понимание команды "ifthenelse" с pgf случайным числом

понимание команды "ifthenelse" с pgf случайным числом

Я не могу понять, почему следующее использование ifthenelse и pgf приводит к ошибке:

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

дайте мне ошибку

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

В то время как код

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

дайте мне ошибку:

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

Пока я не пытаюсь выполнить вычисление на \c, ошибки не возникает; как, например, в

\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, кажется, говорит мне, что я пропустил часть fi команды, но я этого не сделал? Использование

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

имеет похожие эффекты. Любая помощь будет высоко оценена.

решение1

Когда вы определяете \c, а затем определяете, \Mчто происходит

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

который не расширяем, поэтому он не может взять целую часть и прибавить к ней 1. Во втором случае происходит то же самое, но на другом шаге он спотыкается.

В обоих случаях сообщения об ошибках не отражают реальную проблему, а указывают на первое, что вызвало сбой.

Вам нужно присвоить значение вычисления \cлибо через

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

или

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

Тогда \cбудет храниться фактическое значение вычисления, а не команды вычисления.

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

введите описание изображения здесь

решение2

На самом деле, pgf имеет макросы как раз для этой ситуации. Проблема в том, что вы делаете это в \def, и есть обычные проблемы расширения (которые я не совсем понимаю). В любом случае, это работает без проблем.

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

Связанный контент