
我目前正在擺弄巨集(相當新),我似乎缺少一些關於 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
我習慣於\edef
get onlyYes
或No
in \car
。如果\def
使用,則存在輸入在評估之前被更改的風險,例如,如果輸入是計數器。