使用特定参数重新定义命令

使用特定参数重新定义命令

例如,我想用 替换所有\hat{N}内容\widehat{N},但其他内容保持\hat{#1}不变。#1=

我希望在宏观层面实现它,而不是替换文档中的文本,因为这些替换与包的特定用途有关。我不想在相应的包不使用时撤消替换。

答案1

想这样做。尽管有一位受人尊敬的用户推荐了它,但它并不正确(至少在我看来)。

无论如何,你可以重新定义\hat来寻找它的参数,看看是否

  1. 它不止一个令牌(使用\widehat
  2. 它是一个大写拉丁字母(使用\widehat
  3. 它是一个表示大写希腊字母的单个命令(使用\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}

在此处输入图片描述

与标准比较

在此处输入图片描述

相关内容