TikZ 노드의 수동/자동 줄 바꿈 및 텍스트 정렬

TikZ 노드의 수동/자동 줄 바꿈 및 텍스트 정렬

TikZ 노드에 줄 바꿈을 어떻게 삽입할 수 있나요? 단순히 \\휴식을 원하는 위치에 두는 것은 효과가 없습니다(MWE 참조).

지정된 너비에서 자동으로 줄을 나누는 방법이 있습니까?

그리고 텍스트 정렬(왼쪽, 오른쪽, 가운데, 양쪽 맞춤)을 제어할 수 있나요?

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

답변1

문제는 에 따르면TikZ-PGF 매뉴얼그게

일반적으로 노드를 조판할 때 중괄호 안에 입력하는 모든 텍스트는 하나의 긴 줄( \hbox정확히 말하면 )에 배치되고 노드는 필요한 만큼 넓어집니다(§17.4.3).

이제 TikZ-PGF 매뉴얼에서는 원하는 경우 TikZ 노드 내부에서 줄바꿈을 달성하는 세 가지 방법을 설명합니다.

  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}

여기에 이미지 설명을 입력하세요

이 옵션의 장점은 노드의 너비가 두 번째 줄의 너비로 설정되는 첨부 이미지에서 볼 수 있듯이 노드의 크기가 노드 내부에서 가장 긴 줄의 너비로 자동 설정된다는 것입니다. 그러나 이 솔루션의 단점은 라인 끊김을 직접 제어해야 한다는 것입니다(자세한 내용은 아래 참조).

명령 의 선택적 인수를 통해 줄 간격을 제어할 수 있다는 점도 주목할 가치가 있습니다 \\.

\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 widthand를 사용하세요 \\(아마도 align).

마지막으로 TikZ-PGF 매뉴얼에 언급된 세 번째 옵션은 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.)

네 번째 옵션

네 번째, 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}

여기에 이미지 설명을 입력하세요

논의

전반적으로, 나는 네 번째 옵션이 가장 선호된다고 생각합니다. 왜냐하면 노드를 가능한 한 컴팩트하게 만들기 때문입니다(물론 그렇게 하지 않는 한).~ 아니다노드를 컴팩트하게 만들고 싶습니다).

그럼에도 불구하고 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} 

여기에 이미지 설명을 입력하세요

이미지에서는 처음 두 노드 사이에 차이가 없다는 것을 알 수 있지만 에서 제공하는 명령을 사용하면 ragged2e세 번째 노드에서 눈에 띄는 효과가 나타납니다.

네 번째 옵션에 대한 두 번째 단점은 실제로 줄 바꿈을 수동으로 제어하려는 경우에 발생합니다. 환경 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}

여기에 이미지 설명을 입력하세요

줄 바꿈을 수동으로 제어하려면 인수를 지정 하고 원하는 대로 '를 align삽입하는 두 번째 옵션을 제안합니다.\\

업데이트(@percusse의 의견에 따름):

줄 바꿈을 수동으로 제어하려는 경우 두 번째 옵션은 두 번째 옵션이 노드 내부에서 가장 긴 줄의 길이로 노드 너비를 설정하기 때문에 네 번째 옵션보다 두 번째 옵션이 더 좋습니다. 텍스트 줄 바꿈 및 하이픈 넣기가 적용되지 않습니다. 결과적으로 텍스트 줄 바꿈 및 하이픈 넣기가 적용되지 않기 때문에 두 번째 옵션에서는 '추악한' 출력이 없을 것이라고 생각합니다.

더욱이 이것이 바로 TikZ-PGF 매뉴얼에 언급된 세 가지 옵션 외에 네 번째 옵션을 포함시킨 이유입니다. 특정 너비로 ​​노드 내부에 텍스트 줄 바꿈을 적용하려는 경우노드의 크기를 가능한 한 작게 유지합니다., 그러면 환경을 사용하고 싶을 것입니다 varwidth. 다음 두 노드를 비교하십시오(하나 align는 다음 varwidth으로 설정됨 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}

여기에 이미지 설명을 입력하세요


부록

엄밀히 말하면, 이 부록은 문제의 범위를 벗어납니다. 그러나 질문에 대한 의견에 표시된 대로 이 질문의 의도된 특성을 고려하여 목록 환경( itemize, enumerate및 )을 노드 description내부에 삽입하여 노드 내부에 minipage넣을 수 있다는 점을 추가할 것이라고 생각했습니다. varwidth. 다시 한 번 말씀드리지만, varwidth위에 열거된 이유로 인해(말장난 의도는 아닙니다!) 환경이 더 바람직하다고 생각합니다 .

\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 스크립트 출력

관련 정보