我在尾注和宏方面遇到以下问题。代码如下:
\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
在调用\endnote
using之前扩展参数\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}
我不确定我使用可选参数的方法是否常见,所以请随意发表评论!