当我跑步时
\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. 为什么输出被视为错误
这里有三件事情会让您的编辑感到困惑:
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)。因此,如果您不觉得它在视觉上令人不快,最好的办法可能是忽略它。(您可以通过增加或增加任何更大的值来使警告不再出现\hfuzz
。1.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
字体:
这是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
,我能够获得该行更结构化的输出:这里。这对于典型用途来说太冗长了,但交互式系统可以扩展/显示,显示字体的实际字形,而不是令人困惑的东西!
,等等。)