使用 pdflatex,我的所有引文都是指向参考书目中相应条目的 pdf 超链接。这会导致问题,因为有时 Latex 决定在引文中间进行分页,使得引文从第 n 页开始,到第 n+1 页结束。问题是第 n 页的页脚(包含页码)和第 n+1 页的页眉(包含章节名称)也包含在超链接中。
这在突出显示此类链接的 PDF 查看器(如 evince)中看起来尤其难看。到目前为止,我已经通过重写文本直到分页符不再与引用重合来解决这个问题,但有没有更好的解决方案?我不介意引用跨越页面,我只是不希望页眉和页脚包含在超链接中。
答案1
这是一个尚未解决的难题;pdfTeX 使用启发式方法来查找属于链接的正确框。这取决于框的顺序、嵌套级别和位置。以下示例修改了 LaTeX,\@outputpage
将页眉和页脚框移开,以欺骗 pdfTeX 的启发式方法。
\documentclass{article}
\usepackage{fancyhdr}
\fancyhead[c]{HEADER}
\fancyfoot[c]{FOOT}
\pagestyle{fancy}
\usepackage{hyperref}
\makeatletter
\def\@outputpage{%
\begingroup % the \endgroup is put in by \aftergroup
\let \protect \noexpand
\@resetactivechars
\global\let\@@if@newlist\if@newlist
\global\@newlistfalse
\@parboxrestore
\shipout \vbox{%
\set@typeset@protect
\aftergroup \endgroup
\aftergroup \set@typeset@protect
% correct? or just restore by ending
% the group?
\if@specialpage
\global\@specialpagefalse\@nameuse{ps@\@specialstyle}%
\fi
\if@twoside
\ifodd\count\z@ \let\@thehead\@oddhead \let\@thefoot\@oddfoot
\let\@themargin\oddsidemargin
\else \let\@thehead\@evenhead
\let\@thefoot\@evenfoot \let\@themargin\evensidemargin
\fi
\fi
\reset@font
\normalsize
\normalsfcodes
\let\label\@gobble
\let\index\@gobble
\let\glossary\@gobble
\baselineskip\z@skip \lineskip\z@skip \lineskiplimit\z@
\@begindvi
\vskip \topmargin
\moveright\@themargin \vbox {%
\setbox\@tempboxa \vbox to\headheight{%
\vfil
\color@hbox
\normalcolor
\hb@xt@\textwidth{\@thehead}%
\color@endbox
}% %% 22 Feb 87
\dp\@tempboxa \z@
%%% begin head
% \box\@tempboxa
%%% replaced by:
\moveright\paperwidth\rlap{%
\rlap{\kern-\paperwidth\box\@tempboxa}%
}%
%%% end head
\vskip \headsep
\box\@outputbox
\baselineskip \footskip
%%% begin foot
% \color@hbox
% \normalcolor
% \hb@xt@\textwidth{\@thefoot}%
% \color@endbox
%%% foot replaced by
\setbox\@tempboxa=\hbox{%
\color@begingroup
\normalcolor
\hb@xt@\textwidth{\@thefoot}%
\color@endgroup
}%
\moveright\paperwidth\rlap{%
\rlap{\kern-\paperwidth\box\@tempboxa}%
}%
%%% end foot
}%
}%
\global\let\if@newlist\@@if@newlist
\global \@colht \textheight
\stepcounter{page}%
\let\firstmark\botmark
}
\makeatother
\begin{document}
\href{http://www.dante.de/}{Hello\newpage\noindent World}
\end{document}
页脚和页眉行周围的链接仍然存在,但位于页面区域之外:
/MediaBox [0 0 612 792] % page 1 and 2
/Rect [147.716 656.239 478.476 665.15] % page 1, "Hello"
/Rect [744.772 84.782 746.765 98.73] % page 1, "FOOTER"
/Rect [744.772 691.108 746.765 705.056] % page 2, "HEADER"
/Rect [132.772 656.239 161.359 665.15] % page 2, "World"
如果添加图片和脚注:
\begin{document}
\footnote{A footnote}
\begin{figure}[b]\centering Figure bottom\caption{Figure A}\end{figure}
\href{http://www.dante.de/}{Hello\newpage\noindent World}
\begin{figure}[t]\centering Figure top\caption{Figure B}\end{figure}
\end{document}
那么在这种情况下,图片不会转换为链接,但脚注是链接。后者可以通过重新定义来捕获\@makecol
:
\gdef \@makecol {%
\ifvoid\footins
\setbox\@outputbox \box\@cclv
\else
\setbox\@outputbox \vbox {%
\boxmaxdepth \@maxdepth
\unvbox \@cclv
\vskip \skip\footins
\color@begingroup
\normalcolor
\footnoterule
%%% original:
% \unvbox\footins
%%% modified:
\moveright\paperwidth\rlap{%
\kern-\paperwidth\box \footins
}%
%%%
\color@endgroup
}%
\fi
\let\@elt\relax
\xdef\@freelist{\@freelist\@midlist}%
\global \let \@midlist \@empty
\@combinefloats
\ifvbox\@kludgeins
\@makespecialcolbox
\else
\setbox\@outputbox \vbox to\@colht {%
\@texttop
\dimen@ \dp\@outputbox
\unvbox \@outputbox
\vskip -\dimen@
\@textbottom
}%
\fi
\global \maxdepth \@maxdepth
}
但是,如果再次编辑,将自由垂直材料(\unvbox
)放入固定框中并非没有副作用。因此它很快就会变得丑陋。修补 LaTeX 输出例程的基本宏会引发与其他处理输出例程的软件包的兼容性问题。\@cclv
\unvbox
答案2
您可以像这样包装有问题的引用,\hbox{\cite{...}}
使其牢不可破。对我来说,这很有效。
答案3
如果将来有人遇到此问题并使用 DVI 工作流程,解决方案可以是dvibreaklinks.sty。它只适用于luatex
引擎,因为链接插入基于\localleftbox
和\localrightbox
。链接将通过页面正确断开(浮动和标题将被忽略)
\documentclass{article}
\usepackage[paperwidth=10cm,paperheight=5cm]{geometry}
\usepackage[T1]{fontenc}
\usepackage[breaklinks]{hyperref}
\usepackage{dvibreaklinks}
\usepackage{blindtext}
\begin{document}
\href{https://github.com}{\blindtext}
\end{document}