hyperref 软件包使用 KOMA 销毁 \leftmark 和 \rightmark

hyperref 软件包使用 KOMA 销毁 \leftmark 和 \rightmark

我注意到,当我使用\usepackage{hyperref}左和右标记时,它们被破坏了。可以通过取消下面的注释来验证这hyperref一点MWE


没有hyperref 没有 <code>hyperref</code>


hyperref 使用 <code>hyperref</code>

\documentclass[oneside,
           a4paper,
           parskip=off,
           12pt]{scrbook}


%\usepackage{hyperref}

\usepackage{lipsum}
\usepackage{etoolbox}
\makeatletter
\patchcmd{\@part}{\@mkboth{}{}}{\@mkboth{#1}{#1}}{}{} %
\makeatother

\usepackage{scrlayer-scrpage}
\cohead[]{\leftmark}    
\cohead[]{\rightmark}
%\pagestyle{scrheadings}
\begin{document}
\part{One}
\lipsum[1-20]
\part{Two}
\lipsum[1-20]
\end{document}

KOMA scrbook我该如何防止这种不良行为?或者,如何在使用时插入包含部分标题的页眉hyperref

答案1

hyperref为使文档中的超链接正常工作,它做了很多幕后工作。因此,它通常会存储现有命令以供以后使用,并根据其要求更新定义。

在您的特定情况下,\@part使用 时不需要修补宏hyperref。相反,您需要修补\H@old@part- 由 制作hyperref以存储 的“旧”版本\@part

在此处输入图片描述

\documentclass[oneside,
           a4paper,
           parskip=off,
           12pt]{scrbook}

\usepackage{hyperref}

\usepackage{lipsum}
\usepackage{etoolbox}
\makeatletter
\patchcmd{\H@old@part}{\@mkboth{}{}}{\@mkboth{#1}{#1}}{}{} %
\makeatother

\usepackage{scrlayer-scrpage}
\cohead[]{\leftmark}    
\cohead[]{\rightmark}
%\pagestyle{scrheadings}
\begin{document}
\part{One}
\lipsum[1-20]
\part{Two}
\lipsum[1-20]
\end{document}

您还会发现,您的\patchcmd工作没有按预期进行,您在\tracinpatches序言中添加了以下内容并检查了您的.log

[debug] tracing \patchcmd on input line 13
[debug] analyzing '\@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

\@mkboth{}{}未找到搜索模式,因为hyperref重新定义\@part

\def\@part{%
  \ifnum\Hy@secnum@part>\c@secnumdepth
    \phantomsection
  \fi
  \H@old@part
}

与大多数相关事物一样hyperref,另一种方法是最后加载它。

答案2

您可以使用 KOMA-Script 命令\automark并重新定义\partmarkformat以获得所需的结果:

\usepackage{scrlayer-scrpage}
\automark[part]{part}
\renewcommand\partmarkformat{}

在此处输入图片描述

代码:

\documentclass[oneside,
           a4paper,
           parskip=off,
           12pt]{scrbook}

\usepackage{hyperref}

\usepackage{lipsum}

\usepackage{scrlayer-scrpage}
\automark[part]{part}
\renewcommand\partmarkformat{}

\begin{document}
\part{One}
\lipsum[1-20]
\part{Two}
\lipsum[1-20]
\end{document}

相关内容