comprender el comando "ifthenelse" con un número aleatorio pgf

comprender el comando "ifthenelse" con un número aleatorio pgf

No puedo entender por qué el siguiente uso de ifthenelse y pgf me da un error:

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

dame el error

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

Mientras que el 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}

dame el error:

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

Mientras no intente hacer un cálculo en \c no hay ningún error; como por ejemplo en

\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 parece decirme que me perdí la parte fi del comando pero no fue así. el uso de

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

tiene efectos similares. Cualquier ayuda sería muy apreciada.

Respuesta1

Cuando defines \cy luego defines \Mlo que sucede es

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

que no es expandible, por lo tanto, no puede tomar la parte entera y agregarle 1. En el segundo caso sucede algo similar pero en un paso diferente falla.

En ambos casos, los mensajes de error no reflejan el problema real, sino que muestran lo primero que falla.

Lo que necesita es asignar el valor del cálculo a \ctravés de

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

o

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

Entonces \cmantendría el valor real del cálculo y no los 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}

ingrese la descripción de la imagen aquí

Respuesta2

En realidad, pgf tiene macros precisamente para esta situación. El problema es que haces estas cosas en \def, y existen los problemas de expansión habituales (que no entiendo del todo). De todos modos, esto funciona sin 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}

información relacionada