@for-Schleifenvariablenname wird anstelle von Inhalt in einer Tabulatorumgebung gedruckt

@for-Schleifenvariablenname wird anstelle von Inhalt in einer Tabulatorumgebung gedruckt

Ich versuche, mithilfe der tabbingUmgebung und einer @forSchleife automatisch einige eingerückte Zeilen zu generieren. Aus irgendeinem Grund führt dies dazu, dass die For-Schleife immer wieder den Namen der Iterationsvariable ausgibt und nicht den Inhalt. Was mache ich falsch?

MWE:

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

Antwort1

Tabellenzellen erstellen Gruppen, sodass jede nicht globale Zuweisung verloren geht, wenn TeX zu einer anderen Zelle wechselt (hier, wenn Sie verwenden, \>um zur nächsten Spalte oder \\zur nächsten Zeile zu wechseln). \@forführt eine lokale Zuweisung an die Schleifenvariable durch, sodass sie natürlich verloren geht, wenn die Tabellenzelle endet. Sie sehen, dass der „Name“ der Schleifenvariable gedruckt wird, weil Sie gewählt haben \ij, dessen Standarddefinition den niederländischen Digraphen „ij“ druckt. Wenn Sie verwendet hätten \ii(oder irgendetwas, das nicht definiert ist), würden Sie eine Fehlermeldung erhalten.

Wenn die Schleifenvariable das allererste Element nach dem ist \>, können Sie schummeln und die Schleifenvariable erweitern, bevor die Tabellenzelle mit endet \expandafter. Dies funktioniert (ohne Anpassung) nicht, wenn vor der Schleifenvariable etwas steht:

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

Sie können der Tabellenzelle auch eine globale Variable zuweisen. Anschließend können Sie die globale Variable an einer beliebigen Stelle erscheinen lassen.

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

Ich würde jedoch empfehlen, eine Schleifenfunktion zu verwenden, die keine Schleifenvariable verwendet. Zum Beispiel expl3's \clist_map_inline:nn(hier umbenannt in \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}

Das erste Argument ist die zu iterierende Liste und das zweite ist der bei jeder Iteration auszuführende Code, in dem #1sich das aktuelle Element befindet (oder das Sie innerhalb einer Definition ##1verwenden ).\ListLoop

verwandte Informationen