水平盒子过满--如何修复?

水平盒子过满--如何修复?

我在 tex 中有一个行,其标记(作为行的一部分)如下:

\texttt{org.springframework.beans.factory.BeanFactory}

这给出了过度\hbox警告。我该如何修复?

我在 Windows 7 上使用 MiKTeX 2.7。

答案1

超满\hbox警告与溢出某些文本边界的文本块有关。这可能是右文本块边距,或者其他包含比框宽度更宽的内容的固定宽度框。

就您而言,打字机样式的字符串很可能与org.springframework.beans.factory.BeanFactory任何现有的换行规则不匹配(因为从技术上讲它不是一个具有连字符模式的单词)。

如果您需要,可以强制使用连字符,方法是\-在可能出现连字符的地方插入。例如:

\texttt{org.spring\-frame\-work.beans.fac\-tory.Bean\-Fac\-tory}

有关连字符的更多信息,请参阅为什么带连字符的单词会导致边距违规(以及如何防止这种情况发生)?

当然,如果您不喜欢使用连字符,也可以在您想要换行的地方输入\linebreak\newline。但是,这种硬编码换行应该作为最后的手段,因为如果文本发生移动,对文档的编辑可能会导致不正确的换行。

答案2

我不会对这些术语使用连字符,而是在不使用连字符的情况下将其拆分。一个建议是使用包网址

\documentclass[a5paper]{article}
\usepackage{showframe}% for demontration only!
\usepackage{url}

\begin{document}
Line width violation by tt-terms like
\url{org.springframework.beans.factory.BeanFactory} and others.
\end{document}

但这不会在字母序列内中断。您可以定义(并使用)新的 url 样式来更改此情况:

\documentclass[a5paper]{article}
\usepackage{showframe}
\usepackage{url}

\makeatletter
\def\url@allbreakstyle{%
  \def\UrlBreaks{\do\.\do\@\do\\\do\/\do\!\do\_\do\|\do\;\do\>\do\]%
    \do\)\do\,\do\?\do\'\do+\do\=\do\#%
    \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 0\do 1\do 2\do 3\do 4\do 5\do 6\do 7\do 8\do 9%
  }%
}
\def\url@restrictedbreakstyle{%
  \def\UrlBreaks{\do\.\do\@\do\\\do\/\do\!\do\_\do\|\do\;\do\>\do\]%
    \do\)\do\,\do\?\do\'\do+\do\=\do\#}%
}
\makeatother

\begin{document}
% Problem using the default style
Line width violation by tt-terms like this one:
\url{org.springframework.beans.factory.BeanFactory} and others.

% Break inside letter sequences using new style
\urlstyle{allbreak}%
Line width violation by tt-terms like this one:
\url{org.springframework.beans.factory.BeanFactory} and others.

\end{document}

您可以使用 切换回更受限制的中断样式\urlstyle{restrictedbreak}

注意:如果您使用的是包,hyperref则需要使用\url不带链接的原始定义。hyperref提供\nolinkurl这样做。但没有\hyperref这个就不会被定义。因此,可以使用url或带有的通用解决方案hyperref\nolinkurl自行定义,当且仅当它尚未定义时:

\documentclass[a5paper]{article}
\usepackage{showframe}
% Only one of the following two lines is needed:
\usepackage{url}
\usepackage{hyperref}

\providecommand*{\nolinkurl}{\url}

\begin{document}
Line width violation by tt-terms like
\breaktext{org.springframework.beans.factory.BeanFactory} and others.

\end{document}

您可以将其与定义之前显示的新 url 样式结合起来。

注意:您不应该定义\nobreakurl读取参数,因为这会改变参数中几个字符的行为。这是因为原始\nobreakurl\url在读取参数之前会更改几个字符的 cat-code!因此,您可以编写,例如,而无需用宏\nobreakurl{this%and%that}替换。但是,如果您定义(使用包),这将不再起作用,所以不要这样做!%\%\providecommand*{\nobreakurl}[1]{\url{#1}}url

注意:您可以对新定义的 url 样式进行其他更改,例如重新定义以\UrlFont更改将要使用的字体。有关更多信息,请查看包的文档。

答案3

完全限定的 Java 类名的连字符使用是错误的。虽然例如org.spring-framework.beans.factory.BeanFactory不是有效的 Java,但包名中连字符的规则是初级开发人员在查阅印刷文档时可能会忽略的事情之一(也许一些高级开发人员也会忽略)。最好允许在句号处中断。

由于没有人提到它,我建议使用\allowbreak来允许在句号后中断。我甚至会更进一步,将 包装\allowbreak在其自己的命令中,以便更容易输入:

在序言中

\NewDocumentCommand{\0}{}{\allowbreak}

在文档中

\texttt{org.\0springframework.\0beans.\0factory.\0BeanFactory}

如果我们真的很聪明,我们甚至可以通过创建一个新命令来自动化此操作,该命令将其参数在句点处拆分,然后在\allowbreak每个部分之间重新组装。我目前没有使用 LaTeX 的计算机,但类似这样的操作应该可行:

序言

\ExplSyntaxOn
\NewDocumentCommand{\javaname}{ m }
  {
    \seq_set_split:Nnn \l_tmpa_seq { . } { #1 } % ❶
    \texttt{
      \seq_use:Nn \l_tmpa_seq { .\allowbreak } % ❷
    }
  }
\ExplSyntaxOff

在文档中

\javaname{org.springframework.beans.factory.BeanFactory}

这里的基本思想是在句号 ❶ 处进行拆分,然后用句号后跟\allowbreak❷ 将拆分后的标记再次连接起来。

相关内容