理解带有 pgf 随机数的“ifthenelse”命令

理解带有 pgf 随机数的“ifthenelse”命令

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

相关内容