在表格環境中循環時,LaTeX 會出錯

在表格環境中循環時,LaTeX 會出錯
  • 使用的軟體套件: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: 到目前為止我發現有用的:

  1. 大衛卡萊爾的評論有助於理解導致錯誤的原因。
  2. Qrrbrbirlbel 和 pascal974 都指出了 LaTeX3 中的解決方案(參考教程將特別有用)
  3. Steven B. Segletes 的答案似乎提供了一個更簡單的解決方案(使用 TeX 令牌),但即使如此,我也需要一些時間和研究來理解。
  4. 總而言之:到目前為止提出的兩個解決方案似乎都不錯,需要我進一步研究,所以我還不知道在解決原始問題時我會選擇哪一個。

更新1: 幫助熟悉 TeX 令牌的好系列:

  1. 新系列文章:TeX 代幣和相關概念 — 但為什麼(以及如何)?
  2. 什麼是「TeX 代幣」?
  3. 什麼是 TeX 令牌列表

在閱讀上述系列文章時,我發現一些進一步的參考資料很有用:

  1. 對於令牌擴充:關於 \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

相關內容