最初,我有代码
\begin{align*}
|a_d|_p & = 1 \\
|a_i|_p & \leq 1
\end{align*}
产生的结果如下:
|
这是不理想的,因为左侧的垂直条不对齐。然后我发现了 alignat 环境,并尝试了代码
\begin{alignat}{3}
| & a_d & |_p & & & = 1 \\
| & a_i & |_p & & & \leq 1
\end{alignat}
产生的结果如下:
这样好一些,但仍然不是很好,因为现在a_d
和a_i
不对齐了。理想情况下,我希望只有带有和的列居中a_d
。a_i
然后,我查看了答案这个问题并尝试了代码
\begin{alignat*}{3}
| & \omit\hfill $a_d$ \hfill & |_p & & & = 1 \\
| & \omit\hfill $a_i$ \hfill & |_p & & & \leq 1
\end{alignat*}
产生的结果如下:
从某些方面来看,这样更好,因为每个垂直条都对齐了, 和 也是如此a_d
,a_i
但现在右侧垂直条的|_p
间距太靠右了。有什么建议吗?
更新:在阅读了 Bernard 建议中的代码以及有关\makemathbox
(来自mathtools
)、\newlength
和的一些信息后\settowidth
,我得出了以下代码,它似乎可以满足我的要求。但是,我是否做了任何不推荐的事情?
\newlength{\myl}
\settowidth{\myl}{$a_d$}
\begin{align*}
|a_d|_p & = 1 \\
| \mathmakebox[\myl]{a_i} |_p & \leq 1
\end{align*}
答案1
这里有两个解决方案,其中一个使用mathtools
和。对于第二个解决方案,使用,更加自动化。我定义了一个 使用标签的命令:所有共享相同标签的命令将具有相同的宽度——即最宽参数的宽度:makebox
eqparbox
\varpabs
\varpabs
\documentclass{article}
\usepackage{mathtools}
\usepackage{etoolbox}
\usepackage{makebox, eqparbox}
\DeclarePairedDelimiterXPP{\pabs}[1]{}\lvert \rvert{_p}{\ifblank{#1}{\:\cdot\:}{#1}}
\DeclarePairedDelimiterXPP{\varpabs}[2]{}\lvert\rvert{_p}{\eqmakebox[#1]{$\displaystyle#2$}}
\begin{document}
\begin{align*}
\pabs{a_d} & = 1 \\
\pabs{\makebox*{$ a_d $}{$ a_i $}} & \leq 1
\end{align*}
\begin{align*}
\varpabs{A}{a_d + c} & = 1 \\
\varpabs*{A}{ \frac{a_i }{b_i}} & \leq 1
\end{align*}
\end{document}