矢印上のノードが適切に配置されていない

矢印上のノードが適切に配置されていない

私は次のようなオートマトン用の LaTeX を書きました:

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

ご覧のとおり、q1 から q3 への矢印の「b」は、q3 から q2 への矢印の「a、b、c」よりも下に配置されています。

また、q2 から q3 へのエッジの「b」は、q3 から q1 への矢印の「a、c」よりも下に配置されています。

両方のノード デュオをきちんと整列させて、つまり同じベースライン上に配置したいと思います。ただし、4 つすべてが同じライン上にある必要はありません。

私のコードはこれを自動的に実行するはずですが、どういうわけか動作しません。なぜでしょうか?

これが私のコードです。2 つのノード デュオにコメントを付けました。

\documentclass[border=5mm]{standalone}

\usepackage{tikz}
\usetikzlibrary{automata,arrows,calc,positioning}

\begin{document}
\begin{tikzpicture}[->,node distance=25mm]
\node[state,initial,accepting] (q0) {$q_0$};
\node[state,right=of q0] (q1) {$q_1$};
\node[state,right=of q1] (q2) {$q_2$};
\node[state,below=of $(q1)!0.5!(q2)$] (q3) {$q_3$};
\node[state,accepting,right=of q2] (q4) {$q_4$};

\draw (q0) edge[loop above] node[above] {a, b} (q0);
\draw (q0) -- node[above] {b, c} ++ (q1);
\draw (q1) edge[loop above] node[above] {a, c} (q1);
\draw (q1) edge[bend left] node[above] {a, b, c} (q2);
\draw (q2) -- node[below] {a, c} ++ (q1);
\draw (q2) edge[bend left] node[right] {b} (q3);             % ! duo B
\draw (q3) -- node[above left] {a, b, c} ++ (q2);            % ! duo A
\draw (q3) edge[bend left] node[left] {a, c} (q1);           % ! duo B
\draw (q1) -- node[above right] {b} ++ (q3);                 % ! duo A
\draw (q2) edge[loop above] node[above] {a, b, c} (q2);
\draw (q2) -- node[above] {c} ++ (q4);
\draw (q1) edge[out=60,in=120] node[above] {c} (q4);
\end{tikzpicture}
\end{document}

答え1

\strutこれらのノードにまたは を追加します。およびも適切にtext depth変更しました。above leftleftabove rightright

\documentclass[border=5mm]{standalone}

\usepackage{tikz}
\usetikzlibrary{automata,arrows,calc,positioning}

\begin{document}
\begin{tikzpicture}[->,node distance=25mm]
\node[state,initial,accepting] (q0) {$q_0$};
\node[state,right=of q0] (q1) {$q_1$};
\node[state,right=of q1] (q2) {$q_2$};
\node[state,below=of $(q1)!0.5!(q2)$] (q3) {$q_3$};
\node[state,accepting,right=of q2] (q4) {$q_4$};

\draw (q0) edge[loop above] node[above] {a, b} (q0);
\draw (q0) -- node[above] {b, c} ++ (q1);
\draw (q1) edge[loop above] node[above] {a, c} (q1);
\draw (q1) edge[bend left] node[above] {a, b, c} (q2);
\draw (q2) -- node[below] {a, c} ++ (q1);
\draw (q2) edge[bend left] node[right] {\strut b} (q3);             % ! duo B
\draw (q3) -- node[left] {\strut a, b, c} ++ (q2);            % ! duo A
\draw (q3) edge[bend left] node[left] {\strut a, c} (q1);           % ! duo B
\draw (q1) -- node[right] {\strut b} ++ (q3);                 % ! duo A
\draw (q2) edge[loop above] node[above] {a, b, c} (q2);
\draw (q2) -- node[above] {c} ++ (q4);
\draw (q1) edge[out=60,in=120] node[above] {c} (q4);
\end{tikzpicture}
\end{document}

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

答え2

text height=1ex, text depth=0ptまず最初に、s オプションにオプションを追加してtikzpicture、すべてのラベルのサイズ (垂直方向) を強制的に同じにします。

これを実行すると、問題は

ご覧のとおり、q1 から q3 への矢印の「b」は、q3 から q2 への矢印の「a、b、c」よりも下に配置されています。

また、q2 から q3 へのエッジの「b」は、q3 から q1 への矢印の「a、c」よりも下に配置されています。

魔法のように修正されます。

代わりの珍しい解決策は、重要なノードに名前を付けることです。たとえば、 を持つノードに名前を付けa,b,cbの場所を重要なノードの位置に基づいて定義します。つまり、次のようになります。

\draw (q1) -- node[shift={(label-abc.west)}, xshift=-3.5mm] {b} ++ (q3);

完全なコード:

\documentclass[border=5mm]{standalone}

\usepackage{tikz}
\usetikzlibrary{automata,arrows,calc,positioning}

\begin{document}
\begin{tikzpicture}[->,node distance=25mm, text height=1ex, text depth=0pt]
\node[state,initial,accepting] (q0) {$q_0$};
\node[state,right=of q0] (q1) {$q_1$};
\node[state,right=of q1] (q2) {$q_2$};
\node[state,below=of $(q1)!0.5!(q2)$] (q3) {$q_3$};
\node[state,accepting,right=of q2] (q4) {$q_4$};

