如何禁止 URL 内的分页符而不禁止换行符?

如何禁止 URL 内的分页符而不禁止换行符?

考虑一下文件

\documentclass{article}
\usepackage{lipsum}
\usepackage{hyperref}
\begin{document}
\edef\l{Lorem,ipsum,dolor,sit,amet,,
  consectetur,adipiscing,elit,,sed,do,
  eiusmod,tempor,incididunt,ut,labore,et,dolore,magna,aliqua.  ,,Ut,
  enim,ad,minim,veniam,,quis,nostrud,exercitation,ullamco,laboris,
  nisi,ut,aliquip,ex,ea,commodo,consequat.  ,,Duis,aute,irure,
  dolor,in,reprehenderit,in,voluptate,velit,esse,cillum,dolore,eu,
  fugiat,nulla,pariatur.  ,,Excepteur,
  sint,occaecat,cupidatat,non,proident,,sunt,in,culpa,qui,officia,
  deserunt,mollit,anim,id,est,laborum.}
\url{\l}

\url{\l}

\url{\l}

\url{\l}

\url{\l}

\url{\l}

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
\url{\l}
\end{document}

它会产生一个跨页面的 URL,从而导致Hyperref 链接跨越分页符,看起来丑陋\mbox。但是,如果我按照建议的方式将链接放在https://tex.stackexchange.com/a/182769/2066,那么 URL 就会从页面右侧跑出。我可以\interlinepenalty 10000按照建议进行设置https://tex.stackexchange.com/a/21985/2066,但这对于长段落来说并不理想,因为它会导致根本不会中断该段落。我可以\widowpenalties 7 10000 10000 10000 10000 10000 10000 0在此处插入我想要的内容,但这需要知道链接跨越多少行以及它在段落中的位置等。有没有更好的方法,或者至少有一种方法可以自动计算参数并将\windowpenalties其隐藏在命令后面?(有没有办法在同一段落中支持多个不可分页的链接?(如果这是软件包的一个选项就好了hyperref……))

编辑:由于它看起来可能相关,我需要一个适用于 LuaLaTeX 生成的 PDF 而不仅仅是 pdflatex 的解决方案。

答案1

更新 2022-11-04

中断链接所需的补丁将从移至pdfmanagement-testphaselatex-lab并且不再自动加载。

这意味着从 pdfmanagment 0.95t 版本开始,必须\DocumentMetadata明确加载补丁,直到将它们直接添加到 LaTeX 中:

\DocumentMetadata{testphase=new-or-1}

更新于2021-08-28。

我刚刚上传了 pdfmanagment-testphase 包的新版本。它现在包含中断页眉和页脚中链接的代码。因此,以下内容将给出与下面提到的补丁相同的输出。它需要当前的 tex 系统(texlive 2021 或当前的 miktex),因为它需要一些新的原语。

\RequirePackage{pdfmanagement-testphase} % no longer needed with next latex 2022-06-01
\DeclareDocumentMetadata{} % Change to \DocumentMetadata{} in latex 2022-06-01

\documentclass{article}
\usepackage{lipsum}
\usepackage{hyperref}
\usepackage{color,fancyhdr}
\pagestyle{fancy}
\lhead{HEADER}
\lfoot{FOOTER}

\textheight=2.5cm
\begin{document}

\section{abc}
x\\x\\x\\x
\href{https://www.latex-project.org}{Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.}\\x

\end{document}

旧答案

PDF 中的链接基本上是页面上的一个矩形(省略更复杂的形状)区域。

如果链接在行或页上断开,pdftex 必须创建多个链接,每个片段/框一个。为了确定片段是否属于这种断开的链接,pdftex 会保留由 创建的链接堆栈\pdfstartlink,称为pdf_link_stack。在将 hbox 写出到 pdf 时,pdftex 会检查框的嵌套级别是否与 中的顶部条目的嵌套级别相同,pdf_link_stack如果是,则该框也将成为链接。

这意味着页眉或页脚是否是链接取决于装箱级别。

页眉和页脚的装箱级别不同:在您的示例中,只有页眉是链接。但是,如果您加载包,color情况会发生变化,因为color会添加一个额外的框。如果您使用 fancyhdr 也会添加框,情况也类似。

解决这个问题的一种方法是在文本主体周围添加更多框命令。但这并不容易,因为您不知道需要多少层:包和用户可以轻松添加更多框,例如通过\parbox在页脚中使用。

因此,在 TeXLive 2021 中,pdftex 将获得两个新的原语,这将有助于避免此问题(它们是围绕\specialdvipdfmx 类似的模型建模的)(对于 Windows,可以从 w32tex.org 获取二进制文件。MiKTeX 也已经有了新的二进制文件):

\pdfrunninglinkoff\pdfrunninglinkon允许中断链接。

它们的使用并不完全简单,因为它们必须放置在正确的框级别。以下显示了\@outputpage如果加载了颜色,应如何更改以使其与框设置配合使用:

\documentclass{article}
\usepackage{lipsum}
\usepackage{hyperref}
\usepackage{color,xpatch,fancyhdr}
\pagestyle{fancy}
\lhead{HEADER}
\lfoot{FOOTER}

\makeatletter
%patches for texlive 2021/current miktex
\xpatchcmd\@outputpage{\vfil\color@hbox}{\vfil\pdfrunninglinkoff\color@hbox}{}{\fail}
\xpatchcmd\@outputpage{{\@thehead}\color@endbox}{{\@thehead}\color@endbox\pdfrunninglinkon}{}{\fail}
\xpatchcmd\@outputpage{\footskip\color@hbox\normalcolor}{\footskip\color@hbox\normalcolor\pdfrunninglinkoff}{}{\fail}
\xpatchcmd\@outputpage{{\@thefoot}\color@endbox}{{\@thefoot}\pdfrunninglinkon\color@endbox}{}{\fail}
\makeatother

\textheight=2.5cm
\begin{document}

\section{abc}
x\\x\\x\\x
\href{https://www.latex-project.org}{Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.}\\x

\end{document}

没有补丁的输出:

无补丁的输出

补丁后的输出:

在此处输入图片描述

相关内容