检查宏是否已定义

检查宏是否已定义

如何检查宏是否已定义?我想发出一个命令\dd。但是,如果physics包已加载,我需要执行\renewcommand;如果包未加载,我需要执行\newcommand。所以我想要某种方法来检查宏是否\dd已定义。

下面是一些显示我想要的伪代码:

if <\dd> is defined:
    \renewcommand ....
else:
     \newcommand ...

以下是 MWE:

\documentclass{article}

\usepackage{physics} % may or may not be loaded

% Definition of \dd
% \newcommand*{\dd}{\mathop{}\!{\operator@font d}}
% or
% \renewcommand*{\dd}{\mathop{}\!{\operator@font d}}

\begin{document}

Hello $\dd f$

\end{document}

答案1

回答第一句话中的问题“我如何检查宏是否已定义?”:

\ifdefined\dd
    %% it is already defined
\else
    %% it is not yet defined
\fi

我实际上经常使用它,例如,作为布尔开关(我可以使用它来打开\def\myswitch{}和关闭\let\myswitch\undefined)。

答案2

最简单的方法是

\def\dd{<whatever you like>}

答案3

最简单的方法是

\providecommand{\dd}{}% defines \dd if not already defined
\renewcommand{\dd}{<whatever you like>}

如果是供个人使用,那很好。

在包代码中执行此操作。加载您的包的用户可能想要使用\ddfrom physics(我不会,但人们似乎喜欢承诺比实际提供更多功能的包)。

我不喜欢physics:它写得很糟糕并且语法非常奇怪。

答案4

在这个特殊的情况下,我找到了这个解决方案:

\makeatletter
\DeclareRobustCommand{\dd}{\relax\ifmmode\ddaux\relax\fi}
\newcommand*{\ddaux}{\mathop{}\!{\operator@font d}}
\makeatother

1)\dd从物理包中覆盖如果它被导入,并且 2)确保该命令仅在数学模式下工作。

相关内容