Manuelle/automatische Zeilenumbrüche und Textausrichtung in TikZ-Knoten

Manuelle/automatische Zeilenumbrüche und Textausrichtung in TikZ-Knoten

Wie kann ich einen Zeilenumbruch in einen TikZ-Knoten einfügen? Einfach dort einzufügen, \\wo ich den Umbruch haben möchte, funktioniert nicht (siehe MWE).

Gibt es eine Möglichkeit, Zeilenumbrüche automatisch bei einer bestimmten Breite vorzunehmen?

Und kann ich die Ausrichtung des Textes steuern (links, rechts, zentriert, Blocksatz)?

\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\node {First line\\second line};
\end{tikzpicture}
\end{document}

Antwort1

Das Problem, so dieTikZ-PGF-Handbuchist das

Normalerweise wird beim Setzen eines Knotens der gesamte Text in Klammern in eine lange Zeile gesetzt ( \hboxgenauer gesagt in ein ) und der Knoten wird so breit wie nötig (§17.4.3).

Nun werden im TikZ-PGF-Handbuch drei Möglichkeiten erläutert, wie man bei Bedarf einen Zeilenumbruch innerhalb eines TikZ-Knotens erreichen kann.

  1. Verwenden Sie innerhalb des Knotens eine mehrzeilige Umgebung.

Man kann innerhalb des Knotens eine Umgebung verwenden, die Zeilenumbrüche erzwingt oder eine Umgebung für Zeilenumbrüche erstellt, um Zeilenumbrüche innerhalb des Knotens zu erreichen. Das Beispiel im Handbuch verwendet die tabularUmgebung:

\documentclass{article}

\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
\node [draw] (example-tabular) {
\begin{tabular}{cc}
eaxmple1 & example2 \\
example 3 & example4 \\
\end{tabular}
};
\end{tikzpicture}

\end{document}

Bildbeschreibung hier eingeben

  1. Verwenden Sie \\und align.

Wenn Sie Zeilenumbrüche manuell einfügen möchten, können Sie \\und das optionale Argument verwenden align. (Wenn Sie keine Option für angeben align, erfolgt der Zeilenumbruch nicht und das vom OP festgestellte Problem tritt auf.)

\begin{tikzpicture}
\node (example-align) [draw, align=left]{example \\ example example};
\end{tikzpicture}

Bildbeschreibung hier eingeben

Der Vorteil dieser Option besteht darin, dass die Größe des Knotens automatisch auf die Breite der längsten Zeile innerhalb des Knotens eingestellt wird, wie im beigefügten Bild zu sehen ist, wo die Breite des Knotens auf die Breite der zweiten Zeile eingestellt wird. Der Nachteil dieser Lösung besteht jedoch darin, dass Sie den Zeilenumbruch manuell selbst steuern müssen (mehr dazu weiter unten).

Es ist auch erwähnenswert, dass Sie den Abstand der Zeilen über ein optionales Argument des \\Befehls steuern können:

\begin{tikzpicture}
\node (example-align) [draw, align=left]{example \\[5em] example example};
\end{tikzpicture}

Bildbeschreibung hier eingeben

Beachten Sie jedoch, dass die \\nicht innerhalb einer Gruppe verschachtelt werden können. So wird beispielsweise Folgendesnichtarbeiten.

\begin{tikzpicture}
\node (example-align) [draw, align=left]{\textbf{example \\ example example}};
\end{tikzpicture}

Stattdessen müssten Sie Folgendes tun:

\begin{tikzpicture}
\node (example-align) [draw, align=left]{\textbf{example}\\\textbf{example example}};
\end{tikzpicture}
  1. Verwenden Sie text widthund \\(und vielleicht alignauch ).

Schließlich besteht die dritte im TikZ-PGF-Handbuch erwähnte Option darin, das text widthArgument zu verwenden, das meines Erachtens intern eine minipageUmgebung erstellt. Diese Lösung legt die Breite des Knotens manuell fest und kann dann in Verbindung mit manuellem Zeilenumbruch verwendet werden:

\begin{tikzpicture}
\node (example-textwidth-1) [draw, text width=3cm]{example \\ example};
\end{tikzpicture}

Bildbeschreibung hier eingeben

Darüber hinaus kann es mit einem längeren Textblock verwendet werden, dessen Standardbreite größer ist als die über angegebene Breite text width. In solchen Fällen wird der Text automatisch in einem Feld mit der angegebenen Breite umbrochen:

\begin{tikzpicture}
\node (example-textwidth-2) [draw, text width=3cm]{This is a demonstration text for showing how line breaking works.};
\end{tikzpicture}

