首先,我喜欢 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}