Tikz : Графики : Смещение подслоев/уровней по горизонтали и вертикали в древовидной структуре?

Tikz : Графики : Смещение подслоев/уровней по горизонтали и вертикали в древовидной структуре?

Это немного отличается от списка каталогов, представленного наTeXampleиРисование списка каталогов по принципу команды tree в TikZв том, что я хотел бы аннотировать окончательную структуру, показывающую связи между файлами. Мне нужны какие-то средства для ссылки на узлы в дереве, и следующее, похоже, мои варианты

  1. Используйте tabbingсреду для создания древовидной структуры, используя tikzmarkаннотацию узлов.
  2. Используйте библиотеки graphsили treesв tikzpictureсреде.
  3. Используйте пакеты dirtreeи forestв некоторой комбинации с предыдущими настройками (1 или 2).

Метод1дал мне желаемый вывод, но аннотации становились все запутанными, если дерево распространялось на более чем одну страницу, использование multicolsи minipageне улучшило это. В настоящее время я рассматриваю метод2и если это не удастся, попробую3.

Я надеялся, что подслои в следующем дереве, нарисованные с использованием TikZ graphdrawings' tree layout,

Текущая раскладка

могут быть вложены между своими родителями, как во втором макете с использованием библиотеки TikZ treesиLoop Space's dirtreeключ,

Предпочтительная раскладка

, а не симметрично разбросаны веером вокруг них.

Мое предположение, возможно ошибочное, состояло в том, что библиотека рисования графов позволит манипулировать подграфами в предпочтительную позицию. Однако интерфейс для graphsи graphdrawingкажется довольно сегрегированным в отличие от других библиотек TikZ. Примеры, с которыми я столкнулся, следующие

  • Ключ triesвосстанавливает часть макета правильно, но ломается при использовании подграфов.
  • Настройка grow down sepзадает правильную структуру, но я не вижу, как ее еще больше настроить, и она игнорируется для макетов подграфов.
  • Использование tree layoutдопускает подграфы, но не дает особого контроля над их размещением.

Код ниже создает первое изображение. В нем я указываю значение сдвига для первого подслоя, которое смещает следующий подслой, как и ожидалось, но не его узел, плавающий прямоугольник в правом верхнем углу. Попытка предоставить фантомные значения также терпит неудачу, как видно по сбившимся стрелкам в самом нижнем слое.

\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}

Я бы также хотел использовать |-спецификацию линии, но, похоже, не могу установить ее в /tikz/graphs/edgesключе. Я понимаю, что края рисуются to[...]командами, а не командами --/ |-/ -|. Фактически я хотел бы "понижать" механизм рисования to[...]с |-.Стиль разветвления вниз с графом дерева Tikz 3.0задает аналогичный вопрос. topathБиблиотека, раздел 70 в версии 3.0.1a pgfmanual, позволяет использовать прямую линию, как в , to[line]но не упоминает об локтях.

В настоящее время я пробую использовать оба варианта treesодновременно graph: первый — для макета, а второй — для аннотаций.

Я думаю, что главный вопрос на самом деле заключается в том, «как контролировать размещение подграфов, не подталкивая их». Возможно ли это на самом деле? Чтение руководства заставляет поверить в это, но я не смог найти хорошего примера того, как это сделать, и я довольно тщательно просмотрел разделы , layered layoutи tree layout, graphdrawingкак мне показалось.

Связанный контент