在大多数情况下,xurl
包裹(提供这里) 确保长 URL 适当地跨行换行。然而,在定理的可选“caption”参数中,长 URL 保持完整,如下面的 MWE 所示。 有没有办法让它们在那里自动中断?
我的文档使用amsthm
和hyperref
;MWE 使用xurl
,但我的文档中并不需要这样做。问题是在定理环境的标题中启用换行符类似,但不涵盖 url(用于打破普通文本的长定理标题,使用 解决amsthm
)。
\documentclass{amsart}
\usepackage{geometry}\geometry{textwidth=100mm}
\usepackage{blindtext}
\usepackage{amsthm}
\newtheorem{theorem}{Theorem}
\usepackage[colorlinks]{hyperref}
\usepackage{xurl}
\begin{document}
\blindtext[1]
\url{https://tex.stackexchange.com/questions/696129/long-url-doesn-t-break-in-theorem-optional-argument-under-amsthm-hyperref-xur}.
\blindtext[1]
\begin{theorem}[\url{https://tex.stackexchange.com/questions/696129/long-url-doesn-t-break-in-theorem-optional-argument-under-amsthm-hyperref-xur}]
\blindtext[1]
\end{theorem}
\end{document}
答案1
问题在于 url 是数学。定理代码将可选参数存储在一个框中,然后稍后将其解开,但 TeX 在这种情况下会进行一些优化并省略隐式惩罚。您可以尝试该setouterhbox
包:
\documentclass{amsart}
\usepackage{geometry}\geometry{textwidth=100mm}
\usepackage{blindtext}
\usepackage{amsthm}
\newtheorem{theorem}{Theorem}
\usepackage[colorlinks]{hyperref}
\usepackage{xurl}
\usepackage{setouterhbox}
\usepackage{etoolbox}
\begin{document}
\section{unpatched}
$a=b=c=d=a=b=c=d=a=b=c=d=a=b=c=d=a=b=c=d=a=b=c=d=a=b=c=d=$
\begin{theorem}[$a=b=c=d=a=b=c=d=a=b=c=d=a=b=c=d=a=b=c=d=a=b=c=d=a=b=c=d=$]
some text
\end{theorem}
\begin{theorem}[\url{https://tex.stackexchange.com/questions/696129/long-url-doesn-t-break-in-theorem-optional-argument-under-amsthm-hyperref-xur}]
some text
\end{theorem}
\section{patched}
\makeatletter
\patchcmd\deferred@thm@head{\sbox\@labels{\normalfont#1}}{\setouterhbox\@labels \normalfont#1\endsetouterhbox}{}{\fail}
\makeatother
\begin{theorem}[$a=b=c=d=a=b=c=d=a=b=c=d=a=b=c=d=a=b=c=d=a=b=c=d=a=b=c=d=$]
some text
\end{theorem}
\begin{theorem}[\url{https://tex.stackexchange.com/questions/696129/long-url-doesn-t-break-in-theorem-optional-argument-under-amsthm-hyperref-xur}]
some text
\end{theorem}
\end{document}
答案2
您没有义务使用theorem
环境的可选参数来放置 URL 字符串。
%
如果 URL 字符串包含某些 TeX 特殊字符(例如或 ),则必须修改此方法#
。在这种情况下,我建议采用\urldef
该包用户指南第 2 节url
“定义已定义的 URL”中所述的路线。或者只需将其替换\myurl{...}
为\begingroup\upshape(\url{...})\endgroup
。
\documentclass{amsart}
\usepackage[textwidth=100mm]{geometry}
\usepackage{lipsum}
% \usepackage{amsthm} % 'amsthm' is loaded automatically by 'amsart' doc. class
\newtheorem{theorem}{Theorem}
\usepackage{xurl}
\usepackage[colorlinks,allcolors=blue]{hyperref}
\newcommand\myurl[1]{\begingroup\upshape(\url{#1})\endgroup}
\begin{document}
\begin{theorem}
\myurl{https://tex.stackexchange.com/questions/696129/long-url-doesn-t-break-in-theorem-optional-argument-under-amsthm-hyperref-xur}
\lipsum[1][1-5] % filler text
\end{theorem}
\end{document}