我正在尝试对齐 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
好的,现在我了解你的问题了。以下是解决方法:
要使行居中,请将它们放置在
\node
s 中,并将锚点置于其中心。A\matrix
按其“原点”对齐其列,对于复杂的构造来说,更改原点相当棘手,但对于节点来说,锚点始终位于原点。为了获得正确的间距,您必须确保
inner sep
标签的为零;每个label
都是一个新节点,事实证明,它的不可见范围比您绘制它的框要大一些。
点\node
1 中也有一个inner sep
,我必须将其设置为零,以避免在每一个行。事实证明,您的样式仅设置minimum width
和依赖来inner sep
强制高度,因此为了防止框在包含在具有的范围内时变平inner sep = 0
,我已更改minimum width=#1
为minimum 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}