LaTeX for 循环 \@for

LaTeX for 循环 \@for

在 user700902 的回答中此主题,使用带有语法的 for 循环\@for。这个语法是如何工作的?我尝试在其他网站上搜索有关 for 循环的信息,但我只能找到类似这一页,其语法有所不同。

答案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 节(列表处理)以获取文档。

相关内容