TIKZ 순서도를 쉽게 작성하세요

TIKZ 순서도를 쉽게 작성하세요

TIKZ 순서도를 쉽게 작성하기 위해 npm 패키지를 만들었습니다. Flowtex는 흐름도의 유지 관리를 용이하게 합니다. 새 노드를 삽입하거나 다른 노드의 기능으로 노드를 배치하는 등의 작업이 가능합니다. 나뿐만 아니라 당신에게도 도움이 되기를 바랍니다.

https://www.npmjs.com/package/flowtex

github에서 flowtex.sty 사용하기기반으로TikZ로 순서도 만들기

튜토리얼 및 문서

흐름도 흐름도

Flowtex 코드

flowchart.offsetX("3");
  N('Start').belowGoto(
    P('k <- 0').belowGoto(
      loop = IO('Loop ?').belowGoto(
        D('Yes or No ?').offsetY(-1) // use offsetY with D
         .rightGoto(kp1 = P('k <- k + 1')).topLabel('yes')
         .belowGoto( // use offsetY for this node because is immediatly below of D
          P('Print k').offsetY(-1).belowGoto(
            P('Stop')
          ).leftLabel('exit')
        ).leftLabel('no')
      ).leftLabel('Looping')
    ).leftLabel('Start loop')
  ).leftLabel('Init');
  kp1.goto(loop).brokenArrow();

TIKZ를 사용하는 LaTeX 코드

\begin{center}
  \begin{tikzpicture}[node distance=2cm]
    \node (node0) [startstop] {Start};
    \node (node1) [process, below of=node0] {k $\leftarrow$ 0};
    \node (node2) [io, below of=node1] {Loop ?};
    \node (node3) [decision, below of=node2, yshift=-1cm] {Yes or No ?};
    \node (node4) [process, right of=node3, xshift=3cm] {k $\leftarrow$ k + 1};
    \node (node5) [process, below of=node3, yshift=-1cm] {Print k};
    \node (node6) [process, below of=node5] {Stop};
    \draw [arrow] (node3) --node[anchor=south] {yes} (node4);
    \draw [arrow] (node3) --node[anchor=east] {no} (node5);
    \draw [arrow] (node5) --node[anchor=east] {exit} (node6);
    \draw [arrow] (node2) --node[anchor=east] {Looping} (node3);
    \draw [arrow] (node1) --node[anchor=east] {Start loop} (node2);
    \draw [arrow] (node0) --node[anchor=east] {Init} (node1);
    \draw [arrow] (node4) |- (node2);
  \end{tikzpicture}
\end{center}

현재 생성된 LaTeX 코드를 삽입하기 위해 \input을 사용합니다. 하지만 다음과 같은 LaTeX 명령을 만들고 싶습니다.

\begin{flowtex}
Here, the Flowtex code.
\end{flowtex}

어떻게 해야 하는지 아시겠어요?

답변1

@A.Ellet 답변에 대한 대안(둘 다 질문의 첫 번째 버전을 고려함):

 \documentclass[border=3mm,
                tikz]{standalone}
\usetikzlibrary{arrows.meta,
                calc, chains,
                quotes,
                positioning,
                shapes.geometric}

\begin{document}
  \begin{tikzpicture}[
    node distance = 8mm and 16mm,
      start chain = A going below,
      base/.style = {draw, minimum width=32mm, minimum height=8mm,
                     align=center, on chain=A},
 startstop/.style = {base, rounded corners, fill=red!30},
   process/.style = {base, fill=orange!30},
        io/.style = {base, trapezium, 
                     trapezium left angle=70, trapezium right angle=110,
                     fill=blue!30},
  decision/.style = {base, diamond, fill=green!30},
  every edge quotes/.style = {auto=right}]
                    ]
\node [startstop]       {Start};            % <-- A-1
\node [process]         {k $\gets$ 0};
\node [io]              {Loop ?};
\node [decision]        {Yes or No ?};
\node [process]         {Print k};
\node [process]         {Stop};             % <-- A-6
%
\node [process,                             % <-- A-7
       right=of A-4]    {k $\gets$ k + 1};
