大家好,我发现 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}