定義列表變數

定義列表變數

我正在使用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}

相關內容