Tikz: Gráficos: Desloca as subcamadas/níveis horizontalmente e verticalmente em um layout de árvore?

Tikz: Gráficos: Desloca as subcamadas/níveis horizontalmente e verticalmente em um layout de árvore?

Isso difere um pouco da listagem de diretórios emTeXampleeDesenhando um diretório listando o comando tree no TikZnisso gostaria de anotar a estrutura final mostrando links entre os arquivos. Preciso de algum meio de me referir aos nós da árvore e as seguintes parecem ser minhas opções

  1. Use um tabbingambiente para fazer o layout da estrutura em árvore aproveitando tikzmarkpara anotar os nós.
  2. Use a graphsou as treesbibliotecas em um tikzpictureambiente.
  3. Use os pacotes dirtreee forestem alguma combinação com as configurações anteriores (1 ou 2).

Método1me deu a saída desejada, mas as anotações ficaram confusas se a árvore se estendesse por mais de uma página, usando multicolse minipagenão melhorasse isso. Atualmente estou considerando o método2e se isso falhar vou tentar3.

Minha esperança era que as subcamadas na árvore a seguir, desenhadas usando TikZ graphdrawings' tree layout,

Layout atual

poderiam ser aninhados entre seus pais, como no segundo layout usando a biblioteca TikZ treeseEspaço de Loop dirtreechave,

Layout preferido

, e não espalhados simetricamente em leque sobre eles.

Minha suposição, provavelmente errada, era que a biblioteca de desenho gráfico permitiria manipular os subgráficos para a posição preferida. No entanto, a interface para graphse graphdrawingparece ser bastante segregada, ao contrário de outras bibliotecas TikZ. Os exemplos que encontrei são os seguintes

  • A trieschave corrige parte do layout, mas quebra se usar subgráficos.
  • A configuração grow down sepfornece a estrutura correta, mas não consigo ver como ajustá-la ainda mais e ela é ignorada nos layouts de subgráficos.
  • O uso tree layoutpermite subgráficos, mas não tem muito controle sobre seu posicionamento.

O código abaixo produz a primeira imagem. Dentro dele, especifico um valor de deslocamento para a primeira subcamada que compensa a próxima subcamada conforme esperado, mas não seu nó, o retângulo flutuante no canto superior direito. Tentar fornecer valores fantasmas também falha, conforme visto pelas setas erradas na camada mais baixa.

\documentclass[tikz]{standalone}%
\usepackage{tikz}%
%
\usepackage{luatex85}%
\usepackage{menukeys}%
\usetikzlibrary{graphs}%
\usetikzlibrary{graphdrawing}%
\usegdlibrary{trees}%
\usegdlibrary{layered}%
\usegdlibrary{circular}%
%
\makeatletter
\newcount\dirtree@lvl
\newcount\dirtree@plvl
\newcount\dirtree@clvl
\def\dirtree@growth{%
  \ifnum\tikznumberofcurrentchild=1\relax
  \global\advance\dirtree@plvl by 1
  \expandafter\xdef\csname dirtree@p@\the\dirtree@plvl\endcsname{\the\dirtree@lvl}
  \fi
  \global\advance\dirtree@lvl by 1\relax
  \dirtree@clvl=\dirtree@lvl
  \advance\dirtree@clvl by -\csname dirtree@p@\the\dirtree@plvl\endcsname
  \pgf@xa=\tikzleveldistance
  \pgf@ya=-\tikzsiblingdistance
  \pgf@ya=\dirtree@clvl\pgf@ya
  \pgftransformshift{\pgfqpoint{\the\pgf@xa}{\the\pgf@ya}}%
  \ifnum\tikznumberofcurrentchild=\tikznumberofchildren
  \global\advance\dirtree@plvl by -1
  \fi
}
%
\tikzset{
  dirtree/.style={
    growth function=\dirtree@growth,
    level distance =1.2em,
    sibling distance =1.2em,
    growth parent anchor=west,
%     every node/.style={anchor=west},
%     every parent node/.style={anchor=south west},
    every child node/.style={anchor=west},
    edge from parent path={(\tikzparentnode.south west) ++(0.5*\tikzleveldistance,0) |- (\tikzchildnode\tikzchildanchor)}
  }
}
\makeatother
%
\newmenumacro{\nixpath}[/]{hyphenatepathswithfolder}
\newmenumacro{\nixfile}[/]{hyphenatepaths}
\newmenumacro{\winpath}[bslash]{hyphenatepathswithfolder}
\newmenumacro{\winfile}[bslash]{hyphenatepaths}
%
\begin{document}%
\normalsize%
\begin{tikzpicture}%
\graph [tree layout, grow'=right]
 {"00"/"\winpath{E:\CheatSheets\Algorithms}" -> 
  {"01"/"\winpath{Genetic}";
   "02"/"\winpath{Linear_Programming}" -> 
   {"03"/"\winpath{build}";
    "04"/"\winfile{Affine_Scaling.pseudo.tex}"};
   "05"/"\winpath{build}";
   "06"/"\winfile{Algorithms.tex}";
   "07"/"\winfile{Genetic.tex}";
   "08"/"\winfile{input.tex}";
   "09"/"\winfile{input2.tex}";
   "10"/"\winfile{input3.tex}"}};%
\end{tikzpicture}%
\begin{tikzpicture}%
\node (00) {\winpath{E:\CheatSheets\Algorithms}}[dirtree]
 child {node (01) {\winpath{Genetic}}}
 child {node (02) {\winpath{Linear_Programming}}
 child {node (03) {\winpath{build}}}
  child {node (04) {\winfile{Affine_Scaling.pseudo.tex}}}}
 child {node (05) {\winpath{build}}}
 child {node (06) {\winfile{Algorithms.tex}}}
 child {node (07) {\winfile{Genetic.tex}}}
 child {node (08) {\winfile{input.tex}}}
 child {node (09) {\winfile{input2.tex}}}
 child {node (10) {\winfile{input3.tex}}} ;%
\graph [use existing nodes]
{06      ->[in=0, out=0, looseness=3] {04     }};%
\end{tikzpicture}%
\end{document}

Eu também gostaria de usar a |-especificação de linha, mas não consigo definir isso dentro da /tikz/graphs/edgeschave. Meu entendimento é que as bordas são desenhadas com to[...]comandos versus comandos --// |-. -|Efetivamente, eu gostaria de "rebaixar" o mecanismo de desenho de to[...]para |-.Estilo de borda descendente com gráfico de árvore Tikz 3.0faz uma pergunta semelhante. A topathbiblioteca, seção 70 na versão 3.0.1a do pgfmanual, permite usar uma linha reta como em, to[line]mas não faz menção aos cotovelos.

No momento estou tentando os dois treesjuntos graph, o primeiro fazendo o layout e o segundo as anotações.

Acho que a questão principal é realmente "como controlar o posicionamento dos subgráficos, além de empurrá-los". Isso é realmente possível? A leitura do manual leva alguém a acreditar que sim, mas não consegui encontrar um bom exemplo de como fazer isso e examinei as seções layered layout, tree layoute graphdrawingcom bastante atenção.

informação relacionada