Bildbeschreibung hier eingeben

Das text widthArgument kann auch in Verbindung mit dem Argument verwendet werden, alignum verschiedene Effekte zu erzielen. Die Optionen für alignsind left, flush left, right, flush right, center, , flush center, justify, und none. Einzelheiten zu den verschiedenen Effekten dieser alignOptionen in Verbindung mit dem text widthArgument finden Sie in §17.4.3.

Kurz gesagt, die flushVarianten versuchen jedoch nicht, linke und rechte Ränder durch Silbentrennung auszugleichen. Meiner Meinung nach sieht das Ergebnis oft nicht gut aus (siehe Bild), aber es kann verwendet werden, wenn Sie aus irgendeinem Grund die Silbentrennung vermeiden möchten.

Bildbeschreibung hier eingeben

(Der obere Knoten im Bild direkt darüber verwendet align=leftund der untere Knoten verwendet align=flush left.)

Eine vierte Option

Eine vierte und meiner Meinung nach bevorzugte Option, die im TikZ-PGF-Handbuch nicht behandelt wird, ist die Verwendung desvarwidthPaket. Dieses Paket erstellt im Wesentlichen eine minipageUmgebung, stellt die horizontale Größe der Umgebung jedoch automatisch auf das breiteste Objekt darin ein. Oben werden Sie feststellen, dass die text widthOption den Knoten oft größer als nötig machte. Im direkt darunter wiedergegebenen Bild können Sie beispielsweise sehen, dass am rechten Rand zusätzlicher Platz vorhanden ist:

Bildbeschreibung hier eingeben

Wenn wir jedoch das varwidthPaket verwenden, wird dieser zusätzliche Platz eliminiert,obwohl beide auf 3cm:

\documentclass{article}

\usepackage{tikz}
\usepackage{varwidth}

\begin{document}

\begin{tikzpicture}
\node (example-textwidth-3) [draw, text width=3cm, align=left]{This is a demonstration text for showing how line breaking works.};
\end{tikzpicture}

\begin{tikzpicture}
\node (example-varwidth) [draw, align=left] {\begin{varwidth}{3cm}This is a demonstration text for showing how line breaking works.\end{varwidth}};
\end{tikzpicture}

\end{document}

Bildbeschreibung hier eingeben

Diskussion

Insgesamt halte ich die vierte Option für die bevorzugte, da sie den Knoten so kompakt wie möglich macht (es sei denn natürlich, Sienichtmöchten, dass der Knoten kompakt ist).

Dennoch fallen mir bei der vierten Option mindestens zwei Nachteile ein, die Sie möglicherweise bedenken sollten, bevor Sie entscheiden, wie Sie mehrzeiligen Text in einem TikZ-Knoten implementieren möchten. Ich glaube jedoch, dass es für den ersten Nachteil dieser Option einen Workaround gibt.

Der erste Nachteil ist der folgende: Wie @percusse in den Kommentaren anmerkte, varwidthmacht das Paket im Grunde dasselbe wie das, was alignmit dem Knoten gemacht wird, was vermutlich dazu führt, varwidthdass alle sichtbaren Unterschiede zwischen den möglichen Optionen für hinfällig werden align. Wenn Sie also einen rechtsbündigen Rand in Ihrem Knoten haben möchten und ihn über angeben align=right, gibt es keinen sichtbaren Unterschied zwischen diesem und beispielsweise align=left. Dies kann jedoch überwunden werden, indem Sie denragged2ePaket. Wenn Sie möchten, dass Ihr Knoten einen rechtsbündigen Rand hat, aber gleichzeitig so kompakt wie möglich sein soll (und Sie sich nicht die Zeit nehmen möchten, die Einstellung manuell text widthüber eine „Raten und Prüfen“-Methode zu manipulieren):

\documentclass{article}

\usepackage{tikz}
\usepackage{varwidth}
\usepackage{ragged2e}

\begin{document}

\begin{tikzpicture}
\node (example-varwidth-left) [draw, align=left]{\begin{varwidth}{3cm}This is a demonstration text for showing how line breaking works.\end{varwidth}};
\end{tikzpicture}

\begin{tikzpicture}
\node (example-varwidth-right) [draw, align=right]{\begin{varwidth}{3cm}This is a demonstration text for showing how line breaking works.\end{varwidth}};
\end{tikzpicture}

\begin{tikzpicture}
\node (example-varwidth-ragged) [draw, align=flush right] {\begin{varwidth}{3cm}\RaggedLeft This is a demonstration text for showing how line breaking works.\end{varwidth}};
\end{tikzpicture}

