- 使用的軟體套件:pgffor
- 包中使用的函數:foreach
- 編譯:乳膠
最小化文檔:
\documentclass[a4paper]{article}
\usepackage{pgffor}
\begin{document}
\def\colourNames{red, green, blue}
\begin{tabular}{cc}
\foreach \n in \colourNames {
\foreach [expand list=true] \m in {\colourNames} { \n & \m \\ }
}
\end{tabular}
\end{document}
我收到的錯誤:
! Extra }, or forgotten \endgroup.
<template> \unskip \hfil }
\hskip \tabcolsep \endtemplate
l.11 }
?
! Emergency stop.
<template> \unskip \hfil }
\hskip \tabcolsep \endtemplate
l.11 }
添加\endgroup
沒有幫助。刪除“有問題的”}
不會有幫助,因為它確實關閉了之前兩行的大括號。
如果我用\tabular
一個環境替換該環境\itemize
(並進行必要的更改以適應\item
語法,那麼程式碼就可以了。
[...]
\begin{itemize}
\foreach \n in \colourNames {
\foreach [expand list=true] \m in {\colourNames} { \item \n, \m }
}
\end{itemize}
[...]
最有可能的是,特殊的表格字元&
和/或//
導致了問題。但如果是這樣,如何轉義它們以使編譯正常進行?是否有任何好的文件可以展示解決問題的最優雅的方法,並深入解釋選項及其優缺點?
筆記:下面的「更新」部分包含我收到的評論和答案的摘要和附加資訊。我仍在積極處理收到的訊息和線索。完成後,我將按照大衛·卡萊爾的建議清理、完成並將「更新」部分移至答案中。
更新0: 到目前為止我發現有用的:
- 大衛卡萊爾的評論有助於理解導致錯誤的原因。
- Qrrbrbirlbel 和 pascal974 都指出了 LaTeX3 中的解決方案(參考教程將特別有用)
- Steven B. Segletes 的答案似乎提供了一個更簡單的解決方案(使用 TeX 令牌),但即使如此,我也需要一些時間和研究來理解。
- 總而言之:到目前為止提出的兩個解決方案似乎都不錯,需要我進一步研究,所以我還不知道在解決原始問題時我會選擇哪一個。
更新1: 幫助熟悉 TeX 令牌的好系列:
在閱讀上述系列文章時,我發現一些進一步的參考資料很有用:
- 對於令牌擴充:關於 \newtoks 和令牌列表的令人困惑的事情
更新2: 第三個答案(使用 OpTeX)是最簡單的,但它導致了一個平行宇宙(從 LaTeX 的角度來看)。對於那些剛開始並且不打算使用 LaTeX 功能的人來說,它非常有用。OpTeX 套件文檔非常好。
更新3: 事實證明,LaTeX3 解決方案能夠更容易、最快地擴展以解決原始問題,並從中提取最小的範例。它接受更容易插入表中的附加使用者定義函數。所以,這就是綠色勾號出現在那裡的原因。
更新4:
不幸的是,添加新答案的機會已被阻止。連結的etoolbox
解決方案受到與TeX 代幣解決方案。在裡面添加用戶定義的命令可以殺死它。因此,LaTeX3 選項似乎仍然是最安全的解決方案。 (無論如何,供參考:etoolbox 包文檔)
答案1
使用 expl3,文件:interface3
usrguide
和教程https://www.alanshawn.com/latex3-tutorial/
\documentclass[a4paper]{article}
%https://tex.stackexchange.com/questions/706767/latex-gives-error-when-looping-in-tabular-environment
\ExplSyntaxOn
%\<scope>_<module>_<description>_<type>
\seq_new:N \l_Tibor_listcolor_seq
\tl_new:N \l_Tibor_rowtab_tl
\NewDocumentCommand{\mytab}{ m }
{
\tl_clear:N \l_Tibor_rowtab_tl
\seq_set_from_clist:NN \l_Tibor_listcolor_seq #1
\seq_map_inline:Nn \l_Tibor_listcolor_seq
{
\seq_map_inline:Nn \l_Tibor_listcolor_seq
{
\tl_put_right:Nn \l_Tibor_rowtab_tl {##1 & ####1\\}
}
}
\l_Tibor_rowtab_tl
}
\ExplSyntaxOff
\begin{document}
\def\colourNames{red, green, blue}
\begin{tabular}{| c | c |}
\mytab{\colourNames}
\end{tabular}
\end{document}
答案2
使用\foreach
循環收集令牌;然後,將它們一次全部吐入tabular
.
\documentclass[a4paper]{article}
\usepackage{pgffor}
\newtoks\mytoks
\newcommand\addtomytoks[1]{\global\mytoks\expandafter{\the\mytoks#1}}
\newcommand\xaddtomytoks[1]{\expandafter\addtomytoks\expandafter{#1}}
\begin{document}
\def\colourNames{red, green, blue}
\mytoks{}%
\foreach \n in \colourNames {%
\foreach [expand list=true] \m in {\colourNames} { %
\xaddtomytoks{\n &}\xaddtomytoks{\m \\} }%
}%
\begin{tabular}{cc}
\the\mytoks
\end{tabular}
\end{document}
答案3
\foreach
當我們使用 OpTeX 時,內部沒有問題\table
:
\def\colourNames{red, green, blue}
\table{cc}{
\ea\foreach \colourNames, \do#1, {%
\ea\foreach \colourNames, \do##1, {#1 & ##1 \cr}
}
}
\bye