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