如何让 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 … \endcsname
for 来\csname … \endcsname
构造具有给定名称的控制序列。如果控制序列不存在,则暂时让它等于\relax
,这不执行任何操作。
所以,
\csname mytitle\endcsname
\mytitle
不管定义与否都能工作。
如果你的命令带有参数,那么这个简单的方法就不能再使用了。然后你可以使用以下命令\@ifundefined
:
\makeatletter
\@ifundefined{mytitle}{not defined}{defined}
\makeatother