在以下 MWE 中,我曾经\renewcommand
重新定义通过以下方式定义的命令\def
:
\documentclass{article}
\def\mymacro{Hello}
\renewcommand{\mymacro}{Hello world}
\begin{document}
\mymacro
\end{document}
据我所知,它运行良好。
我想知道的是:
- 有哪些情况它不起作用?
- 这是一个好的做法吗?或者我应该用它
\def
来重新定义通过定义的命令\def
?
编辑
我已经看过了\def 和 \newcommand 之间有什么区别?。我的意思是,有时我需要破解一些定义的命令\def
,我想知道是否允许我这样做\renewcommand
。
答案1
如果用 创建的命令\def
是“上下文相关的”(或“分隔的”),则不能用 重新定义\renewcommand
。但对于像您展示的那样的简单定义,它\renewcommand
可以很好地工作,并且在 LaTeX 中被认为是更好的选择。
在定义比纯文本提供的类似命令更灵活的符号命令时,内部使用以下模式来amsmath
检查符号的存在或类别,以便“做正确的事情”:
\def\@tempa#1#2\@nil{<...>}
该字符串\@nil
看起来像一个命令,但实际上它不是。相反,它被用作“哨兵”来划定正在测试的范围。
在这种情况下,使用标记可以避免在使用定义的命令时使用括号。“LaTeX 方式”是使用括号,但在某些情况下,括号的增多会使输入更难阅读(并且在发生错误时难以调试),而标记方法可以发挥其优势。
编辑:正如@Dan所说,这并不意味着不能使用重新定义命令\renewcommand
,而是在这样做时不可能复制原始的使用语法。