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

這個答案ext.node-families作為我的一部分被轉換為自己的 TikZ 庫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 heighttext 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};
    

    這會導致以下輸出:

    在此輸入影像描述

  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}

輸出

第一次編譯

在此輸入影像描述

第二次編譯

在此輸入影像描述

輸出(範例)

在此輸入影像描述 在此輸入影像描述 在此輸入影像描述

相關內容