
Ich verstehe nicht, warum die folgende Verwendung von ifthenelse und pgf einen Fehler erzeugt:
\documentclass{article}
\usepackage{pgf}
\begin{document}
\pgfmathrandominteger{\a}{2}{7}
\pgfmathrandominteger{\b}{2}{3}
\def\c{\pgfmathparse{ifthenelse(\a!=\b,\a,int(\a+1))} \pgfmathresult}
\def\M{ \pgfmathparse{int(\c)} \pgfmathresult}
$\M$
\end{document}
gib mir den Fehler
! TeX capacity exceeded, sorry [input stack size=5000].
\@inmathwarn ...latex@warning {Command \protect #1 invalid in math mode}\fi
l.21 $\M
$
Während der Code
\documentclass{article}
\usepackage{pgf}
\begin{document}
\pgfmathrandominteger{\a}{2}{7}
\pgfmathrandominteger{\b}{2}{3}
\def\c{\pgfmathparse{ifthenelse(\a!=\b,\a,int(\a+1))} \pgfmathresult}
\pgfmathparse{int(\c)}
\def\M{\pgfmathresult}
$\M$
\end{document}
gib mir den Fehler:
! Incomplete \iffalse; all text was ignored after line 20.
<inserted text>
\fi
<*> bugpgf
Solange ich nicht versuche, eine Berechnung auf \c durchzuführen, gibt es keinen Fehler; wie zum Beispiel in
\documentclass{article}
\usepackage{pgf}
\begin{document}
\pgfmathrandominteger{\a}{2}{7}
\pgfmathrandominteger{\b}{2}{3}
$\a$ $\b$ $\c$
\def\c{\pgfmathparse{ifthenelse(\a!=\b,\a,int(\a+1))} \pgfmathresult} \end{document}
Latex scheint mir zu sagen, dass ich den fi-Teil des Befehls verpasst habe, aber das habe ich nicht, oder? Die Verwendung von
\a!=\b ?\a : int(\a+1)
hat ähnliche Auswirkungen. Für jede Hilfe wäre ich sehr dankbar.
Antwort1
Wenn Sie definieren \c
und dann definieren, \M
was passiert, ist
int(\pgfmathparse{ifthenelse(\a!=\b,\a,int(\a+1))} \pgfmathresult) + 1
das nicht erweiterbar ist, daher kann es den ganzzahligen Teil nicht nehmen und 1 dazu addieren. Im zweiten Fall passiert etwas Ähnliches, aber es stolpert bei einem anderen Schritt.
In beiden Fällen spiegeln die Fehlermeldungen nicht das eigentliche Problem wider, sondern zeigen das erste, was stört.
Was Sie tun müssen, ist, den Wert der Berechnung \c
entweder über
\pgfmathparse{\pgfmathparse{ifthenelse(\a!=\b,\a,int(\a+1))}}
\let\c=\pgfmathresult
oder
\pgfmathsetmacro\c{ifthenelse(\a!=\b,\a,int(\a+1))}
Dann \c
würde der eigentliche Wert der Berechnung und nicht die Berechnungsbefehle enthalten sein.
\documentclass{article}
\usepackage{pgf,pgffor}
\begin{document}
\foreach\x in{0,...,10}{
\pgfmathrandominteger{\a}{2}{7}
\pgfmathrandominteger{\b}{2}{3}
\pgfmathsetmacro\M{int((\a!=\b?\a:int(\a+1))+1)}
$\a, \b \to \M$
}
\end{document}
Antwort2
Tatsächlich hat pgf genau für diese Situation Makros. Das Problem ist, dass Sie diese Dinge in tun \def
, und es gibt die üblichen Erweiterungsprobleme (die ich nicht ganz verstehe). Jedenfalls läuft das ohne Probleme.
\documentclass{article}
\usepackage{pgf}
\begin{document}
\pgfmathrandominteger{\a}{2}{7}
\pgfmathrandominteger{\b}{2}{3}
\pgfmathsetmacro{\c}{ifthenelse(\a!=\b,\a,int(\a+1))}
\pgfmathsetmacro{\M}{int(\c)}
$\M$
\pgfmathrandominteger{\a}{2}{7}
\pgfmathrandominteger{\b}{2}{3}
\pgfmathsetmacro{\M}{int(ifthenelse(\a!=\b,\a,int(\a+1)))}
$\M$
\end{document}