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 を加算することはできません。2 番目のケースでは同様のことが起こりますが、別のステップで問題が発生します。

どちらの場合も、エラー メッセージは実際の問題を反映するものではなく、最初に問題となるものを示します。

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

関連情報