防止 LaTeX 替換變數

防止 LaTeX 替換變數

我目前正在擺弄巨集(相當新),我似乎缺少一些關於 LaTeX/TeX 巨集的相當基本的東西:

\def\car{Yes}
    \def\iszero#1{
    \ifnum#1=0{
        \let \car = Yes
    }
    \else{
        \let \car = No
    }
    \car
}
\iszero{1}

返回是。

我想知道為什麼會發生這種情況以及如何防止 LaTeX 過早替換\car為當前值。

答案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和 the分隔\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

我習慣於\edefget onlyYesNoin \car。如果\def使用,則存在輸入在評估之前被更改的風險,例如,如果輸入是計數器。

相關內容