附录:-1ex

附录:-1ex

我想知道是否有办法设置矩形分割部分的高度。我在 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 partsPGF/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 heightrs 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):蓝色

在此处输入图片描述

有没有更好的解决办法?

我想到两个:

  1. 除了减去硬编码,1ex我们还可以减去当前实际宽度

    rectangle split empty part width=\widthof{#1}-\widthof{\pgf@lib@sh@rs@every@emptypart}
    

    只要其内容不超过 ,就可以正常工作#1

  2. 覆盖空部分宏。

有一个未记录的密钥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}几次,因此我认为最好为此定义一个自己的命令,这在示例中可能看起来有点多,但对于实际应用来说它非常有用。看一看:

列表

我发布此信息是因为它可能对遇到类似问题的人有所帮助。

相关内容