%%
\draw [arrows=-Stealth] 
    (A-1) edge["init"]          (A-2)
    (A-2) edge["start stop"]    (A-3)
    (A-3) edge["looping"]       (A-4)
    (A-4) edge["no"]            (A-5)
    (A-5) edge["exit"]          (A-6)
    (A-4) edge["yes"']          (A-7)       % <-- by ' is swapped label position
    (A-7) |- ($(A-2.south east)!0.5!(A-3.north east)$)
          -| ([xshift=7mm] A-3.north);
  \end{tikzpicture}
\end{document}

두 솔루션을 비교하면 다음과 같은 주요 차이점을 확인할 수 있습니다.

  • 메인 브랜치의 노드는 체인으로 설정됩니다(이로 인해 코드가 상당히 단순화됨)
  • 노드 이름은 체인으로 정의된 이름으로 사용됩니다.
  • 노드의 공통 매개변수에 대해 이름이 지정된 새 스타일이 정의되었습니다. base
  • quotes노드 사이의 가장자리를 그리기 위해 가장자리 레이블을 작성하는 구문이 훨씬 더 짧은 필요한 코드를 사용하는 패키지가 사용됩니다 .

위의 MWE(최소 작업 예제)를 편집하면 @A.Ellett 답변에 표시된 것과 중요한 차이점이 있는 유사한 그림이 생성됩니다. 즉, 피드백 가장자리가 더 정확하게 그려집니다(내 의견에 따르면).

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

답변2

MWE에는 사용 중인 라이브러리 등이 상당히 누락되어 있습니다. 그럼에도 불구하고 여기서는 실제로 아무것도 수행하지 않았습니다. 귀하의 코드를 복사한 다음 나머지 부분을 표절했습니다.이 웹페이지.

색상을 제외하고 다음 코드는 원하는 작업을 수행합니다.

\documentclass[border=4pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{shapes.geometric}
\usetikzlibrary{arrows.meta}
\begin{document}

  \begin{tikzpicture}[
    node distance=2cm,
    startstop/.style={rectangle, rounded corners, minimum width=3cm, minimum height=1cm,text centered, draw=black, fill=red!30},
    process/.style={rectangle, minimum width=3cm, minimum height=1cm, text centered, draw=black, fill=orange!30},
    io/.style={trapezium, trapezium left angle=70, trapezium right angle=110, minimum width=3cm, minimum height=1cm, text centered, draw=black, fill=blue!30},
    decision/.style={diamond, minimum width=3cm, minimum height=1cm, text centered, draw=black, fill=green!30},
    ]

    \node (node0) [startstop]                             {Start};
    \node (node1) [process, below of=node0]               {k $\leftarrow$ 0};
    \node (node2) [io, below of=node1]                    {Loop ?};     
    \node (node3) [decision, below of=node2, yshift=-1cm] {Yes or No ?};
    \node (node4) [process, right of=node3, xshift=3cm]   {k $\leftarrow$ k + 1};
    \node (node5) [process, below of=node3, yshift=-1cm]  {Print k};
    \node (node6) [process, below of=node5]               {Stop};

    \draw [arrows=-Stealth] (node3) --node[anchor=south]            {yes}        (node4);
    \draw [arrows=-Stealth] (node3) --node[anchor=east]             {no}         (node5);
    \draw [arrows=-Stealth] (node5) --node[anchor=east]             {exit}       (node6);
    \draw [arrows=-Stealth] (node2) --node[anchor=east]             {Looping}    (node3);
    \draw [arrows=-Stealth] (node1) --node[anchor=east]             {Start loop} (node2);
    \draw [arrows=-Stealth] (node0) --node[anchor=east]             {Init}       (node1);
    \draw [arrows=-Stealth] (node4) -- (node2);

  \end{tikzpicture}

\end{document}

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

원하는 색상을 얻기 위해 나머지 부분을 조정하는 것은 여러분의 몫입니다(결국 저는 색맹입니다).

관련 정보