50 如何进一步调整下面nicematrix代码的「行高和行宽」以及「大括号的长度和位置」使其匀称美观?

发布于 2025-07-14 21:14:30

如题,下面的MWE:

Claim: \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}

image.png

大致还有如下问题:

  • 整个矩阵如何合理控制「宽度高度」让其「匀称、方正」
  • 如何保证每个「大括号的长度相同」,且其「高度、水平位置相同」

查看更多

关注者
0
被浏览
260
shadow
shadow 2025-07-15
这个人懒得不得了,竟然啥也没写

给一个比较愚蠢的方法,与 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}

image.png

可以看到,一些元素的间距处理比较麻烦而且效果不完美,用 nicematrix 处理更好。

4 个回答
Sagittarius Rover
Sagittarius Rover 2025-07-15
我要成为Typst糕手/(ㄒoㄒ)/~~

为了追求更高质量的位置、长度自定义,如「方正」、「规整」等,同时受我自己的这个回答启发,我也用tikzmatrix子库自己实现了...

下面保留了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}

image.png

Sagittarius Rover
Sagittarius Rover 2025-07-17
我要成为Typst糕手/(ㄒoㄒ)/~~

原来的MWE已经确认为nicematrix的bug,可关注相关issues.

基于nicematrix的文档18.5中例子的一个workaround,使用了较旧的\Submatrix\Overbrace命令:

image.png

不过并不够优雅,例如下面的m_in_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}

image.png

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览