尾注和宏的问题

尾注和宏的问题

我在尾注和宏方面遇到以下问题。代码如下:

\documentclass{article}

\usepackage{endnotes}

\begin{document}

\def\tmp{yellow}
yellow\endnote{\tmp}

\def\tmp{blue}
blue\endnote{\tmp}

\theendnotes

\end{document}

输出为:在此处输入图片描述

换句话说,/tmp 的第二个定义会删除第一个尾注的内容。这是由尾注处理宏和生成 .ent 文件的方式造成的:

\@doanenote {1}
macro:->\tmp

\@endanenote 
\@doanenote {2}
macro:->\tmp

\@endanenote 

有办法解决这个问题吗?我有一个相当复杂的 tex 应用程序,其中 endnote 内容是在运行时从数据库(使用包 datatool)组装的,我无法避免使用宏。但是内容相当简单,由简单的文本组成,没有什么花哨的。我想将这个简单的文本传递给 \endnote{},而不是用于生成它的宏,但我不知所措。如果答案有点琐碎,请原谅。

答案1

您可以\tmp在调用\endnoteusing之前扩展参数\expandafter。此宏会在下一个标记之后扩展标记。花括号 ( {) 算作一个标记,因此在这种情况下您需要两个\expandafter宏,一个用于跳过\endnote,另一个用于跳过花括号。

梅威瑟:

\documentclass{article}

\usepackage{endnotes}

\begin{document}

\def\tmp{yellow}
yellow\expandafter\endnote\expandafter{\tmp}

\def\tmp{blue}
blue\expandafter\endnote\expandafter{\tmp}

\theendnotes

\end{document}

结果:

在此处输入图片描述

答案2

我最近遇到了同样的问题,但我也需要\endnote识别可选参数。

这是我的解决方案,扩展了 Marijn 的答案:

\documentclass{article}

% redefine \endnote
\usepackage{endnotes}
\let\eendnote\endnote % original \endnote
\renewcommand{\endnote}[2][]{%
    \def\optarg{#1}%
    \edef\etext{#2}% 
    \ifx\optarg\empty%
        \let\enote\eendnote%
    \else%
        \edef\enote{\noexpand\eendnote[#1]}%
    \fi%
    \expandafter\enote\expandafter{\etext}%
}

\begin{document}

\def\tmp{yellow}
Yellow\endnote{This is \tmp.}\par
\def\tmp{blue}
Blue\endnote{This is \detokenize{\textit}{\tmp} and more \tmp.}\par
\def\tmp{green}
Green\endnote[10]{\tmp\ at last.}\par

\theendnotes

\end{document}

我不确定我使用可选参数的方法是否常见,所以请随意发表评论!

相关内容