emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: Rasmus <rasmus@gmx.us>
To: emacs-orgmode@gnu.org
Subject: Re: [patch] more robust footnotes
Date: Tue, 24 May 2016 23:38:27 +0200	[thread overview]
Message-ID: <87eg8r6srw.fsf@gmx.us> (raw)
In-Reply-To: 87h9dn87nn.fsf@saiph.selenimh

[-- Attachment #1: Type: text/plain, Size: 119 bytes --]

Nicolas Goaziou <mail@nicolasgoaziou.fr> writes:

> You sent the wrong patch.

Ups...!

-- 
Vote for proprietary math!

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-ox-latex-More-robust-repeated-footnote-references.patch --]
[-- Type: text/x-diff, Size: 5906 bytes --]

From 880eb2047f7895a4d767ce59b9fe13465b5a16a7 Mon Sep 17 00:00:00 2001
From: Rasmus <rasmus@gmx.us>
Date: Sun, 22 May 2016 20:33:06 +0200
Subject: [PATCH] ox-latex: More robust repeated footnote references

* lisp/ox-latex.el (org-latex--label): Prefix footnote with "fn".
(org-latex--delayed-footnotes-definitions): Fix typo in docstring.
(org-latex-footnote-defined-format): New defcustom.
(org-latex-footnote-reference): Refer to repeated footnotes using
labels.  Format using new defcustom.
---
 lisp/ox-latex.el | 78 ++++++++++++++++++++++++++++++++++++++------------------
 1 file changed, 53 insertions(+), 25 deletions(-)

diff --git a/lisp/ox-latex.el b/lisp/ox-latex.el
index 0946fe4..5883448 100644
--- a/lisp/ox-latex.el
+++ b/lisp/ox-latex.el
@@ -119,6 +119,7 @@
     (:latex-default-table-mode nil nil org-latex-default-table-mode)
     (:latex-diary-timestamp-format nil nil org-latex-diary-timestamp-format)
     (:latex-footnote-separator nil nil org-latex-footnote-separator)
+    (:latex-footnote-defined-format nil nil org-latex-footnote-defined-format)
     (:latex-format-drawer-function nil nil org-latex-format-drawer-function)
     (:latex-format-headline-function nil nil org-latex-format-headline-function)
     (:latex-format-inlinetask-function nil nil org-latex-format-inlinetask-function)
@@ -651,6 +652,16 @@ The function result will be used in the section format string."
   :group 'org-export-latex
   :type 'string)
 
+(defcustom org-latex-footnote-defined-format "\\textsuperscript{\\ref{%s}}"
+  "Format string used to format reference to footnote already defined.
+%s will be replaced by the label of the referred footnote."
+  :group 'org-export-latex
+  :type '(choice
+	  (const :tag "Use plain superscript (default)" "\\textsuperscript{\\ref{%s}}")
+	  (const :tag "Use Memoir/KOMA-Script footref" "\\footref{%s}")
+	  (string :tag "Other format string"))
+  :version "25.2"
+  :package-version '(Org . "9.0"))
 
 ;;;; Timestamps
 
@@ -1246,6 +1257,8 @@ Eventually, if FULL is non-nil, wrap label within \"\\label{}\"."
 				  org-latex-math-environments-re
 				  (org-element-property :value datum))
 				 "eq:"))
+			   (footnote-reference "fn:")
+			   (footnote-definition "fn:")
 			   (paragraph
 			    (and (org-element-property :caption datum)
 				 "fig:")))
@@ -1498,7 +1511,7 @@ INFO is a plist used as a communication channel.  See
 
 INFO is a plist used as a communication channel.
 
-Footnotes definitions are returned within \"\\footnotetxt{}\"
+Footnotes definitions are returned within \"\\footnotetext{}\"
 commands.
 
 This function is used within constructs that don't support
