目录

目录

当我跑步时

\documentclass{article}
\begin{document}
Aaaaaa aaaaa aajcaaaaaa $a:A_{aa}\to a_a$a$\ge$ aaaaaaaaaaaaaaaaaaaaaa 
$a_a\dots\to$
\end{document}

构建输出包含以下行:

LaTeX-Result: 1 Error(s), 0 Warning(s), 1 Bad Box(es), 1 Page(s)

当我单击“下一个错误”时,它会在构建输出中指向以下段落中以 ! 开头的行:

Overfull \hbox (1.65294pt too wide) in paragraph at lines 3--4
[]\OT1/cmr/m/n/10 Aaaaaa aaaaa aa-j-caaaaaa $\OML/cmm/m/it/10 a \OT1/cmr/m/n/10 : \OML/cmm/m/it/10 A[] \OMS/cmsy/m/n/10 
! \OML/cmm/m/it/10 a[]$\OT1/cmr/m/n/10 a$\OMS/cmsy/m/n/10 $ \OT1/cmr/m/n/10 aaaaaaaaaaaaaaaaaaaaaa $\OML/cmm/m/it/10 a[
] [] \OMS/cmsy/m/n/10 !$ 
 []

查看此错误,我发现字体出现了类似的内容,但是错误代码略有不同。

我的猜测是,这与末尾的 $\to$ 溢出有关,但这并不是全部,因为我可以移动一些字母,而无需改变坏框的大小来消除错误。

有人能告诉我这个错误的原因是什么吗?

更新:根据其中一条评论,这可能取决于正在使用的程序。我在 TeXnicCenter 上都遇到了此错误,此错误代码也出现在latexbase.com但它没有被报告为错误。

答案1

简短回答:这是一个警告,但您的编辑器 (TeXnicCenter) 将其误认为是错误。详细回答如下。


(之前的一个问题“输入一个字母后出现难以理解的错误”涵盖了这一点,但我觉得值得更详细地介绍,因此再试一次。)

目录

  1. 为什么输出被视为错误(以及如何修复)
  2. 如何让这个输出消失(修复警告)
  3. 输出的含义

1. 为什么输出被视为错误

这里有三件事情会让您的编辑感到困惑:

  • TeX 在新行上打印错误消息,以!␣(a开头!,后面跟着一个空格;只需使用表示空格,因为否则它在这里不可见)。(顺便说一句,这实际上并没有记录在TeXbook我认为 Knuth 并不想指定用户交互的细节,并希望它们随着 TeX 的实现而改变——但请参见第 6 章和第 27 章中的示例,以及第六部分“报告错误” §73 在TeX:程序

  • 当 TeX 被迫排版一个溢出的框时,它会打印出一个诊断信息,显示溢出的框。(对于紧框等,情况类似。)此诊断信息可能包含诸如 之类的内容!,具体取决于框内出现的字符和使用的字体。

  • TeX 默认将输出行换行,宽度为max_print_line。在本例中,你的 TeX 环境似乎已设置为将错误输出行换行到恰好 120 个字符的位置,因此其中一行(巧合地)以!。你可以更改此换行正如另一个答案所述max_print_line,或者简单地在 shell 环境中使用更大的值调用 TeX ,例如max_print_line=1000 pdflatex ...)。

由于这些因素的综合作用,我们打印了一个过满的框诊断信息,并将其换行到 120 个字符,并且被您的编辑器错误地解释为错误。

如果增加换行宽度(例如max_print_line=10000),则可以避免这种混淆,并获得如下输出,其中溢出的框完全显示在一行上(并且没有以 开头的行!):

Overfull \hbox (1.65294pt too wide) in paragraph at lines 3--5
[]\OT1/cmr/m/n/10 Aaaaaa aaaaa aa-j-caaaaaa $\OML/cmm/m/it/10 a \OT1/cmr/m/n/10 : \OML/cmm/m/it/10 A[] \OMS/cmsy/m/n/10 ! \OML/cmm/m/it/10 a[]$\OT1/cmr/m/n/10 a$\OMS/cmsy/m/n/10 ^^U$ \OT1/cmr/m/n/10 aaaaaaaaaaaaaaaaaaaaaa $\OML/cmm/m/it/10 a[] [] \OMS/cmsy/m/n/10 !$ 

2. 如何让输出消失

输出(警告)是关于一个溢出的框,这意味着一行比它应该的要多一点。多多少?我们可以通过在它附近添加一段文字来直观地看到它:

线

你能看出箭头比上面的文字更突出吗?也许是这样:

带有线条

