Hyperref 链接跨越分页符,看起来丑陋

Hyperref 链接跨越分页符,看起来丑陋

我正在使用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 代码中给出了链接,但它仍是链接的。
  • 另外,顶部链接盒是否应该延伸到线路末端也存在争议。

\pdfstartlinkpdfTeX 只是将和之间的材料\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}

第 1 页 第2页

相关内容