为什么 LaTeX 不将 ( 解释为 \left( 而 ) 解释为 \right)?

为什么 LaTeX 不将 ( 解释为 \left( 而 ) 解释为 \right)?

首先,我喜欢 LaTeX/MathJax;我经常使用它,但也有一些我讨厌的地方。有时代码变得非常混乱,我几乎无法在不看输出的情况下阅读它,而我觉得代码本来可以更干净一些。

例如,有时句子中会有很多\left's 和\right's。我不明白为什么 LaTeX 不将其解释为 和(\left(这会使这样的代码更简洁。)\right)

另外,还有类似的事情:\int_a^b \! f(x) \, \mathrm{d}x.我想输入一些内容\int{x,a,b}{f(x)}。而不是记住要输入什么,这样才能让事情看起来更好。

是否有一些软件包可以让我编写“更干净”的 LaTeX 代码?

答案1

也许首先要问的是:

是否有一些软件包可以让我编写“更干净”的 LaTeX 代码?

虽然有些软件包存在,但这非常特定于用户。例如,虽然你喜欢一个接口\int{x,a,b}{f(x)}*,但我可能喜欢一个稍微冗长的接口,如\integral[variable=x,lowerbound=a,upperbound=b]{f(x)},因为不清楚\int{x,a,b}哪个是下限或上限,或者变量。为此,用户(你)是影响代码可读性的最佳人选。

最好将宏定义为具有语义含义,这样可以大大提高可读性,而且一致性。后半部分很重要,因为我们经常改变主意。将界面宏化可以让以后的适应变得轻松无忧。

如果代码缩进可以让它变得干净(在我看来,是的),那么就养成这样做的习惯,或者使用latexindent

我不明白为什么 LaTeX 不将 解释为 和(\left(这会使此类代码更加简洁。)\right)

当然,你的代码可能“更干净”,但输出不一定更漂亮(如果你认为输入的干净意味着输出的美观)。关于这一点,请参阅间距\left\right-\left\right引入比“正常”更多的空间。此外,在某些情况下,它甚至可能产生不理想的结果由于其不断延伸的特性。最后,如果要考虑始终\left/ \right,它们必须是成对在同一组内……这对跨越多行的方程或跨对齐(例如,在array或其他类似的环境中)。

也许这里更简单的指示是最好谨慎使用\left\right,而使用“大”等价物,这样您可以更好地控制间距和高度。

其他参考:


*您可以在文档序言中使用如下定义:

\makeatletter
\let\oldint\int
\def\int#1{\expandafter\@int#1}
\def\@int#1,#2,#3{\@@int{#1}{#2}{#3}}
\def\@@int#1#2#3#4{\oldint_{#2}^{#3}\!#4\,\mathrm{d}#1}
\makeatother

答案2

我认为您知道 LaTeX/TeX 与 MathJaX 不同。

这肯定会可能的在数学模式下使()字符“活跃”(使用 TeX 术语),以便它们分别自动生成\left\lparen\right\rparen。(另外:人们肯定不想在文本模式下这样做。)然而,这将是一个非常糟糕的想法总的来说。我能想到至少四个理由来支持这一说法。

  • 如果括号内的内容不是“大”——例如$((u+v)(w+x))$——\left(\right)指令将不是创建更大的括号,尽管在排版方面有明显的例外,即外括号(略)大于内括号。所有$\left(\left(u+v\right)\left(w+x\right)\right)$成功的做法都不同于$((u+v)(w+x))$将括号间隔得更宽(我添加了“abc”字符串作为“填充数学”材料):

    在此处输入图片描述

    稍微变大一点括号中的内容类似于\bigl(and\bigr)是必需的:

    在此处输入图片描述

  • 在许多其他情况下,\left(并且\right)将创建括号,太大了从印刷角度来看。例如,以下表达式:

    $\displaystyle \left( \sum_{i=1}^\infty (a_i+b_i) \right)^2 $
    

    这将产生这样的结果:

    在此处输入图片描述

    从排版/美观的角度来看,这些括号实在太大了。最好这样写

    $\displaystyle \biggl( \sum_{i=1}^\infty (a_i+b_i) \biggr)^2 $
    

    创造这种外观:

    在此处输入图片描述

    顺便说一句,这个例子或多或少直接取自 TeXbook。

  • 在文本中排版内联数学时,输入$\left(a+b\right)^2$会使指数比输入 时高一点$(a+b)^2$。(试试看!)如果文本设置为单倍行距,由于使用\left(\right)指令,指数占用的额外垂直空间可能刚好足以使 TeX 在该行和前一行之间插入更多空间。这反过来会导致段落看起来非常不均匀,这是(几乎)无论如何都要避免的——当然,假设好的排版是本练习的目标。

  • 如果你仍然不相信,还有一些案例彻底的错误\left(如果使用...则生成\right):括号对跨越 (i) 分割方程中的明确换行符或 (ii)&诸如 的结构中的明确对齐点 ( ) align

简而言之,这不值得麻烦...

答案3

nath套餐提供正确的(参见 Mico 的回答)左括号和右括号的自动缩放(包括跨行断行的能力)。

\documentclass{article}
\usepackage{nath}

\begin{document}

\begin{equation}
  ( \sum_{i=1}^n (a_i + b_i) )^2
\end{equation}

\begin{equation}
  f(x) = \wall ( \sum_{i = 1}^n \frac {1}{i}  \\
   (a_i + b_i)^2 ) \return
\end{equation}

\end{document}

给出

在此处输入图片描述

答案4

我从这个网站复制粘贴了一些代码,然后把它们放在一起。这似乎确实能满足您的要求,而且似乎能够避免 mico 警告的问题。

\documentclass{article}
\usepackage{amsmath}
\makeatletter
\def\resetMathstrut@{%
  \setbox\z@\hbox{%
    \mathchardef\@tempa\mathcode`\[\relax
    \def\@tempb##1"##2##3{\the\textfont"##3\char"}%
    \expandafter\@tempb\meaning\@tempa \relax
  }%
  \ht\Mathstrutbox@\ht\z@ \dp\Mathstrutbox@\dp\z@}
\makeatother
\begingroup
  \catcode`(\active \xdef({\left\string(}
  \catcode`)\active \xdef){\right\string)}
\endgroup
\mathcode`(="8000 \mathcode`)="8000
\let\originalleft\left
\let\originalright\right
\renewcommand{\left}{\mathopen{}\mathclose\bgroup\originalleft}
\renewcommand{\right}{\aftergroup\egroup\originalright}
\begin{document}
\begin{align*}
&f(x) = (\frac{(3-\frac{1}{x})^2}{(\frac4x-1)x}-1)x^2 \\
&\cos(\theta) \\
&\biggl( \sum_{i=1}^\infty (a_i+b_i) \biggr)^2  \\
&\bigl( (u+v)(w+x)\bigr)
\end{align*}
\end{document}

在此处输入图片描述

相关内容