前段时间我使用了用户 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@part
hyperref 中是如何定义的,但未能在代码中找到搜索模式,而且我对 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
更好的办法是找到一个不依赖修补的持久解决方案