![\iffalse incompleto con \pgfmathsetmacro](https://rvso.com/image/353034/%5Ciffalse%20incompleto%20con%20%5Cpgfmathsetmacro.png)
Quiero generar una tabla con el \foreach
comando 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
\pgfmathsetmacro
no es ampliable, por lo que no se “evalúa” en un \edef
(que es lo que \xappto
hace, 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}
Alternativamente, puedes usar aritmética expandible: expl3
proporciona, con xfp
y \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}
Solo para mostrar las capacidades (aunque no todas las cubiertas pgfmath
están disponibles), si cambia la \xappto
llamada a
\xappto\mytablecontents{\fpeval{round(\i*sqrt(\j),2)}&}
la salida sería
El mismo resultado con expl3
el 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:Nx
es el análogo de \eappto
( x
significa eXpanded) y \tl_put_right:Nn
es el análogo de \appto
. No se necesitan definiciones globales, ya que \int_step_inline:nnnn
no utiliza agrupación de ciclos: el índice actual está disponible directamente como #1
(o ##1
en 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 \foreach
bucle 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}
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 app
endage a \mytablecontents
. Dado que la expresión es bastante sencilla (la suma de dos números), puedes usar \number\numexpr#1+#2
:
\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_eval
desde LaTeX3 en elxfp
paquete:
\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{\\}
}