From add8d28ba23cd758dbc5b70eebd4198233a1fda6 Mon Sep 17 00:00:00 2001 From: Nicolas Goaziou Date: Mon, 18 Jun 2012 12:39:11 +0200 Subject: [PATCH] org-e-latex: Support for footnote references in an item tag --- contrib/lisp/org-e-latex.el | 46 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) diff --git a/contrib/lisp/org-e-latex.el b/contrib/lisp/org-e-latex.el index 40192c278..f80b34da4 100644 --- a/contrib/lisp/org-e-latex.el +++ b/contrib/lisp/org-e-latex.el @@ -1249,6 +1249,14 @@ CONTENTS is nil. INFO is a plist holding contextual information." '(footnote-reference footnote-definition))) (let ((num (org-export-get-footnote-number footnote-reference info))) (format "\\footnotemark[%s]{}\\setcounter{footnote}{%s}" num num))) + ;; Use also \footnotemark if reference is within an item's tag. + ;; Note: this won't work if reference has already been defined + ;; since we cannot specify footnote number through square + ;; brackets, forbidden in an optional argument. + ((eq (org-element-type (org-export-get-parent-element footnote-reference)) + 'item) + (format "\\footnotemark\\setcounter{footnote}{%s}" + (org-export-get-footnote-number footnote-reference info))) ;; Otherwise, define it with \footnote command. (t (let ((def (org-export-get-footnote-definition footnote-reference info))) @@ -1283,7 +1291,7 @@ CONTENTS is nil. INFO is a plist holding contextual information." (org-trim (org-export-data (org-export-get-footnote-definition ref info) info)))) - (funcall search-refs def) "")))))))) + "")))))))) ;;;; Headline @@ -1545,7 +1553,41 @@ contextual information." (and tag (format "[%s] " (concat checkbox (org-export-data tag info))))))) - (concat counter "\\item" (or tag (concat " " checkbox)) contents))) + (concat counter "\\item" (or tag (concat " " checkbox)) + (org-trim contents) + ;; If there are footnotes references in tag, be sure to + ;; add their definition at the end of the item. This + ;; workaround is necessary since "\footnote{}" command is + ;; not supported in tags. + (and tag + (mapconcat + (lambda (ref) + (format + "\\footnotetext[%s]{%s}" + (org-export-get-footnote-number ref info) + (org-trim + (org-export-data + (org-export-get-footnote-definition ref info) info)))) + ;; Find every footnote reference in item's tag. + (let (all-refs + search-refs ; For byte-compiler. + (search-refs + (function + (lambda (data) + ;; Return a list of all footnote + ;; references never seen before in DATA. + (org-element-map + data 'footnote-reference + (lambda (ref) + (when (org-export-footnote-first-reference-p ref info) + (push ref all-refs) + (when (eq (org-element-property :type ref) 'standard) + (funcall + search-refs + (org-export-get-footnote-definition ref info))))) + info) (reverse all-refs))))) + (funcall search-refs (org-element-property :tag item))) + ""))))) ;;;; Keyword -- 2.11.4.GIT