仅当存在时才运行新命令

仅当存在时才运行新命令

如何让 LaTeX 仅在命令存在时才运行该命令?我需要类似以下内容的内容:

\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc}
% \newcommand{\mytitle}{Title Test}
\begin{document}
\if mytitle exists
\mytitle %true
\else
do not run the command
\fi
\end{document}

为了防止出现错误消息:“未定义的控制序列\mytitle”,我需要决定这一点,因为我将对多个文件使用布尔运算。

答案1

我通常使用\ifdefined

\documentclass[a4paper]{article}
\usepackage[utf8]{inputenc}
%\newcommand{\mytitle}{ducks}
\begin{document}

\ifdefined\mytitle
Yay, \mytitle!
\else
Oops.
\fi
\end{document}

正如 Martin Scharrer 在评论中提到的,\ifdefined它是 e-TeX 扩展的一部分。

答案2

有内核命令\@ifundefined

\makeatletter
\@ifundefined{mytitle}{do not run the command}{\mytitle}
\makeatother

否则,正如前面提到的

\ifdefined\mytitle
  \mytitle
\else
  do not run the command
\fi

在某些情况下,两者会给出不同的结果

\let\mytitle\relax

在测试之前已给出,因为\@ifundefined测试作为参数给出的控制序列名称是否等同于\relax。这有技术原因。

答案3

另一种方法是使用\providecommand来定义不执行任何操作的命令。如果命令尚未定义,则仅定义该命令。如果已定义,则原始定义不会改变。这样就无需每次使用它时都进行测试。

\documentclass{article}
\begin{document}

\providecommand{\mytitle}{}%

This does nothing: \mytitle
\end{document}

如果命令需要带参数,您可以执行以下操作:

\providecommand{\mytitle}[1]{#1}%

它只会返回参数,因此不执行任何操作。

答案4

您可以使用\csname … \endcsnamefor 来\csname … \endcsname构造具有给定名称的控制序列。如果控制序列不存在,则暂时让它等于\relax,这不执行任何操作。

所以,

\csname mytitle\endcsname

\mytitle不管定义与否都能工作。

如果你的命令带有参数,那么这个简单的方法就不能再使用了。然后你可以使用以下命令\@ifundefined

\makeatletter
\@ifundefined{mytitle}{not defined}{defined}
\makeatother

相关内容