TikZ 中的依赖节点大小

TikZ 中的依赖节点大小

我正在制作一些控制理论流程图,其中TikZ我指定了节点框大小。由于我制作了很多这些流程图,我为它们设置了全局样式,例如box我目前使用的样式:

box/.style={rectangle, draw, minimum width = 8ex,
            minimum height = 4ex, inner sep = 1ex}

节点中的文本量各不相同。问题是,如果节点文本占用的空间比minimum该图片中的其余节点应保持与最大节点相同的大小。我该怎么做?解决方案这个问题是我想要避免的,因为在我看来它太“手动”了,我需要自动化。

MWE:

\documentclass[12pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\tikzset{
    box/.style={rectangle, draw, minimum width = 8ex,
                minimum height = 4ex, inner sep = 0},
    split/.style={circle, draw, minimum size = 2.5pt, fill=black,
                inner sep = 0},
}
\begin{document}
\begin{tikzpicture}[
    every path/.style={>={stealth}, ->, draw, node distance = 1pt, inner sep = 0pt},
    ]
    \node[split] (split)  {};
    \node[box] (I) at ($(split) + (4,0)$) {Short};
    \node[box] (P) at ($(I)+(0,1)$) {This node has long node text};
    \node[box] (D) at ($(I)+(0,-1)$) {Short};
    \draw (split.north) |-(P);
    \draw (split.east) -- (I) ;
    \draw (split.south) |-(D);

\end{tikzpicture}
\end{document}

答案1

这个答案被转换为自己的 TikZ 库ext.node-families作为我的一部分tikz-ext扩展包


我认为,这几乎是自动化的。它使用.aux当图片被外部化时,它将不起作用external图书馆

您指定一个节点系列,它们应具有相同的维度,并且所有节点都位于名称空间中/tikz/node family

  1. 类型:文本框。

    在构建节点之前,\pgfnodeparttextbox会测量并比较包含节点文本的文本框的尺寸( )。使用最大值。

    • text height=<name>:具有相同高度的节点 将具有相同的文本高度。<name>

    • text depth=<name>:具有相同的节点 将具有相同的文本深度。<name>

    • text width=<name>:具有相同宽度的节点 将具有相同的文本宽度。<name>

    • text width align = left|center|right

      设置文本框的宽度只会将框向右扩展。框的内容需要重新对齐。键text width align(默认center)确保正确完成。

    • text=<name>将所有text height和 设置text depthtext width相同 。<name>

    rectangle默认情况下,这只针对基本形状和进行设置circle。在声明另一个形状后(通常通过加载其中一个shapes.*库),可以使用相同的方式进行设置

    \tikzset{node family/setup shape=<shape name>}
    

    每个形状只需执行一次此操作。

    由于这只会改变文本框的尺寸,因此对于同一系列中的不同形状,这可能会导致形状的宽度或高度不同,因为它们的尺寸是根据文本框的大小计算不同的。考虑这个例子:

    \tikz[nodes=draw, node family/text width=test]
      \node {Foo} node[circle] {Barbarbar};
    

    输出结果如下:

    在此处输入图片描述

  2. 类型:最小高度和最小宽度。

    与文本框测量相反,它使用形状的高度和宽度,这些高度和宽度由形状声明本身计算得出。由于此计算是在形状声明的深处完成的,因此需要新的形状声明:CircleRectangle

    • width=<name>:具有相同的节点 将具有相同的宽度。<name>

    • height=<name>:具有相同高度的节点 具有相同的高度。<name>

    与 和/pgf/minimum width一样/pgf/minimum height,这会忽略 和 的任何值/pgf/outer xsep/pgf/outer ysep线宽本身。

设置为空值将禁用此库的操作。<name>


在内部,文件的写入.aux发生在图片的末尾,使用\tikz@atend@pictureexecute at end picture)。

prefix指定prefix所有节点系列的。默认情况下,这是\pgfpictureid-,这使得节点系列仅适用于单独的 TikZpictures。

在下面的例子中,所有家庭都有名字test,但都是不同的。


我也使用了该positioning库,这使得效果更加明显。

代码仍可以稍微优化一下,因为下面的示例文件定义了七个额外的宏.aux。将一个系列的所有值保存在一个宏中可能更好吗?

代码

\documentclass[12pt,tikz]{standalone}
\usetikzlibrary{
  positioning,       % better positioning (right=of …)
  ext.node-families, % node families
  arrows.meta        % arrow tips
}
\begin{document}
\begin{tikzpicture}[
  node distance=.3cm and 1cm,
  box/.style={
    rectangle, draw, minimum width=+8ex, minimum height=+4ex, inner sep=+0pt,
    node family/text width=test},
  split/.style={
    circle, draw, minimum size=+2.5pt, fill=black, inner sep=+0pt}]
\node[split] (split)  {};
\node[box, right=of split] (I)  {Short};
\node[box, above=of I]     (P)  {This node has long node text};
\node[box, below=of I]     (D)  {Short};
\draw[-Stealth] (split.north) |-(P);
\draw[-Stealth] (split.east) -- (I) ;
\draw[-Stealth] (split.south) |-(D);
\end{tikzpicture}
\tikz % only the same height (text is still centered)
  \foreach \cnt[count=\Cnt] in {a,...,h}
    \node[draw, Circle, node family/height=test] at (right:\Cnt) {\cnt};
\tikz % height and text height (text depth set to zero)
  \foreach \cnt[count=\Cnt] in {a,...,h}
    \node[draw, Circle, text depth=+0pt,
      node family={height=test, text height=test}]
      at (right:\Cnt) {\cnt};
\begin{tikzpicture}[% http://tex.stackexchange.com/q/134983
   nodes={circle, draw=black, node family/text=test}]
\node                 (A) {$n$};
\node[right=0pt of A] (B) {$n+1$};
\end{tikzpicture}
\end{document}

输出

首次编译

在此处输入图片描述

第二次编译

在此处输入图片描述

输出(示例)

在此处输入图片描述 在此处输入图片描述 在此处输入图片描述

相关内容