我正在使用 amsmath,想要显示一个状态空间表示,其中所有等号都对齐,中间的元素居中。align
据我所知,就像应该做的那样。但我得到了这个,其中所有块都正确对齐。更不用说每个后面插入了奇怪的空格=
:
代码:
\documentclass{article}
\usepackage{amsmath}
\renewcommand{\vec}{\textbf}
\begin{document}
\begin{align}
\dot{\vec{x}} &=& \begin{bmatrix}
\dot{n}\\\dot{x}\\\dot{x_c}\\\dot{V_v}\\\dot{V_m}\\\dot{H}
\end{bmatrix} &=& \begin{bmatrix}
f_2(f_1(I),n)\\
f_4(x, x_c, f_3(f_1(I),n,x,x_c))\\
f_5(x, x_c, f_3(f_1(I),n,x,x_c))\\
f_8(f_7(f_6(x, x_c),H), V_v, f_9(V_m))\\
f_{10}(V_m, f_{11}(V_v))\\
f_{12}(H, f_9(V_m))
\end{bmatrix} &=& \vec{f}(\vec{x}, \vec{u}; \theta)
\label{eq:state}\text{, and}\\
\vec{z} &=& \begin{bmatrix}
S_w
\end{bmatrix} &=& \begin{bmatrix}
h_1(f_9(V_m))
\end{bmatrix} &=& \vec{h}(\vec{x}; \theta)
\label{eq:output}\text{.}
\end{align}
\end{document}
答案1
这是 的标准行为align
,因为它会根据 的使用插入间隙(水平)&
。假设多个方程要分散开来。并且您当前在&=&
关系周围的使用类似于使用 时所需的eqnarray
。但 并非如此amsmath
和align
朋友。
为了强制中心对齐,您可以将内容存储在一个盒子中,然后使用测量值将较小的盒子推到正确的位置。eqparbox
提供开箱即用的功能\eqmakebox[<tag>][<align>]{<stuff>}
,<align>
ing(l
eft、c
entre/default、r
ight)全部<stuff>
与所需相同<tag>
。
\documentclass{article}
\usepackage{amsmath,bm}
\usepackage{eqparbox,xparse}
% https://tex.stackexchange.com/a/34412/5764
\makeatletter
\NewDocumentCommand{\eqmathbox}{o O{c} m}{%
\IfValueTF{#1}
{\def\eqmathbox@##1##2{\eqmakebox[#1][#2]{$##1##2$}}}
{\def\eqmathbox@##1##2{\eqmakebox{$##1##2$}}}
\mathpalette\eqmathbox@{#3}
}
\renewcommand{\vec}{\bm}
\begin{document}
\begin{align}
\dot{\vec{x}} &= \eqmathbox[left]{\begin{bmatrix}
\dot{n} \\ \dot{x} \\ \dot{x_c} \\ \dot{V_v} \\ \dot{V_m} \\ \dot{H}
\end{bmatrix}} = \eqmathbox[middle]{\begin{bmatrix}
f_2( f_1( I ), n) \\
f_4( x, x_c, f_3( f_1( I ), n, x, x_c ) ) \\
f_5( x, x_c, f_3( f_1( I ), n, x, x_c ) ) \\
f_8( f_7( f_6( x, x_c ), H ), V_v, f_9( V_m ) ) \\
f_{10}( V_m, f_{11}( V_v ) ) \\
f_{12}( H, f_9( V_m ) )
\end{bmatrix}} = \eqmathbox[right]{\vec{f}( \vec{x}, \vec{u}; \theta ),}
\label{eq:state} \text{ and} \\
\vec{z} &= \eqmathbox[left]{\begin{bmatrix}
S_w
\end{bmatrix}} = \eqmathbox[middle]{\begin{bmatrix}
h_1( f_9( V_m ) )
\end{bmatrix}} = \eqmathbox[right]{\vec{h}( \vec{x}; \theta ).}
\label{eq:output}
\end{align}
\end{document}
这要求对 中的每个内容更改进行至少两次编译\eqmathbox
。
答案2
我认为在两个方程之间提供多个对齐点并不能真正帮助阐明这两个方程的“含义”。为什么不使用环境gather
来创建两个以单独为中心的方程呢?
\documentclass{article}
\usepackage{mathtools} % for '\shortintertext' macro
\renewcommand{\vec}{\mathbf} % use '\mathbf', not '\textbf'
\begin{document}
\begin{gather}
\dot{\vec{x}} =
\begin{bmatrix}
\dot{n}\\ \dot{x}\\ \dot{x_c}\\ \dot{V_v}\\ \dot{V_m}\\ \dot{H}
\end{bmatrix} =
\begin{bmatrix}
f_2(f_1(I),n)\\
f_4(x, x_c, f_3(f_1(I),n,x,x_c))\\
f_5(x, x_c, f_3(f_1(I),n,x,x_c))\\
f_8(f_7(f_6(x, x_c),H), V_v, f_9(V_m))\\
f_{10}(V_m, f_{11}(V_v))\\
f_{12}(H, f_9(V_m))
\end{bmatrix} =
\vec{f}(\vec{x}, \vec{u}; \theta)
\label{eq:state}\\
\shortintertext{and}
\vec{z} =
\begin{bmatrix}
S_w
\end{bmatrix} =
\begin{bmatrix}
h_1(f_9(V_m))
\end{bmatrix} =
\vec{h}(\vec{x}; \theta).
\label{eq:output}
\end{gather}
\end{document}