TikZ ノードでの手動/自動の改行とテキストの配置

TikZ ノードでの手動/自動の改行とテキストの配置

TikZ ノードに改行を挿入するにはどうすればよいでしょうか?\\改行したい場所に置くだけでは機能しません (MWE を参照)。

指定した幅で自動的に行を折り返す方法はありますか?

また、テキストの配置(左、右、中央、両端揃え)を制御できますか?

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

答え1

問題は、TikZ-PGF マニュアルそれは

通常、ノードがタイプセットされるとき、中括弧で囲んだすべてのテキストが 1 つの長い行 (\hbox正確には ) に配置され、ノードは必要なだけ広くなります (§17.4.3)。

現在、TikZ-PGF マニュアルでは、必要に応じて TikZ ノード内で改行を実行する 3 つの方法について説明しています。

  1. ノード内で複数行の環境を使用します。

ノード内で改行を強制する環境を使用したり、ノード内で改行を実現するために改行環境を作成したりすることができます。マニュアルの例では、次のtabular環境が使用されています。

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

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

  1. \\および を使用しますalign

手動で改行を挿入したい場合は、\\とオプションの引数を使用できますalign。( のオプションを指定しないとalign、改行は行われず、OP が指摘した問題が発生します。)

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

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

このオプションの利点は、ノードのサイズがノード内の最長の行の幅に自動的に設定されることです。添付の​​画像では、ノードの幅が 2 番目の行の幅に設定されています。ただし、このソリューションの欠点は、行の分割を手動で制御する必要があることです (詳細は後述)。

コマンドのオプション引数を使用して行間隔を制御できることも注目に値します\\

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

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

ただし、\\グループ内にネストすることはできないので注意してください。たとえば、次の例ではない仕事。

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

代わりに、次の操作を行う必要があります。

\begin{tikzpicture}
\node (example-align) [draw, align=left]{\textbf{example}\\\textbf{example example}};
\end{tikzpicture}
  1. text widthおよび\\(場合によってはalignも)を使用してください。

最後に、TikZ-PGF マニュアルに記載されている 3 番目のオプションは、text width引数を使用することです。これは、内部的に環境を作成するものだと思いますminipage。このソリューションでは、ノードの幅を手動で設定し、手動の改行と組み合わせて使用​​できます。

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

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

さらに、デフォルトの幅が で指定された幅よりも大きい長いテキスト ブロックで使用することもできますtext width。このような場合、テキストは指定された幅のボックス内で自動的に折り返されます。

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

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

引数は、引数text widthと組み合わせて使用​​して、さまざまな効果を生み出すこともできます。alignのオプションは、、、、、、、、、およびalignです。 引数と組み合わせたこれらのオプションのさまざまな効果の詳細については、§17.4.3 を参照してください。leftflush leftrightflush rightcenterflush centerjustifynonealigntext width

ただし、簡単に言うと、これらのflushバリアントはハイフネーションによって左右の境界のバランスを取ろうとはしません。私の意見では、結果は見栄えがよくないことが多いですが (画像を参照)、何らかの理由でハイフネーションを避けたい場合は使用できます。

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

(上の図の上のノードは を使用しalign=left、下のノードは を使用しますalign=flush left。)

4番目の選択肢

4つ目は、TikZ-PGFマニュアルでは説明されていないが、推奨されるオプションだと思うが、varwidthパッケージ。このパッケージは基本的にminipage環境を作成しますが、環境の水平サイズをその中の最も広いものに自動的に設定します。上記では、text widthオプションによってノードが必要以上に大きくなっていることに気付くでしょう。たとえば、すぐ下に再現した画像では、右余白に余分なスペースがあることがわかります。

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

しかし、パッケージを使用するとvarwidth、この余分なスペースはなくなり、両方とも 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}

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

議論

全体的に、4番目のオプションが最も好ましいと思います。これは、ノードを可能な限りコンパクトにするためです(もちろん、ないノードをコンパクトにしたい場合)。

それでも、4 番目のオプションには少なくとも 2 つの欠点があり、TikZ ノード内で複数行テキストを実装する方法を決定する前に考慮する必要があると考えられます。ただし、このオプションの最初の欠点には回避策があると思います。

最初の欠点は次のとおりです。@percusse がコメントで指摘したように、パッケージはノードに対して行うのvarwidthと同じことを実質的に行うため、の可能なオプション間の目に見える違いは実質的に無意味になります。したがって、ノードに右揃えの余白を持たせたい場合、 でそれを指定しても、 と、たとえば の間に目に見える違いはありません。ただし、 を使用することでこれを克服できます。alignvarwidthalignalign=rightalign=leftragged2eパッケージ。ノードに右揃えの余白を持たせたいが、できるだけコンパクトにしたい場合(そしてtext width「推測と確認」の方法で設定を手動で操作する時間をかけたくない場合):

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

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

画像では、最初の 2 つのノードに違いはありませんが、 で使用可能なコマンドを使用すると、ragged2e3 番目のノードに目に見える効果が生成されます。

4 番目のオプションの 2 番目の欠点は、実際に手動で改行を制御したい場合に発生します。環境はvarwidth依然としてハイフネーションによって行のバランスを取ろうとしますが、私の意見では、これは見苦しい結果につながる可能性があります。

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

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

改行を手動で制御したい場合は、引数を指定して、必要に応じて 'salignを挿入する2 番目のオプションをお勧めします。\\

更新(@percusse のコメントによる):

改行を手動で制御したい場合は、2 番目のオプションが 4 番目のオプションよりも適しています。2 番目のオプションでは、ノードの幅がノード内の最長行の長さに設定されるからです。テキストの折り返しやハイフネーションは強制されません。結果として、テキストの折り返しやハイフネーションが強制されないため、2 番目のオプションでは「見苦しい」出力は発生しないというのが私の意見です。

さらに、これがTikZ-PGFマニュアルに記載されている3つのオプションに加えて4番目のオプションを追加した理由です。特定の幅のノード内でテキストの折り返しを強制したい場合は、ノードのサイズを可能な限りコンパクトにするの場合、 環境を使用する必要があります。 がに設定されているノードと がに設定されているノードのvarwidth次の 2 つのノードを比較します。alignvarwidth3cm

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

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


補遺

厳密に言えば、この補足は質問の範囲外です。しかし、質問のコメントに示されているように、この質問の意図する性質を考慮して、リスト環境 ( itemizeenumerate、 ) のいずれかをまたは環境descriptionのいずれかに埋め込むことで、ノード内に置くことができることを付け加えておきたいと思います。繰り返しになりますが、上に列挙した理由 (しゃれではありません!) により、環境の方が好ましいと思います。minipagevarwidthvarwidth

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

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

答え2

参照ポイントでラインを分割するだけの場合は、ノード自体を複数のラインに分割するだけで十分です。

例えば、TikZマニュアルのセクション3.12から、以下のコード草稿

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

追加のパッケージやツールを必要とせずに行を分割します。

注: この方法は、ノードが単独の場合には機能しませんでした。ノードがラインの一部である場合のみ機能します。ただし、追加のパッケージは必要ありません。

スクリプトの出力:

追加パッケージなしのTikZスクリプトの出力

関連情報