我不明白为什么以下使用 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}