![Hyperref 链接跨越分页符,看起来丑陋](https://linux22.com/image/249149/Hyperref%20%E9%93%BE%E6%8E%A5%E8%B7%A8%E8%B6%8A%E5%88%86%E9%A1%B5%E7%AC%A6%EF%BC%8C%E7%9C%8B%E8%B5%B7%E6%9D%A5%E4%B8%91%E9%99%8B.png)
我正在使用hyperref
链接pdflatex
,但遇到了以下问题:当参考书目引用跨越分页符(通常出现在较长的作者姓名中)时,页脚处会显示一个额外的绿色链接框,并且该链接会链接到下一页的整个页眉。
代码(包含我正在使用的所有软件包的列表):
\documentclass[a4paper,12pt,oneside]{book}
\synctex=1 % synchronize with texmaker
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[left=3.5cm, right=2cm, top=3.5cm, bottom=2.5cm]{geometry} % sizes
\usepackage{newcent} % font, Century Schoolbook
\usepackage{graphicx} % include graphics
\usepackage{setspace} % control line spacing
\usepackage{amssymb} % math
\usepackage{amsmath} % math
\usepackage{amsthm} % theorems
\usepackage{cite} % numeric citations
\usepackage{epigraph} % quotations
\usepackage{booktabs} % nice looking tables
\usepackage{url} % recognize urls
\usepackage{hyperref} % links in PDF
\usepackage{enumitem} % enhanced enumerations
\usepackage{fancyhdr} % fancy headers and footers
\usepackage{color} % allow colors
\usepackage{pdfpages} % include assignment PDFs
\usepackage{texshade} % sequence alignments
\usepackage{lipsum} % just for the sake of this example
\fancyhead{}
\fancyhead[LO]{\nouppercase{\textsc{\leftmark}}}
\fancyhead[RO]{\nouppercase{\textsc{\thepage}}}
\fancyfoot{}
\setlength{\headheight}{15pt}
\begin{document}
\onehalfspacing
\mainmatter
\pagestyle{fancy}
\chapter{An Example Chapter}
\lipsum
Stuff stuff stuff stuff stuff stuff
Stuff stuff stuff stuff stuff stuff
Stuff stuff stuff
\cite{reference}
Stuff stuff stuff stuff stuff stuff
Stuff stuff stuff stuff stuff stuff
Stuff stuff stuff
\bibliographystyle{apalike}
\bibliography{references}
\end{document}
BibTeX 文件references.bib
:
@Article{reference,
Author="LongSurnameOfTheFirstAuthor, D. and LongSurnameOfTheSecondAuthor, R. ",
Title="Example text",
Journal="Journal of example articles",
Year="2004",
Volume="21",
Number="12",
Pages="2326--2339",
Month="Dec",
Note={[DOI:\href{http://www.example.com}{example}]}
}
输出:
我怎样才能摆脱它?
我正在使用 pdfTeX 3.1415926-1.40.10-2.2(TeX Live 2009/Debian)和 BibTeX 0.99c(TeX Live 2009/Debian)。
答案1
这种不良行为是一个非常古老的缺陷hyperref
,不幸的是,它尚未得到解决。参见http://tug.org/applications/hyperref/ftp/README
12 待办事项
[...]
* PostScript 驱动程序:当前实现并不真正支持嵌套链接。起始位置应该被记住在堆栈中,但分页符会很复杂。
* ...
这也发生在pdflatex
答案2
pdfTeX 中的链接限制
\pdfendlink
可断开链接。这样,文本可以尽可能自然地流动。但这有其局限性。它甚至不需要分页符来显示其中之一:
\documentclass[a5paper]{article}
\usepackage[allbordercolors={0 0 1}]{hyperref}
\begin{document}
Hello \vadjust{\hbox{Oops}} World!
\href{http://www.example.org/}{This is a link\\broken across lines}
\end{document}
Oops
尽管在 TeX 代码中给出了链接,但它仍是链接的。- 另外,顶部链接盒是否应该延伸到线路末端也存在争议。
\pdfstartlink
pdfTeX 只是将和之间的材料\pdfendlink
转换为链接框。它使用基于组/框级别的启发式方法来排除某些内容。这有时在分页时有效,有时部分有效,有时根本不成功。
我已经给出了一个分页符的示例回答。
解决方法:防止跨页面链接
以下解决方法将标签放在链接的前面和后面,内部使用\hyper@link@
。如果页面引用不同,则链接在不同的页面上开始和结束。在这种情况下,链接被放入 中\mbox
,第二个标签被隐藏,以便在后续的 LaTeX 运行中有一个标记来记住这个决定。
当然,这也不是没有副作用和问题:
粘合组件被忽略,例如空格使用其自然宽度,不能在内部拉伸或收缩
\mbox
。由于避免了分页符,TeX 很难找到不同的换行符。下面的示例触发了“过满
\hbox
警告”。如果将链接放入
\mbox
,则信息将不再可用,无论链接是否跨越页面边界。随着文档的变化,.aux
应不时删除文件。由于标签的存在,链接需要额外的 LaTeX 运行。
完整示例:
\documentclass[12pt]{article}
\usepackage[a5paper,hmargin=10mm,vmargin=20mm]{geometry}
\usepackage{cite} % numeric citations
\usepackage{hyperref} % links in PDF
\usepackage{fancyhdr} % fancy headers and footers
\usepackage{lipsum} % just for the sake of this example
\fancyhead{}
\fancyhead[LO]{\nouppercase{\textsc{\leftmark}}}
\fancyhead[RO]{\nouppercase{\textsc{\thepage}}}
\fancyfoot{}
\setlength{\headheight}{15pt}
\usepackage{zref-abspage}
\makeatletter
\newcounter{lnkpg}
\renewcommand*{\thelnkpg}{lnkpg\the\value{lnkpg}}
\newcommand*{\org@hyper@link@}{}
\let\org@hyper@link@\hyper@link@
\protected\def\hyper@link@[#1]#2#3#4{%
\def\lnkpg@callorg{%
\org@hyper@link@[{#1}]{#2}{#3}{#4}%
}%
\stepcounter{lnkpg}%
\zref@labelbyprops{\thelnkpg a}{abspage}%
\zref@refused{\thelnkpg a}%
\zref@ifrefundefined{\thelnkpg a}{%
\lnkpg@callorg
\zref@labelbyprops{\thelnkpg b}{abspage}%
}{%
\zref@ifrefundefined{\thelnkpg b}{%
\mbox{\lnkpg@callorg}%
}{%
\edef\lnkpg@a{\zref@extractdefault{\thelnkpg a}{abspage}{0}}%
\edef\lnkpg@b{\zref@extractdefault{\thelnkpg b}{abspage}{0}}%
\ifx\lnkpg@a\lnkpg@b
\lnkpg@callorg
\zref@labelbyprops{\thelnkpg b}{abspage}%
\else
\mbox{\lnkpg@callorg}%
\fi
}%
}%
}
\makeatother
\begin{document}
\pagestyle{fancy}
\lipsum[2]\lipsum[2]\lipsum[2]\lipsum[4]
Stuff stuff stuff stuff stuff stuff
Stuff stuff stuff stuff stuff stuff
Stuff stuff stuff
\cite{reference}
Stuff stuff stuff stuff stuff stuff
Stuff stuff stuff stuff stuff stuff
Stuff stuff stuff
\begin{thebibliography}{}
\bibitem[LongSurnameOfTheFirstAuthor and LongSurnameOfTheSecondAuthor,
2004]{reference}
LongSurnameOfTheFirstAuthor, D. and LongSurnameOfTheSecondAuthor, R. (2004).
\newblock Example text.
\newblock {\em Journal of example articles}, 21(12):2326--2339.
\newblock [DOI:\href{http://www.example.com}{example}].
\end{thebibliography}
\end{document}