如何在 LaTeX 中有条件地定义新命令?

如何在 LaTeX 中有条件地定义新命令?

我正在尝试使用某个软件包的旧版本编译 LaTeX 代码。因此,由于未定义的命令,我遇到了一些问题。

我如何添加条件代码以便可以定义这个旧包版本的一些解决方法命令?

% I want something like this:
if command \foobar is not defined
  \newcommand{\foobar}{FooBar}

% I don't need an "else" clause here, but it would be good
% to know how to add one, in case I need it in future

end if

答案1

LaTeX 内核命令\providecommand{\foobar}{FooBar}正是您想要的。

答案2

我认为这\providecommand就是你想要的,正如 lockstep 所说,但值得一提的是\@ifundefinedLaTeX 命令,它测试命令是否已定义,如果已定义则执行一些代码。它比只\providecommand处理定义特定命令更灵活。下面是我在英语化一些命令时使用的简单示例:

\makeatletter
\@ifundefined{centre}{%
\newenvironment{centre}{\center}{\endcenter}%
}{}
\makeatother

因此,如果命令 \centre未定义,则它定义环境 centre

答案3

ifthen 包为此提供了一些易于使用的宏。例如:

\ifthenelse{\isundefined{\foobar}}{
  %% Do this if it is undefined
}{
  %% Do this if it is defined
}

您也可以使用纯 TeX 来完成此操作(不需要任何外部包):

\ifx\foobar\undefined
  %% Do this if it is undefined
\else
  %% Do this if it is defined
\fi

答案4

LaTeX 包装的 e-TeX 基元(显然)是\ifdefined\ifcsname。使用方式如下:

\ifdefined \foobar \else
  \newcommand{\foobar}{FooBar}
\fi

\ifcsname如果需要用宏构造命令名,请使用:

\ifcsname foobar\endcsname \else
  \newcommand{\foobar}{FooBar}
\fi

\ifdefined和控制序列\ifcsname在原始 tex 程序中不存在,但它们在我的 Ubuntu 系统上的所有 latex/xetex/pdftex 变体中都存在。

相关内容