@@ -1804,30 +1817,45 @@ CONTENTS is nil.  INFO is a plist holding contextual information."
 (defun org-latex-footnote-reference (footnote-reference _contents info)
   "Transcode a FOOTNOTE-REFERENCE element from Org to LaTeX.
 CONTENTS is nil.  INFO is a plist holding contextual information."
-  (concat
-   ;; Insert separator between two footnotes in a row.
-   (let ((prev (org-export-get-previous-element footnote-reference info)))
-     (when (eq (org-element-type prev) 'footnote-reference)
-       (plist-get info :latex-footnote-separator)))
-   (cond
-    ;; Use \footnotemark if the footnote has already been defined.
-    ((not (org-export-footnote-first-reference-p footnote-reference info))
-     (format "\\footnotemark[%s]{}"
-	     (org-export-get-footnote-number footnote-reference info)))
-    ;; Use \footnotemark if reference is within another footnote
-    ;; reference, footnote definition or table cell.
-    ((org-element-lineage footnote-reference
-			  '(footnote-reference footnote-definition table-cell))
-     "\\footnotemark")
-    ;; Otherwise, define it with \footnote command.
-    (t
-     (let ((def (org-export-get-footnote-definition footnote-reference info)))
-       (concat
-	(format "\\footnote{%s}" (org-trim (org-export-data def info)))
-	;; Retrieve all footnote references within the footnote and
-	;; add their definition after it, since LaTeX doesn't support
-	;; them inside.
-	(org-latex--delayed-footnotes-definitions def info)))))))
+  (let ((label (org-element-property :label footnote-reference)))
+    (concat
+     ;; Insert separator between two footnotes in a row.
+     (let ((prev (org-export-get-previous-element footnote-reference info)))
+       (when (eq (org-element-type prev) 'footnote-reference)
+	 (plist-get info :latex-footnote-separator)))
+     (cond
+      ;; Use `:latex-footnote-defined-format' if the footnote has
+      ;; already been defined.
+      ((not (org-export-footnote-first-reference-p footnote-reference info))
+       (format (plist-get info :latex-footnote-defined-format)
+	       (org-latex--label
+		(org-export-get-footnote-definition footnote-reference info)
+		info t)))
+      ;; Use \footnotemark if reference is within another footnote
+      ;; reference, footnote definition or table cell.
+      ((org-element-lineage footnote-reference
+			    '(footnote-reference footnote-definition table-cell))
+       "\\footnotemark")
+      ;; Otherwise, define it with \footnote command.
+      (t
+       (let ((def (org-export-get-footnote-definition footnote-reference info)))
+	 (concat
+	  (format "\\footnote{%s%s}" (org-trim (org-export-data def info))
+		  ;; Only insert a label if there exist another
+		  ;; reference to def.
+		  (if (org-element-map
+			  (plist-get info :parse-tree)
+			  'footnote-reference
+			(lambda (f)
+			  (and (not (eq f footnote-reference))
+			       (eq def (org-export-get-footnote-definition f info))))
+			info t)
+		      (org-trim (org-latex--label def info t t))
+		    ""))
+	  ;; Retrieve all footnote references within the footnote and
+	  ;; add their definition after it, since LaTeX doesn't support
+	  ;; them inside.
+	  (org-latex--delayed-footnotes-definitions def info))))))))
 
 
 ;;;; Headline
-- 
2.8.3


  reply	other threads:[~2016-05-24 21:38 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-23 20:54 Bug: When exporting to PDF an Org file where multiple footnotes share the same definition, only the first footnote is clickable [8.3.4 (8.3.4-39-ge0acd8-elpaplus @ /home/jorge/.emacs.d/elpa/org-plus-contrib-20160418/)] Jorge Peixoto de Morais Neto
2016-04-25  8:38 ` Rasmus
2016-04-25  8:58   ` Nicolas Goaziou
2016-04-25 10:53     ` Rasmus
2016-04-25 11:41       ` Nicolas Goaziou
2016-04-25 13:36         ` Rasmus
2016-04-25 13:57           ` Nicolas Goaziou
2016-04-25 14:04             ` Rasmus
2016-04-25 14:07               ` Rasmus
2016-05-22 20:16             ` Rasmus
2016-05-23 21:41               ` Nicolas Goaziou
2016-05-24 20:59                 ` [patch] more robust footnotes (was: Bug: When exporting to PDF an Org file where multiple footnotes share the same definition, only the first footnote is clickable [8.3.4 (8.3.4-39-ge0acd8-elpaplus @ /home/jorge/.emacs.d/elpa/org-plus-contrib-20160418/)]) Rasmus
2016-05-24 21:31                   ` [patch] more robust footnotes Nicolas Goaziou
2016-05-24 21:38                     ` Rasmus [this message]
2016-05-24 21:54                       ` Nicolas Goaziou
2016-05-25  7:16                         ` Rasmus
2016-05-25 16:50                           ` Nicolas Goaziou
2016-05-25 17:51                             ` Rasmus
2016-08-10 21:09                 ` Bug: When exporting to PDF an Org file where multiple footnotes share the same definition, only the first footnote is clickable [8.3.4 (8.3.4-39-ge0acd8-elpaplus @ /home/jorge/.emacs.d/elpa/org-plus-contrib-20160418/)] Kaushal Modi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87eg8r6srw.fsf@gmx.us \
    --to=rasmus@gmx.us \
    --cc=emacs-orgmode@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).