\draw (q0) edge[loop above] node[above] {a, b} (q0);
\draw (q0) -- node[above] {b, c} ++ (q1);
\draw (q1) edge[loop above] node[above] {a, c} (q1);
\draw (q1) edge[bend left] node[above] {a, b, c} (q2);
\draw (q2) -- node[below] {a, c} ++ (q1);
\draw (q2) edge[bend left] node[right] {b} (q3);             % ! duo B
\draw (q3) -- node[above left](label-abc) {a, b, c} ++ (q2); % ! duo A
\draw (q3) edge[bend left] node[left] {a, c} (q1);           % ! duo B
\draw (q1) -- node[shift={(label-abc.west)}, xshift=-3.5mm] {b} ++ (q3); % ! duo A
\draw (q2) edge[loop above] node[above] {a, b, c} (q2);
\draw (q2) -- node[above] {c} ++ (q4);
\draw (q1) edge[out=60,in=120] node[above] {c} (q4);
\end{tikzpicture}
\end{document}

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

注: と の両方を設定するtext heightと、text depth次のような文字の場合に非常に役立ちます。pq等々。

例えば:

\documentclass[border=5mm]{standalone}

\usepackage{tikz}
\usetikzlibrary{automata,arrows,calc,positioning,fit}

\begin{document}
\begin{tikzpicture}[->,node distance=25mm, text height=1ex, text depth=0pt]
\node[state,initial,accepting] (q0) {$q_0$};
\node[state,right=of q0] (q1) {$q_1$};
\node[state,right=of q1] (q2) {$q_2$};
\node[state,below=of $(q1)!0.5!(q2)$] (q3) {$q_3$};
\node[state,accepting,right=of q2] (q4) {$q_4$};

\draw (q0) edge[loop above] node[above] {a, b} (q0);
\draw (q0) -- node[above] {b, c} ++ (q1);
\draw (q1) edge[loop above] node[above] {a, c} (q1);
\draw (q1) edge[bend left] node[above] {a, b, c} (q2);
\draw (q2) -- node[below] {a, c} ++ (q1);
\draw (q2) edge[bend left] node[right] (label-g) {g} (q3);             % ! duo B
\draw (q3) -- node[draw,above left](label-abc) {a, b, c} ++ (q2); % ! duo A
\draw (q3) edge[bend left] node[left] (label-ac) {a, c} (q1);           % ! duo B
\draw (q1) -- node[draw,above right] {q} ++ (q3);                 % ! duo A
\draw (q2) edge[loop above] node[above] {a, b, c} (q2);
\draw (q2) -- node[above] {c} ++ (q4);
\draw (q1) edge[out=60,in=120] node[above] {c} (q4);

\node[draw,fit=(label-g)(label-ac)]{};
\draw (label-ac.base)--(label-g.base);
\end{tikzpicture}
\end{document}

結果:

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

答え3

ほとんど話題から外れますが、図のコードを短くする方法の練習です :-)。また、いくつかの追加の説明が示され、tikzライブラリ `quotes. を使用することが提案されています。

他の回答で述べたように、エッジ ラベルのコンマ用のスペースを定義する必要があります。これは 2 つの方法で実行できます。

  • 提案通りクラウディオ・フィアンドリーノ: 決定しtext height=1exて設定しますtext depth=0pt。これは、文字bとカンマがそれぞれノードの上部と下部の境界に触れるためです。
  • @user11232 の提案どおり: 各傾斜エッジ ラベルのノード コンテンツに支柱を使用し、それらのノードの高さと深さを等しくします。

下記のmweで私は従いますクラウディオ・フィアンドリーノアプローチですが、ノード サイズは異なる方法で定義されており、私の意見では、より正確です。エッジ ラベルには次のものが使用されますedge quotes

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

\begin{document}
    \begin{tikzpicture}[-Straight Barb,
node distance = 25mm,
         auto = left,
every edge quotes/.style = {inner sep=1pt,     % that labels are closer to edges
                            text height=1.5ex, % equal height, 
                            text depth=2pt,    % space for commas
                                               % however this depth is not sufficient for letters as p,q, ...
                                               % for them is better 0.25ex or slightly more
                            font=\small}       % smaller letters, gives a nicer result
                        ]
\node (q0)  [state,initial,accepting]         {$q_0$};
\node (q1)  [state,right=of q0]               {$q_1$};
\node (q2)  [state,right=of q1]               {$q_2$};
\node (q3)  [state,below=of $(q1)!0.5!(q2)$]  {$q_3$};
\node (q4)  [state,accepting,right=of q2]     {$q_4$};
%
\draw   (q0) edge[loop above, "{a, b}"]     ()
        (q0) edge["{b, c}"]                 (q1)
        (q1) edge[loop above, "{a, c}"]     ()
        (q1) edge[bend left, "{a, b, c}"]   (q2)
        (q2) edge["{a, c}"]                 (q1)
        (q2) edge[loop above, "{a, b, c}"]  ()
        (q2) edge[bend left, "b"]           (q3)    % ! duo B
        (q2) edge["c"]                      (q4)
        (q3) edge["{a, b, c}"]              (q2)    % ! duo A
        (q3) edge[bend left, "{a, c}"]      (q1)    % ! duo B
        (q1) edge["b"]                      (q3)    % ! duo A
        (q1) edge[out=60,in=120, "c"]       (q4);
\end{tikzpicture}
\end{document}

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

関連情報