我每天都使用 LaTeX 来撰写论文,虽然我发现它是一种非常好的文档制作工具,但该系统的某些方面确实令我困扰;例如非常不一致的宏系统。
举几个例子:
许多(但不是全部)块宏/命令看起来像这样:
\begin{lstlisting}
...
\end{lstlisting}
除了看起来像这样的数学块:
\[ ... \]
内联宏通常如下所示:
\footnote{...}
但当它们突然变成这样时:
{\em ...} % I'm aware that \emph{...} also exits
或者像这样:
\lstinline|...|
或者像这样:
$ ... $
那么,为什么 LaTeX 的设计如此不一致呢?似乎我添加的每个包都有一种新的编写方式,这使得 LaTeX 的学习曲线异常陡峭,为什么不保持一切一致和统一呢?
答案1
LaTeX 的主要目的之一是提供持续的 语法与 TeX 基元极不一致的语法不同,因此
\frac{a}{b}
不是{a \over b}
\makebox[3pt]{foo}
不是\hbox to 3pt{foo}
\begin{math} x \end{math}
作为别名$ x $
环境和带参数的命令之间的区别有点随意,但通常效果还不错,使用环境主体来处理大块文本。在大多数文档标记系统中,您都会看到类似的东西,例如 HTML 或 XML 中的属性和元素之间的区别,<p> xxx </p>
但href=....
\bf
自从 LaTeX2e 发布以来,大多数双字母字体命令(等)已被弃用,部分原因就在于此。(\em
如评论中所述,略有不同。)
其他与列表和逐字相关的示例,它们必然具有不同的语法,比较 XML,其中类似的构造不是元素或属性,而是<![CDATA[....]]>
答案2
除了 David Carlisle 的回答之外,我还要引用 Python 之禅的这句话:
特殊情况还不足以打破规则。
尽管实用性比纯粹性更重要。
正如 David 指出的那样,有多种方法可以以标准格式编写这些命令。但如果我在写论文,我不希望它充斥着
Then substitute
\begin{math}
x^2
\end{math}
for
\begin{math}
y
\end{math}
in \ref{eq:foo}.
什么时候
Then substitute $x^2$ for $y$ in \ref{eq:foo}.
就足够了。
这是实用性打破纯粹性的一个典型案例。当然,第一个版本更纯粹。但纯粹性根本不值得。
答案3
不去讨论哪种语法更有用、更合理、更成熟,有一个根本原因。
(La)TeX 没有有(静态)语法。词法分析器可以在解释过程中的任何时候重新定义,甚至由最终用户重新定义(即在文档代码中)。
这使得每个软件包和文档作者都可以开发自己的语法,无论多么聪明或不明智。经过几十年的(重新)开发,你只能面对大量(遗留)的东西,这些东西几乎只能靠一些大胆的惯例拼凑起来。