
Я не могу понять, почему следующее использование 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}