为什么LaTeX/pdflatex编译器如此';时髦的';与c++;?

为什么LaTeX/pdflatex编译器如此';时髦的';与c++;?,pdf,compiler-construction,latex,compiler-errors,pdf-generation,Pdf,Compiler Construction,Latex,Compiler Errors,Pdf Generation,对于latex/pdflatex编译器为何在以下两个方面很时髦,是否有一个简单的解释: 1) N在达到“稳定状态”版本之前,需要多次编译。如果我使用许多软件包和参考资料,N似乎会增长到5或6个左右 2) 错误消息几乎总是毫无价值的。未标记实际错误。例如: \begin{itemize} % Line 499 \begin{enumerate} % Comment: error: forgot to close the enumerate block \item Thi

对于latex/pdflatex编译器为何在以下两个方面很时髦,是否有一个简单的解释:

1) N在达到“稳定状态”版本之前,需要多次编译。如果我使用许多软件包和参考资料,N似乎会增长到5或6个左右

2) 错误消息几乎总是毫无价值的。未标记实际错误。例如:

  \begin{itemize} % Line 499
   \begin{enumerate}
    % Comment: error: forgot to close the enumerate block 
    \item This is a bullet point. 
  \end{itemize}   % Line 503
结果:“扫描\begin{document}时第1行出错”,不是很有用

<>我意识到有一个单独的“TEX Exchange”,但我想知道如果有人对C++、java或其他编译器有知识,可以提供一些关于如何支持单编译和正确错误定位的见解。p>
编辑:这篇文档看起来像是在为latex实现中的黑客行为辩护,但是latex的语法/语言属性如何使得奇怪的实现成为必要

从乳胶的角度来看:

  • 你最多需要3个(…也许4个)才能达到稳定状态。这并不取决于包的数量,而是取决于文档中可能发生的布局更改。布局更改会导致引用移动,并且这些引用必须正确(因此需要重新编译,直到它们不移动为止)

  • 允许嵌套环境(尽管这不能直接解决您的问题)。此外,宏定义还充当输入的替换文本。因此,即使您编写了
    \end{itemize}
    ,它实际上也被转换为一系列其他/不同的(原始)宏,从而消除了显而易见的人类结构,从而也消除了奇怪的错误消息。这就是为什么有些错误消息很难解释

  • wrt。第(2)点: 考虑到大多数错误都是在解析扩展的宏防御时发现的,我的猜测是,即使错误包含区域设置和特定原因,也不会对用户有用,因为它们不能很好地转换为您在查看代码时看到的内容


    不过,如果它们更明确一点,这将是有用的://

    我知道多重编译是必要的,因为它能够在标记中标记方程式、页面等,并在以后引用它们。该文件必须编译一次,对所有方程进行编号,然后再次将这些编号替换到参考文献中。这是一个好问题。考虑到Don Knuth发明了LR(1)解析……许多编译器都会对其源代码进行多次传递。并不是所有的编译器都能说明这一点。你不应该将LaTeX或其他文档编译器与软件编译器进行比较。他们的任务截然不同。LaTeX在第一次运行中写入某些信息,如标签的值和位置,然后在第二次运行中包含它们。目录是通过将剖切宏中的所有信息写入
    .toc
    文件生成的,该文件随后将包含在下一次运行中。如果没有多次运行,LaTeX将不得不缓冲整个文档,以便在开始时包含TOC,并在最后提供信息。啊,没有阅读其他答案,似乎我只是重复了已经说过的内容