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も役に立ちません。「問題のある」部分を削除しても、}2 行前の中括弧が閉じられるため役に立ちません。

\tabular環境を環境に置き換えて\itemize(そして構文に合うように必要な変更を加えると)\item、コードは正常になります。

[...]
\begin{itemize}
  \foreach \n in \colourNames {
    \foreach [expand list=true] \m in {\colourNames} { \item \n, \m }
  }
\end{itemize}
[...]

おそらく、特殊な表形式の文字&やが//問題の原因です。しかし、もしそうなら、コンパイルが機能するようにそれらをエスケープするにはどうすればよいでしょうか? オプションとその長所と短所の詳細な説明とともに、問題を解決する最もエレガントな方法を示す優れたドキュメントはありますか?


注記:以下の「更新」セクションには、私が受け取ったコメントと回答の要約と追加情報が記載されています。私は現在、受け取った情報と手がかりを積極的に処理しています。処理が終わったら、David Carlisle の推奨に従って、「更新」セクションを整理して完了し、回答に移動します。

アップデート0: これまで役に立ったと思うもの:

  1. David Carlisle 氏のコメントは、エラーの原因を理解するのに役立ちました。
  2. Qrrbrbirlbel と pascal974 はどちらも LaTeX3 での解決策を示しています (チュートリアルへの参照が特に役立ちます)
  3. Steven B. Segletes の回答は、より簡単な解決策 (TeX トークンを使用) を提供しているようですが、それでも理解するには時間と調査が必要です。
  4. 全体として、これまでに提案された両方の解決策は良いように思われますが、私自身がさらに研究する必要があるため、元の問題を解決するためにどちらを選択するかはまだわかりません。

アップデート1: TeX トークンに慣れるのに役立つ優れたシリーズ:

  1. 新しい記事シリーズ: TeX トークンと関連概念 - なぜ (そしてどのように)?
  2. 「TeX トークン」とは何ですか?
  3. TeXトークンリストとは何か

上記のシリーズを読んでいるときに役に立つと思ったその他の参考資料:

  1. トークン拡張の場合:\newtoks とトークンリストに関する不可解なこと

アップデート2: 3 番目の回答 (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

OpTeX を使用している場合、\foreach内部では問題はありません\table

\def\colourNames{red, green, blue}
\table{cc}{
   \ea\foreach \colourNames, \do#1, {%
      \ea\foreach \colourNames, \do##1, {#1 & ##1 \cr}
   }
}
\bye

関連情報