使用回车符来中断 URL 的选项?

使用回车符来中断 URL 的选项?

有几种方法可以让长而难以操作的 URL 在 LaTeX 中换行。如果您使用的是 pdfLaTeX,那么该hyperref软件包可以帮您将它们换行,大致在任意 之后/。如果您给它这个[hyphens]选项,它还会允许在任何字符后换行-。如果您不使用 pdfLaTeX,则breakurl包给出了相同的行为。但是它的文档说它永远不会在破折号处断开 URL,因为破折号可能会被误认为不是 URL 一部分的连字符。同样,选项的文档警告hyphenshyperref连字符后断开可能会导致印刷混乱。具体来说,如果 LaTeX 必须处理像 这样的 URL http://foo.com/is-this-read-able-or-readable,并且恰好在第三个破折号后断开,那么查看打印结果:

   http://foo.com/is-this-read-
able-or-readable

含糊不清:除非你作为读者已经知道或者breakurl从不[hyphens]{hyperref}引入新-字符,那么就有可能将该 url 读作is-this-readable-or-readable,这是不正确的。

假设你遵循警告,并决定不是在破折号后断开。然后,自然地,你可能会发现自己的盒子严重不足或过满。我通常遵循的推荐建议是使用 FlushLeft但即便如此,你也可能有一些特别难以打破的链接。所以我的场景是:

  • 甚至FLushLeft认为队伍不够满
  • 在最后一个字符之后,没有任何好的字符可以破坏 URL/
  • 在线情况下(即在计算机上查看,而不是打印出来),我需要支持hyperref正确链接 URL - 因此奇怪的字符不应该出现在文本中或hyperref可能造成混淆。
  • 我正在使用 pdflatex,如果这对解决方案有任何影响。

我的问题(我希望这个网站中的许多相关问题不会重复这个问题!)是,有没有办法配置,\url以便我可以在任何字符处中断,插入一个回车符(\hookleftarrow我认为在视觉上类似于)作为连字符,并且仍然正确链接hyperref(即不认为回车符是文本的一部分)?根据这个问题,这很棘手,而且看起来它与 不太兼容hyperref。其他问题的其他建议大多归结为“使用右侧不规则文本”。显然,我宁愿在 URL 中可中断的位置中断,也不愿插入符号,但这个 URL 特别不配合……

已编辑:我修改了问题的描述,以(希望)澄清我的目标。我知道解决方案涉及在破折号处断开;我首先试图避免对破折号和连字符产生混淆 :)

答案1

您需要使用 吗breakurl?如果不需要,则\usepackage[hyphens]{url}大部分情况下都可以使用(带连字符的 URL 周围的框不太正确)。

\documentclass{article}
\usepackage[hyphens]{url}
\usepackage{hyperref}

