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

이 답변자체 TikZ 라이브러리로 변환되었습니다.ext.node-families내 일부로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 depthtext 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또한 효과를 더욱 눈에 띄게 만드는 라이브러리를 사용했습니다 .

코드는 파일에 의해 정의된 7개의 추가 매크로가 아래 예와 같이 여전히 약간 최적화될 수 있습니다 .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}

산출

첫 번째 편집

여기에 이미지 설명을 입력하세요

두 번째 편집

여기에 이미지 설명을 입력하세요

출력(예)

여기에 이미지 설명을 입력하세요 여기에 이미지 설명을 입력하세요 여기에 이미지 설명을 입력하세요

관련 정보