如何保存字符串的运行列表,然后逐个处理它们

如何保存字符串的运行列表,然后逐个处理它们

我想跟踪\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来补偿。

相关内容