下列宏在 中定义<pgf/tikz installation dir>/utilities/pgfutil-common.tex
。
% Usage:
% \pgfutil@in@{one}{three two one}
% \ifpgfutil@in@
% -> will be true!
% \else
% \fi
%
% \pgfutil@in@{,}{1234,456567}
% \ifpgfutil@in@
% -> will be true!
% \else
% \fi
\def\pgfutil@in@#1#2{%
\def\pgfutil@in@@##1#1##2##3\pgfutil@in@@{%
\ifx\pgfutil@in@##2\pgfutil@in@false\else\pgfutil@in@true\fi}%
\pgfutil@in@@#2#1\pgfutil@in@\pgfutil@in@@}
代码使用控制序列\pgfutil@in@false
和\pgfutil@in@true
。但是,这些控制序列不仅在此文件中出现,而且在整个 pgf/tikz 源代码中也仅出现一次。具体而言,这些控制序列在任何地方都不存在\def
或\let
。
那么他们的目的是什么?导致不可避免的错误?这似乎是一种扭曲的做法。
我以为我可能解析错了,实际上false
和true
是传递给的参数\pgfutil@in@
,也就是说\pgfutil@in@false
应该被解释为\pgfutil@in@ false
。但这不是 TeX 解释它的方式,对吧?TeX 会“吞掉”从\
到下一个非类别 11 标记的所有内容,因此它会将控制序列的名称视为pgfutil@in@false
。
答案1
这只是 TeX 处理 if 的方式。往下你会发现
\newif\ifpgfutil@in@
声明
\pgfutil@in@true
\pgfutil@in@false
\ifpgfutil@in@
具有分别重新定义为\iftrue
和的效果\iffalse
。
以下为 Plain TeX 示例(LaTeX 类似)
\catcode`@=11 % makeatletter
\newif\ifpgfutil@in@
\show\pgfutil@in@true
\show\pgfutil@in@false
\bye
将在日志中显示此信息
> \pgfutil@in@true=macro:
->\let \ifpgfutil@in@ \iftrue .
l.4 \show\pgfutil@in@true
> \pgfutil@in@false=macro:
->\let \ifpgfutil@in@ \iffalse .
l.5 \show\pgfutil@in@false
这在TeXbook参见 »第 20 章:定义(也称为宏)«
为了便于
\if...
构造,普通 TeX 有一个\newif
宏,这样在您说出\newif\ifabc
三个控制序列之后,将定义:(\ifabc
用于测试开关)、\abctrue
(用于使开关为真)和\abcfalse
(用于使其为假)。\phantom
现在,该问题在附录 B 中通过以下方式解决:\newif\ifhph \newif\ifvph \def\hphantom{\hphtrue\vphfalse\phant} \endtt
\vphantom
和 具有类似的和的定义\phantom
。不再需要\ph
宏;再次\phant
测试\ifhph
和\ifvph
。附录 E 包含由创建的条件的其他示例\newif
。新条件最初为假。