我正在製作一些控制理論流程圖,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
這個答案ext.node-families
作為我的一部分被轉換為自己的 TikZ 庫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}
輸出
第一次編譯
第二次編譯
輸出(範例)