我正在嘗試使用tabbing
環境和@for
循環自動生成一些縮進線。由於某種原因,這會導致 for 迴圈一遍又一遍地列印迭代變數的名稱而不是內容。我究竟做錯了什麼?
微量元素:
\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}
第一個參數是要迭代的列表,第二個參數是每次迭代時執行的程式碼,其中#1
是當前項目(或您在定義中##1
使用的項目)。\ListLoop