如何用选项修补另一个带有选项的宏中的宏?

如何用选项修补另一个带有选项的宏中的宏?

为了将超链接放在正确的位置,我想修补一些由 生成的格式宏cleveref。例如,\cref@theorem@format定义为:

macro:#1#2#3->#2\cref@theorem@name \nobreakspace #1#3

我想将替换#2\cref@theorem@name为类似的东西A #2 B,但这个替换应该在另一个宏(比如说)中进行\PatchCrefFormat,该宏以环境名称theorem作为其参数。

如何实现?我正在寻找expl3方法(如\regex_replace_once)或使用regexpatch

下面是 MWE。

\documentclass{article}

% \usepackage[nameinlink]{crefthe}
\usepackage[nameinlink]{cleveref}

% \usepackage{regexpatch}

\newtheorem{theorem}{Théorème}

% \crefthename{theorem}[le]{théorème}[les]{théorèmes}
% \Crefthename{theorem}[Le]{théorème}[Les]{théorèmes}
\crefname{theorem}{théorème}{théorèmes}
\Crefname{theorem}{théorème}{théorèmes}


\NewDocumentCommand \PatchCrefFormat { m }
% #1 is the name of an environment
{
    % In the command \cref@#1@format ,
    % how to replace the "##2\cref@#1@name" into "A ##2 B"?
}


\begin{document}


\makeatletter

\meaning\cref@theorem@format


\meaning\crefrange@theorem@format

\meaning\Crefrange@theorem@format@first

\meaning\Crefrange@theorem@format@second

\makeatother


\end{document}

答案1

您不能轻易地使用 来做到这etoolbox一点,\patchcmd因为您是在另一个宏的定义中执行此操作,并对\patchcmd进行特殊处理#

进行替换的一种方法regexpatch是:

\exp_args:Nc \regexpatchcmd { cref@#1@format }
  { \cP. 2 \c{cref@#1@name} }
  { A \ \cP\#2 \ B }
  { } { \PatchFailed }

搜索正则表达式\cP. 2 \c{cref@#1@name}会查找具有\cP任意字符代码 ( ) 的参数标记 ( .),后跟数字2,然后是控制序列\c{cref@#1@name}(这里#1已经被theoremTeX 的参数替换所替换)。

然后替换正则表达式很简单A \ \cP\#2 \ BA,一个空格,一个参数字符#\cP\#),另一个空格和B

完整代码:

\documentclass{article}

% \usepackage[nameinlink]{crefthe}
\usepackage[nameinlink]{cleveref}

\usepackage{regexpatch}

\newtheorem{theorem}{Théorème}

% \crefthename{theorem}[le]{théorème}[les]{théorèmes}
% \Crefthename{theorem}[Le]{théorème}[Les]{théorèmes}
\crefname{theorem}{théorème}{théorèmes}
\Crefname{theorem}{théorème}{théorèmes}


\ExplSyntaxOn
\NewDocumentCommand \PatchCrefFormat { m }
  {
    \exp_args:Nc \regexpatchcmd { cref@#1@format }
      { \cP.2 \c{cref@#1@name} }
      { A \ \cP\#2 \ B }
      { } { \PatchFailed }
  }
\ExplSyntaxOff


\begin{document}

\makeatletter

\PatchCrefFormat{theorem}

\meaning\cref@theorem@format

\meaning\crefrange@theorem@format

\meaning\Crefrange@theorem@format@first

\meaning\Crefrange@theorem@format@second

\makeatother

\end{document}

相关内容