\iffalse incompleto con \pgfmathsetmacro

\iffalse incompleto con \pgfmathsetmacro

Quiero generar una tabla con el \foreachcomando de manera que las entradas de la tabla dependan de la fila y columna. Quería probar el siguiente código:

\documentclass{article}
\usepackage{pgffor,etoolbox}   
\newcommand*\tas[2]{
\pgfmathsetmacro{\sat}{#1+#2}
\sat
}    
\newcommand*\mytablecontents{}
\foreach \i in {1,...,7}{
\foreach \j in {1,...,7}{
    \xappto\mytablecontents{\tas{\i}{\j}}
    \gappto\mytablecontents{&}
  }
  \gappto\mytablecontents{\\}
}    
\begin{document}    
\begin{tabular}{c|cc|ccc|cc}
  \mytablecontents
\end{tabular}   
\end{document}

Esto da el error "Incompleto \iffalse". Leí que el motivo de este error es el uso de \pgfmathsetmacro. ¿Alguien sabe cómo manejar esto?

Respuesta1

\pgfmathsetmacrono es ampliable, por lo que no se “evalúa” en un \edef(que es lo que \xapptohace, en la variante \xdef).

Primero puede calcular la suma, almacenarla en una macro y luego agregar la versión ampliada:

\documentclass{article}
\usepackage{pgffor,etoolbox}

\newcommand*\tas[2]{%
  \pgfmathsetmacro{\sat}{#1+#2}%
}
\newcommand*\mytablecontents{}
\foreach \i in {1,...,7}{%
\foreach \j in {1,...,7}{%
    \tas{\i}{\j}%
    \xappto\mytablecontents{\sat &}
  }%
  \gappto\mytablecontents{\\}
}

\begin{document}

\begin{tabular}{c|cc|ccc|cc}
  \mytablecontents
\end{tabular}

\end{document}

ingrese la descripción de la imagen aquí

Alternativamente, puedes usar aritmética expandible: expl3proporciona, con xfpy \fpeval:

\documentclass{article}
\usepackage{pgffor,etoolbox,xfp}

\newcommand*\mytablecontents{}
\foreach \i in {1,...,7}{%
\foreach \j in {1,...,7}{%
    \xappto\mytablecontents{\fpeval{\i+\j}&}
  }%
  \gappto\mytablecontents{\\}
}

\begin{document}

\begin{tabular}{c|cc|ccc|cc}
  \mytablecontents
\end{tabular}

\end{document}

ingrese la descripción de la imagen aquí

Solo para mostrar las capacidades (aunque no todas las cubiertas pgfmathestán disponibles), si cambia la \xapptollamada a

\xappto\mytablecontents{\fpeval{round(\i*sqrt(\j),2)}&}

la salida sería

ingrese la descripción de la imagen aquí

El mismo resultado con expl3el código completo:

\documentclass{article}
\usepackage{expl3}

\ExplSyntaxOn
\tl_clear:N \l_tmpa_tl
\int_step_inline:nnnn { 1 } { 1 } { 7 }
 { % outer cycle: #1
  \int_step_inline:nnnn { 1 } { 1 } { 7 }
   { % inner cycle: ##1
    \tl_put_right:Nx \l_tmpa_tl { \fp_eval:n {round(#1*sqrt(##1),2)} & }
   }
  \tl_put_right:Nn \l_tmpa_tl { \\ }
 }
\tl_set_eq:NN \mytablecontents \l_tmpa_tl
\ExplSyntaxOff

\begin{document}    

\begin{tabular}{c|cc|ccc|cc}
  \mytablecontents
\end{tabular}   

\end{document}

Tenga en cuenta que \tl_put_right:Nxes el análogo de \eappto( xsignifica eXpanded) y \tl_put_right:Nnes el análogo de \appto. No se necesitan definiciones globales, ya que \int_step_inline:nnnnno utiliza agrupación de ciclos: el índice actual está disponible directamente como #1(o ##1en el bucle interno).

Respuesta2

Para evitar usar eso newcommand, puedes calcular el mismo resultado usando la opción [evaluate = \j as \c using int(\i+\j)]del \foreachbucle interno.

\documentclass{article}
\usepackage{pgffor,etoolbox}

\newcommand*\mytablecontents{}
\foreach \i in {0,...,7}{
  \foreach \j [evaluate = \j as \c using int(\i+\j)] in {0,...,7}{
    \xappto\mytablecontents{\c}
    \gappto\mytablecontents{&}
  }
  \gappto\mytablecontents{\\}
}

\begin{document}

\begin{tabular}{c|cc|ccc|cc}
  \mytablecontents
\end{tabular}

\end{document}

ingrese la descripción de la imagen aquí

También puedes usar:

\newcommand*\mytablecontents{}
\foreach \i in {0,...,7}{
  \foreach \j in {0,...,7}{
    \pgfmathtruncatemacro\c{\i+\j}
    \xappto\mytablecontents{\c}
    \gappto\mytablecontents{&}
  }
  \gappto\mytablecontents{\\}%
}

Respuesta3

Su ejecución de

\xappto\mytablecontents{\tas{\i}{\j}}

Se supone que \tas{.}{.}es ampliable. Sin embargo, dado que contiene una asignación ( \pgfmathsetmacro), no lo es. Por lo tanto, primero tendrás que evaluar (expandir) la expresión antes de incluirla como parte de tu appendage a \mytablecontents. Dado que la expresión es bastante sencilla (la suma de dos números), puedes usar \number\numexpr#1+#2:

ingrese la descripción de la imagen aquí

\documentclass{article}

\usepackage{pgffor,etoolbox}

\newcommand*\tas[2]{%
  \number\numexpr#1+#2\relax
}

\newcommand*\mytablecontents{}
\foreach \i in {1,...,7}{
  \foreach \j in {1,...,7}{
    \xappto\mytablecontents{\tas{\i}{\j}}
    \gappto\mytablecontents{&}
  }
  \gappto\mytablecontents{\\}
}

\begin{document}

\begin{tabular}{c|cc|ccc|cc}
  \mytablecontents
\end{tabular}

\end{document}

El cálculo ampliable es fácilmente posible a través de la interfaz LaTeX2e \fp_evaldesde LaTeX3 en elxfppaquete:

\usepackage{pgffor,xfp,etoolbox}

\newcommand*\mytablecontents{}
\foreach \i in {1,...,7}{
  \foreach \j in {1,...,7}{
    \xappto\mytablecontents{\fpeval{\i+\j}}
    \gappto\mytablecontents{&}
  }
  \gappto\mytablecontents{\\}
}

información relacionada