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