如何让树的最后一个层级对齐到相同的高度?在此之前的每个层级都已对齐,但最后一个层级不同。
你能用这个代码吗?我 5 周前开始使用 TeX,这是我第一次在论坛上寻求帮助。
\documentclass[a5paper,pdftex,twoside,9pt,paper=21cm:14.85cm,openright]{scrartcl}
\usepackage[ngerman]{babel}
\usepackage[latin1]{inputenc}
\usepackage{tikz}
\usetikzlibrary{arrows,positioning,automata,shadows,fit,shapes}
\usepackage{tikz-qtree}
\begin{document}
\begin{center}
\resizebox{1\textwidth}{!}{%
\begin{tikzpicture}[every tree node/.style={align=center,anchor=north}]
\Tree [.\textbf{Gießverfahren}
[.{Schwerkraftgießen}
[.{Verlorene\\Formen}
[.{verlorene\\Modelle} \textit{Feingießen}\\\textit{Vollformgießem} ]
[.{Dauermodelle} \textit{Sandgießen}\\\textit{Maskenformgießen} ]]
[.Dauerformen \textit{Kokillengießen}\\\textit{Stranggießen}\\\textit{Schleudergießen} ] ]
[.{\textbf{Gießen unter Druck}}
[.{Verlorene\\Formen} \textit{Niederdruck-Sandgießen} ]
[.\textbf{Dauerformen} \textbf{Druckgießen}\\\textit{Niederdruckgießen}\\\textit{Gegendruckgießen}\\\textit{Sonderverfahren} ] ] ]
\end{tikzpicture}}
\end{center}
\end{document}
答案1
frontier
是应用于每个叶节点的样式。假设“最后一个层次”指的是这些节点,即没有子节点的终端节点,您可以设置此样式来自定义它们的外观和位置。
要对齐这些节点,您需要指定与根的绝对距离。(因此这需要比森林但允许您使用当前代码进行少量更改。)
例如:
\documentclass[tikz,border=10pt]{standalone}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage{tikz-qtree}
\begin{document}
\begin{tikzpicture}
[
every tree node/.style={align=center,anchor=north},
frontier/.style={distance from root=130pt}
]
\Tree
[.\textbf{Gießverfahren}
[.{Schwerkraftgießen}
[.{Verlorene\\Formen}
[.{verlorene\\Modelle} \textit{Feingießen}\\\textit{Vollformgießem} ]
[.{Dauermodelle} \textit{Sandgießen}\\\textit{Maskenformgießen} ]
]
[.Dauerformen \textit{Kokillengießen}\\\textit{Stranggießen}\\\textit{Schleudergießen} ]
]
[.{\textbf{Gießen unter Druck}}
[.{Verlorene\\Formen} \textit{Niederdruck-Sandgießen} ]
[.\textbf{Dauerformen} \textbf{Druckgießen}\\\textit{Niederdruckgießen}\\\textit{Gegendruckgießen}\\\textit{Sonderverfahren} ]
]
]
\end{tikzpicture}
\end{document}
我们可以做类似的事情,但更灵活,森林通过适应Alenanno 的解决方案:
for tree={
parent anchor=south,
child anchor=north,
这确保了子节点的边缘从同一点开始,因为这不是森林的默认点,并且被绘制到这些子节点的顶部中心。
align=center,
与以下操作相同tikz-qtree。
如果需要的话,最好确保所有级别的节点都默认对齐,而不是依赖于它碰巧以这种方式出现。我们可以使用以下代码来实现这一点:
tier/.wrap pgfmath arg={tier #1}{level()},% align the nodes on all levels
我们需要为终端节点重写此设置,因为我们希望它们对齐,尽管它们处于不同的级别。因此,对于叶节点,我们将其设置tier=word
为 Alenanno 的解决方案,但无需记住将其添加到每个节点:
if n children=0{% for the leaf nodes
tier=word,% override the default tier setting because these are at different levels of the tree but we want them still aligned
当我们在这里时,我们不妨将它们设置为斜体字体并覆盖异常,而不是将它们全部设置为直立,然后除了一种情况外,在其他所有情况下都覆盖它:
font=\itshape,% make these nodes italic by default and we'll override this for the single exception
}{}
}
介绍森林及其括号语法,请参阅第二部分我对先前问题的回答。
森林代码:
\documentclass[tikz,border=10pt]{standalone}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage{forest}
\begin{document}
\begin{forest}
for tree={
parent anchor=south,
child anchor=north,
align=center,
tier/.wrap pgfmath arg={tier #1}{level()},% align the nodes on all levels
if n children=0{% for the leaf nodes
tier=word,% override the default tier setting because these are at different levels of the tree but we want them still aligned
font=\itshape,% make these nodes italic by default and we'll override this for the single exception
}{}
}
[\textbf{Gieverfahren}
[Schwerkraftgieen
[Verlorene Formen
[verlorene\\Modelle
[Feingieen\\Vollformgieen
]
]
[Dauermodelle
[Sandgieen\\Maskenformgieen
]
]
]
[Dauerformen
[Kokillengieen\\Stranggieen\\Schleudergieen
]
]
]
[\textbf{Gieen unter Druck}
[Verlorene Formen
[Niederdruck-Sandgieen
]
]
[\textbf{Dauerformen}
[\textbf{\upshape Druckgieen}\\Niederdruckgieen\\Gegendruckgieen\\Sonderverfahren
]
]
]
]
\end{forest}
\end{document}
请注意,如果在节点内添加\itshape
,则需要在每个换行符后添加,就像在tikz-qtree否则只有第一行会设置为斜体。
答案2
我建议使用该forest
包。它有一个选项tier=word
,您可以将其添加到所有要对齐的节点。
我已经替换了一些其他的小细节,请随时要求解释。
输出
代码
\documentclass[a5paper,pdftex,twoside,9pt,paper=21cm:14.85cm,openright]{scrartcl}
\usepackage[ngerman]{babel}
\usepackage{tikz}
\usepackage{forest}
\forestset{
.style={
for tree={
base=bottom,
parent anchor=south,
child anchor=north,
align=center,
s sep=.9mm,
draw=none,
if n children=0{tier=word, font=\itshape}{}
}
}
}
\begin{document}
\begin{figure}[!h]
\centering
\resizebox{\textwidth}{!}{
\begin{forest}
[ \textbf{Gieverfahren}
[ Schwerkraftgieen
[ Verlorene Formen
[ verlorene\\Modelle
[Feingieen\\Vollformgieen] ]
[ Dauermodelle
[Sandgieen\\Maskenformgieen]] ]
[ Dauerformen
[Kokillengieen\\Stranggieen\\Schleudergieen] ] ]
[ \textbf{Gieen unter Druck}
[ Verlorene Formen
[Niederdruck-Sandgieen] ]
[ \textbf{Dauerformen}
[\textbf{Druckgieen}\\Niederdruckgieen\\Gegendruckgieen\\Sonderverfahren] ] ] ]
\end{forest}}
\end{figure}
\end{document}
答案3
也可以插入缺失的级别:
\documentclass[a5paper,twoside,fontsize=9pt,open=any]{scrartcl}
\usepackage[ngerman]{babel}
\usepackage{selinput}
\SelectInputMappings{adieresis={ä},germandbls={ß}}
\usepackage{tikz-qtree}
\begin{document}
\begin{center}
\resizebox{1\textwidth}{!}{%
\begin{tikzpicture}[every tree node/.style={align=center,anchor=north}]
\Tree [.\textbf{Gießverfahren}
[.{Schwerkraftgießen}
[.{Verlorene\\Formen}
[.{verlorene\\Modelle} \textit{Feingießen}\\\textit{Vollformgießem} ]
[.{Dauermodelle} \textit{Sandgießen}\\\textit{Maskenformgießen} ]]
[.Dauerformen
[
[.\textit{Kokillengießen}\\\textit{Stranggießen}\\\textit{Schleudergießen} ] ] ] ]
[.{\textbf{Gießen unter Druck}}
[.{Verlorene\\Formen}
[
[.\textit{Niederdruck-Sandgießen} ] ] ]
[.\textbf{Dauerformen}
[
[.\textbf{Druckgießen}\\\textit{Niederdruckgießen}\\\textit{Gegendruckgießen}\\\textit{Sonderverfahren} ] ] ] ] ]
\end{tikzpicture}}
\end{center}
\end{document}