Unvollständiges \iffalse mit \pgfmathsetmacro

Unvollständiges \iffalse mit \pgfmathsetmacro

Ich möchte mit dem Befehl eine Tabelle so erzeugen, \foreachdass 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

\pgfmathsetmacroist nicht erweiterbar und wird daher in einem nicht „ausgewertet“ \edef(was \xapptoin 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}

Bildbeschreibung hier eingeben

Alternativ können Sie die erweiterbare Arithmetik verwenden: expl3bietet sie mit xfpund 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}

Bildbeschreibung hier eingeben

Nur um die Möglichkeiten zu zeigen (es sind allerdings nicht alle von abgedeckten Möglichkeiten pgfmathverfügbar), ändern Sie den \xapptoAufruf in

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

Die Ausgabe wäre

Bildbeschreibung hier eingeben

Dasselbe Ergebnis mit vollständigem expl3Code:

\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:Nxdas Analogon von \eappto( xsteht für eXpanded) und \tl_put_right:Nnist das Analogon zu \appto. Keine Notwendigkeit für globale Definitionen, da \int_step_inline:nnnnkeine Gruppierung von Zyklen verwendet wird: Der aktuelle Index ist direkt verfügbar als #1(oder ##1in 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 \foreachSchleife 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}

Bildbeschreibung hier eingeben

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 appEndage an einschließen \mytablecontents. Da der Ausdruck ziemlich unkompliziert ist (die Addition zweier Zahlen), können Sie einfach verwenden \number\numexpr#1+#2:

Bildbeschreibung hier eingeben

\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_evalLaTeX3 imxfpPaket:

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

verwandte Informationen