[ ]
我有一个用括号(或()
,或{}
,或|
'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
\left
name-row-column
m
thick
我尝试用漂亮的命令包装所有内容。不幸的是,我只成功了一部分,因为我不知道如何处理&
矩阵中的 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
宏。我之前的回答也使用了包\rotatebox
的graphicx
,但阅读后
我意识到我以前对竖括号的误解是多么愚蠢。所以我用这个版本(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}
我知道,这仍然只是一个快速的破解而不是一个令人满意的解决方案,但这是一个开始。