使用 tikz-qtree 的文本树太宽,不知道如何换行并使树紧凑

使用 tikz-qtree 的文本树太宽,不知道如何换行并使树紧凑

我想制作一棵像这样的树:

原始树

它不需要完全相同,但我想翻译文本,所以我需要重建它,我还想添加一个节点,但这很容易。

我的第一次尝试:

\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+下推节点

相关内容