LaTeX의 변수 교체 방지

LaTeX의 변수 교체 방지

나는 현재 매크로(아주 새로운)를 다루고 있는데 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평가 전에 입력이 변경될 위험이 있습니다(예: 입력이 카운터인 경우).

관련 정보