使用 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}

相關內容