私は、ノード ボックスのサイズを指定した制御理論フロー シートをいくつか作成しています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.*
ライブラリの1つをロードすることによって)、次のように同じ方法で設定できます。\tikzset{node family/setup shape=<shape name>}
これは図形ごとに 1 回だけ実行する必要があります。
これはテキスト ボックスの寸法のみを変更するため、同じファミリ内の異なる図形の場合、寸法はテキスト ボックスのサイズに基づいて異なって計算されるため、図形の幅や高さが異なる場合があります。次の例を検討してください。
\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
効果がより顕著になるライブラリも使用しました。
以下の例では、ファイルによって 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弾
出力(例)