diff --git a/lisp/oc.el b/lisp/oc.el index 2f741768f..f9883ba49 100644 --- a/lisp/oc.el +++ b/lisp/oc.el @@ -789,6 +789,20 @@ Citations are ordered by appearance in the document, when following footnotes. INFO is the export communication channel, as a property list." (or (plist-get info :citations) (letrec ((cites nil) + (tree (plist-get info :parse-tree)) + (find-definition + ;; Find definition for standard reference LABEL. At + ;; this point, it is impossible to rely on + ;; `org-export-get-footnote-definition' because the + ;; function caches results that could contain + ;; un-processed citation objects. So we use + ;; a simplified version of the function above. + (lambda (label) + (org-element-map tree 'footnote-definition + (lambda (d) + (and (equal label (org-element-property :label d)) + (or (org-element-contents d) ""))) + info t))) (search-cites (lambda (data) (org-element-map data '(citation footnote-reference) @@ -798,22 +812,13 @@ INFO is the export communication channel, as a property list." ;; Do not force entering inline definitions, since ;; `org-element-map' is going to enter it anyway. ((guard (eq 'inline (org-element-property :type datum)))) - ;; Find definition for current standard - ;; footnote reference. Unlike to - ;; `org-export-get-footnote-definition', do - ;; not cache results as they would contain - ;; un-processed citation objects. + ;; Walk footnote definition. (_ (let ((label (org-element-property :label datum))) - (funcall - search-cites - (org-element-map data 'footnote-definition - (lambda (d) - (and - (equal label (org-element-property :label d)) - (or (org-element-contents d) ""))))))))) + (funcall search-cites + (funcall find-definition label)))))) info nil 'footnote-definition t)))) - (funcall search-cites (plist-get info :parse-tree)) + (funcall search-cites tree) (let ((result (nreverse cites))) (plist-put info :citations result) result))))