对于处理过满的框,您的选择(按所需努力的顺序增加,美观度的顺序减少)是忽略它,允许更多拉伸,允许更多中断或重写文本。

在这种情况下,如您所见,它并没有过满很多(警告消息显示 1.65 pt)。因此,如果您不觉得它在视觉上令人不快,最好的办法可能是忽略它。(您可以通过增加或增加任何更大的值来使警告不再出现\hfuzz1.66pt

否则,这里最好的方法(因为有数学,在数学中引入中断可能不好)可能是重写文本。或者,如果你不想麻烦,你可以设置\sloppy(见这个答案到底\sloppy做了什么)或增加\emergencystretch,以获得换行符,但代价是比 TeX 默认情况下更舒适的拉伸:

有弹性

(为了避免影响文档中的其他段落,您可以通过分组将更改\sloppy和/或限制在本段,例如 LaTeX 提供了一个执行此操作的环境。)\emergencystretch{ … }sloppypar


3. 输出的含义

剩下的问题是为什么过满箱诊断看起来是这样的:这个输出是什么意思?

它基本上是 TeX 在该行上放置的所有内容的列表,包括粘连和来自不同字体的字符。在包含许多不同字体的行上,很多输出可能最终与字体有关。

您可以使用包fonttable

\xfonttable{OT1}{cmr}{m}{n}
\xfonttable{OML}{cmm}{m}{it}
\xfonttable{OMS}{cmsy}{m}{n}

更详细地了解输出行中出现的字体。这是OT1/cmr/m/n字体:

OT1

这是OML/cmm/m/it

光学微阵列

这是OMS/cmsy/m/n

远程管理系统

因此在Overfull \hbox日志行中,当它打印排版的溢出水平盒子是什么时,

违规方框

作为

[]\OT1/cmr/m/n/10 Aaaaaa aaaaa aa-j-caaaaaa $\OML/cmm/m/it/10 a \OT1/cmr/m/n/10 : \OML/cmm/m/it/10 A[] \OMS/cmsy/m/n/10 ! \OML/cmm/m/it/10 a[]$\OT1/cmr/m/n/10 a$\OMS/cmsy/m/n/10 ^^U$ \OT1/cmr/m/n/10 aaaaaaaaaaaaaaaaaaaaaa $\OML/cmm/m/it/10 a[] [] \OMS/cmsy/m/n/10 !$ 

我们可以将其分成几部分:

  • []— 这是父母胶
  • \OT1/cmr/m/n/10 Aaaaaa aaaaa aa-j-caaaaaa $— 这仅仅意味着字体中的“Aaaaaa aaaaa aajcaaaaaa” OT1/cmr/m/n/10(见上文),其中自由分隔符(潜在连字符点)如图所示aaaaa aa-j-caaaaaa,然后是数学模式的开始。
  • \OML/cmm/m/it/10 a
  • \OT1/cmr/m/n/10 :— 请注意,即使我们处于数学模式,它也是:来自 OT1cmr字体,因为它应该是直立的等等。
  • \OML/cmm/m/it/10 A[]— 下标aa是一个独立的框(我认为),这里简单地显示为[]
  • \OMS/cmsy/m/n/10 !— 请注意,!中的 (字符 33)OMS/cmsy/m/n字符。在非 Unicode TeX 引擎(基本上是 pdfTeX,而不是 XeTeX 或 LuaTeX)中,字体最多可以有 256 个字形,因此像这样的字符必须映射到 0–255 中的某个位置。
  • \OML/cmm/m/it/10 a[]$— 下标a同样表示为[]
  • \OT1/cmr/m/n/10 a$
  • \OMS/cmsy/m/n/10 ^^U$— 在这里,^^U表示字符 21(因为U是 ASCII 85,在 TeX 中^^表示加或减 64),并且该字体中的字符 21 是
  • \OT1/cmr/m/n/10 aaaaaaaaaaaaaaaaaaaaaa $
  • \OML/cmm/m/it/10 a[] []
  • \OMS/cmsy/m/n/10 !$— 再次,!这里的意思是

(显然,这些满溢框的输出显示方式,虽然在 TeX 开发的时候(~1980)是好的,并且对于仔细阅读手册的人来说很有用,但今天可以做得更好,例如有选项来为输出着色,将字符转换为 Unicode,或抑制/切换字体信息,但不幸的是,对 TeX 的此类改进工作并不多。使用 LuaTeX 和post_linebreak_filter,我能够获得该行更结构化的输出:这里。这对于典型用途来说太冗长了,但交互式系统可以扩展/显示,显示字体的实际字形,而不是令人困惑的东西!,等等。)

相关内容