entendendo o comando "ifthenelse" com número aleatório pgf

entendendo o comando "ifthenelse" com número aleatório pgf

Não consigo entender porque o seguinte uso de ifthenelse e pgf me dá um erro:

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

me dê o erro

! TeX capacity exceeded, sorry [input stack size=5000].
\@inmathwarn ...latex@warning {Command \protect #1 invalid in math mode}\fi 
l.21 $\M
    $

Enquanto o código

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

me dê o erro:

! Incomplete \iffalse; all text was ignored after line 20.
<inserted text> 
                \fi 
<*> bugpgf

Contanto que eu não tente fazer um cálculo em \c não há erro; como por exemplo em

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

O látex parece me dizer que perdi a parte fi do comando, mas não perdi? o uso de

\a!=\b ?\a : int(\a+1)

tem efeitos semelhantes. Qualquer ajuda seria muito apreciada.

Responder1

Quando você define \ce depois define \Mo que acontece é

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

que não é expansível, portanto, não pode pegar a parte inteira e adicionar 1 a ela. No segundo caso acontece algo semelhante, mas num passo diferente ele tropeça.

Em ambos os casos, as mensagens de erro não refletem o problema real, mas mostram a primeira coisa que surge.

O que você precisa é atribuir o valor do cálculo por \cmeio de

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

ou

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

Então \cmanteria o valor real do cálculo e não os comandos de cálculo.

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

insira a descrição da imagem aqui

Responder2

Na verdade, o pgf possui macros justamente para esta situação. O problema é que você faz essas coisas no \def, e há os problemas usuais de expansão (que não entendo completamente). De qualquer forma, isso funciona sem problemas.

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

informação relacionada