如何使用括号标记矩阵的不同行或列?

如何使用括号标记矩阵的不同行或列?

[ ]我有一个用括号(或(),或{},或|'s ,或||'s)括起来的矩阵:

- a b c d -
| e f g h |
| i j k l |
- m n o p -

我想这样标记:

           R
         |---|
  -- - a b c d -
 A|  | e f g h |
  -- | i j k l |
     - m n o p -  

标签旁边的破折号应该是巨大的{,就像图中这样:
替代文本
我该怎么做?


尽管已经提供了两个在一定程度上可行的答案,但我还是增加了悬赏,因为我想看看是否有人有或可以想出一个简洁、强大的解决方案。

答案1

以下解决方案使用 TikZ,但使用了少量的黑客技术:

\usepackage{tikz}
\usetikzlibrary{matrix,decorations.pathreplacing}

\begin{tikzpicture}[decoration=brace]
    \matrix (m) [matrix of math nodes,left delimiter=[,right delimiter={]}] {
        a & b & c & d \\
        e & f & g & h \\
        i & j & k & l \\
        m & n & o & p \\
    };
    \draw[decorate,transform canvas={xshift=-1.5em},thick] (m-3-1.south west) -- node[left=2pt] {$A$} (m-1-1.north west);
    \draw[decorate,transform canvas={yshift=0.5em},thick] (m-1-2.north west) -- node[above=2pt] {$R$} (m-1-4.north east);
\end{tikzpicture}

首先加载两个 tikz 库(这只需执行一次)。在环境中定义了tikzpicture一个名为的矩阵。分隔符可以更改为数学模式中可接受的任何内容。矩阵的条目可以通过引用(在这种情况下,名称为)。我通过反复试验找到了好看的移位(即括号和矩阵条目之间的距离);您可能必须更改它们。此外,您可能想尝试删除该参数。m\leftname-row-columnmthick


我尝试用漂亮的命令包装所有内容。不幸的是,我只成功了一部分,因为我不知道如何处理&矩阵中的 LaTeX 不会抱怨“错位对齐制表符”。我稍微调整了以下 tikz 样式中的间距,使矩阵看起来更像通常的矩阵。也许有更好的方法来做到这一点((通常的)矩阵环境使用的所有长度是否可以通过某种方式访问​​?)。

不管怎样,继续执行命令。将以下代码放在文档开头附近的某个位置:

% Load TikZ
\usepackage{tikz}
\usetikzlibrary{matrix,decorations.pathreplacing,calc}

% Set various styles for the matrices and braces. It might pay off to fiddle around with the values a little bit
\pgfkeys{tikz/mymatrixenv/.style={decoration=brace,every left delimiter/.style={xshift=3pt},every right delimiter/.style={xshift=-3pt}}}
\pgfkeys{tikz/mymatrix/.style={matrix of math nodes,left delimiter=[,right delimiter={]},inner sep=2pt,column sep=1em,row sep=0.5em,nodes={inner sep=0pt}}}
\pgfkeys{tikz/mymatrixbrace/.style={decorate,thick}}
\newcommand\mymatrixbraceoffseth{0.5em}
\newcommand\mymatrixbraceoffsetv{0.2em}

% Now the commands to produce the braces. (I'll explain below how to use them.)
\newcommand*\mymatrixbraceright[4][m]{
    \draw[mymatrixbrace] ($(#1.north west)!(#1-#3-1.south west)!(#1.south west)-(\mymatrixbraceoffseth,0)$)
        -- node[left=2pt] {#4} 
        ($(#1.north west)!(#1-#2-1.north west)!(#1.south west)-(\mymatrixbraceoffseth,0)$);
}
\newcommand*\mymatrixbraceleft[4][m]{
    \draw[mymatrixbrace] ($(#1.north east)!(#1-#2-1.north east)!(#1.south east)+(\mymatrixbraceoffseth,0)$)
        -- node[right=2pt] {#4} 
        ($(#1.north east)!(#1-#3-1.south east)!(#1.south east)+(\mymatrixbraceoffseth,0)$);
}
\newcommand*\mymatrixbracetop[4][m]{
    \draw[mymatrixbrace] ($(#1.north west)!(#1-1-#2.north west)!(#1.north east)+(0,\mymatrixbraceoffsetv)$)
        -- node[above=2pt] {#4} 
        ($(#1.north west)!(#1-1-#3.north east)!(#1.north east)+(0,\mymatrixbraceoffsetv)$);
}
\newcommand*\mymatrixbracebottom[4][m]{
    \draw[mymatrixbrace] ($(#1.south west)!(#1-1-#3.south east)!(#1.south east)-(0,\mymatrixbraceoffsetv)$)
        -- node[below=2pt] {#4} 
        ($(#1.south west)!(#1-1-#2.south west)!(#1.south east)-(0,\mymatrixbraceoffsetv)$);
}

此后,您只需使用以下代码即可生成示例:

\[
\begin{tikzpicture}[mymatrixenv]
    \matrix[mymatrix] (m)  {
        a & b & c & d \\
        e & f & g & h \\
        i & j & k & l \\
        m & n & o & p \\
    };
    \mymatrixbraceright{1}{3}{$A$}
    \mymatrixbracetop{2}{4}{$R$}
\end{tikzpicture}
\]

矩阵定义与以前基本相同,只是现在所需的所有样式都存储在mymatrixenv和中mymatrix。无需为每个矩阵重复它们!

括号分别由\mymatrixbraceright\mymatrixbracetop和组成\mymatrixbraceleft\mymatrixbracebottom分别表示右括号、上括号、左括号和下括号。所有命令的工作方式相同:它们有三个必需命令,用于指定括号的起始和结束位置(按“自然”顺序)和标签。此外,它们还有一个可选参数,用于指定矩阵的名称(默认为)。因此,如果您想要一个从第 3 行到第 417 行m的矩阵左侧的括号,并带有标签,则可以使用foo$415$ rows!

\mymatrixbraceleft[foo]{3}{417}{$415$ rows!}

答案2

2017 年编辑以修复影响 的网站\\错误

这是实现此目的的一种可能方法。它使用mathtools包作为其\mathrlap宏。我之前的回答也使用了包\rotateboxgraphicx,但阅读后

将较大的垂直分隔符(括号)与表格的行对齐?

我意识到我以前对竖括号的误解是多么愚蠢。所以我用这个版本(graphicx现在根本不需要了)完全替换了我的代码;它之所以需要,是mathtools因为我排版了一个稍微复杂的案例,而更简单的情况可以不用\mathrlap

我附上了结果图片。代码注意墨水区域最终完全被包围在边界框中,这样它就不会打印到左侧、右侧、顶部或底部的材料上。

非常酷的矩阵,四周都有括号

编写单个宏来实现自动化有点困难,因为标记最好留给智人属的聪明代表。如何使其适应任何给定的情况几乎是不言而喻的。

缺陷:垂直支架比水平支架延伸得稍微远一些。但是如果不使用矩阵环境内部使用的某些尺寸,我不知道如何解决这个问题。所以我把这个问题留在这里。

\documentclass{article}
\usepackage{amsmath}
\usepackage{mathtools}
\pagestyle{empty}

\newcommand\coolover[2]{\mathrlap{\smash{\overbrace{\phantom{%
    \begin{matrix} #2 \end{matrix}}}^{\mbox{$#1$}}}}#2}

\newcommand\coolunder[2]{\mathrlap{\smash{\underbrace{\phantom{%
    \begin{matrix} #2 \end{matrix}}}_{\mbox{$#1$}}}}#2}

\newcommand\coolleftbrace[2]{%
#1\left\{\vphantom{\begin{matrix} #2 \end{matrix}}\right.}

\newcommand\coolrightbrace[2]{%
\left.\vphantom{\begin{matrix} #1 \end{matrix}}\right\}#2}

\begin{document}

\[ \vphantom{% phantom stuff for correct box dimensions
    \begin{matrix}
    \overbrace{XYZ}^{\mbox{$R$}}\\ \\ \\ \\ \\ \\
    \underbrace{pqr}_{\mbox{$S$}}
    \end{matrix}}%
\begin{matrix}% matrix for left braces
\vphantom{a}\\
    \coolleftbrace{A}{e \\ y\\ y}\\
    \coolleftbrace{B}{y \\i \\ m}
\end{matrix}%
\begin{bmatrix}
a & \coolover{R}{b & c & d} & x & \coolover{Z}{x & x}\\
    e & f & g & h & x & x & x \\
    y & y & y & y & y & y & y \\
    y & y & y & y & y & y & y \\
    y & y & y & y & y & y & y \\
    i & j & k & l & x & x & x \\
    m &  \coolunder{S}{n & o}  & \coolunder{W}{p & x & x} & x
\end{bmatrix}%
\begin{matrix}% matrix for right braces
    \coolrightbrace{x \\ x \\ y\\ y}{T}\\
    \coolrightbrace{y \\ y \\ x }{U}
\end{matrix}\]

\end{document}

答案3

这个解决方案并不像专用包那样优雅(希望如此),但我不知道有这样的包,所以这里...这个例子假设您正在使用该amsmath包。

您可以通过创建一个 2x2 的“超级矩阵”并将 (1,1) 项留空来实现所需的效果。然后在 (1,2) 项中放置一个横跨一些列的水平括号,在 (2,1) 项中放置一个横跨一些行的垂直括号。最后,将这些括号所跨越的实际矩阵放在 (2,2) 项中。

为了获得正确的间距,您可以使用\vphantom\hphantom在 (1,2) 和 (2,1) 条目中创建不可见的矩阵,并使用命令\mspace来减少超级矩阵两列之间的间距。

下面是一个例子(粘贴到具有语法高亮功能的编辑器中可能会好看得多):

\begin{matrix} %This is the super matrix
    %(1,1) cell: Empty
  &
    %(1,2) cell: Brace spanning columns
    \begin{matrix}   %One-row matrix to hold the brace
      \hphantom{a} & %Blank space to skip over first column
      \overbrace{
        \hphantom{\begin{matrix}b & c & d\end{matrix}}
      }^{\text{\footnotesize Final three columns}}
    \end{matrix}
  \\
    %(2,1) cell: Brace spanning rows
    \begin{matrix}    %One-column matrix to hold a brace
      \vphantom{a} \\ %Blank space to skip first row
      \text{\footnotesize Middle two rows}
        \left\{\vphantom{\begin{matrix} e \\ i \end{matrix}}\right. \\
      \vphantom{m}
    \end{matrix}
    %The inter-column spacing of the super matrix looks too big by default
    \mspace{-33mu}
  &
    %(2,2) cell: Actual matrix
    \begin{pmatrix}
      a & b & c & d \\
      e & f & g & h \\
      i & j & k & l \\
      m & n & o & p
    \end{pmatrix} 
\end{matrix} 

超矩阵的 (1,2) 和 (2,1) 项中的不可见矩阵允许您跨越所需的任意列,甚至可以在任一方向上拥有多个括号。

答案4

我按照以下方式对行进行括号。首先必须定义一个宏:

\newcommand{\threelinebrace}{$\left. \begin{array}{c} \\ \\ \\ \end{array} \right\rbrace$}

然后为括号添加一列,并将以下代码放在括号所包含的第一个单元格中:

\multirow{3}{*}{\threelinebrace your label}

您还必须包含多行包才能使其工作。

以下是从我曾经做过的演示中提取的一个最小示例:

\documentclass[ngerman]{article}
\usepackage{babel}
\usepackage{multirow}
\newcommand{\threelinebrace}{$\left. \begin{array}{c} \\ \\ \\ \end{array} \right\rbrace$}

\begin{document}
\begin{tabular}{|c|l}
\cline{1-1} 
Protocol ID & \textbf{\multirow{3}{*}{\threelinebrace CPCS-PDU Payload}}\tabularnewline
\cline{1-1} 
Information & \tabularnewline
\cline{1-1} 
Padding & \tabularnewline
\cline{1-1} 
\end{tabular}
\end{document}

我知道,这仍然只是一个快速的破解而不是一个令人满意的解决方案,但这是一个开始。

相关内容