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}

관련 정보