
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 (
\hbox
genauer 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.
- 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 tabular
Umgebung:
\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}
- Verwenden Sie
\\
undalign
.
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}
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}
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}
- Verwenden Sie
text width
und\\
(und vielleichtalign
auch ).
Schließlich besteht die dritte im TikZ-PGF-Handbuch erwähnte Option darin, das text width
Argument zu verwenden, das meines Erachtens intern eine minipage
Umgebung 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}
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}
Das text width
Argument kann auch in Verbindung mit dem Argument verwendet werden, align
um verschiedene Effekte zu erzielen. Die Optionen für align
sind left
, flush left
, right
, flush right
, center
, , flush center
, justify
, und none
. Einzelheiten zu den verschiedenen Effekten dieser align
Optionen in Verbindung mit dem text width
Argument finden Sie in §17.4.3.
Kurz gesagt, die flush
Varianten 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.
(Der obere Knoten im Bild direkt darüber verwendet align=left
und 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 desvarwidth
Paket. Dieses Paket erstellt im Wesentlichen eine minipage
Umgebung, stellt die horizontale Größe der Umgebung jedoch automatisch auf das breiteste Objekt darin ein. Oben werden Sie feststellen, dass die text width
Option 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:
Wenn wir jedoch das varwidth
Paket 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}
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, varwidth
macht das Paket im Grunde dasselbe wie das, was align
mit dem Knoten gemacht wird, was vermutlich dazu führt, varwidth
dass 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 denragged2e
Paket. 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}
Im Bild ist zu erkennen, dass zwischen den ersten beiden Knoten kein Unterschied besteht, die Verwendung der von zur Verfügung gestellten Befehle jedoch ragged2e
einen sichtbaren Effekt im dritten Knoten erzeugt.
Der zweite Nachteil der vierten Option entsteht, wenn Sie den Zeilenumbruch wirklich manuell steuern möchten. Die varwidth
Umgebung 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}
Wenn Sie den Zeilenumbruch manuell steuern möchten, empfehle ich die zweite Option. Geben Sie dabei das align
Argument 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 varwidth
Umgebung verwenden. Vergleichen Sie die folgenden beiden Knoten, einen mit align
und einen mit varwidth
auf 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}
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 minipage
oder varwidth
Umgebung einbetten. Ich denke wiederum, dass die varwidth
Umgebung 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}
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: