xurl
是一个很好的解决方案。
以下是这段话的引文:
包 xurl 默认加载包 url,并为所有字母数字字符和 = / . : * - ~ ' " 定义可能的 url 中断
如何添加下划线 = / . : * - ~ ' " 和 _ 作为首选字符来打破以下url
https://www.weibull.com/pubs/2011_RAMS_planning_a_reliability_growth_program_utilizing_historical_data.pdf
只有在迫不得已的情况下才应断言。
显示问题的最少代码:
\documentclass{minimal}
\usepackage{xurl}
\begin{document}
Here is the url \url{https://www.weibull.com/pubs/2011_RAMS_planning_a_reliability_growth_program_utilizing_historical_data.pdf}.
\end{document}
答案1
理论上,除了其他可能的断点之外,还可以允许在 , , 之后换行,但惩罚会更严厉(这意味着 LaTeX 将更喜欢其他连字符点A-Z
)a-z
。0-9
\url
不过,我怀疑这会产生与直接加载截然不同的效果xurl
,后者允许在任何地方以相同的惩罚进行换行。如果 URL 占据了行的很大一部分,则可能没有多少空间可以缩小和放大,这意味着 TeX 在决定换行位置时几乎没有回旋余地:URL 要么可以在与边距相交的地方换行,要么不换行。
无论如何,这是如何biblatex
做到的
\documentclass{article}
\usepackage{url}
\usepackage{lipsum}
\mathchardef\UrlNotSoGreatBreakPenalty=800
\usepackage{etoolbox}
\begingroup
\def\do#1{%
\gappto\UrlSpecials{%
\do#1{%
\mathchar`#1
\penalty\UrlNotSoGreatBreakPenalty}}}
\do\A\do\B\do\C\do\D\do\E\do\F\do\G\do\H\do\I\do\J
\do\K\do\L\do\M\do\N\do\O\do\P\do\Q\do\R\do\S\do\T
\do\U\do\V\do\W\do\X\do\Y\do\Z
\do\a\do\b\do\c\do\d\do\e\do\f\do\g\do\h\do\i\do\j
\do\k\do\l\do\m\do\n\do\o\do\p\do\q\do\r\do\s\do\t
\do\u\do\v\do\w\do\x\do\y\do\z
\do\1\do\2\do\3\do\4\do\5\do\6\do\7\do\8\do\9\do\0
\endgroup
\begin{document}
\lipsum[1]
Text \url{https://www.weibull.com/pubs/2011_RAMS_planning_a_reliability_growth_program_utilizing_historical_data.pdf}.
\lipsum[2]
\end{document}
A-Z
这将对、 、之后不太严重的断句罚 800 分a-z
。0-9
标点符号后的断句罚 700 分,:
标点符号后的大断句罚 500 分。
您可以按照建议留出一些可伸缩空间乌尔丽克·菲舍尔的回答到长 URL 中的“不均匀”中断(\url)(已经被无耻地窃取了biblatex
:https://github.com/plk/biblatex/issues/850,https://github.com/plk/biblatex/pull/886)。这样可以让您的 URL 在更合适的位置断开,但代价是字符之间的空格更多一些。
\documentclass{article}
\usepackage{url}
\usepackage{lipsum}
\mathchardef\UrlNotSoGreatBreakPenalty=800
\newmuskip\urlalnumskip
\setlength{\urlalnumskip}{0mu plus 2mu}
\usepackage{etoolbox}
\begingroup
\def\do#1{%
\gappto\UrlSpecials{%
\do#1{%
\mathchar`#1
\mskip\urlalnumskip
\penalty\UrlNotSoGreatBreakPenalty}}}
\do\A\do\B\do\C\do\D\do\E\do\F\do\G\do\H\do\I\do\J
\do\K\do\L\do\M\do\N\do\O\do\P\do\Q\do\R\do\S\do\T
\do\U\do\V\do\W\do\X\do\Y\do\Z
\do\a\do\b\do\c\do\d\do\e\do\f\do\g\do\h\do\i\do\j
\do\k\do\l\do\m\do\n\do\o\do\p\do\q\do\r\do\s\do\t
\do\u\do\v\do\w\do\x\do\y\do\z
\do\1\do\2\do\3\do\4\do\5\do\6\do\7\do\8\do\9\do\0
\endgroup
\begin{document}
\lipsum[1]
Text \url{https://www.weibull.com/pubs/2011_RAMS_planning_a_reliability_growth_program_utilizing_historical_data.pdf}.
\lipsum[2]
\end{document}
请注意,第一行中的字符是如何间隔开相当远的,以便能够实现更好的间隔。
如果您仔细研究惩罚和可拉伸空间,您会发现,只有当可拉伸空间能够给予惩罚足够的余地时,惩罚才会产生实际效果。
答案2
这将创建一个\url
允许在指定字符处中断的命令,这里给出的字符是/
、.
和_
。
\documentclass{article}
\usepackage[pass,showframe]{geometry}
\catcode`_=12
\newcommand{\url}[1]{%
\begingroup
\ttfamily
\begingroup\lccode`~=`/\lowercase{\endgroup\def~}{/\penalty0 }%
\begingroup\lccode`~=`.\lowercase{\endgroup\def~}{.\penalty0 }%
\begingroup\lccode`~=`_\lowercase{\endgroup\def~}{_\penalty0 }%
\catcode`/=\active\catcode`.=\active\catcode`_=\active
\scantokens{#1\noexpand}%
\endgroup
}
\catcode`_=8
\begin{document}
Here is the url \url{https://www.weibull.com/pubs/2011_RAMS_planning_a_reliability_growth_program_utilizing_historical_data.pdf}.
\end{document}