使用twocolumn
模式时,一个已知问题是,对章节标题的引用指向基线而不是章节标题。
在之前的一个问题中,我问过如何修复目录这个问题,但我意识到该解决方案并不能解决我\ref
和朋友的相同问题。
我尝试\label
以与 相同的方式进行修补,但这对的\addcontentsline
没有任何影响。我如何修改标签的目标?如果有帮助的话,引用该章节的书签总是以 为前缀。\hypertarget
\*ref
chapter:
chapter:
代表:
\documentclass{scrbook}
\usepackage[twocolumn]{geometry}
\usepackage{varioref}
\usepackage[hypertexnames=false]{hyperref}
\usepackage{cleveref}
\usepackage{etoolbox}
% Add extra hyper target for chapter: chapter..\thechapter
\renewcommand*{\chapterformat}{%
\mbox{\raisebox{25pt}[0pt][0pt]{\hypertarget{.\theHchapter}{}}% Add
\chapappifchapterprefix{\nobreakspace}\thechapter\hspace{1em}}%
}
\makeatletter
% Update \addcontentsline to jump to new hyper target _only_ if \chapter is used
\patchcmd{\addcontentsline}% <cmd>
{\Hy@writebookmark}% <search>
{\ifnum\pdfstrcmp{chapter}{#2}=0 % Chapter mark
\edef\@currentHref{.\theHchapter}%
\fi
\Hy@writebookmark}% <replace>
{}{}% <success><failure>
\patchcmd{\label}% <cmd>
{\Hy@writebookmark}% <search>
{\edef\@currentHref{.\theHchapter}%
\Hy@writebookmark}% <replace>
{}{}% <success><failure>
\makeatother
\makeatletter
\@addtoreset{chapter}{part}
\makeatother
\begin{document}
\tableofcontents
\part{A}
\chapter{foo\label{chapter:foo}}
\chapter{bar}
\part{B}
\chapter{Baz}\label{chapter:Baz}
\chapter{Foobar}
\Vref{chapter:Baz}.
\Vref{chapter:foo}.
\end{document}
答案1
Hyperref 自动在每个页面顶部以名称提供目标page.\thepage
。
\documentclass{scrbook}
\usepackage[twocolumn]{geometry}
\usepackage{varioref}
\usepackage{hyperref}
\usepackage{cleveref}
\newcommand{\topref}[1]% #1 = label
{\hyperlink{page.\getpagerefnumber{#1}}{\getrefnumber{#1}}}
\begin{document}
chapter \topref{chapter:foo}
\part{A}
\chapter{foo}\label{chapter:foo}
\chapter{bar}
\part{B}
\chapter{Baz}\label{chapter:Baz}
\chapter{Foobar}
\end{document}