我想制作一棵像这样的树:
它不需要完全相同,但我想翻译文本,所以我需要重建它,我还想添加一个节点,但这很容易。
我的第一次尝试:
\documentclass{standalone}
\usepackage{booktabs}
\usepackage{pgfplotstable}
\usepackage{graphicx}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{tikz}
\usepackage{tikz-qtree}
\begin{document}
\begin{tikzpicture}
\Tree
[.{Métodos de otimização}
[.{Métodos exatos}
[.{Branch-and-X}
[{Branch-and-bound} ]
[{Branch-and-cut} ]
[{Branch-and-price} ]
]
[{Programação de restrições} ]
[{Programação dinâmica} ]
[{A*, IDA*} ]
]
[.{Métodos aproximados}
[.{Algoritmos Heurísticos}
[.{Meta-heurísticas}
[{Meta-heurísticas baseadas em solução única} ]
[{Meta-heurísticas baseadasem população} ]
]
[{Heurísticas específicas do problema} ]
]
[{Algoritmos de aproximação} ]
]
]
\end{tikzpicture}
}
\end{document}
给我这棵丑陋的宽树:
第一个问题是我不知道如何在每个节点中换行。我试过了\\\\
,但没有任何效果;我应该为每行文本使用一个表格吗?
第二个问题是每个子树的子节点不会放在同一列上。这可以修复或破解吗?例如第四行上的“Metaheuristics”和第三行上的“A*, IDA*”,它们来自不同的子树,但位于同一列上。
还有其他想法吗?
答案1
- 要使用换行符,您可以使用
every tree node
键并使用center
对齐。
\tikzset{every tree node/.style={align=center}}
- 您可以缩短
sibling distance
以使其更紧凑。
\tikzset{sibling distance=6pt}
- 您还可以设置
level distance
\tikzset{level distance=60pt}
应用这些后,您将获得:
代码 1
\documentclass{standalone}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
%\usepackage{tikz}
\usepackage{tikz-qtree}
\tikzset{level distance=60pt,
sibling distance=6pt,
every tree node/.style={align=center},
}
\begin{document}
\begin{tikzpicture}
\Tree
[.{Métodos de otimização}
[.{Métodos exatos}
[.{Branch-and-X}
[{Branch-and-bound} ]
[{Branch-and-cut} ]
[{Branch-and-price} ]
]
[{Programação\\ de restrições} ]
[{Programação\\ dinâmica} ]
[{A*, IDA*} ]
]
[.{Métodos aproximados}
[.{Algoritmos Heurísticos}
[.{Meta-heurísticas}
[{Meta-heurísticas\\ baseadas em solução única} ]
[{Meta-heurísticas\\ baseadasem população} ]
]
[{Heurísticas específicas\\ do problema} ]
]
[{Algoritmos\\ de aproximação} ]
]
]
\end{tikzpicture}
\end{document}
但我不知道您是否在寻找以下内容。
代码 2
\documentclass{standalone}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
%\usepackage{tikz}
\usepackage{tikz-qtree}
\tikzset{level distance=60pt,
sibling distance=6pt,
every tree node/.style={align=center},
}
\begin{document}
\begin{tikzpicture}
\Tree
[.{Métodos de otimização}
[.{Métodos exatos}
[.{Branch-and-X}
[.{Branch-and-bound} ]
[.{Branch-and-cut} ]
[.{Branch-and-price} ]
]
[.{Programação\\ de restrições} ]
[.{Programação\\ dinâmica} ]
[.{A*, IDA*} ]
]
[.{Métodos aproximados}
[.{Algoritmos Heurísticos}
[.{Meta-heurísticas}
[.{Meta-heurísticas\\ baseadas em solução única} ]
[.{Meta-heurísticas\\ baseadasem população} ]
]
[.{Heurísticas específicas\\ do problema} ]
]
[.{Algoritmos\\ de aproximação} ]
]
]
\end{tikzpicture}
\end{document}
编辑
您还可以使用负距离缩短第一级兄弟距离,例如
\tikzset{level 1/.style={sibling distance=-100pt}}
您还可以通过这种方式调整每个级别兄弟之间的距离。
为了使您的树看起来像您发布的图片,您可以使用arrows
库来设置边缘的样式。(我不知道这样做是否是罪pgf
但无论如何它在这里。)将文本与图形一起缩放是世界上的罪过,但这似乎是 中的默认行为tikz-qtree
。我缩小到0.8
以便它适合肖像 A4 纸。这是另一个完整的代码。
代码 3
\documentclass[10pt]{article}
\usepackage{geometry}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
%\usepackage{tikz}
\usepackage{tikz-qtree}
\usetikzlibrary{arrows}
\tikzset{level distance=60pt,
sibling distance=0pt,
level 1/.style={sibling distance=-100pt},
level 2/.style={sibling distance=0pt},
level 3/.style={sibling distance=0pt},
execute at begin node=\strut,
every tree node/.style={align=center},
edge from parent/.append style={very thick,-stealth}
}
\begin{document}
\begin{tikzpicture}[scale=0.8]
\Tree
[.{Métodos de otimização}
[.{Métodos exatos}
[.{Branch-and-X}
[.{Branch-\\ and-\\ bound} ]
[.{Branch-\\ and-\\ cut} ]
[.{Branch-\\ and-\\ price} ]
]
[.{Programação\\ de restrições} ]
[.{Programação\\ dinâmica} ]
[.{A*, IDA*} ]
]
[.{Métodos\\ aproximados}
[.{Algoritmos\\ Heurísticos}
[.{Meta-heurísticas}
[.{Meta-heurísticas\\ baseadas em\\ solução única} ]
[.{Meta-heurísticas\\ baseadasem\\ população} ]
]
[.{Heurísticas\\ específicas\\ do problema} ]
]
[.{Algoritmos\\ de aproximação} ]
]
]
\end{tikzpicture}
\end{document}
答案2
正是因为树木繁茂,我才森林!
\documentclass{standalone}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{forest}
\begin{document}
\tikzset{>=latex}
\begin{forest} for tree={align=center,edge=->,}
[Métodos de otimização
[Métodos exatos
[Branch-and-X,for children={l+=2ex}
[Branch-\\and-bound]
[Branch-\\and-cut]
[Branch-\\and-price]
]
[Programação\\de restrições]
[Programação\\dinâmica]
[{A*, IDA*} ]
]
[Métodos aproximados
[Algoritmos\\Heurísticos
[Meta-heurísticas
[Meta-heurísticas\\baseadas em solução única]
[Meta-heurísticas\\baseadasem população]
]
[Heurísticas específicas\\ do problema]
]
[Algoritmos\\de aproximação]
]
]
\end{forest}
\end{document}
由于文本太多,因此需要提供一些帮助:
- 手动换行符:通过
align=center
;启用 l+
下推节点