我想要实现的是一个绘制这种图表的代码结构:
我需要装饰一个两行矩阵,用方括号将一个或多个列分组,然后再次用方括号将一个或多个子组分组(嵌套组可能有三级以上)。
起初我尝试使用嵌套矩阵above delimiter=\lbrack
,但 TikZ 告诉我You cannot nest pgfmatrix environments, yet
,所以我最终得到了类似这样的结果
\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{matrix,fit,positioning,decorations.pathreplacing,arrows,calc}
\begin{document}
\begin{tikzpicture}[
group/.style={inner sep=0pt},
brace/.style={very thick,decorate,decoration={brace,amplitude=10pt}},
square/.style={-,to path={-- ++(0,.25) -| (\tikztotarget)}}
]
\matrix (A) [matrix of nodes]
{
1--2 & 3--4 & 5 &
6--7 & 8--9 & 10 &
11--12 & 13--14 & 15--16 \\
%
I & V--I--V & V--IV &
V$^6$--IV & V$^7$ & V--IV &
I--V--I--IV & V$^7$--I & V--VI \\
};
\node (gdg) [group,fit=(A-1-1)(A-2-1)] {};
\node (boh) [group,fit=(A-1-2)(A-2-2)] {};
\node (z) [group,fit=(A-1-3)(A-2-3)] {};
\node (frase-a) [group,fit=(gdg)(boh)(z)] {};
\draw[square] ([yshift=.5cm]gdg.west) to ([yshift=.5cm]gdg.east);
\draw[square] ([yshift=.5cm]boh.west) to ([yshift=.5cm]boh.east);
\draw[square] ([yshift=.5cm]z.west) to ([yshift=.5cm]z.east);
\draw[square] ([yshift=1cm]frase-a.west) to ([yshift=1cm]frase-a.east);
\draw[brace] ([yshift=2cm]A.west) -- ([yshift=2cm]A.east);
\end{tikzpicture}
\end{document}
我首先绘制矩阵,然后将每列分组到一个不可见的节点(使用fit
),然后绘制方括号作为从/到组的西/东锚点的路径,在 y 轴上移动坐标。这非常难以维护且丑陋。当然,主要目标是构建可以适应矩阵列可变宽度的东西。任何建议都将不胜感激!
答案1
受到大卫卡莱尔的回答的启发,我想出了这个解决方案:
\documentclass{minimal}
\usepackage{mathtools}
\newcommand{\mfrac}[2]{\genfrac{}{}{0pt}{}{#1}{#2}}
\begin{document}
\[
\overbrace{
\overbracket{
\overbracket{\mfrac{1-2}{I}}^{\text{Gdg}}
\overbracket{\mfrac{3-4}{V-I-V}}
\overbracket{\mfrac{5}{V-IV}}^{z}
}^{\text{frase }a}
\overbracket{
\overbracket{\mfrac{6-7}{V^6}}
\overbracket{\mfrac{8-9}{V^7}}^{y}
\overbracket{\mfrac{10}{V-IV}}^{z'}
}^{\text{frase }b/a'}
\overbracket{
\overbracket{\mfrac{11-12}{I-V-I-IV}}
\overbracket{\mfrac{13-14}{V^7-I}}^{y'}
\overbracket{\mfrac{15-16}{V-VI}}^{z''}
}^{\text{frase }a'/b}
}^{A}
\]
\end{document}
结果是:
现在它很灵活且易于维护,我只需要找出在每行左边的括号外添加标签。
答案2
这不使用 TiKz,而且可以更漂亮,但是
\documentclass{article}
\usepackage{array}
\makeatletter
\newcommand\ob{%
\vrule\@width .7pt\@height3pt\hbox{$\smash-\mkern-3mu$}%
\xleaders\hbox{$\mkern-3mu\smash-\mkern-3mu$}\hfill
\hbox{$\mkern-3mu\smash-$}%
\vrule\@width .7pt}
\makeatother
\begin{document}
\[
\overbrace{
\begin{array}{*{9}c}
\multicolumn{3}{c}{\mathrm{something}}&
\multicolumn{3}{c}{\mathrm{something}\quad b/a'}&
\multicolumn{3}{c}{\mathrm{something}\quad b'/a}\\
\omit\span\omit\span\omit\kern\tabcolsep
\ob\kern\tabcolsep&%
\omit\span\omit\span\omit\kern\tabcolsep
\ob\kern\tabcolsep&%
\omit\span\omit\span\omit\kern\tabcolsep
\ob\kern\tabcolsep\\
GdG&&z&&y&z'&&y'&z''\\
\omit\kern\tabcolsep
\ob\kern\tabcolsep&\ob&\ob&\ob&\ob&\ob&\ob&\ob&\ob\\
1-2&3-4&5 &6-7 &8-9&10&11-12&13-14 &15-16\\
I &V &V^6&V(I-N)&X &Y &Z &(V^3)(X-V)&V^5
\end{array}}^A
\]
\end{document}