
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 노드 내부에서 줄바꿈을 달성하는 세 가지 방법을 설명합니다.
- 노드 내부에 다중 라인 환경을 사용하십시오.
줄 바꿈을 강제로 수행하거나 줄 바꿈 환경을 생성하여 노드 내부에서 줄 바꿈을 달성하는 노드 내부의 환경을 사용할 수 있습니다. 매뉴얼의 예에서는 다음 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}
\\
및 을 사용합니다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}
text width
and를 사용하세요\\
(아마도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을 참조하세요 .left
flush left
right
flush right
center
flush center
justify
none
align
text 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
것과 동일한 작업을 효과적으로 수행하므로 아마도 . 따라서 노드에 오른쪽 정렬 여백을 두고 를 통해 지정하는 경우 와 가령 . 사이에 눈에 띄는 차이가 없습니다 . 하지만 이 문제는 다음을 사용하여 극복할 수 있습니다.align
varwidth
align
align=right
align=left
ragged2e
패키지. 노드의 여백이 오른쪽으로 정렬되기를 원하지만 가능한 한 간결해지기를 원하는 경우(그리고 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}
추가 패키지/도구가 필요하지 않습니다.
참고: 이 방법은 노드가 단독으로 있을 때 작동하지 않았습니다. 라인의 일부일 때만. 하지만 추가 패키지는 필요하지 않습니다.
스크립트 출력: