我一直在使用\footnotemark
和\footnotetext
编写脚注,主要是因为如果TeX
脚注文本不散布在句子中间,那么阅读和编写段落会更容易。
但是这意味着我必须亲自为每个脚注手动编号。当我反复写新段落或更改文本顺序时,这意味着我必须重新编号所有后续脚注。
有办法解决这个问题吗?理想情况下,我想为每个脚注赋予一个唯一的标识符,并让编译器自动处理编号。
答案1
如果你遵循这条路线,我建议使用\label
-\ref
系统并创建自己的宏来处理标签和交叉引用。以下是使用refcount
将引用作为值传递给脚注机制(使用计数器):
\documentclass{article}
\usepackage{refcount}% http://ctan.org/pkg/refcount
\newcounter{fncntr}
\newcommand{\fnmark}[1]{\refstepcounter{fncntr}\label{#1}\footnotemark[\getrefnumber{#1}]}
\newcommand{\fntext}[2]{\footnotetext[\getrefnumber{#1}]{#2}}
\begin{document}
Some text\fnmark{first-fn} and some more\fnmark{second-fn} text,
and finally\fnmark{last-fn} this.
\fntext{first-fn}{First footnote.}
\fntext{second-fn}{Second footnote.}
\fntext{last-fn}{Last footnote.}
\end{document}
每个\fnmark{<label>}
都带有一个标签,然后与\fntext{<label>}{<text>}
文档中其他地方的同步。由于这使用.aux
文件来存储参考文献,因此您必须至少编译两次才能开始(所有脚注都将是0
,按照 的refcount
)\setrefcountdefault{0}
。但是,后续运行只需要一次编译,直到引入新的脚注或参考文献发生变化。
答案2
如果您想要一个简单的答案,那么您可以在一个段落中简单地添加多个标记,然后在段落后按顺序添加脚注的文本,这可能是一个简单的解决方案:
% Better footnote handling
\newcounter{footnoteInText}
\newcounter{footnoteInNote}
\newcommand{\fnmark}{\stepcounter{footnoteInText}\setcounter{footnote}{\value{footnoteInText}}\addtocounter{footnote}{-1}\footnotemark}
\newcommand{\fntext}[1]{\stepcounter{footnoteInNote}\setcounter{footnote}{\value{footnoteInNote}}\footnotetext{#1}}
现在,不再调用\footnotemark
和\footnotetext{...}
,而是调用\fnmark
和\fntext{...}
。
答案3
这详细说明了上述 cgnieder 的建议。使用包:九月脚注
句法:
% First assign an identifier to note:
\sepfootnotecontent{<id>}{<text>}
% Then typeset that note using its identifier:
\sepfootnote{<id>}
例子:
\documentclass{article}
\usepackage{sepfootnotes}
\sepfootnotecontent{abc}{A footnote.}
\sepfootnotecontent{xyz}{Another footnote.}
\begin{document}
Here is a footnote tagged as `xyz'.\sepfootnote{xyz}
Here is a footnote tagged as `abc'.\sepfootnote{abc}
\end{document}
(请注意,虽然xyz
在之后定义abc
,但排版在之前。换句话说,顺序根本不重要)
答案4
我正在使用\label
-\ref
系统,但根本没用过\footnotemark
(有人建议我使用发丝间距和上标),而且由于hyperref
我不能使用\footnotetext
它们。我自己定义了一个可以工作的变体(最初用于表格和可能的迷你页面,但如果您只想单独定义它们,它也适合您)。它的优点是我\hyperfootnotemark
不会离开 vmode。
总结
\makeatletter%
% \hyperfootnotetext is what \footnotetext is supposed to be:
% like \footnote except not rendering anything (it will not
% generate a paragraph if you append % to all lines)
\newcommand\hyperfootnotetext[1]{%
% new local scope
{%
% temporarily redefine this macro to empty
\renewcommand{\@makefnmark}{}%
% temporarily prevent leaving vmode
\renewcommand{\leavevmode}{}%
% this also means we cannot create a(n empty) hyperlink
\renewcommand{\hyper@linkstart}[2]{}%
\renewcommand{\hyper@linkend}{}%
% call the original \footnote macro
\footnote{#1}%
% exit the local scope with the redefined macro
}%
% end of command
}%
\makeatother%
% for footnotes
\newcommand{\Hair}{\kern.16667em}
用于:
Some text\Hair\textsuperscript{\ref{fn:foo}}. Some more text.
\hyperfootnotetext{\label{fn:foo}%
The footnote body.}%
您通常希望\hyperfootnotetext
调用的位置接近(或位于)您(第一次)使用脚注的位置。有关更多详细信息,请阅读我的其他答案关于这一点。