
次のように 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}