LaTeX gibt einen Fehler aus, wenn eine Schleife in einer tabellarischen Umgebung ausgeführt wird

LaTeX gibt einen Fehler aus, wenn eine Schleife in einer tabellarischen Umgebung ausgeführt wird
  • Verwendetes Paket: pgffor
  • Vom Paket verwendete Funktion: foreach
  • Zusammengestellt mit: Latex

das minimierte Dokument:

\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}

der Fehler, den ich erhalte:

! Extra }, or forgotten \endgroup.
<template> \unskip \hfil }
                          \hskip \tabcolsep \endtemplate 
l.11   }
        
? 
! Emergency stop.
<template> \unskip \hfil }
                          \hskip \tabcolsep \endtemplate 
l.11   }

Das Hinzufügen \endgrouphilft nicht. Das Löschen des „Anstößigen“ }würde nicht helfen, da es die Klammer in den beiden Zeilen davor schließt.

Wenn ich die \tabularUmgebung durch eine \itemizeUmgebung ersetze (und die notwendigen Änderungen vornehme, damit sie der \itemSyntax entspricht), ist der Code in Ordnung.

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

Höchstwahrscheinlich verursachen die speziellen Tabellenzeichen &und/oder //das Problem. Aber wenn ja, wie können sie maskiert werden, damit die Kompilierung funktioniert? Gibt es eine gute Dokumentation, die den elegantesten Weg zur Lösung des Problems zeigt, mit einer ausführlichen Erklärung der Optionen und ihrer Vor- und Nachteile?


Notiz:Der Abschnitt „Update“ weiter unten enthält eine Zusammenfassung und zusätzliche Informationen zu den Kommentaren und Antworten, die ich erhalten habe. Ich verarbeite die erhaltenen Informationen und Hinweise noch aktiv. Wenn ich fertig bin, werde ich den Abschnitt „Update“ bereinigen, vervollständigen und in eine Antwort verschieben, wie von David Carlisle empfohlen.

Aktualisierung 0: was ich bisher hilfreich fand:

  1. Der Kommentar von David Carlisle half dabei, die Fehlerursache zu verstehen.
  2. Sowohl Qrrbrbirlbel als auch pascal974 weisen auf eine Lösung in LaTeX3 hin (ein Verweis auf das Tutorial wird besonders nützlich sein)
  3. Die Antwort von Steven B. Segletes scheint eine einfachere Lösung zu bieten (unter Verwendung von TeX-Tokens), aber selbst dafür brauche ich etwas Zeit und Recherche, um es zu verstehen.
  4. Alles in allem scheinen mir beide bisher vorgeschlagenen Lösungen gut zu sein und müssen noch weiter untersucht werden, daher weiß ich noch nicht, welche ich zur Lösung des ursprünglichen Problems auswählen werde.

Aktualisierung 1: Eine gute Serie zum Einstieg mit TeX-Tokens:

  1. Eine neue Artikelserie: TeX-Token und verwandte Konzepte – aber warum (und wie)?
  2. Was ist ein „TeX-Token“?
  3. Was ist eine TeX-Token-Liste?

Einige weitere Referenzen, die ich beim Lesen der obigen Serie nützlich fand:

  1. zur Token-Erweiterung:Das Rätselhafte an \newtoks und der Tokenliste

Aktualisierung 2: Die dritte Lösung (mit OpTeX) ist die einfachste, führt aber in ein Paralleluniversum (aus LaTeX-Sicht). Sie ist äußerst nützlich für diejenigen, die gerade erst anfangen und nicht vorhaben, LaTeX-Funktionen zu verwenden.OpTeX-Paketdokumentationist ausgezeichnet.

Aktualisierung 3: Wie sich herausstellte, war die LaTeX3-Lösung einfacher und schneller zu erweitern, um das ursprüngliche Problem zu lösen, aus dem das Minimalbeispiel extrahiert wurde. Sie akzeptiert einfacher eine zusätzliche benutzerdefinierte Funktion in der Tabelle. Aus diesem Grund steht dort das grüne Häkchen.

Aktualisierung 4: Die Möglichkeit, eine neue Antwort hinzuzufügen, wurde leider blockiert. Die verlinkte etoolboxLösung leidet unter dem gleichen Problem wie dieTeX-TokenLösung. Das Hinzufügen eines benutzerdefinierten Befehls kann es zerstören. Daher scheint die LaTeX3-Option immer noch die sicherste Lösung zu sein. (Ungeachtet dessen, als Referenz:etoolbox Paketdokumentation)

Antwort1

Mit expl3 die Dokumentation: interface3 usrguideund ein Tutorialhttps://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}

Bildbeschreibung hier eingeben

Antwort2

Verwenden Sie die \foreachSchleife, um die Token einzusammeln. Geben Sie sie dann alle auf einmal im Inneren wieder frei 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}

Bildbeschreibung hier eingeben

Antwort3

Wenn wir OpTeX verwenden, haben wir keine Probleme \foreachmit \table:

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

verwandte Informationen