PGF 源代码中两个看似未定义的控制序列的含义

PGF 源代码中两个看似未定义的控制序列的含义

下列宏在 中定义<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

那么他们的目的是什么?导致不可避免的错误?这似乎是一种扭曲的做法。

我以为我可能解析错了,实际上falsetrue是传递给的参数\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。新条件最初为假。

相关内容