脚注:段落中的标签,其他地方的文本?

脚注:段落中的标签,其他地方的文本?

TL;DR:是否有一个包允许在应该插入标记的位置后写入脚注文本?请注意,我问的是源代码的定位,不是关于输出文档中注释的定位。


在编写 LaTeX 时,我发现脚注源的内联字符有些分散注意力。

This is some text\footnote{That for
whatever reason contains a long 
footnote. The main text becomes split 
apart} so far that it is barely readable. 

使用换行符来做一些小技巧

This is some text\footnote{
  That for whatever reason contains a long
  footnote. The main text becomes split
  apart}
so far that it is barely readable.

也只能帮到这么多。我更愿意写

This is some text\fn{1} that contains a
couple\fn{2} footnotes yet remain readable.

\text{1}{Here is the text of the first
footnote, conveniently readable while reading
the main source, yet not disrupting it.}

\text{2}{-/2}

我知道使用 \footnotemark和可以有一些技巧\footnotetext。但是,当一个段落中有多个脚注时,这将需要手动更改脚注计数器,这太不方便了,因此这不是一个明智的选择。此外,如果我没记错的话,当段落延伸到下一页但 仍在当前页面上的文本中时,它可能会导致脚注显示在错误的页面上\footnotemark

+---------------+  +---------------+
|...            |  |end of the page|
|               |  |...            |
|               |  |               |
|some text with²|  |—————          |
|footnote on the|  |²The FNText    |
+---------------+  +---------------+

是否有一些包可以自动实现这种风格?

作为一个快速破解,我有时使用如下结构

\def\fnlater#1#2{\def#1{\footnote{#2}}}
...
\fnlater\myfnI{The footnote text must be
defined before the paragraph.}
...
Here is some textparagraph\myfnI that refers
to the previously defined footnote. 

遗憾的是,这个定制解决方案有两个主要缺陷:

  1. 它需要定义脚注 使用它,虽然直觉上需要脚注 周围的文字。

  2. 当脚注被意外使用两次时,会导致编译错误。

  3. 当脚注根本没有使用时,它也会导致编译错误。

由于我认为这些问题不容易解决,特别是在周围文本之前定义脚注的要求,因此使用自定义黑客是不可取的。

如果 LaTeX 有这样的包,那么 LyX 是否有相应的模块就更好了。


作为最小可编译示例,请将这些代码示例放入框架中

\documentclass{article}
\begin{document}
...
\end{document}

答案1

我设法把它们拼凑起来。它只允许在页脚中使用纯文本,但除此之外,它应该可以满足您的所有要求。但是,如果标签未定义,则不会引发任何错误,因为每次添加新脚注时都会出现错误。

编辑:现在它支持格式化,感谢\detokenize:D

脚注在文档的任何地方用 来定义\definefootnote{label}{footnotetext},并在文档的其他任何地方用 来使用\usefootnote{label}

\documentclass{article}

\makeatletter
\catcode`#=11
\AtEndDocument{
\immediate\write\@auxout{\detokenize{%
    \newcommand{\@makefootnote}[2]%
        {\expandafter\gdef\csname footnote@#1\endcsname{#2}%
        % Check if footnote is unused
        \AtEndDocument%
            {\expandafter\ifx\csname footnoteused@#1\endcsname\relax%
                \errmessage{Error: Footnote #1 never used!}%
            \fi}}}}}
\catcode`#=6

\newcommand{\@addfootnotetolist}[2]
    {\AtEndDocument{\immediate\write\@auxout
        {\detokenize{\@makefootnote{#1}{#2}}}}}

\newcommand{\definefootnote}[2]
    {% Check if footnote has been defined earlier
    \expandafter\ifx\csname footnotedefd@#1\endcsname\relax
        \@addfootnotetolist{#1}{#2}%
        \expandafter\def\csname footnotedefd@#1\endcsname{}%
    \else
        \errmessage{Error: Footnote #1 defined twice!}
    \fi}
\newcommand{\usefootnote}[1]
    {% Check if footnote is defined
    \expandafter\ifx\csname footnote@#1\endcsname\relax
        % not yet defined, give warning?
        % always happens first time used, of course
        \expandafter\def\csname footnoteused@#1\endcsname{}%
    \else
        % Check if footnote has been used
        \expandafter\ifx\csname footnoteused@#1\endcsname\relax
            \footnote{\csname footnote@#1\endcsname}%
            \expandafter\def\csname footnoteused@#1\endcsname{}%
        \else
            \errmessage{Error: Footnote #1 used twice!}
        \fi
    \fi}
\makeatother

\begin{document}

text\usefootnote{label}

\definefootnote{label}{footnotetext}

\end{document}

答案2

乔纳斯,

当我尝试使用您 2014 年 5 月 27 日发表的帖子中的 MVW 脚注宏时,在我通过 \usefootnote{label} 向同一脚注添加第二个引用后,它停止工作。错误在第二次运行 pdflatex 时出现,如下所示:

\usefootnote ...e {错误:脚注 #1 使用了两次!} \fi \fi l.49 ...s 第二次出现 \usefootnote{label} . ?

我的印象是,您的宏将会促进这样一种情况:页面上可能有两个点恰好引用同一个脚注(即共享的单个脚注)。

为避免疑问,我在下面附上了 MWE(其中有一个额外的脚注引用),如下所示:

\documentclass{article}

\makeatletter
\catcode`#=11
\AtEndDocument{
\immediate\write\@auxout{\detokenize{%
    \newcommand{\@makefootnote}[2]%
        {\expandafter\gdef\csname footnote@#1\endcsname{#2}%
        % Check if footnote is unused
        \AtEndDocument%
            {\expandafter\ifx\csname footnoteused@#1\endcsname\relax%
                \errmessage{Error: Footnote #1 never used!}%
            \fi}}}}}
\catcode`#=6

\newcommand{\@addfootnotetolist}[2]
    {\AtEndDocument{\immediate\write\@auxout
        {\detokenize{\@makefootnote{#1}{#2}}}}}

\newcommand{\definefootnote}[2]
    {% Check if footnote has been defined earlier
    \expandafter\ifx\csname footnotedefd@#1\endcsname\relax
        \@addfootnotetolist{#1}{#2}%
        \expandafter\def\csname footnotedefd@#1\endcsname{}%
    \else
        \errmessage{Error: Footnote #1 defined twice!}
    \fi}
\newcommand{\usefootnote}[1]
    {% Check if footnote is defined
    \expandafter\ifx\csname footnote@#1\endcsname\relax
        % not yet defined, give warning?
        % always happens first time used, of course
        \expandafter\def\csname footnoteused@#1\endcsname{}%
    \else
        % Check if footnote has been used
        \expandafter\ifx\csname footnoteused@#1\endcsname\relax
            \footnote{\csname footnote@#1\endcsname}%
            \expandafter\def\csname footnoteused@#1\endcsname{}%
        \else
            \errmessage{Error: Footnote #1 used twice!}
        \fi
    \fi}
\makeatother

\begin{document}

text\usefootnote{label}.

This is the second occurrence\usefootnote{label}.

\definefootnote{label}{footnotetext}

\end{document}

相关内容