Knoten auf Pfeilen nicht richtig ausgerichtet

Knoten auf Pfeilen nicht richtig ausgerichtet

Ich habe das LaTeX für einen Automaten geschrieben, der so aussieht:

Bildbeschreibung hier eingeben

Wie Sie sehen können, ist das „b“ auf dem Pfeil von q1 nach q3 tiefer positioniert als das „a, b, c“ auf dem Pfeil von q3 nach q2.

Außerdem ist das „b“ an der Kante von q2 nach q3 tiefer positioniert als das „a, c“ auf dem Pfeil von q3 nach q1.

Ich möchte, dass beide Knotenduos schön ausgerichtet sind, also auf derselben Grundlinie. Es ist jedoch nicht notwendig, dass alle vier auf derselben Linie liegen.

Mir scheint, dass mein Code dies von selbst erledigen sollte, aber irgendwie funktioniert es nicht. Warum?

Hier ist mein Code. Ich habe die beiden Knotenduos mit Kommentaren markiert:

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

Antwort1

Fügen Sie für diese Knoten ein \strutoder ein „Definition“ hinzu text depth. Ich habe auch „ above leftin“ leftund „ above rightin“ entsprechend geändert right.

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

Bildbeschreibung hier eingeben

Antwort2

Als Erstes würde ich die Optionen text height=1ex, text depth=0ptin der tikzpictureOption „s“ hinzufügen, um zu erzwingen, dass alle Beschriftungen die gleiche (vertikale) Größe haben.

Nachdem dies getan ist, die Probleme

Wie Sie sehen können, ist das „b“ auf dem Pfeil von q1 nach q3 tiefer positioniert als das „a, b, c“ auf dem Pfeil von q3 nach q2.

Außerdem ist das „b“ an der Kante von q2 nach q3 tiefer positioniert als das „a, c“ auf dem Pfeil von q3 nach q1.

sind wie durch Zauberhand behoben.

Eine alternative und exotische Lösung besteht darin, den wichtigen Knoten zu benennen, beispielsweise den mit , a,b,cund bden Ort anhand des Standorts des wichtigen Knotens zu definieren. Das heißt:

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

Der vollständige Code:

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

Bildbeschreibung hier eingeben

Hinweis: Sowohl text heightals auch festgelegt zu haben text depth, ist bei Buchstaben wieP,Q,Gund so weiter.

Zum Beispiel:

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

Das Ergebnis:

Bildbeschreibung hier eingeben

Antwort3

größtenteils Off-Topic, zur Übung, wie man Diagrammcode kürzer macht :-). Außerdem werden einige zusätzliche Erklärungen gegeben und die Verwendung von tikzAnführungszeichen aus der Bibliothek vorgeschlagen.

wie in anderen Antworten angegeben, müssen Sie in Ihren Randbeschriftungen Leerzeichen für Kommas definieren. Dies kann auf zwei Arten erfolgen:

  • wie vorgeschlagenClaudio Fiandrino: bestimmen text height=1exund setzen text depth=0pt. Dies bewirkt, dass Buchstaben bund Kommas den oberen bzw. unteren Rand des Knotens berühren.
  • wie von @user11232 vorgeschlagen: Verwendung einer Strebe an den Knoteninhalten jeder Beschriftung mit geneigter Kante, wodurch diese Knoten die gleiche Höhe und Tiefe haben

in mwe unten folge ichClaudio FiandrinoAnsatz, jedoch ist die Knotengröße anders und meiner Meinung nach korrekter definiert. Für Kantenbeschriftungen werden verwendet 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}

Bildbeschreibung hier eingeben

verwandte Informationen