我目前正在编写一个小工具,可以自动生成方程式的乳胶代码。我偶然发现了以下问题,其极其简化的形式如下:
\begin{align*}
a
&=
\left( \left[ \left\{ \left( b
\vphantom{x} \right.
\vphantom{x} \right.
\vphantom{x} \right.
\vphantom{x} \right.
\\&\quad\;
%--------
c
\\&\quad\;
%--------
\left. \vphantom{x}
\left. \vphantom{x}
\left. \vphantom{x}
\left. \vphantom{x}
d
\right) \right\} \right] \right)
\\&\quad\;
%--------
\left. \left. \left. \left.
e
\right) \right\} \right] \right)
\end{align*}
输出包含一些我无法解释的空间:
请让我指导您完成此操作。
在对齐环境中,我仅在第一行中设置左侧 (a),在所有行中设置右侧。我\quad\;
在每行(第一行除外)的开头插入 a 以跳过=
字符的空格。
在第一行 (a, b) 中,我有四个带自动缩放功能的左括号 ( \left
)。\vphantom
在我的代码中,需要 来保持换行符上的括号的垂直大小;它们包含更复杂的文本,但在这里我只是传递x
。我用虚拟的右括号 ( \right.
) 来补偿四个左括号。
在第二行 (c) 中,我只需将c
其与第一行的右侧对齐即可。这也是我对第三行的期望。
在第三行 (d)(实际上是我的代码生成的形式)中,我有四个虚拟的左括号 ( \left.
) 和四个右括号。现在此行在 之前生成了大量空格d
。
在第四行(e)中,我删除了所有\vphantom
命令。令人惊讶的是,这减少了空间。剩余的空间似乎是由命令生成的\left.
。我可以理解这是否是右括号占用的空间,但它更小(请与第一行进行比较)。
因此,我的问题是我想通过插入负空格(例如\!
)来补偿第三行中不需要的空格,但我不知道 latex 首先如何以及为什么生成该空格。由于代码是自动生成的并且具有任意数量的括号,因此我不能只使用固定大小的负空格。
有没有谁非常熟悉内部乳胶代码,可以告诉我乳胶在这种情况下做了什么,以便我可以补偿不需要的空间?非常感谢!
编辑以回应 campa:我包含了\setlength{\nulldelimiterspace}{0pt}
似乎可以减少间距的内容,但并没有完全消除它(第二个例子):
答案1
我觉得你需要跑\setlength\nulldelimiterspace{0pt}
,加载左右包裹,和分别用\left
和替换和的所有实例。\right
\mleft
\mright
&\quad\;
另外,我将用替换所有实例,&\phantom{{}={}}
以保证正确对齐。
在以下屏幕截图中,我|
仅使用 来指示(可见或隐藏)符号右侧材料的开始和结束=
。请注意,我还删除了所有\vphantom{x}
指令,因为它们不执行任何操作。
\documentclass{article}
\usepackage{amsmath} % for 'align*' environment
\usepackage{mleftright} % for '\mleft' and '\mright' macros
\begin{document}
\setlength\nulldelimiterspace{0pt}
\begin{align*}
a
&=
|\mleft( \mleft[ \mleft\{ \mleft(
b
\mright. \mright. \mright. \mright. | \\
&\phantom{{}={}}
|b| \\
&\phantom{{}={}}
|\mleft. \mleft. \mleft. \mleft.
b
\mright) \mright\} \mright] \mright) |
\end{align*}
\end{document}