\begin{document}
\url{https://tex.stackexchange.com/questions/28835/option-to-break-urls-with-carriage-return-symbol}

\bigskip% An alternative, if this is meant for online use:
\href{https://tex.stackexchange.com/questions/28835/option-to-break-urls-with-carriage-return-symbol}{Question about to break in URLs}
\end{document}

[hyphens]选项似乎也解决了参考书目问题(改编形式参考书目中的 URL 引用):

\documentclass{article}
\usepackage[hyphens]{url}
\usepackage{filecontents}

\begin{filecontents}{\jobname.bib}
@misc{A01,
  author = {Lerner, Ben},
  year = {2011},
  title = {Break URLs},
  url = {http://short.domain.com/very-long-dashed-section},
}
\end{filecontents}

\begin{document}
\nocite{*}
\bibliographystyle{alphaurl}
\bibliography{\jobname}
\end{document}

enter image description here

更新:2011-09-20:

借用用向后的箭头替换连字符,这使用连\hookleftarrow字符分隔符,似乎有效。在这里我允许每一个字符是可破坏的,但如果不希望如此,您可以有选择地\BreakableChar在想要破坏的字符处插入:

enter image description here

\documentclass{article}
\usepackage{hyphenat}
\usepackage{url}
\usepackage{xstring}
\usepackage{forloop}
\usepackage{xcolor}
%\usepackage{filecontents}

\newsavebox\MyArrowBox%
\sbox\MyArrowBox{$\hookleftarrow$}%
\makeatletter%
\newcommand*{\BreakableChar}{%
  \leavevmode%
  \prw@zbreak%
  \discretionary{\usebox\MyArrowBox}{}{}%
  \prw@zbreak%
}%

\newcounter{index}%
\newcommand{\AddBreakableChars}[1]{%
  \StrLen{#1 }[\stringLength]%
  \forloop[1]{index}{1}{\value{index}<\stringLength}{%
    \StrChar{#1}{\value{index}}[\currentLetter]%
    {\currentLetter\BreakableChar}%
  }%
}%

\newcommand*{\MyUrl}{https://tex.stackexchange.com/questions/28835/option-to-break-urls-with-carriage-return-symbol}%

\begin{document}
\parbox{4cm}{\textcolor{blue}{\AddBreakableChars{\MyUrl}}}

\bigskip
\parbox{7cm}{\textcolor{blue}{\AddBreakableChars{\MyUrl}}}
\end{document}

答案2

url扩展,该包允许您通过指定、和hyperref来定义 URL 中的断点。该选项除了在列表中添加连字符外不执行任何其他操作。但还有另一个调整点:。在这里,您可以定义将执行有趣操作的字符。因此,我们可以让断点字符在发生换行时插入回车符。请注意,URL 实际上是在数学模式下设置的,因此必须将断点字符定义为映射到数学字符和断点。\UrlBreaks\UrlBigBreaks\UrlNoBreakshyphens\UrlBigBreaks\UrlSpecials

这个解决方案有一个小缺点。在原始设置中,由于 / 是一个\UrlBreak字符,所以两个连续的斜线之间不能出现换行符,例如 http://... 当将斜线设为特殊符号时,就会出现这样的换行符。

\documentclass[10pt,a4paper]{article}

\PassOptionsToPackage{hyphens}{url}
\usepackage[colorlinks]{hyperref}
\usepackage{dingbat} % for \carriagereturn
\newcommand{\urllb}{\discretionary{\carriagereturn}{}{}}

%% original breaking points of url package
% \def\UrlBreaks{\do\.\do\@\do\\\do\/\do\!\do\_\do\|\do\;\do\>\do\]%
%  \do\)\do\,\do\?\do\'\do+\do\=\do\#}%
% \def\UrlBigBreaks{\do\:\do@url@hyp}%

\renewcommand{\UrlSpecials}{\do\.{\mathchar`\.\urllb}%
                            \do\/{\mathchar`\/\urllb}%
                            \do\@{\mathchar`\@\urllb}%
                            \do\\{\mathchar`\\\urllb}%
                            \do\-{\mathchar`\-\urllb}%
                            \do\#{\mathchar`\#\urllb}}% 
                            % and so on; I'm too lazy to type all breaking characters 
                            % here, you get the idea
\begin{document}    
\urldef{\myurl}\url{http://tex.stackexchange.com/questions/28835/option-to-break-urls-with-carriage-return-symbol}
\parbox{3cm}{\myurl}

\bigskip

\parbox{4cm}{\myurl}

\bigskip

\parbox{5cm}{\myurl}
\end{document}

产量

sample output

答案3

由于您使用的是hyperref,因此可以手动拆分 URL。这样您就可以自由地在两部分之间放置任何您想要的字符,并且更普遍地可以微调输出。

需要注意的是,断开的两半要指向正确的东西——您可以通过使用\href\nolinkurl代替 来实现这一点\url

\documentclass{article}
\usepackage{hyperref}
\usepackage{parskip}

\begin{document}
\href{http://tex.stackexchange.com/questions/28835/option-to-break-urls-with-carriage-return-symbol}{\nolinkurl{http://tex.stackexchange.com/questions/}}%
\(\hookleftarrow\)\\
\qquad\href{http://tex.stackexchange.com/questions/28835/option-to-break-urls-with-carriage-return-symbol}{\nolinkurl{28835/option-to-break-urls-with-carriage-return-symbol}}
\end{document} 

相关内容