可选但建议使用换行符 + \hfill

可选但建议使用换行符 + \hfill

我该如何编写一个宏(放在参考书目中每个 URL 的前面),它的作用是告诉 TeX

  1. 这是一个插入换行符的好地方,但这里不需要换行。
  2. 如果(且仅当)您在此处换行,请在换行符前立即插入一个\hfill(或者可能是一个,我不确定哪个更有意义)。\par

我尝试过\discretionary{\hfill}{}{}\penalty-500\relax,但结果出现了一堆“不当的自由裁量列表”错误,我也尝试过,\discretionary{\par}{}{}\penalty-500\relax但没有出现任何错误,但似乎也没有任何效果。

(另外我不确定\penalty您是否鼓励换行。)

(我真的想要 TeX 插入一个段落当且仅当 URL 无法容纳在当前行的剩余空间中时,才在 URL 之前中断,但 - 在中断之后 - 不会干扰url.styURL 内部的换行。但我怀疑这根本不可能,而我上面描述的,我很确定可能,我只是不知道该怎么做。)

编辑:使用 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 的末尾。

相关内容