\end{document} 

Bildbeschreibung hier eingeben

Im Bild ist zu erkennen, dass zwischen den ersten beiden Knoten kein Unterschied besteht, die Verwendung der von zur Verfügung gestellten Befehle jedoch ragged2eeinen sichtbaren Effekt im dritten Knoten erzeugt.

Der zweite Nachteil der vierten Option entsteht, wenn Sie den Zeilenumbruch wirklich manuell steuern möchten. Die varwidthUmgebung versucht immer noch, Zeilen durch Silbentrennung auszugleichen, was meiner Meinung nach zu hässlichen Ergebnissen führen kann:

\begin{tikzpicture}
\node (example-varwidth-linebreak) [draw, align=left]{\begin{varwidth}{3cm}This is a demonstration \\ text for showing how line breaking works.\end{varwidth}};
\end{tikzpicture}

Bildbeschreibung hier eingeben

Wenn Sie den Zeilenumbruch manuell steuern möchten, empfehle ich die zweite Option. Geben Sie dabei das alignArgument an und fügen Sie \\nach Belieben 's ein.

Update (gemäß Kommentar von @percusse):

Wenn Sie Zeilenumbrüche manuell steuern möchten, ist die zweite Option der vierten vorzuziehen, da die zweite Option die Knotenbreite auf die Länge der längsten Zeile innerhalb des Knotens einstellt. Es wird kein Textumbruch und keine Silbentrennung erzwungen. Daher wird es meiner Meinung nach bei der zweiten Option keine „hässliche“ Ausgabe geben, gerade weil kein Textumbruch und keine Silbentrennung erzwungen werden.

Aus diesem Grund habe ich die vierte Option zusätzlich zu den drei im TikZ-PGF-Handbuch aufgeführten Optionen hinzugefügt. Wenn Sie einen Textumbruch innerhalb des Knotens mit einer bestimmten Breite erzwingen möchtensowie die Größe des Knotens so kompakt wie möglich zu halten, dann möchten Sie die varwidthUmgebung verwenden. Vergleichen Sie die folgenden beiden Knoten, einen mit alignund einen mit varwidthauf gesetzt 3cm:

\begin{tikzpicture}
\node (example) [draw, align=left]{This is a demonstration text for showing how line breaking works.};
\end{tikzpicture}

\begin{tikzpicture}
\node (example) [draw]{\begin{varwidth}{3cm}This is a demonstration text for showing how line breaking works.\end{varwidth}};
\end{tikzpicture}

Bildbeschreibung hier eingeben


Nachtrag

Streng genommen liegt dieser Nachtrag außerhalb des Rahmens dieser Frage. Angesichts der beabsichtigten Natur dieser Frage, wie sie in den Kommentaren zur Frage angegeben ist, möchte ich jedoch hinzufügen, dass Sie jede der Listenumgebungen ( itemize, enumerate, und description) in einen Knoten einfügen können, indem Sie sie entweder in eine minipageoder varwidthUmgebung einbetten. Ich denke wiederum, dass die varwidthUmgebung aus den oben aufgezählten Gründen (kein Wortspiel beabsichtigt!) vorzuziehen ist.

\documentclass{article}

\usepackage{tikz}
\usepackage{varwidth}
\usepackage{enumitem}

\begin{document}

\begin{tikzpicture}
\node [draw] (example-list) {
\begin{varwidth}{3cm}
\begin{enumerate}[leftmargin=*]
\item{First item}
\item{Second item}
\end{enumerate}
\end{varwidth}
};
\end{tikzpicture}

\end{document}

Bildbeschreibung hier eingeben

Antwort2

Wenn Sie lediglich die Linie an Ihren Referenzpunkten unterteilen möchten, reicht es aus, den Knoten selbst in mehrere Linien zu unterteilen.

Beispielsweise aus dem Abschnitt 3.12 des TikZ-Handbuchs, dem folgenden Codeentwurf

\begin{tikzpicture}
  \draw (0,0) -- (3,0) 
  node [above,align=center,midway]
  {
    First line \\
    Second Line
  };
\end{tikzpicture}

unterbricht die Zeile, ohne dass weitere Pakete/Tools erforderlich sind.

HINWEIS: Diese Methode hat bei mir nicht funktioniert, wenn der Knoten allein ist; nur wenn er Teil einer Zeile ist. Es sind jedoch keine zusätzlichen Pakete erforderlich.

Die Skriptausgabe:

Ausgabe des TikZ-Skripts ohne zusätzliche Pakete

verwandte Informationen