![在 classicthesis 中将页码转换为罗马格式(并转回)会产生错误的超链接](https://linux22.com/image/371179/%E5%9C%A8%20classicthesis%20%E4%B8%AD%E5%B0%86%E9%A1%B5%E7%A0%81%E8%BD%AC%E6%8D%A2%E4%B8%BA%E7%BD%97%E9%A9%AC%E6%A0%BC%E5%BC%8F%EF%BC%88%E5%B9%B6%E8%BD%AC%E5%9B%9E%EF%BC%89%E4%BC%9A%E4%BA%A7%E7%94%9F%E9%94%99%E8%AF%AF%E7%9A%84%E8%B6%85%E9%93%BE%E6%8E%A5.png)
本文档中目录中第 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
和\ResetPreventPackageFromLoading
whenclassicthesis
加载。这两个命令均由 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}