
나는 현재 매크로(아주 새로운)를 다루고 있는데 LaTeX/TeX 매크로에 대한 기본적인 내용이 누락된 것 같습니다.
\def\car{Yes}
\def\iszero#1{
\ifnum#1=0{
\let \car = Yes
}
\else{
\let \car = No
}
\car
}
\iszero{1}
예를 반환합니다.
\car
왜 이런 일이 발생하는지, LaTeX가 조기에 현재 값으로 대체되는 것을 방지할 수 있는 방법이 궁금합니다 .
답변1
당신이 원하는
\def\car{Yes}
\def\iszero#1{%
\ifnum#1=0 % Terminate number with a space
\def\car{Yes}%
\else
\def\car{No}%
\fi
}
\iszero{1}
TeX 기본 조건을 사용하고 있으므로 두 분기는 다음과 같습니다.~ 아니다중괄호 안의 장소: 대신 the 는 조건문의 끝인 the \else
및 로 구분됩니다 \fi
. 기본 \let
요소는 하나의 토큰을 두 번째 토큰의 값에 할당하는 데에만 사용할 수 있습니다. 가 필요한 매크로를 정의하는 데는 사용할 수 없습니다 \def
.
답변2
TeX 조건문의 구문은 true 및 false 분기에 중괄호를 사용하지 않습니다.
또한 \let
당신이 생각하는 것과 다르게 동작합니다: 와 (거의) 동일하게 \let\foo=<token>
만듭니다 . 의 경우\foo
<token>
\let\car = Yes
토큰은 Y
할당되고 \car
인쇄 es
됩니다(건너뛸 수 없는 분기에 있는 경우). 에 대해서도 마찬가지입니다 \let\car = No
.
대신 을 사용해야 합니다 \def
. 그러나 가 필요하지 않은 더 좋은 방법이 있습니다 \car
.
일반 TeX를 가정하면,
\long\def\firstoftwo#1#2{#1}
\long\def\secondoftwo#1#2{#2}
\def\iszero#1{%
\ifnum#1=0
\expandafter\firstoftwo
\else
\expandafter\secondoftwo
\fi
{Yes}{No}%
}
작동할 것입니다. 이 트릭은 입력 스트림에 또는 \expandafter
를 남겨두고 조건부 텍스트의 나머지 부분을 제거합니다 .\firstoftwo{Yes}{No}
\secondoftwo{Yes}{No}
이는 일반화될 수 있다
\def\IfIsZeroTF#1{%
\ifnum#1=0
\expandafter\firstoftwo
\else
\expandafter\secondoftwo
\fi
}
처럼 불리다
\IfIsZeroTF{1}{Yes}{No}
답변3
또는 비교를 의 정의 안에 넣으십시오 \car
.
%\def\car{Yes}%% Not needed for this example
\def\iszero#1{%
\edef\car{%
\ifnum#1=0
Yes%
\else
No%
\fi
}}
False: \iszero{1}\car
True: \iszero{0}\car
나는 \edef
단지 Yes
또는 No
에 들어가곤 했습니다 \car
. 를 사용 하면 \def
평가 전에 입력이 변경될 위험이 있습니다(예: 입력이 카운터인 경우).