例如,我想用 替换所有\hat{N}
内容\widehat{N}
,但其他内容保持\hat{#1}
不变。#1=
我希望在宏观层面实现它,而不是替换文档中的文本,因为这些替换与包的特定用途有关。我不想在相应的包不使用时撤消替换。
答案1
你不想这样做。尽管有一位受人尊敬的用户推荐了它,但它并不正确(至少在我看来)。
无论如何,你可以重新定义\hat
来寻找它的参数,看看是否
- 它不止一个令牌(使用
\widehat
) - 它是一个大写拉丁字母(使用
\widehat
) - 它是一个表示大写希腊字母的单个命令(使用
\widehat
)
在所有其他情况下使用\hat
。
\documentclass{article}
\usepackage{amsmath}
\NewCommandCopy{\amsmathhat}{\hat}
\ExplSyntaxOn
\RenewDocumentCommand{\hat}{m}
{
\joeli_hat:n { #1 }
}
\clist_const:Nn \c__joeli_hat_greek_clist
{
\Gamma,\Delta,\Theta,\Kappa,\Lambda,\Xi,\Pi,\Sigma,\Upsilon,\Phi,\Omega
}
\cs_new_protected:Nn \joeli_hat:n
{
\tl_if_single:nTF { #1 }
{% just one token
\__joeli_hat_single:N #1
}
{
\widehat{#1}
}
}
\cs_new_protected:Nn \__joeli_hat_single:N
{
\token_if_cs:NTF #1
{
\__joeli_hat_greek:N #1
}
{
\str_if_eq:eeTF { #1 } { \str_uppercase:n { #1 } }
{ \widehat{#1} }
{ \amsmathhat{#1} }
}
}
\cs_new_protected:Nn \__joeli_hat_greek:N
{
\clist_if_in:NnTF \c__joeli_hat_greek_clist { #1 }
{ \widehat{#1} }
{ \amsmathhat{#1} }
}
\ExplSyntaxOff
\begin{document}
$\hat{a}\hat{A}\hat{b}\hat{B}\hat{\gamma}\hat{\Gamma}\hat{ABC}$
\end{document}
与标准比较