タブ環境では内容ではなく@forループ変数名が出力される

タブ環境では内容ではなく@forループ変数名が出力される

tabbing環境とループを使用して、インデントされた行を自動的に生成しようとしています@for。何らかの理由で、for ループは内容ではなく、反復変数の名前を繰り返し出力します。何が間違っているのでしょうか?

MWE:

\documentclass{article}
\begin{document}
\begin{tabbing}
a \= b\\
\> c\\
\makeatletter
\@for\ij:=abc,def\do{\>\ij{}\\}
\makeatother
\end{tabbing}
\end{document}

答え1

表のセルはグループを作成するので、TeX が別のセルに移動すると (ここでは、\>次の列または\\次の行に移動するために を使用するとき)、非グローバル割り当ては失われます。 は \@forループ変数にローカル割り当てを行うので、表のセルが終了すると当然失われます。 を選択したため、ループ変数の「名前」が印刷されます\ij。 の標準定義では、オランダ語の二重音字「ij」が印刷されます。 (または定義されていないもの) を使用した場合は、\iiエラーが発生します。

ループ変数が の直後にある場合は\>、テーブル セルが で終わる前にループ変数を展開するというごまかしができます\expandafter。ループ変数の前に何かある場合は、(適応なしでは) 機能しません。

\@for\ii:=abc,def\do{\expandafter\>\ii{}\\}

テーブル セルを終了する前にグローバル変数を割り当てることもできます。これにより、グローバル変数をどこにでも表示できるようになります。

\@for\ii:=abc,def\do{\global\let\jj=\ii  \> something \jj{}\\}

ただし、ループ変数を使用しないループ関数を使用することをお勧めします。たとえば、expl3's \clist_map_inline:nn(ここでは に名前が変更されています\ListLoop)。

\documentclass{article}
\ExplSyntaxOn
\cs_new_eq:NN \ListLoop \clist_map_inline:nn
\ExplSyntaxOff
\begin{document}
\begin{tabbing}
a \= b\\
\> c\\
\ListLoop{abc,def}{\>#1\\}
\end{tabbing}
\end{document}

最初の引数は反復するリストであり、2 番目の引数は各反復で実行されるコードであり、その中の#1現在の項目 (または定義内で##1使用している項目) です。\ListLoop

関連情報