LaTeX da error al realizar un bucle en un entorno tabular

LaTeX da error al realizar un bucle en un entorno tabular
  • Paquete utilizado: pgffor
  • Función utilizada del paquete: foreach
  • Compilado con: látex

el documento minimizado:

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

el error que recibo:

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

agregar \endgroupno ayuda. Eliminar el "infractor" }no ayudaría, ya que cierra la llave en dos líneas antes.

Si reemplazo el \tabularentorno con un \itemizeentorno (y hago los cambios necesarios para ajustarse a la \itemsintaxis, el código está bien.

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

Lo más probable es que los caracteres tabulares especiales &sean //la causa del problema. Pero si es así, ¿cómo se pueden escapar para que la compilación funcione? ¿Existe alguna buena documentación que muestre la forma más elegante de resolver el problema, con una explicación detallada de las opciones y sus pros y contras?


Nota:La sección "actualización" a continuación tiene un resumen e información adicional sobre los comentarios y respuestas que he recibido. Todavía estoy procesando activamente la información y los clientes potenciales que he recibido. Cuando termine, aclararé, completaré y trasladaré la sección "actualizar" a una respuesta según lo recomendado por David Carlisle.

actualización 0: lo que encontré útil hasta ahora:

  1. El comentario de David Carlisle ayudó a comprender qué causó el error.
  2. Tanto Qrrbrbirlbel como pascal974 apuntan a una solución en LaTeX3 (la referencia al tutorial será especialmente útil)
  3. La respuesta de Steven B. Segletes parece ofrecer una solución más simple (usando tokens TeX), pero incluso para eso, necesito algo de tiempo e investigación para comprenderlo.
  4. Considerándolo todo: ambas soluciones sugeridas hasta ahora parecen buenas y necesitan más estudio por mi parte, por lo que todavía no sé cuál elegiré para resolver el problema original.

actualización 1: Una buena serie para ayudar a familiarizarse con los tokens TeX:

  1. Una nueva serie de artículos: tokens TeX y conceptos relacionados, pero ¿por qué (y cómo)?
  2. ¿Qué es un "token TeX"?
  3. ¿Qué es una lista de tokens TeX?

¿Alguna referencia adicional que encontré útil mientras leía la serie anterior:

  1. para expansión de tokens:Lo desconcertante de \newtoks y la lista de tokens

actualización 2: La tercera respuesta (usando OpTeX) es la más simple pero conduce a un universo paralelo (desde el punto de vista de LaTeX). Es extremadamente útil para aquellos que recién están comenzando y no planean utilizar las funciones de LaTeX.Documentación del paquete OpTeXes excelente.

actualización 3: Resulta que la solución LaTeX3 fue la más fácil y rápida de expandir para abordar el problema original, del cual se extrajo el ejemplo mínimo. Acepta una función adicional definida por el usuario más fácilmente en la tabla. Por eso la marca verde va ahí.

actualización 4: Desafortunadamente, la oportunidad de agregar una nueva respuesta ha sido bloqueada. La solución vinculada etoolboxestá plagada del mismo problema que laficha de textosolución. Agregar un comando definido por el usuario en su interior puede eliminarlo. Por lo tanto, sigue siendo la opción LaTeX3 la que parece ser la solución más segura. (Independientemente, como referencia:Documentación del paquete etoolbox)

Respuesta1

Con expl3, la documentación: interface3 usrguidey un tutorial.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}

ingrese la descripción de la imagen aquí

Respuesta2

Utilice el \foreachbucle para recoger las fichas; luego, regurgitarlos todos a la vez dentro del 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}

ingrese la descripción de la imagen aquí

Respuesta3

Cuando usamos OpTeX, no tenemos problemas con \foreachel interior \table:

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

información relacionada