![Unvollständiges \iffalse mit \pgfmathsetmacro](https://rvso.com/image/353034/Unvollst%C3%A4ndiges%20%5Ciffalse%20mit%20%5Cpgfmathsetmacro.png)
Ich möchte mit dem Befehl eine Tabelle so erzeugen, \foreach
dass die Einträge der Tabelle zeilen- und spaltenabhängig sind. Dazu wollte ich folgenden Code testen:
\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}
Dies führt zu dem Fehler „Unvollständiges \iffalse“. Ich habe gelesen, dass der Grund für diesen Fehler die Verwendung von ist \pgfmathsetmacro
. Weiß jemand, wie man damit umgeht?
Antwort1
\pgfmathsetmacro
ist nicht erweiterbar und wird daher in einem nicht „ausgewertet“ \edef
(was \xappto
in der Variante der Fall ist \xdef
).
Sie können zuerst die Summe berechnen, sie in einem Makro speichern und dann die erweiterte Version anhängen:
\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}
Alternativ können Sie die erweiterbare Arithmetik verwenden: expl3
bietet sie mit xfp
und an \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}
Nur um die Möglichkeiten zu zeigen (es sind allerdings nicht alle von abgedeckten Möglichkeiten pgfmath
verfügbar), ändern Sie den \xappto
Aufruf in
\xappto\mytablecontents{\fpeval{round(\i*sqrt(\j),2)}&}
Die Ausgabe wäre
Dasselbe Ergebnis mit vollständigem expl3
Code:
\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}
Beachten Sie, dass dies \tl_put_right:Nx
das Analogon von \eappto
( x
steht für eXpanded) und \tl_put_right:Nn
ist das Analogon zu \appto
. Keine Notwendigkeit für globale Definitionen, da \int_step_inline:nnnn
keine Gruppierung von Zyklen verwendet wird: Der aktuelle Index ist direkt verfügbar als #1
(oder ##1
in der inneren Schleife).
Antwort2
Um dies zu vermeiden newcommand
, können Sie dasselbe Ergebnis mit der Option [evaluate = \j as \c using int(\i+\j)]
der inneren \foreach
Schleife berechnen.
\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}
Sie können auch Folgendes verwenden:
\newcommand*\mytablecontents{}
\foreach \i in {0,...,7}{
\foreach \j in {0,...,7}{
\pgfmathtruncatemacro\c{\i+\j}
\xappto\mytablecontents{\c}
\gappto\mytablecontents{&}
}
\gappto\mytablecontents{\\}%
}
Antwort3
Ihre Ausführung von
\xappto\mytablecontents{\tas{\i}{\j}}
geht davon aus, dass \tas{.}{.}
erweiterbar ist. Da es jedoch eine Zuweisung ( \pgfmathsetmacro
) enthält, ist es das nicht. Daher müssen Sie den Ausdruck zuerst auswerten (erweitern), bevor Sie ihn als Teil Ihrer app
Endage an einschließen \mytablecontents
. Da der Ausdruck ziemlich unkompliziert ist (die Addition zweier Zahlen), können Sie einfach verwenden \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}
Erweiterbare Berechnungen sind über die LaTeX2e-Schnittstelle für \fp_eval
LaTeX3 imxfp
Paket:
\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{\\}
}