在 classicthesis 中将页码转换为罗马格式(并转回)会产生错误的超链接

在 classicthesis 中将页码转换为罗马格式(并转回)会产生错误的超链接

本文档中目录中第 2、3、5、6、8、9 章的超链接可转至前几章的起始页(第 1、4 和 8 章以及所有部分均有适当的超链接):

\documentclass[a4paper]{scrbook}

\usepackage{classicthesis}
%\usepackage{hyperref}

\title{Title}
\author{Author}

\begin{document}

\tableofcontents%

\part{1}
\chapter{1}
\chapter{2}
\chapter{3}

\newcounter{savepage}
\setcounter{savepage}{\arabic{page}}
\cleardoublepage
\pagenumbering{Roman}

\part{2}
\chapter{4}
\chapter{5}
\chapter{6}

\cleardoublepage
\pagenumbering{arabic}
\setcounter{page}{\thesavepage}

\part{3}
\chapter{7}
\chapter{8}
\chapter{9}

\end{document}

切换两条线路:

\usepackage{classicthesis}
%\usepackage{hyperref}

到:

%\usepackage{classicthesis}
\usepackage{hyperref}

使所有章节超链接按预期工作。

我知道使用不同的页码编号方案并hyperref以独特的方式标记它们往往很棘手,但在这种情况下,它hyperref本身似乎可以正确地解释页面标签。classicthesis仅当调用包时(间接调用)才会出现问题hyperref

有没有简单的解决方案或更合适的方法来实现所需的结果?我不确定这是否是一个错误,或者我是否没有按照应该的方式执行此操作。

受影响的章节超链接在下图中标记。

在此处输入图片描述


编辑:在 esdd 的解决方案之后,除了 LoT/LoF 的条目外,几乎所有内容都可以正常工作:

\documentclass[a4paper]{scrbook}
\PreventPackageFromLoading[{\newcommand*\pdfstringdefDisableCommands[1]{}}]{hyperref}

\usepackage{classicthesis}

\ResetPreventPackageFromLoading
\let\pdfstringdefDisableCommands\relax
\usepackage{hyperref}
\pdfstringdefDisableCommands{\let\thepart=\relax}% I do not know if that is really needed

\usepackage[nottoc]{tocbibind} % adding list of figures and list of tables to table of contents

\cfoot*{Page \pagemark}% to show the page number

\newcounter{savepage}

\begin{document}
\tableofcontents

\part{1}
\chapter{1}
\chapter{2}
\chapter{3}

\cleardoublepage
\setcounter{savepage}{\value{page}}
\pagenumbering{Roman}

\part{2}
\chapter{4}
\chapter{5}
\chapter{6}

\cleardoublepage
\pagenumbering{arabic}
\setcounter{page}{\thesavepage}

\part{3}
\chapter{7}
\chapter{8}
\chapter{9}

\listoftables
\listoffigures
\end{document}

在此处输入图片描述

答案1

正如@egreg 所评论的(该评论被删除了?)包hyperref加载得太早了。

解决方法:您可以使用\PreventPackageFromLoading[...]{hyperref}before 包classicthesis\ResetPreventPackageFromLoadingwhenclassicthesis加载。这两个命令均由 KOMA-Script 包提供,scrlfile并由 KOMA-Script 类自动加载。

\documentclass[a4paper]{scrbook}
\PreventPackageFromLoading[{\newcommand*\pdfstringdefDisableCommands[1]{}}]{hyperref}

\usepackage{classicthesis}

\ResetPreventPackageFromLoading
\let\pdfstringdefDisableCommands\relax
\usepackage{hyperref}
\pdfstringdefDisableCommands{\let\thepart=\relax}% I do not know if that is really needed

\cfoot*{Page \pagemark}% to show the page number

\newcounter{savepage}

\begin{document}
\tableofcontents

\part{1}
\chapter{1}
\chapter{2}
\chapter{3}

\cleardoublepage
\setcounter{savepage}{\value{page}}
\pagenumbering{Roman}

\part{2}
\chapter{4}
\chapter{5}
\chapter{6}

\cleardoublepage
\pagenumbering{arabic}
\setcounter{page}{\thesavepage}

\part{3}
\chapter{7}
\chapter{8}
\chapter{9}
\end{document}

更新

使用 KOMA-Script 类,您可以使用选项listof=totoc获取 LoF 和 LoT 的 ToC 条目。因此您可以tocbibind从更新的 MWE 中删除包。

似乎还有第二个解决方法需要正确获取 LoF 和 LoT 的链接。

\documentclass[a4paper,
  listof=totoc% <- add a tocentry for LoF and LoT
]{scrbook}

\PreventPackageFromLoading[{\newcommand*\pdfstringdefDisableCommands[1]{}}]{hyperref}
\usepackage{classicthesis}

\usepackage{xpatch}
\xpretocmd\listoftoc{\cleardoublepage\phantomsection}{}{\PatchFailed}

\ResetPreventPackageFromLoading
\let\pdfstringdefDisableCommands\relax
\usepackage{hyperref}
\pdfstringdefDisableCommands{\let\thepart=\relax}% I do not know if that is really needed

\cfoot*{Page \pagemark}% to show the page number

\newcounter{savepage}
\begin{document}
\tableofcontents
\part{1}
\chapter{1}
\chapter{2}
\chapter{3}

\cleardoublepage
\setcounter{savepage}{\value{page}}
\pagenumbering{Roman}

\part{2}
\chapter{4}
\chapter{5}
\chapter{6}

\cleardoublepage
\pagenumbering{arabic}
\setcounter{page}{\thesavepage}

\part{3}
\chapter{7}
\chapter{8}
\chapter{9}

\listoftables
\listoffigures
\end{document}

答案2

正确设置页码:首先确保弹出一页,然后如果页码是奇数则加 1,因为下一个\cleardoublepage

\documentclass[a4paper]{scrbook}

\usepackage{classicthesis}

\newcounter{savepage}

\title{Title}
\author{Author}

\begin{document}

\tableofcontents

\part{1}
\chapter{1}{\Huge\thepage}
\chapter{2}{\Huge\thepage}
\chapter{3}{\Huge\thepage}

\clearpage
\setcounter{savepage}{\value{page}}
\ifodd\value{savepage}\stepcounter{savepage}\fi
\cleardoublepage

\pagenumbering{Roman}

\part{2}
\chapter{4}{\Huge\thepage}
\chapter{5}{\Huge\thepage}
\chapter{6}{\Huge\thepage}

\cleardoublepage
\pagenumbering{arabic}
\setcounter{page}{\value{savepage}}

\part{3}
\chapter{7}{\Huge\thepage}
\chapter{8}{\Huge\thepage}
\chapter{9}{\Huge\thepage}

\end{document}

相关内容