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:
Carsten Dominik 2009-01-02 15:53:02 +01:00
parent a50df2a06f
commit 317990dd8a
4 changed files with 97 additions and 22 deletions

View File

@ -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:

View File

@ -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}

View File

@ -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 "")

View File

@ -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.