答案1
语法\@for
是
\@for\cs:=<list>\do{<code>}
这<list>
是一个以逗号分隔的标记列表,或者是一个扩展到此类列表的宏。
因此,调用
\@for\next:=abc, def, gh ,ij\do{<code>}
和
\def\mylist{abc, def, gh ,ij}
\@for\next:=\mylist\do{<code>}
是等价的。请注意,LaTeX 并没有真正区分这两种情况:它只是做了一个\expandafter
,所以这两种情况是完全等价的仅有的如果显式列表(第一种情况)以不可扩展的标记开头。如果不能确定这一点,最好遵循第二种路径。
该宏将循环遍历列表,主要执行
\def\next{abc}<code>
\def\next{def}<code>
\def\next{gh }<code>
\def\next{ij}<code>
其中 用来<code>
对 进行处理\next
。通常使用\next
或其他临时控制序列:重要的是要意识到 在每个步骤中它都会被重新定义。
还要注意,\@for
不会删除前导或尾随空格;这可以通过使用\show\next
来证明<code>
,得到
> \next=macro:
->abc.
> \next=macro:
-> def.
> \next=macro:
-> gh .
> \next=macro:
->ij.
来自内核的一个例子:
\DeclareRobustCommand\cite{%
\@ifnextchar [{\@tempswatrue\@citex}{\@tempswafalse\@citex[]}}
\def\@citex[#1]#2{\leavevmode
\let\@citea\@empty
\@cite{\@for\@citeb:=#2\do
{\@citea\def\@citea{,\penalty\@m\ }%
\edef\@citeb{\expandafter\@firstofone\@citeb\@empty}%
\if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi
\@ifundefined{b@\@citeb}{\hbox{\reset@font\bfseries ?}%
\G@refundefinedtrue
\@latex@warning
{Citation `\@citeb' on page \thepage \space undefined}}%
{\@cite@ofmt{\csname b@\@citeb\endcsname}}}}{#1}}
\def\@cite#1#2{[{#1\if@tempswa , #2\fi}]}
这里\cite
将控制权传递给\@citex
;然后将强制参数通过\@for
循环传递,用于排版引用列表。
答案2
您提到的命令\@for
是内部 LaTeX 命令。我不知道是否有关于它的详细文档。
您链接到的 Wikibooks 页面是关于排版算法,所以不是你想要的。
我建议使用包电子工具箱.请参阅手册第 3.7 节(列表处理)以获取文档。