为了将超链接放在正确的位置,我想修补一些由 生成的格式宏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
已经被theorem
TeX 的参数替换所替换)。
然后替换正则表达式很简单A \ \cP\#2 \ B
:A
,一个空格,一个参数字符#
(\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}