ox-latex: Introduce `org-latex-prefer-user-labels' variable

* lisp/ox-latex.el (org-latex-prefer-user-labels): New variable.
(org-latex-custom-id-as-label): Remove variable.
(org-latex--label): New function.

(org-latex--caption/label-string):
(org-latex-headline):
(org-latex-inlinetask):
(org-latex-latex-environment):
(org-latex-link): Use new function.

* etc/ORG-NEWS: Document new variable.

This variable replaces, and generalizes,
`org-latex-custom-id-as-label'.
This commit is contained in:
Nicolas Goaziou 2015-04-13 11:53:59 +02:00
parent 68eb1d0ab0
commit 4bbc054bd2
2 changed files with 89 additions and 76 deletions

View File

@ -318,6 +318,8 @@ When non-nil, attachments from archived subtrees are removed.
This variable generalizes ~org-latex-table-caption-above~, which is
now deprecated. In addition to tables, it applies to source blocks,
special blocks and images. See docstring for more information.
*** New option: ~org-latex-prefer-user-labels~
See docstring for more information.
*** Export unnumbered headlines
Headlines, for which the property ~UNNUMBERED~ is non-nil, are now
exported without section numbers irrespective of their levels. The

View File

@ -115,7 +115,6 @@
(:latex-active-timestamp-format nil nil org-latex-active-timestamp-format)
(:latex-caption-above nil nil org-latex-caption-above)
(:latex-classes nil nil org-latex-classes)
(:latex-custom-id-labels nil nil org-latex-custom-id-as-label)
(:latex-default-figure-position nil nil org-latex-default-figure-position)
(:latex-default-table-environment nil nil org-latex-default-table-environment)
(:latex-default-table-mode nil nil org-latex-default-table-mode)
@ -136,6 +135,7 @@
(:latex-listings-options nil nil org-latex-listings-options)
(:latex-minted-langs nil nil org-latex-minted-langs)
(:latex-minted-options nil nil org-latex-minted-options)
(:latex-prefer-user-labels nil nil org-latex-prefer-user-labels)
(:latex-subtitle-format nil nil org-latex-subtitle-format)
(:latex-subtitle-separate nil nil org-latex-subtitle-separate)
(:latex-table-scientific-notation nil nil org-latex-table-scientific-notation)
@ -237,6 +237,61 @@ symbols are: `image', `table', `src-block' and `special-block'."
(const :tag "Source code" src-block)
(const :tag "Special blocks" special-block))))
(defcustom org-latex-prefer-user-labels nil
"Use user-provided labels instead of internal ones when non-nil.
When this variable is non-nil, Org will use the value of
a headline's CUSTOM_ID property and NAME values as the key for
the \\label commands generated.
By default, Org generates its own internal labels during LaTeX
export. This process ensures that the \\label keys are unique
and valid, but it means the keys are not available in advance of
the export process.
Setting this variable gives you control over how Org generates
labels during LaTeX export, so that you may know their keys in
advance. One reason to do this is that it allows you to refer to
various elements using a single label both in Org's link syntax
and in embedded LaTeX code.
For example, when this variable is non-nil, a headline like this:
** Some section
:PROPERTIES:
:CUSTOM_ID: sec:foo
:END:
This is section [[#sec:foo]].
#+BEGIN_LATEX
And this is still section \\ref{sec:foo}.
#+END_LATEX
will be exported to LaTeX as:
\\subsection{Some section}
\\label{sec:foo}
This is section \\ref{sec:foo}.
And this is still section \\ref{sec:foo}.
Note, however, that setting this variable introduces a limitation
on the possible values for CUSTOM_ID and NAME. When this
variable is non-nil, Org passes their value to \\label unchanged.
You are responsible for ensuring that the value is a valid LaTeX
\\label key, and that no other \\label commands with the same key
appear elsewhere in your document. (Keys may contain letters,
numbers, and the following punctuation: '_' '.' '-' ':'.) There
are no such limitations on CUSTOM_ID and NAME when this variable
is nil.
For headlines that do not define the CUSTOM_ID property or
elements without a NAME, Org will continue to use its default
labeling scheme to generate labels and resolve links into proper
references."
:group 'org-export-latex
:type 'boolean
:version "25.1"
:package-version '(Org . "8.3"))
;;;; Preamble
(defcustom org-latex-default-class "article"
@ -477,59 +532,6 @@ The function result will be used in the section format string."
:package-version '(Org . "8.0")
:type 'function)
(defcustom org-latex-custom-id-as-label nil
"Toggle use of CUSTOM_ID properties for generating section labels.
When this variable is non-nil, Org will use the value of a
headline's CUSTOM_ID property as the key for the \\label command
for the LaTeX section corresponding to the headline.
By default, Org generates its own internal section labels for all
headlines during LaTeX export. This process ensures that the
\\label keys are unique and valid, but it means the keys are not
available in advance of the export process.
Setting this variable gives you control over how Org generates
labels for sections during LaTeX export, so that you may know
their keys in advance. One reason to do this is that it allows
you to refer to headlines using a single label both in Org's link
syntax and in embedded LaTeX code.
For example, when this variable is non-nil, a headline like this:
** Some section
:PROPERTIES:
:CUSTOM_ID: sec:foo
:END:
This is section [[#sec:foo]].
#+BEGIN_LATEX
And this is still section \\ref{sec:foo}.
#+END_LATEX
will be exported to LaTeX as:
\\subsection{Some section}
\\label{sec:foo}
This is section \\ref{sec:foo}.
And this is still section \\ref{sec:foo}.
Note, however, that setting this variable introduces a limitation
on the possible values for CUSTOM_ID. When this variable is
non-nil and a headline defines a CUSTOM_ID value, Org simply
passes this value to \\label unchanged. You are responsible for
ensuring that the value is a valid LaTeX \\label key, and that no
other \\label commands with the same key appear elsewhere in your
document. (Keys may contain letters, numbers, and the following
punctuation: '_' '.' '-' ':'.) There are no such limitations on
CUSTOM_ID when this variable is nil.
For headlines that do not define the CUSTOM_ID property, Org will
continue to use its default labeling scheme to generate labels
and resolve links into section references."
:group 'org-export-latex
:type 'boolean
:version "25.1"
:package-version '(Org . "8.3"))
;;;; Footnotes
@ -1043,6 +1045,30 @@ INFO is a plist holding contextual information."
(let ((type (org-element-type element)))
(memq (if (eq type 'link) 'image type) above)))))
(defun org-latex--label (element info &optional force full)
"Return an appropriate label for ELEMENT.
INFO is the current export state, as a plist.
Return nil if ELEMENT has no NAME affiliated keyword or no
CUSTOM_ID property, unless FORCE is non-nil. In this case always
return a unique label.
Eventually, if FULL is non-nil, wrap label within \"\\label{}\"."
(let* ((user-label
(org-element-property
(if (memq (org-element-type element) '(headline inlinetask))
:CUSTOM_ID
:name)
element))
(label
(and (or user-label force)
(if (and user-label (plist-get info :latex-prefer-user-labels))
user-label
(org-export-get-reference element info)))))
(cond ((not full) label)
(label (format "\\label{%s}\n" label))
(t ""))))
(defun org-latex--caption/label-string (element info)
"Return caption and label LaTeX string for ELEMENT.
@ -1050,9 +1076,7 @@ INFO is a plist holding contextual information. If there's no
caption nor label, return the empty string.
For non-floats, see `org-latex--wrap-label'."
(let* ((label
(if (not (org-element-property :name element)) ""
(format "\\label{%s}" (org-export-get-reference element info))))
(let* ((label (org-latex--label element info nil t))
(main (org-export-get-caption element))
(short (org-export-get-caption element t))
(caption-from-attr-latex
@ -1564,13 +1588,9 @@ holding contextual information."
(full-text (funcall (plist-get info :latex-format-headline-function)
todo todo-type priority text tags info))
;; Associate \label to the headline for internal links.
(headline-label
(format "\\label{%s}\n"
(or (and (plist-get info :latex-custom-id-labels)
(org-element-property :CUSTOM_ID headline))
(org-export-get-reference headline info))))
(headline-label (org-latex--label headline info t t))
(pre-blanks
(make-string (org-element-property :pre-blank headline) 10)))
(make-string (org-element-property :pre-blank headline) ?\n)))
(if (or (not section-fmt) (org-export-low-level-p headline info))
;; This is a deep sub-tree: export it as a list item. Also
;; export as items headlines for which no section format has
@ -1727,10 +1747,7 @@ holding contextual information."
(org-export-get-tags inlinetask info)))
(priority (and (plist-get info :with-priority)
(org-element-property :priority inlinetask)))
(contents (concat
(let ((label (org-element-property :CUSTOM_ID inlinetask)))
(and label (format "\\label{%s}\n" label)))
contents)))
(contents (concat (org-latex--label inlinetask info) contents)))
(funcall (plist-get info :latex-format-inlinetask-function)
todo todo-type priority title tags contents info)))
@ -1884,9 +1901,7 @@ CONTENTS is nil. INFO is a plist holding contextual information."
(insert value)
(goto-char (point-min))
(forward-line)
(insert
(format "\\label{%s}\n"
(org-export-get-reference latex-environment info)))
(insert (org-latex--label latex-environment info nil t))
(buffer-string))))))
@ -2097,11 +2112,7 @@ INFO is a plist holding contextual information. See
;; number. Otherwise, display description or headline's
;; title.
(headline
(let* ((custom-label
(and (plist-get info :latex-custom-id-labels)
(org-element-property :CUSTOM_ID destination)))
(label (or custom-label
(org-export-get-reference destination info))))
(let ((label (org-latex--label destination info t)))
(if (and (not desc)
(org-export-numbered-headline-p destination info))
(format "\\ref{%s}" label)
@ -2111,7 +2122,7 @@ INFO is a plist holding contextual information. See
(org-element-property :title destination) info))))))
;; Fuzzy link points to a target. Do as above.
(otherwise
(let ((ref (org-export-get-reference destination info)))
(let ((ref (org-latex--label destination info t)))
(if (not desc) (format "\\ref{%s}" ref)
(format "\\hyperref[%s]{%s}" ref desc)))))))
;; Coderef: replace link with the reference name or the