下面的 MWE 尝试\newif
在 内定义\ifdefined
。这可以正常工作,除非第二次加载文件。
如下所示生成以下错误消息:
不完整的 \ifdefined;第 1 行后的所有文本都被忽略。
\newif
然而如果你根据需要注释掉这些作品。
问题:
我如何\newif
在其中声明\ifdefined
?
梅威瑟:
\documentclass{article}
\usepackage{filecontents}
\begin{filecontents*}{MyHeader.tex}
\ifdefined\MyHeaderAlreadyIncluded\else
\def\MyHeaderAlreadyIncluded{}%
\newcommand{\SomeCommand}{some command}%
\newif\ifDTLnewdbonload%
\fi
\end{filecontents*}
\begin{document}
Lorem ipsum
\input{MyHeader.tex} \SomeCommand.
\input{MyHeader.tex} \SomeCommand.
\end{document}
答案1
为了不加载文件两次,最好使用另一种方法:
%%% MyHeader.tex
\ifdefined\MyHeaderAlreadyIncluded
\expandafter\endinput
\fi
\gdef\MyHeaderAlreadyIncluded{}
\newcommand{\SomeCommand}{some command}
\newif\ifDTLnewdbonload
如果文件已经加载,则将定义控制序列。因此,条件将扩展\endinput
,停止读取文件。这\expandafter
只是为了完成条件。另一种格式是
%%% MyHeader.tex
\ifdefined\MyHeaderAlreadyIncluded\endinput\fi
\gdef\MyHeaderAlreadyIncluded{}
\newcommand{\SomeCommand}{some command}
\newif\ifDTLnewdbonload
\endinput
因为 TeX 总是在完成工作之前结束该行。
要回答最初的问题,
\expandafter\newif\csname ifDTLnewdbonload\endcsname
会起作用,因为如果 TeX 跳过\else
分支,它就不会“看到”已经定义的条件。