使用`\matrix`或其他构造对 TikZ 中的节点“组”进行对齐?

使用`\matrix`或其他构造对 TikZ 中的节点“组”进行对齐?

我正在尝试对齐 2 组 TikZ 节点,但不知道该怎么做。我尝试用 包裹每组,\tikz{...}但没有成功(可能是因为tikzpicture 环境中的 \tikz。目前,我正在使用,\matrix但它将节点水平对齐在左侧(我希望居中)并且不使用行间相等的间距(或者可能它确实如此,但我希望它更改为最小间距?)

无论如何,我感觉我的目标可以实现,\matrix但我也愿意接受其他方法来分组节点。例如,我还没有完全理解环境{scope}

下面是我的 MWE 说明问题的方法(如果 MWE 可以变得更精简,我也会很高兴,例如,我的 tikz 编码可以得到改进):

\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{shapes,positioning}

% some style definitions:
\newcommand\scriptsize{\fontsize{7pt}{7pt}\selectfont} % because of 'minimal' documentclass
% settings for lexemes
\tikzset{font=\scriptsize}
\tikzset{mynode/.style = {rectangle,minimum width=#1,draw=black!70}}
\tikzset{mynode/.default = 2mm}
% macro for drawing multiple lexemes next to each other:
\newcommand{\lexemes}[1]{%
    \node (A) [mynode] {};
    \xdef\lastx{A}
    \foreach \x/\lbl/\d in {#1} {
      \node (\x) [mynode,label=center:\lbl,right=\d of \lastx] {};
      \xdef\lastx{\x}  
    }
}

\begin{document}

\begin{tikzpicture}[node distance=0.08 and 0.05]
  \matrix [anchor=west] at (0,3) {%  no labels, so rows very tight
    \lexemes{C//} \\
    \lexemes{C//,D//2mm,F//} \\
  };
  \matrix [anchor=west] at (0,2) {%  label in upper row, so less tight
    \lexemes{B/1/,C//} \\
    \lexemes{C//,D//2mm,F//} \\
  };
  \matrix [anchor=west] at (0,1) {%  labels in both rows, so this should be the constant row sep?
    \lexemes{B/1/,C//} \\
    \lexemes{B/3/,C//,D//2mm,F//} \\
  };
\end{tikzpicture}

\end{document}

其结果如下:

在此处输入图片描述

现在我想完成两件事:

  1. 将每对/矩阵的第一行和第二行置于中心。
  2. 每个矩阵的第一行和第二行之间有相等的垂直间距,与使用的节点标签无关。我会测量矩形边缘之间的距离。

答案1

好的,现在我了解你的问题了。以下是解决方法:

  1. 要使行居中,请将它们放置在\nodes 中,并将锚点置于其中心。A\matrix按其“原点”对齐其列,对于复杂的构造来说,更改原点相当棘手,但对于节点来说,锚点始终位于原点。

  2. 为了获得正确的间距,您必须确保inner sep标签的为零;每个label都是一个新节点,事实证明,它的不可见范围比您绘制它的框要大一些。

\node1 中也有一个inner sep,我必须将其设置为零,以避免在每一个行。事实证明,您的样式仅设置minimum width和依赖来inner sep强制高度,因此为了防止框在包含在具有的范围内时变平inner sep = 0,我已更改minimum width=#1minimum size=#1

\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{shapes,positioning,matrix}

% some style definitions:
\newcommand\scriptsize{\fontsize{7pt}{7pt}\selectfont} % because of 'minimal' documentclass
% settings for lexemes
\tikzset{font=\scriptsize}
% changed minimum width to minimum size
\tikzset{mynode/.style = {rectangle,minimum size=#1,draw=black!70}}
\tikzset{mynode/.default = 2mm}
% macro for drawing multiple lexemes next to each other:
\newcommand{\lexemes}[1]{%
 \node[anchor=center,inner sep=0pt]{
  \tikz{
   \node (A) [mynode] {};
   \xdef\lastx{A}
   \foreach \x/\lbl/\d in {#1} {
     \tikzset{every label/.style = {inner sep = 0}}
     \node (\x) [mynode,label=center:\lbl,right=\d of \lastx] {};
     \xdef\lastx{\x}  
   }
  }
 };
}

\begin{document}

\begin{tikzpicture}[
 node distance=0.08 and 0.05,
]
  \matrix [anchor=west] at (0,3) {%  no spaces, so rows very tight
    \lexemes{C//} \\
    \lexemes{C//,D//2mm,F//} \\
  };
  \matrix [anchor=west] at (0,2) {%  space in upper row, so less tight
    \lexemes{B/1/,C//} \\
    \lexemes{C//,D//2mm,F//} \\
  };
  \matrix [anchor=west] at (0,1) {%  spaces in both rows, so this should be the constant row sep?
    \lexemes{B/1/,C//} \\
    \lexemes{B/3/,C//,D//2mm,F//} \\
  };
\end{tikzpicture}

\end{document}

相关内容