latex token 读取器在 \iffalse 上中断

latex token 读取器在 \iffalse 上中断

大家好,我发现 latex 有一个非常奇怪的行为\iffalse\newcommand\NAT@parse...直接\NAT@parse取自 natbib)。如果我在 style 中添加该宏,则 latex 会中断"! Too many }'s."

例如我将创建一个样式温度计

\iffalse
  \newcommand\NAT@parse[1]{%
    \begingroup
     \let\protect=\@unexpandable@protect
     \let~\relax
     \let\active@prefix=\@gobble
     \edef\NAT@temp{\csname b@#1\@extra@b@citeb\endcsname}%
     \aftergroup\NAT@split
     \expandafter
    \endgroup
    \NAT@temp{}{}{}{}{}@@%
    \expandafter\NAT@parse@date\NAT@date??????@@%
    \ifciteindex\NAT@index\fi
  }%
\fi

\endinput

并将其加载样本

\documentclass{article}
\usepackage{temp}
\begin{document}
nothing
\end{document}

\iffalse应该忽略直到的所有内容\fi,但它会中断。有人可以解释为什么会发生这种情况吗?

答案1

仅仅命名一个 token\ifciteindex并不能使其成为条件。只有

\let\ifciteindex\iftrue

或者

\let\ifciteindex\iffalse

保证这一点。

因此,在您的代码中,\ifciteindex会像其他任何非条件标记一样被跳过,而紧随其后的\fi会与初始 匹配\iffalse。这留下了一个不平衡的}和一个\fi

修正。添加

\@ifundefined{ifciteindex}
  {\expandafter\let\csname ifciteindex\expandafter\endcsname\csname iffalse\endcsname}
  {}

在第一个之前\iffalse

答案2

这是典型的宏代码不平衡的情况\if...\fi,因此用宏代码包围它\iffalse...\fi不是一个好主意。更好的方法是在跳过的宏代码之前使用,或者直接在主文档中\endinput使用,即\iffalse...\fi

\iffalse \usepackage{temp}\fi

或更简单:

%\usepackage{temp}

相关内容