以下代码无法编译:
\documentclass{article}
\usepackage{amsmath}
\begin{document}
\begin{align}
\eta_{m} = & \omega_{m1}D_{1} + \omega_{m2}D_{2} + \dots + \omega_{mT}D_{T} \\
\eta_{a} = & \omega_{a1}D_{1} + \omega_{a2}D_{2} + \dots + \omega_{aT}D_{T}
\end{align}
\end{document}
但是,如果我删除空行,就会这样。(与方程式环境相同)。为什么?为什么代码中允许有空格会有问题?惯例?
作为参考,TexStudio 中的错误非常严重,因为这是一个明显微不足道的问题:
line 7: Paragraph ended before \align was complete.
line 7: Missing $ inserted.
line 7: Missing \endgroup inserted.
line 7: Display math should end with $$.
line 8: Misplaced alignment tab character &. &
line 8: Missing $ inserted. & \omega
line 9: Misplaced alignment tab character &. &
line 10: Missing $ inserted.
line 11: Misplaced \cr. \end{align}
line 11: Misplaced \noalign. \end{align}
line 11: Misplaced \noalign. \end{align}
line 11: Extra }, or forgotten \endgroup. \end{align}
line 11: Missing $ inserted. \end{align}
line 11: Display math should end with $$. \end{align}
答案1
错误信息清楚地说明了问题的原因:
Paragraph ended before \align was complete.
在标准 (La)TeX 中,空行表示段落中断。
由于在单个数学显示内开始新段落没有意义,因此显示数学环境在实现时并没有考虑段落中断(一种简化,但我们可以这样想:它们不是“长”环境)。
由于这些环境在创建时不允许段落分隔,因此当 TeX 遇到空行(具有“标准” catcode 设置的段落分隔符)时,它会假定用户忘记关闭环境,并将其关闭(从而离开显示数学),开始新的段落,然后愉快地继续。
然后它找到了所有其他数学模式标记,但由于上述段落,我们不再处于数学模式。所以这是第一个错误之后所有错误的原因。
根据要求,对以下声明进行一些详细说明:
在单个数学显示内开始一个新段落是没有意义的[。]
根据个人选择/偏好的风格,显示的方程或方程组可以是
- 单个句子单元的一部分,或
- 大致相当于一个句子的独立单位。
前一种情况在数学和技术写作中最为常见。在这种情况下,公式与周围的措辞相符,并包含标点符号,以便可以与周围的文本连续阅读。在这种情况下,我们不会在公式内开始一个新段落,也不会在单个句子内开始一个新段落。
后一种情况不太常见,只需要一个方程可以可以单独成一个段落,但更可能有一些文字句子围绕它进行介绍或解释,因此显示的方程式通常“附加”在某个正文中,因此它属于该正文的段落。(就像一个句子可以可以作为一个段落,但更常见的是多个句子组成一个段落。)无论哪种方式,我们不会在等式中开始一个新段落,就像我们不会在单个句子中开始一个新段落一样。
对于单一显示环境中的方程组,它们按逻辑分组这一事实本身就意味着它们在某种程度上是相关的并且是同一“想法”的一部分。就像我们将句子组合在一起形成段落一样,以这种方式分组的方程应该属于同一“想法”或段落。如果您真的打算在方程组中开始一个新的“想法”或段落,我认为应该在此时拆分方程组,而不是试图在方程组内引入段落分隔符。
希望这有助于解释为什么我说在数学显示环境中开始新段落是没有意义的。
答案2
根据设计,LaTeX 尝试为命令提供一致的语法,特别是这里的环境语法清楚地说明了数学中应该包含什么,不应该包含什么。
但是,如果在数学模式下看到错误消息,则错误消息来自 tex 引擎本身\par
。为了防止这种情况,latex 必须防止空行生成标记\par
(这在所有情况下都很难做到)或本地重新定义\par
为不执行任何操作(这是它忽略表格行之间的空行所做的操作)但是它没有。
错误的原因与数学的原始语法有关$
,$$
该语法没有明确的开始/结束区分,并且$
与在文本中使用数学结构时添加的错误恢复有关。
如果(正如这里每隔一天发布的那样)你去
blah blah foo_bar blah ...
然后看到_
Tex 插入一个$
以进入数学模式。之后,整个文档很可能被吞噬在一行中,没有空格。段落末尾的错误陷阱“限制了损害”,允许 TeX 在段落末尾强制结束数学模式并在文本模式下重新开始下一个段落,从而减少报告的虚假错误的数量。
对于现代编辑器工作流程来说这是否仍然有用还有待商榷,但这无疑是一个有意设计的功能。