我该如何编写一个宏(放在参考书目中每个 URL 的前面),它的作用是告诉 TeX
- 这是一个插入换行符的好地方,但这里不需要换行。
- 如果(且仅当)您在此处换行,请在换行符前立即插入一个
\hfill
(或者可能是一个,我不确定哪个更有意义)。\par
我尝试过\discretionary{\hfill}{}{}\penalty-500\relax
,但结果出现了一堆“不当的自由裁量列表”错误,我也尝试过,\discretionary{\par}{}{}\penalty-500\relax
但没有出现任何错误,但似乎也没有任何效果。
(另外我不确定\penalty
您是否鼓励换行。)
(我真的想要 TeX 插入一个段落当且仅当 URL 无法容纳在当前行的剩余空间中时,才在 URL 之前中断,但 - 在中断之后 - 不会干扰url.sty
URL 内部的换行。但我怀疑这根本不可能,而我上面描述的,我很确定是可能,我只是不知道该怎么做。)
编辑:使用 TH 当前建议的代码的溢出水平盒子的最小示例:
\documentclass[twocolumn]{article}
\usepackage[hyphens]{url}
\usepackage[letterpaper,margin=1in]{geometry}
\begin{document}
\urlstyle{same}
\begin{thebibliography}{10}
\let\oldurl\url
\makeatletter
\renewcommand*\url{%
\begingroup
\let\do\@makeother
\dospecials
\catcode`{1
\catcode`}2
\catcode`\ 10
\url@aux
}
\newcommand*\url@aux[1]{%
\setbox0\hbox{\oldurl{#1}}%
\ifdim\wd0>\linewidth
\strut
\\
\vbox{%
\parindent=0pt
\kern-\lineskip
\raggedright
\strut\oldurl{#1}%
}%
\else
\hskip0pt plus\linewidth
\penalty0
\box0
\fi
\endgroup
}
\makeatother
\bibitem{thinkermade08focus}
ThinkerMade. (2008) {How to Tell if a User is Signed in to Facebook and Other
Services}. Blog entry.
\url{http://replay.waybackmachine.org/20081020072934/http://www.thinkermade.com/blog/2008/07/how-to-tell-if-a-user-is-signed-in-to-facebook-and-other-services/}
\end{thebibliography}
\end{document}
抱怨:
(./argh.tex (/usr/share/texmf-texlive/tex/latex/base/article.cls
Document Class: article 2007/10/19 v1.4h Standard LaTeX document class
(/usr/share/texmf-texlive/tex/latex/base/size10.clo))
(/usr/share/texmf-texlive/tex/latex/ltxmisc/url.sty)
(/usr/share/texmf-texlive/tex/latex/geometry/geometry.sty
(/usr/share/texmf-texlive/tex/latex/graphics/keyval.sty)
(/usr/share/texmf-texlive/tex/generic/oberdiek/ifpdf.sty)
(/usr/share/texmf-texlive/tex/generic/oberdiek/ifvtex.sty)) (./argh.aux)
*geometry auto-detecting driver*
*geometry detected driver: pdftex*
Overfull \hbox (20.5556pt too wide) in paragraph at lines 40--43
[]
[1{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map}] (./argh.aux) )
这是不是这只是一个外观问题;URL 延伸到了右边距。
答案1
此解决方案检查 URL 是否长于行宽。如果是,则插入\\
(因为一行无法容纳),然后排版 URL。如果不够长,则一行可以容纳,因此我们将其排版为一个框,前面有一个可伸缩的空间。如果框不适合一行,则空间将伸展以填充行的其余部分,这样行就不会不够满,URL 将出现在下一行。
\documentclass[twocolumn]{article}
\usepackage{lipsum}
\usepackage{url}
\let\oldurl\url
\makeatletter
\renewcommand*\url{%
\begingroup
\let\do\@makeother
\dospecials
\catcode`{1
\catcode`}2
\catcode`\ 10
\url@aux
}
\newcommand*\url@aux[1]{%
\setbox0\hbox{\oldurl{#1}}%
\ifdim\wd0>\linewidth
\strut
\\
\vbox{%
\hsize=\linewidth
\kern-\lineskip
\raggedright
\strut\oldurl{#1}%
}%
\else
\hskip0pt plus\linewidth
\penalty0
\box0
\fi
\endgroup
}
\makeatother
\begin{document}
\lipsum[1]
Here is some text
\url{http://www.example.com/~example/foo/bar/baz/index%20here.html}
Here is some text \url{http://example.org/index.html}
Short \url{http://example.org}
\end{document}
编辑:
我对其进行了修改,试图防止水平盒子未满,并且比仅仅使用更好地处理参数中的特殊情况\detokenize
。
答案2
给定任务的经典解决方案是\nobreak\hfil\penalty0 \hfilneg
。如果行未换行,\peanlty0
则\hfil
+\hfilneg
结果为空。如果行已换行,\peanlty0
则\hfil
在第一行末尾使用,但\hfilneg
会被丢弃,因为它是“可丢弃项目”(从 TeX 的角度来看)。
答案3
我建议用胶水将 \url 括起来,并使用 \allowbreak(评论中提到)。具体来说,
\hspace{\stretch{.001}}\allowbreak\url{___}\hspace{\stretch{1000}}\mbox{}
应该足够了。警告:此答案假定 URL 位于 \bibitem 的末尾。