![定義列表變數](https://rvso.com/image/309876/%E5%AE%9A%E7%BE%A9%E5%88%97%E8%A1%A8%E8%AE%8A%E6%95%B8.png)
我正在使用etoolbox
列表處理,特別是\forcsvlist
.
當逗號分隔的清單直接傳遞給 時\forcsvlist
,它能夠解析清單中的每個項目。但是,如果我在其他地方定義列表變量,則\forcsvlist
無法區分列表中的每一項,並將其作為一個整體參數。
例如:
\newcommand\doforme[1]{#1 \\}
\forcsvlist\doforme{a,b,c}
上面的程式碼可以完美地在每個項目的末尾添加換行符。但下面的程式碼不起作用
\newcommand\doforme[1]{#1 \\}
\def\@authors{a,b,c}
\forcsvlist\doforme{\@authors}
這讓我覺得一定有其他方法可以定義\forcsvlist
可以解釋的清單。
答案1
使用變數形式的問題是其早期的擴展,然後將整體視為a,b,c
一個實體。我所說的一個實體是指列表中唯一的單一元素。
為了解決這個問題,首先我們需要在這裡使用雙括號。所以{a,b,c}
就變成了{{a,b,c}}
,原因將在本答案結束時變得清晰。
\expandafter
原語擴展了下一個參數之後給予它的參數。例如,如果存在\def\foo{A}, \def\bar{B}
和\expandafter\foo\bar
,那麼它首先會變成\foo B
,然後最終變成AB
。
同樣,我可以像這樣解決上述問題:
noindent\expandafter\forcsvlist\expandafter\doforme\authors
如果我們看一下上面的遞歸表達式,第一個expandafter轉到它的第一個參數(\forcsvlist),跳過它一段時間,然後嘗試擴展它旁邊的參數,在本例中是再次\expandafter
。因此,第二個\expandafter
再次跳過\doforme
一段時間,然後將其擴展\authors.
\authors
為 current {{a,b,c}}
。展開後就變成了{a,b,c}
。所以最終的表達式現在變成
\noident\forcsvlist\doforme{a,b,c}
這相當於像問題中的第一種情況一樣傳遞參數,因此產生相同的結果。
答案2
該套件etoolbox
定義了一個特殊的命令來處理內部列表:\forlistloop
.這些列表使用特殊字元作為內部列表分隔符號。所以你必須使用\listadd
(或類似的命令 - 請參閱etoolbox
文件) 將項目新增至此類清單。
\documentclass{article}
\usepackage{etoolbox}
\begin{document}
\newcommand\doforme[1]{#1 \\}
\forcsvlist{\listadd\authors}{a,b,c}
\noindent\forlistloop\doforme{\authors}
\end{document}