如题,下面的MWE:
\Hbrace
和\Vbrace
只能在v7.1
以上的nicematrix
下运行,理论上需要TL25
.\documentclass{article}
\usepackage[OT1]{fontenc}
\usepackage{eulervm}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing}
\usepackage{nicematrix}
\setlength{\extrarowheight}{1mm}
\begin{document}
\[
\begin{pNiceMatrix}[
first-row,
last-col=5,
cell-space-limits=5pt,
xdots/horizontal-labels
]
\Hbrace{1}{n_1} &
\Hbrace{1}{n_2} &
\cdots &
\Hbrace{1}{n_s} & \\
A_{11} & A_{12} & \cdots & A_{1s} & \Vbrace{1}{m_1}\\
A_{21} & A_{22} & \cdots & A_{2s} & \Vbrace{1}{m_2} \\
\vdots & \vdots & {} & \vdots & \vdots \\
A_{r1} & A_{r2} & \cdots & A_{rs} & \Vbrace{1}{m_r} \\
\end{pNiceMatrix}
\]
\end{document}
大致还有如下问题:
给一个比较愚蠢的方法,与 nicematrix 无关,仅仅作为一种方法。用 tikz 的 matrix 库实现
\documentclass[tikz,border=1cm]{standalone}
\usetikzlibrary{matrix,calc}
\begin{document}
\begin{tikzpicture}
\matrix (m) [matrix of math nodes,
left delimiter=(,
right delimiter=),
inner sep=1pt, column sep=8pt,
row sep=8pt,
]
{
A_{11} & A_{12} & \dots & A_{1s} \\
A_{21} & A_{22} & \dots & A_{2s} \\
\vdots & \vdots & \ddots & \vdots \\
A_{r1} & A_{r2} & \dots & A_{rs} \\
};
\foreach \x/\y in {1/1,2/2,4/s}
{
\node[align=center] at ($(m-1-\x.north)+(0,0.27)$) {\scalebox{0.8}{$n_{\y}$}\\[-1ex]
\scalebox{0.65}{\rotatebox{90}{$\bigg\}$}}
};
}
\foreach \x/\y in {1/1,2/2,4/r}
{
\node[align=center] at ($(m-\x-4)+(1,0)$) {\scalebox{0.9}{$\big\}$}\,\scalebox{0.8}{$m_{\y}$}
};
}
\node at ($(m-1-3.north)+(0.03,0.35)$){$\cdots$};
\node at ($(m-3-4)+(0.85,0)$){$\vdots$};
\end{tikzpicture}
\end{document}
可以看到,一些元素的间距处理比较麻烦而且效果不完美,用 nicematrix 处理更好。
(maybe) related references:
为了追求更高质量的位置、长度自定义,如「方正」、「规整」等,同时受我自己的这个回答启发,我也用tikz
的matrix
子库自己实现了...
下面保留了matrix of math nodes
的边界:
\documentclass{article}
\usepackage[OT1]{fontenc}
\usepackage{eulervm}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing,calligraphy,matrix}
% https://tex.stackexchange.com/a/112212/322482
\makeatletter
\DeclareRobustCommand{\rvdots}{%
\vbox{
\baselineskip4\p@\lineskiplimit\z@
\kern-\p@
\hbox{.}\hbox{.}\hbox{.}
}}
\makeatother
\newcommand*\myHbrace[3][0pt]{%
\draw[mybrace] (foo-#2.north west) -- node[above=3pt] {#3} (foo-#2.north east);
}%
\newcommand*\myVbrace[3][8pt]{%
\draw[mybrace=#1] (foo-#2.north east) -- node[right=8pt] {#3} (foo-#2.south east);
}%
\begin{document}
\begin{tikzpicture}[
every left delimiter/.style={xshift=.5em},
every right delimiter/.style={xshift=-.5em},
% https://tex.stackexchange.com/a/525165/322482
mybrace/.default=3pt,
mybrace/.style = {
thick,pen colour=black,
decorate,
decoration={
calligraphic brace, amplitude=2pt,
pre =moveto, pre length=1pt,
post=moveto, post length=1pt,
raise=#1},
},
]
\matrix (foo) [
matrix of math nodes,
% default linewidth = .4pt
column sep=-.4pt,row sep=-.4pt,
anchor=center,
nodes = {
draw=magenta,dashed,
inner sep=1pt,outer sep=0pt,
minimum size=.75cm,anchor=center,
},
left delimiter=(,right delimiter=),
]
{
A_{11} & A_{12} & \cdots & A_{1s} \\
A_{21} & A_{22} & \cdots & A_{2s} \\
\rvdots & \rvdots & & \rvdots \\
A_{r1} & A_{r2} & \cdots & A_{rs} \\
};
\myHbrace{1-1}{$n_1$}
\myHbrace{1-2}{$n_2$}
\node[above=3pt] at (foo-1-3.north) {$\cdots$};
\myHbrace{1-4}{$n_s$}
\myVbrace{1-4}{$m_1$}
\myVbrace{2-4}{$m_2$}
\node[right=12pt] at (foo-3-4.east) {$\rvdots$};
\myVbrace{4-4}{$m_r$}
\end{tikzpicture}
\end{document}
原来的MWE已经确认为nicematrix
的bug,可关注相关issues.
基于nicematrix
的文档18.5中例子的一个workaround,使用了较旧的\Submatrix
和\Overbrace
命令:
不过并不够优雅,例如下面的m_i
和n_j
居然要以两种并不对偶的方式来输入:
\documentclass{article}
\usepackage[OT1]{fontenc}
\usepackage{eulervm}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{decorations.pathreplacing,calligraphy}
% https://tex.stackexchange.com/a/112212/322482
\makeatletter
\DeclareRobustCommand{\rvdots}{%
\vbox{
\baselineskip4\p@\lineskiplimit\z@
\kern-\p@
\hbox{.}\hbox{.}\hbox{.}
}}
\makeatother
\usepackage{nicematrix}
\setlength{\extrarowheight}{1mm}
\begin{document}
\[
% a little syntax inconsisitency in this example
\begin{pNiceArray}{cccc}[margin,last-col,cell-space-limits=5pt]
A_{11} & A_{12} & \cdots & A_{1s} & \enspace m_1 \\
A_{21} & A_{22} & \cdots & A_{2s} & \enspace m_2 \\
\rvdots & \rvdots & {} & \rvdots & \quad \rvdots \\
A_{r1} & A_{r2} & \cdots & A_{rs} & \enspace m_r \\
\CodeAfter
\OverBrace[yshift=1mm]{1-1}{1-1}{n_1}
\OverBrace[yshift=1mm]{1-2}{1-2}{n_2}
\OverBrace[yshift=1mm]{1-3}{1-3}{\cdots}
\OverBrace[yshift=1mm]{1-4}{1-4}{n_s}
\SubMatrix{.}{1-4}{1-4}{\rbrace}[xshift=4mm]
\SubMatrix{.}{2-4}{2-4}{\rbrace}[xshift=4mm]
\SubMatrix{.}{3-4}{3-4}{\rbrace}[xshift=4mm]
\SubMatrix{.}{4-4}{4-4}{\rbrace}[xshift=4mm]
\end{pNiceArray}
\]
\end{document}
@u26254 感觉可以调整一下定位思路,同时在
matrix of math nodes
里用nodes={draw}
可以更方便地看到某位置是什么。