Verständnis des Befehls „ifthenelse“ mit der PGF-Zufallszahl

Verständnis des Befehls „ifthenelse“ mit der PGF-Zufallszahl

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 \cund dann definieren, \Mwas 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 \centweder über

 \pgfmathparse{\pgfmathparse{ifthenelse(\a!=\b,\a,int(\a+1))}}
 \let\c=\pgfmathresult

oder

 \pgfmathsetmacro\c{ifthenelse(\a!=\b,\a,int(\a+1))}

Dann \cwü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}

Bildbeschreibung hier eingeben

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}

verwandte Informationen