如何使用 \patchcmd 替换标记字符串的第二个匹配项?

如何使用 \patchcmd 替换标记字符串的第二个匹配项?

我将首先提出一个一般性问题,然后尝试描述我真正想要实现的目标。

一般问题:如何使用\patchcmd

\patchcmd命令from的逻辑etoolbox基本上是一个搜索和替换过程。但在手册中,它明确指出

匹配第一的要修补的 <command> 的替换文本中出现了 <search> 模式

然后,我的问题是如何替换第二个匹配项、第三个匹配项或所有匹配项。原因是 latex 的许多内置命令具有以下结构

\ifxxx
<some commands>
\theComandIWantToReplace
<some commands>
\else
<some other commands>
\theComandIWantToReplace
<some other commands>
\fi

并且根据我的实践,\patchcmd我无法用第二种情况来代替。

更具体:如何在目录项和段落书签中添加段落符号

更具体地说,我想要实现的是向\paragraph目录中的项目添加段落符号以及 PDF 书签。经过一些搜索后latexdef,我发现最经济的方法就是\addcontentsline\paragraph命令中修补命令,所以我尝试

\documentclass{book}

\setcounter{tocdepth}{4}
\usepackage{etoolbox}
\usepackage{bookmark}
\makeatletter
\patchcmd{\paragraph}{\addcontentsline {toc}{#1}{\ifnum #2>\c@secnumdepth \else \protect \numberline {\csname the#1\endcsname }\fi #7}}{\addcontentsline {toc}{#1}{\ifnum #2>\c@secnumdepth \else \protect \numberline {\csname the#1\endcsname }\fi\P~#7}}{}{}
\makeatother

\begin{document}
    \tableofcontents
    \paragraph{asdadas}
\end{document}

请注意,我添加了一个\P替换文本。但似乎没有产生预期的结果。我猜原因是搜索命令实际上在命令中出现了两次,\paragraph在此处输入图片描述

但是,我错的可能性很高。

系统信息

如果这很重要的话,我在 MacOS 12.3.1 上使用 TexLive 2021 并使用 pdflatex 进行编译。

答案1

补丁失败,因为搜索文本是不是在 的替换文本中\paragraph

而且您也不想修补\@sect,因为这会影响每个分段命令。

只需重新定义\theparagraph

\documentclass{book}
\usepackage{bookmark}

\setcounter{tocdepth}{4}
\setcounter{secnumdepth}{4}
\bookmarksetup{level=4,numbered}

\renewcommand{\theparagraph}{\P~\thesubsubsection.\arabic{paragraph}}

\begin{document}

\tableofcontents

\paragraph{asdadas}

\end{document}

在此处输入图片描述

相关内容