梅威瑟:
\documentclass{article}
\begin{document}
\ExplSyntaxOn
\cs_set_eq:NN \__examzh_symbols_old_frac:nn \frac
\RenewDocumentCommand { \frac } { m m }
{
\__examzh_symbols_old_frac:nn {#1}{#2}
}
\ExplSyntaxOff
$\frac{1}{2}$
\end{document}
我想重新定义\frac
以进行“改进”。但我发现当我想“复制” a \frac
by 时\cs_set_eq:NN
,似乎\cs_set_eq:NN
失败了,我不知道为什么。
然后我用了\NewCommandCopy
并且成功了:
\documentclass{article}
\begin{document}
\ExplSyntaxOn
% \cs_set_eq:NN \__examzh_symbols_old_frac:nn \frac
\NewCommandCopy { \oldfrac } { \frac }
\RenewDocumentCommand { \frac } { m m }
{
% \__examzh_symbols_old_frac:nn {#1}{#2}
\oldfrac {#1}{#2}
}
\ExplSyntaxOff
$\frac{1}{2}$
\end{document}
你能告诉我这个方法有什么问题吗\cs_set_eq:NN
?
答案1
% ltmath.dtx
\DeclareRobustCommand\frac[2]{{\begingroup#1\endgroup\over#2}}
将定义两个而不是一个新的宏:\frac
和\frac␣
。
\def\frac{\protect\frac␣}
\long\def\frac␣#1#2{{\begingroup #1\endgroup \over #2}}
这样,\frac
它就会自动受到保护,因此用 LaTeX2e 的术语来说,就是强大的。另请参阅脆弱命令和坚固命令之间有什么区别?什么时候以及为什么我们需要 \protect?。
因此,与浅复制命令相比,您需要一些“深”复制命令。
- 深度复制:
\NewCommandCopy
自 LaTeX2e 2020-10-01 起或\LetLtxMacro
来自letltxmacro
包。 - 浅拷贝:原始函数
\let
或 l3 函数\cs_set_eq:NN
\cs_new_protected:Npn \cs_set_eq:NN #1 { \tex_let:D #1 =~ }