我正在制作一些控制理论流程图,其中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
:
类型:文本框。
在构建节点之前,
\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 depth
为text 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};
输出结果如下:
类型:最小高度和最小宽度。
与文本框测量相反,它使用形状的高度和宽度,这些高度和宽度由形状声明本身计算得出。由于此计算是在形状声明的深处完成的,因此需要新的形状声明:
Circle
和Rectangle
。width=<name>
:具有相同的节点 将具有相同的宽度。<name>
height=<name>
:具有相同高度的节点 具有相同的高度。<name>
与 和
/pgf/minimum width
一样/pgf/minimum height
,这会忽略 和 的任何值/pgf/outer xsep
或/pgf/outer ysep
线宽本身。
设置为空值将禁用此库的操作。<name>
在内部,文件的写入.aux
发生在图片的末尾,使用\tikz@atend@picture
(execute 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}
输出
首次编译
第二次编译
输出(示例)