forked from mirrors/org-mode
Footnotes: Automatic label creation.
This patch implements fully automatic creation of unique labels for footnotes, which is also turned on as the default setting. The automatic labels look like [fn:1], [fn:2], etc, using the first available unused number. The commit introduces a new variable, `org-footnote-auto-label' with a number of different options ranging from no auto creation (prompting the user for a label) to fully automatic creation. Also, the commit introduces new #+STARTUP options that can be used to select these settings on a per-file basis.
This commit is contained in:
parent
a50df2a06f
commit
317990dd8a
|
@ -31,14 +31,17 @@ For example:
|
||||||
[1] The link is: http://orgmode.org
|
[1] The link is: http://orgmode.org
|
||||||
#+end_src
|
#+end_src
|
||||||
|
|
||||||
Org-mode extends the number-based syntax to _named_ footnotes and
|
Org-mode extends the number-based syntax to /named/ footnotes and
|
||||||
optional inline definition. Using numbers as markers is supported for
|
optional inline definition. Using numbers as markers is
|
||||||
backward compatibility. Here are the valid references:
|
supported for backward compatibility, but not encouraged because
|
||||||
|
of possible conflicts with LaTeX syntax. Here are the valid
|
||||||
|
references:
|
||||||
|
|
||||||
- [1] :: A numeric footnote marker.
|
- [1] :: A plain numeric footnote marker.
|
||||||
|
|
||||||
- [fn:name] :: A named footnote reference, where `name' is a
|
- [fn:name] :: A named footnote reference, where `name' is a
|
||||||
unique label word.
|
unique label word or, for simplicity of automatic creation,
|
||||||
|
a number.
|
||||||
|
|
||||||
- [fn:: This is the inline definition of this footnote] ::
|
- [fn:: This is the inline definition of this footnote] ::
|
||||||
A LaTeX-like anonymous footnote where the definition is given
|
A LaTeX-like anonymous footnote where the definition is given
|
||||||
|
@ -50,17 +53,23 @@ backward compatibility. Here are the valid references:
|
||||||
note, you can then use use `[fn:name]' to create additional
|
note, you can then use use `[fn:name]' to create additional
|
||||||
references.
|
references.
|
||||||
|
|
||||||
|
Footnote labels can be created automatically, or you create names
|
||||||
|
yourself. This is handled by the variable
|
||||||
|
=org-footnote-auto-label= and its corresponding =#+STARTUP=
|
||||||
|
keywords, see the docstring of that variable for details.
|
||||||
|
|
||||||
The following command handles footnotes:
|
The following command handles footnotes:
|
||||||
|
|
||||||
- C-c C-x f ::
|
- C-c C-x f ::
|
||||||
The footnote action command. When the cursor is on a footnote
|
The footnote action command. When the cursor is on a
|
||||||
reference, jump to the definition. When it is at a definition,
|
footnote reference, jump to the definition. When it is at a
|
||||||
jump to the (first) reference. Otherwise, create a new footnote.
|
definition, jump to the (first) reference. Otherwise,
|
||||||
Depending on the variable `org-footnote-define-inline' (with
|
create a new footnote. Depending on the variable
|
||||||
associated #+STARTUP options fninline and nofninline), the
|
`org-footnote-define-inline' (with associated =#+STARTUP=
|
||||||
definitions will be placed locally, or into the nearest outline
|
options =fninline= and =nofninline=), the definitions will
|
||||||
section with the heading `Footnotes'. If no such section is found
|
be placed locally, or into the nearest outline section with
|
||||||
after the reference point, one will be created at the end of the
|
the heading `Footnotes'. If no such section is found after
|
||||||
|
the reference point, one will be created at the end of the
|
||||||
file.
|
file.
|
||||||
When this command is called with a prefix argument, a menu of
|
When this command is called with a prefix argument, a menu of
|
||||||
additional options is offered:
|
additional options is offered:
|
||||||
|
|
37
doc/org.texi
37
doc/org.texi
|
@ -1379,20 +1379,23 @@ brackets in column 0, no indentation allowed. The footnote reference is
|
||||||
simply the marker in square brackets, inside text. For example:
|
simply the marker in square brackets, inside text. For example:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
The Org homepage[1] now looks a lot better than it used to.
|
The Org homepage[fn:1] now looks a lot better than it used to.
|
||||||
...
|
...
|
||||||
[1] The link is: http://orgmode.org
|
[fn:1] The link is: http://orgmode.org
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
Org-mode extends the number-based syntax to @emph{named} footnotes and
|
Org-mode extends the number-based syntax to @emph{named} footnotes and
|
||||||
optional inline definition. Using numbers as markers is supported for
|
optional inline definition. Using plain numbers as markers (as
|
||||||
backward compatibility. Here are the valid references:
|
@file{footnote.el} does) is supported for backward compatibility, but not
|
||||||
|
encouraged because of possible conflicts with LaTeX snippets @pxref{Embedded
|
||||||
|
LaTeX}. Here are the valid references:
|
||||||
|
|
||||||
@table @code
|
@table @code
|
||||||
@item [1]
|
@item [1]
|
||||||
A numeric footnote marker.
|
A plain numeric footnote marker.
|
||||||
@item [fn:name]
|
@item [fn:name]
|
||||||
A named footnote reference, where @code{name} is a unique label word.
|
A named footnote reference, where @code{name} is a unique label word, or, for
|
||||||
|
simplicity of automatic creation, a number.
|
||||||
@item [fn:: This is the inline definition of this footnote]
|
@item [fn:: This is the inline definition of this footnote]
|
||||||
A LaTeX-like anonymous footnote where the definition is given directly at the
|
A LaTeX-like anonymous footnote where the definition is given directly at the
|
||||||
reference point.
|
reference point.
|
||||||
|
@ -1402,6 +1405,11 @@ Since Org allows multiple references to the same note, you can then use use
|
||||||
@code{[fn:name]} to create additional references.
|
@code{[fn:name]} to create additional references.
|
||||||
@end table
|
@end table
|
||||||
|
|
||||||
|
Footnote labels can be created automatically, or you create names yourself.
|
||||||
|
This is handled by the variable @code{org-footnote-auto-label} and its
|
||||||
|
corresponding @code{#+STARTUP} keywords, see the docstring of that variable
|
||||||
|
for details.
|
||||||
|
|
||||||
@noindent The following command handles footnotes:
|
@noindent The following command handles footnotes:
|
||||||
|
|
||||||
@table @kbd
|
@table @kbd
|
||||||
|
@ -8819,6 +8827,23 @@ The following options influence the table spreadsheet (variable
|
||||||
constcgs @r{@file{constants.el} should use the c-g-s unit system}
|
constcgs @r{@file{constants.el} should use the c-g-s unit system}
|
||||||
constSI @r{@file{constants.el} should use the SI unit system}
|
constSI @r{@file{constants.el} should use the SI unit system}
|
||||||
@end example
|
@end example
|
||||||
|
To influence footnote settings, use the following keywords. The
|
||||||
|
corresponding variables are @code{org-footnote-define-inline} and
|
||||||
|
@code{org-footnote-auto-label}.
|
||||||
|
@cindex @code{fninline}, STARTUP keyword
|
||||||
|
@cindex @code{fnnoinline}, STARTUP keyword
|
||||||
|
@cindex @code{fnprompt}, STARTUP keyword
|
||||||
|
@cindex @code{fnauto}, STARTUP keyword
|
||||||
|
@cindex @code{fnconfirm}, STARTUP keyword
|
||||||
|
@cindex @code{fnplain}, STARTUP keyword
|
||||||
|
@example
|
||||||
|
fninline @r{define footnotes inline}
|
||||||
|
fnnoinline @r{define footnotes in separate section}
|
||||||
|
fnprompt @r{prompt for footnote labels}
|
||||||
|
fnauto @r{create [fn:1]-like labels automatically (default)}
|
||||||
|
fnconfirm @r{offer automatic label for editing or confirmation}
|
||||||
|
fnplain @r{create [1]-like labels automatically}
|
||||||
|
@end example
|
||||||
@item #+TAGS: TAG1(c1) TAG2(c2)
|
@item #+TAGS: TAG1(c1) TAG2(c2)
|
||||||
These lines (several such lines are allowed) specify the valid tags in
|
These lines (several such lines are allowed) specify the valid tags in
|
||||||
this file, and (potentially) the corresponding @emph{fast tag selection}
|
this file, and (potentially) the corresponding @emph{fast tag selection}
|
||||||
|
|
|
@ -92,6 +92,23 @@ will be used to define the footnote at the reference position."
|
||||||
:group 'org-footnote
|
:group 'org-footnote
|
||||||
:type 'boolean)
|
:type 'boolean)
|
||||||
|
|
||||||
|
(defcustom org-footnote-auto-label t
|
||||||
|
"Non-nil means, define automatically new labels for footnotes.
|
||||||
|
Possible values are:
|
||||||
|
|
||||||
|
nil prompt the user for each label
|
||||||
|
t create unique labels of the form [fn:1], [fn:2], ...
|
||||||
|
confirm like t, but let the user edit the created value. In particular,
|
||||||
|
the label can be removed from the minibuffer, to create
|
||||||
|
an anonymous footnote.
|
||||||
|
plain Automatically create plain number labels like [1]"
|
||||||
|
:group 'org-footnote
|
||||||
|
:type '(choice
|
||||||
|
(const :tag "Frompt for label" nil)
|
||||||
|
(const :tag "Create automatic [fn:N]" t)
|
||||||
|
(const :tag "Offer automatic [fn:N] for editing" confirm)
|
||||||
|
(const :tag "Create automatic [N]" plain)))
|
||||||
|
|
||||||
(defun org-footnote-at-reference-p ()
|
(defun org-footnote-at-reference-p ()
|
||||||
"Is the cursor at a footnote reference?
|
"Is the cursor at a footnote reference?
|
||||||
If yes, return the beginning position, the label, and the definition, if local."
|
If yes, return the beginning position, the label, and the definition, if local."
|
||||||
|
@ -175,6 +192,20 @@ with start and label of the footnote if there is a definition at point."
|
||||||
(and l (not (equal l "fn:")) (add-to-list 'rtn l)))))
|
(and l (not (equal l "fn:")) (add-to-list 'rtn l)))))
|
||||||
rtn))
|
rtn))
|
||||||
|
|
||||||
|
(defun org-footnote-unique-label (&optional current)
|
||||||
|
"Return a new unique footnote label.
|
||||||
|
The returns the firsts fn:N labels that is currently not used."
|
||||||
|
(unless current (setq current (org-footnote-all-labels)))
|
||||||
|
(let ((fmt (if (eq org-footnote-auto-label 'plain) "%d" "fn:%d"))
|
||||||
|
(cnt 1))
|
||||||
|
(while (member (format fmt cnt) current)
|
||||||
|
(incf cnt))
|
||||||
|
(format fmt cnt)))
|
||||||
|
|
||||||
|
(defvar org-footnote-label-history nil
|
||||||
|
"History of footnote labels entered in current buffer.")
|
||||||
|
(make-variable-buffer-local 'org-footnote-label-history)
|
||||||
|
|
||||||
(defun org-footnote-new ()
|
(defun org-footnote-new ()
|
||||||
"Insert a new footnote.
|
"Insert a new footnote.
|
||||||
This command prompts for a label. If this is a label referencing an
|
This command prompts for a label. If this is a label referencing an
|
||||||
|
@ -182,9 +213,15 @@ existing label, only insert the label. If the footnote label is empty
|
||||||
or new, let the user edit the definition of the footnote."
|
or new, let the user edit the definition of the footnote."
|
||||||
(interactive)
|
(interactive)
|
||||||
(let* ((labels (org-footnote-all-labels))
|
(let* ((labels (org-footnote-all-labels))
|
||||||
(label (completing-read
|
(propose (org-footnote-unique-label labels))
|
||||||
"Label (leave empty for anonymous): "
|
(label
|
||||||
(mapcar 'list labels))))
|
(if (member org-footnote-auto-label '(t plain))
|
||||||
|
propose
|
||||||
|
(completing-read
|
||||||
|
"Label (leave empty for anonymous): "
|
||||||
|
(mapcar 'list labels) nil nil
|
||||||
|
(if (eq org-footnote-auto-label 'confirm) propose nil)
|
||||||
|
'org-footnote-label-history))))
|
||||||
(setq label (org-footnote-normalize-label label))
|
(setq label (org-footnote-normalize-label label))
|
||||||
(cond
|
(cond
|
||||||
((equal label "")
|
((equal label "")
|
||||||
|
|
|
@ -2995,6 +2995,10 @@ After a match, the following groups carry important information:
|
||||||
("nologrepeat" org-log-repeat nil)
|
("nologrepeat" org-log-repeat nil)
|
||||||
("fninline" org-footnote-define-inline t)
|
("fninline" org-footnote-define-inline t)
|
||||||
("nofninline" org-footnote-define-inline nil)
|
("nofninline" org-footnote-define-inline nil)
|
||||||
|
("fnauto" org-footnote-auto-label t)
|
||||||
|
("fnprompt" org-footnote-auto-label nil)
|
||||||
|
("fnconfirm" org-footnote-auto-label confirm)
|
||||||
|
("fnplain" org-footnote-auto-label plain)
|
||||||
("constcgs" constants-unit-system cgs)
|
("constcgs" constants-unit-system cgs)
|
||||||
("constSI" constants-unit-system SI))
|
("constSI" constants-unit-system SI))
|
||||||
"Variable associated with STARTUP options for org-mode.
|
"Variable associated with STARTUP options for org-mode.
|
||||||
|
|
Loading…
Reference in New Issue