在嵌套的 \ifdefined 中定义 \newif

在嵌套的 \ifdefined 中定义 \newif

下面的 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分支,它就不会“看到”已经定义的条件。

相关内容