我想跟踪\AddRef
文档中的所有命令,然后一次处理它们,例如在文档中每个值一行打印它们。这似乎是可行的,因为功能与数字列表没有太大区别,但我似乎无法让它工作。我甚至没有尝试\foreach
文件末尾所需的命令,所以如果有人知道如何做到这一点,我将不胜感激。
\documentclass[12pt]{article}
\begin{document}
\newtoks{\Ref}
\newcommand{\AddRef}[1]{%
\let\OldRef=\the\Ref\relax
\let\Ref=\the\OldRef{#1}\relax
}
\AddRef{Ref 1}
\AddRef{Ref 2}
\AddRef{Ref 3}
The list of Ref are:
\the\Ref
\end{document}
最后,我想处理该列表,比如说一次打印一行:
参考文献 1
参考文献 2
参考文献 3
上面的原始问题要求此字符串列表是全局宏,以便它在文档末尾完整。另一个应用程序要求此字符串列表在某个范围内是本地的,因此本地版本也很有用。
答案1
\documentclass[12pt]{article}
\newcommand\AddRefList{}
\newcommand\AddRef[1]{\edef\AddRefList{\AddRefList#1\endgraf}}
\begin{document}
\AddRef{Ref 1}
\AddRef{Ref 2}
\AddRef{Ref 3}
The list of Ref are:
\AddRefList
\end{document}
答案2
不起作用\let\OldRef=\the\Ref
,因为\OldRef
只是 的副本\the
。还请注意,\Ref
这里代表 ,\toks<number>
使用 复制\let
只会让两个宏指向同一个标记寄存器。
您可以使用\g@addto@macro
宏来累积代码:
\def\Ref{}
\makeatletter
\newcommand{\AddRef}[1]{%
\g@addto@macro\Ref{{#1}}%
}
\makeatother
这重新定义了一个宏,其效率比使用令牌寄存器要低,但在您的情况下应该没问题。
而不是使用为了循环我只需将所需的宏添加为定义的一部分\Ref
,这样您只需使用宏即可。通过将此类代码写入外部文件来生成目录和图表列表。
答案3
如果你想要一个本地版本\g@addto@macro
而不使用新的令牌寄存器,你可以使用类似
\long\def\@addto@macro#1#2{%
\begingroup
\toks@\expandafter{#1#2}%
\expandafter\endgroup\expandafter
\edef\expandafter#1\expandafter{\the\toks@}%
}
这使用了临时寄存器\toks@
而不影响其现有内容,它基本上\g@addto@macro
只是使用\edef
而不是\xdef
并用一些额外的东西\expandafter
来补偿。