
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 \c
e depois define \M
o 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 \c
meio 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 \c
manteria 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}
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}