我想知道是否有办法设置矩形分割部分的高度。我在 pgfmanual 中找不到任何东西。(使用\phantom
似乎只是一个快速修复。)
这里有一个例子来说明我的问题。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes}
\tikzstyle{data}=[rectangle split,rectangle split parts=2,draw,text centered]
\begin{document}
\begin{tikzpicture}[node distance=2cm]
\node [data] (A) {data \nodepart{second} \phantom{null}};
\node [data, right of=A] (B) {data};
\node [data, right of=B] (C) {data \nodepart{second} null};
\end{tikzpicture}
\end{document}
输出
答案1
以下解决方案是\nodepart{second} \hphantom{null}
(或额外的宏)和非空部分也具有指定宽度的条件之间的折衷。
该样式data+
采用一个强制参数,并将空部分的维度设置为其参数的维度。
在您的示例中,您需要data+=null
。当然,如果最后一个节点的第二部分的实际内容发生变化,则必须更改给定的参数data+
(尽管这也可能是一个宏)。
代码
\documentclass{article}
\usepackage{tikz,calc}
\usetikzlibrary{shapes}
\tikzset{
data/.style={
draw,
rectangle split,
rectangle split parts=2,
text centered,
},
data+/.style={
data,
rectangle split every empty part={},% resets empty-part macro (explanation below)
rectangle split empty part width=\widthof{#1},
rectangle split empty part height=\heightof{#1},
rectangle split empty part depth=\depthof{#1},
},
}
\newcommand{\data}{data \nodepart{second} \phantom{null}}
\begin{document}
\begin{tikzpicture}[node distance=2cm]
\node [data+={null}] (A) {data};
\node [data, right of=A] (B) {\data};
\node [data, right of=B] (C) {data \nodepart{second} null};
\end{tikzpicture}
\end{document}
输出
附录:-1ex
风格的定义data+
以前是
data+/.style={
data,
rectangle split empty part width=\widthof{#1}-1ex,
rectangle split empty part height=\heightof{#1},
rectangle split empty part depth=\depthof{#1},
},
楼主问得对
[W]为什么必须
1ex
从宽度中减去?
/pgf/rectangle split ignore empty parts
PGF/TikZ 有一个特殊的宏,如果是,则插入空节点部分false
(这似乎是默认设置,与 PGF 手册相反),否则我们甚至不会得到一个框。
此宏的名称是\pgf@lib@sh@rs@every@emptypart
(简称:空部分宏)。
人们可能认为 PGF 会存储给定键的长度rectangle split empty part <width|height|depth>
,并且不会在需要时使用最新尺寸构建此宏。但事实并非如此。
每次rectangle split empty part <width|height|depth>
使用时,都会创建给定宽度、高度或深度的规则,并且添加 到空部分宏(该规则的所有其他长度参数都是0pt
,这意味着它们是不可见的(例如\strut
))。
问题在于规则(甚至是不可见的规则)会水平堆叠。具有高度或深度的规则不会垂直堆叠,因此它们不会累积额外的高度/深度,但具有宽度的规则(水平规则)会累积。
但等等!我们只使用了这些键一次!是的,但不是。
事实上,它们之前被使用过一次,即在初始化期间。
文件pgflibraryshapes.multipart.code.tex
在第 370、378 和 386 行中读取:
rectangle split empty part width=1ex,% line 370
rectangle split empty part height=1ex,% line 378
rectangle split empty part depth=0ex,% line 386
开始时,我们有一个方形框1ex × 1ex
。如果我们添加一条垂直线,2ex
我们会得到一个框1ex × 2ex
,但如果我们添加一条水平线,2ex
我们会得到一个框3ex × 1ex
。
一张图片胜过千言万语?
我构造了一个例子,其中
初始框是空的:
\def\pgf@lib@sh@rs@every@emptypart{}% clean slate
并且规则实际上具有“宽度”(与其“长度”正交),即水平规则具有高度(实际上是高度和深度,使得线的中间位于基线上),垂直规则具有宽度。
非MWE
rs width
是 的简写,对于和 也rectangular split empty parts width
同样如此。rs height
rs depth
\node[rectangle split ignore empty parts=false] (a) {a};
\node[right of=a, rs width = 1ex] (b) {b};
\node[right of=b, rs height = 3ex] (c) {c};
\node[right of=c, rs depth = .5ex] (d) {d};
\node[below of=a, rs width = 1ex, rs width = \widthof{null}] [yshift=-.5cm] (e) {e};
\node[right of=e, rs height = 1ex, rs height = 2ex, rs height = .5ex] (f) {f};
\node[right of=f, rs depth = 1ex, rs depth = 2ex, rs depth = 3ex] (g) {g};
\node[right of=g, rs width = 1ex, rs depth = 2ex, rs height = 1ex, rs width = 2.5ex] (h) {h};
输出
规则如下:
- 基线:黑色
- 水平(
width
):红色 - 垂直(
height
):绿色 - 垂直(
depth
):蓝色
有没有更好的解决办法?
我想到两个:
除了减去硬编码,
1ex
我们还可以减去当前实际宽度rectangle split empty part width=\widthof{#1}-\widthof{\pgf@lib@sh@rs@every@emptypart}
只要其内容不超过 ,就可以正常工作
#1
。覆盖空部分宏。
有一个未记录的密钥rectangle split every empty part
在 PGF 和 TikZ 中从未使用过。其定义是
rectangle split every empty part/.store in=\pgf@lib@sh@rs@every@emptypart
我们无法做到这一点,rectangle split every empty part={\phantom{null}}
因为 TikZ 切换到了一个\nullfont
吞噬一切的。(您是否曾尝试在tikzpicture
环境中只写一些东西?)。这是同样的原因,我使用了calc
的\<dimen>of
宏,它们巧妙地避开了这一点。
我们可以用规则填充这个空部分宏(不再!)覆盖任何现有内容,但随后我们就可以使用旧的解决方案而不用-1ex
删除任何内容。
代码
\tikzset{
data+/.style={
data,
rectangle split every empty part={},% resets empty-part macro
rectangle split empty part width=\widthof{#1},
rectangle split empty part height=\heightof{#1},
rectangle split empty part depth=\depthof{#1},
},
}
答案2
在尝试了我的问题的评论中的建议之后,我发现最简单的方法是坚持我的第一次尝试使用\phantom
,所以这里是它在代码中的样子。
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{shapes}
\tikzstyle{data}=[rectangle split,rectangle split parts=2,draw,text centered]
\newcommand{\data}{data \nodepart{second} \phantom{null}}
\begin{document}
\begin{tikzpicture}[node distance=2cm]
\node [data] (A) {\data};
\node [data, right of=A] (B) {\data};
\node [data, right of=B] (C) {data \nodepart{second} null};
\end{tikzpicture}
\end{document}
其结果是:
我需要data \nodepart{second} \phantom{null}
几次,因此我认为最好为此定义一个自己的命令,这在示例中可能看起来有点多,但对于实际应用来说它非常有用。看一看:
我发布此信息是因为它可能对遇到类似问题的人有所帮助。