尽管之前可以工作,但补丁不再找到 hyperref 命令的搜索模式,不确定如何更新它

尽管之前可以工作,但补丁不再找到 hyperref 命令的搜索模式,不确定如何更新它

前段时间我使用了用户 Werner 提供的解决方案:

https://tex.stackexchange.com/a/582389

在我的一个文档中。具体来说,目标是使目录中的零件编号和零件标题居中并位于不同的行上,而不是默认的样式(左对齐且全部位于一行上)。该解决方案非常完美。

不幸的是,我最初用来制作该文档的机器最近坏了,迫使我买一台新机器并全新安装 LaTeX(带有 MiKTeX 的 TeXstudio)。

现在,当我再次尝试构建同一篇文档时,上述解决方案不再有效,部件标题会像通常默认的那样显示。如果相关的话,我上次在之前的机器上成功构建文档是在大约两周前,当时 Werner 的解决方案运行良好。

为了诊断问题(尚未解决),我逐字编译了 Werner 的 MWE,输出如下:

在此处输入图片描述

请注意,与 Werner 的输出不同,该部分并不居中,而是完全出现在一行上。

我尝试使用各种 TeX 引擎(pdfLaTeX、XeLaTeX 等),但输出都相同。否则,除非我无意中做了什么,否则我正在使用 TeXstudio 和 MiKTeX,因为它们安装时没有重新配置。但是,我安装了各种软件包(相当多 - 这是一个大文档,一本书,所以除非必要,否则我不想全部列出),这些软件包是原始文档的一部分。它们之前没有造成这个问题,所以我不知道为什么它们现在会造成问题。

我认为我已经确定问题出在了 上\patchcmd。我将其插入\tracingpatches到 Werner 的解决方案中,如下所示:

...
% \parts in ToC
\renewcommand{\cftpartfont}{\large\bfseries\ttfamily}
\makeatletter
\tracingpatches
% \patchcmd{<cmd>}{<search>}{<replace>}{<success>}{<failure>}
...

输出结果如下:

[debug] tracing \patchcmd on input line 11
[debug] analyzing '\H@old@part'
[debug] ++ control sequence is defined
[debug] ++ control sequence is a macro
[debug] ++ macro can be retokenized cleanly
[debug] -- search pattern not found in replacement text

因此,看起来 Werner 的解决方案中的搜索模式(或替换文本?)不再有效。我不知道这是为什么。

此刻,我不知所措。我试图查看\H@old@parthyperref 中是如何定义的,但未能在代码中找到搜索模式,而且我对 TeX 的熟练程度还不够,不知道还要搜索什么。

有人能帮我解决这个问题吗?如果可能的话,除了解决方案之外,我还希望能够提供有关导致此问题的具体原因的更多详细信息。

附言:我意识到可能还有其他方法可以实现我的目标,但我希望能解决这个特定问题。

答案1

嗯,这就是修补内部命令的问题:无法保证此类修补能够永远有效。

补丁不再起作用的原因是hyperref不再延迟 的加载nameref,因此现在要考虑nameref先打哪个补丁。要么打补丁\NR@part,要么(可能更好,因为无论如何都在努力从nameref和 中删除补丁hyperref\@part在加载 之前打补丁hyperref

还需添加一个失败命令,这样如果补丁再次失败,您就会收到错误(以及警告):

\patchcmd{\@part}% 
  {\thepart\hspace{1em}#1}% <search>
  {\protect\setpartToC{\thepart}{#1}}% <replace>
  {}{\ERROR}% <success><failure 

更好的办法是找到一个不依赖修补的持久解决方案

相关内容