Использование «nicematrix» для матриц со специальными аннотациями

Использование «nicematrix» для матриц со специальными аннотациями

Я сгенерировал следующее изображение с помощью nicematrix.
Все работает отлично; так что на данный момент нет никаких серьезных проблем.

Примечание:Результат или оптика в точности как хотелось бы. В дальнейшем я буду касаться только нескольких тонкостей кода, для оптимального использования nicematrix-package.

введите описание изображения здесь

Однако из личного интереса меня интересовали две вещи:

  1. "A1 A2 ... A4"должен быть отцентрирован по вертикали относительно целого.
    Правильно ли я использую здесь слово «ok»? Или мне следовало бы сделать лучше в смысле «?
    \Block{2-1}{A1} & \Block{2-1}{A2} & \Block{2-1}{\cdots} & \Block{2-1}{A4} ... \\

    nicematrix.sty

  2. Выше и ниже "A1 A2 ... A4"я добавил вертикальные линии, каждую к концам матрицы.
    Длянижние строкиМне пришлось сделать визуальную корректировку:
    \draw[shorten <=1em+2pt] (2-\col) -- (last-|\col.5);
    Это означает, что если содержимое изменится, корректировки, вероятно, снова понадобятся.
    Можно ли сделать это более стабильным/гибким?

Код:

\documentclass{article}
\usepackage{amsmath}
\usepackage{nicematrix} 
\usepackage{tikz} 
\begin{document}
$M=\begin{NiceArray}{(c c c c)  c  (c c c c)}
   &   &   &   &   \Block{*-1}{\cdot}  & B1 &    &            &   \\
\Block{2-1}{A1} & \Block{2-1}{A2} & \Block{2-1}{\cdots} & \Block{2-1}{A4} 
        &                                        &    & B2  &   &   \\
   &   &    &    &                             &     &    &  \ddots &   \\
   &   &   &   &                              &     &    &            & B4
\CodeAfter
\begin{tikzpicture}[]
% Verticals  =====================
\foreach \col in {1,2,4}{%% 
\draw[shorten <=0pt] (2-\col) -- (1-|\col.5) ; 
\draw[shorten <=1em+2pt] (2-\col) -- (last-|\col.5) ; 
}%%
\end{tikzpicture}
% Underbracing  =================
\UnderBrace[yshift=2pt]{4-6}{4-9}{=X}
\end{NiceArray}$
\end{document}

решение1

Чтобы получить базовую линию там, где вам нужно, вы можете использовать опцию baseline=<row number>для NiceArray. Но это требует, A1чтобы был в своей собственной строке, а не в блоке. Одна из возможностей — сделать ваш массив с 5 строками и 10 столбцами. Затем во «втором» массиве используйте 2 на 2 Blockдля \ddots.

введите описание изображения здесь

Другие изменения:

  • поместите тонкий пробел ( \,) справа и слева от \cdotстолбца, чтобы расстояние было таким же, как если бы вы использовали два отдельных массива.
  • создайте новый стиль ( mylineв коде ниже), чтобы сократить вертикальные линии. Поскольку A1, A2, и т. д. находятся в своих собственных ячейках, интервал будет равномерным.

Вот код:

\documentclass{article}
\usepackage{amsmath}
\usepackage{nicematrix} 
\usepackage{tikz} 
\tikzset{myline/.style={shorten <=3pt}}
\begin{document}
$M=\begin{NiceArray}{(cccc)!\,c!\,(ccccc)}[baseline=3]
 & & & & \Block{*-1}{\cdot} & B1\\
 & & & & & & B2 \\
A1 & A2 & \cdots & A4 & & & & \Block{2-2}{\ddots} \\
 \\
 & & & & & & & & & B4
\CodeAfter
\begin{tikzpicture}[]
% Verticals  =====================
\foreach \col in {1,2,4}{%%  
  \draw[myline] (3-\col) -- (1-|\col.5) ; 
  \draw[myline] (3-\col) -- (last-|\col.5) ; 
}%%
\end{tikzpicture}
% Underbracing  =================
\UnderBrace[yshift=2pt]{5-6}{5-10}{=X}
\end{NiceArray}$
\end{document}

решение2

введите описание изображения здесь

Если вы хотите, чтобы линии оставались внизу "A1 A2 ... A4", то вам нужно использовать \tikzmarknodeиз tikzmarkбиблиотеки

\documentclass{article}
\usepackage[x11names]{xcolor}
\usepackage{amsmath}
\usepackage{nicematrix} 
\usepackage{tikz}
\usetikzlibrary{arrows.meta}
\usetikzlibrary{tikzmark}

\begin{document}
    
    \begin{equation*}
        \setlength{\arraycolsep}{1em}
        \smash{\rlap{\rule{11cm}{0.1pt}}}
        M
        =
        \begin{NiceArray}{(c c c c)  c  (c c c c)}
            \CodeBefore [create-cell-nodes]
            \Body
            &   &   &   &   \Block{*-1}{\cdot}  & B1 &    &            &   \\
            \Block{2-1}{\tikzmarknode{A1}{A1}} & \Block{2-1}{\tikzmarknode{A2}{A2}} & \Block{2-1}{\cdots} & \Block{2-1}{\tikzmarknode{A4}{A4}} 
            &                                        &    & B2  &   &   \\
            &   &    &    &                             &     &    &  \ddots &   \\
            &   &   &   &                              &     &    &            & B4
            \CodeAfter
            \begin{tikzpicture}[]
                
                % Verticals  =====================
                \draw[shorten <=1pt] (A1.north) -- (1-|1.5);
                \draw[shorten <=1pt] (A2.north) -- (1-|2.5); 
                \draw[shorten <=1pt] (A4.north) -- (1-|4.5);
                
                \draw[shorten >=1pt] (last-|1.5) -- (A1.south); 
                \draw[shorten >=1pt] (last-|2.5) -- (A2.south);
                \draw[shorten >=1pt] (last-|4.5) -- (A4.south);
                    
            \end{tikzpicture}
            % Underbracing  =================
            \UnderBrace[yshift=2pt]{4-6}{4-9}{=X}
        \end{NiceArray}
    \end{equation*}

\end{document}

Связанный контент