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 height、 およびtext depthをすべてtext width同じに 設定します。<name>

    デフォルトでは、これは基本シェイプとにのみ設定されますrectanglecircle別のシェイプが宣言された後(通常はshapes.*ライブラリの1つをロードすることによって)、次のように同じ方法で設定できます。

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

    これは図形ごとに 1 回だけ実行する必要があります。

    これはテキスト ボックスの寸法のみを変更するため、同じファミリ内の異なる図形の場合、寸法はテキスト ボックスのサイズに基づいて異なって計算されるため、図形の幅や高さが異なる場合があります。次の例を検討してください。

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

    出力は次のようになります。

    ここに画像の説明を入力してください

  2. タイプ: 最小の高さと最小の幅。

    テキスト ボックスの測定値とは異なり、これは図形の宣言自体によって計算された図形の高さと幅を使用します。この計算は図形の宣言の深いところで行われるため、新しい図形の宣言とが必要CircleですRectangle

    • 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効果がより顕著になるライブラリも使用しました。

以下の例では、ファイルによって 7 つの追加マクロが定義されているため、コードはまだ少し最適化される可能性があります.aux。 1 つのファミリのすべての値を 1 つのマクロに保存する方がよいかもしれません。

コード

\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}

出力

最初のコンピレーション

ここに画像の説明を入力してください

第2弾

ここに画像の説明を入力してください

出力(例)

ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください

関連情報