如何检查宏是否已定义?我想发出一个命令\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>}
如果是供个人使用,那很好。
不在包代码中执行此操作。加载您的包的用户可能想要使用\dd
from physics
(我不会,但人们似乎喜欢承诺比实际提供更多功能的包)。
我不喜欢physics
:它写得很糟糕并且语法非常奇怪。
答案4
在这个特殊的情况下,我找到了这个解决方案:
\makeatletter
\DeclareRobustCommand{\dd}{\relax\ifmmode\ddaux\relax\fi}
\newcommand*{\ddaux}{\mathop{}\!{\operator@font d}}
\makeatother
1)\dd
从物理包中覆盖如果它被导入,并且 2)确保该命令仅在数学模式下工作。