分支 TikZ 图始终在同一侧

分支 TikZ 图始终在同一侧

我正在尝试绘制一个图形(实际上是自动生成 TikZ 代码),其主分支必须是直的;次要分支必须始终在左侧分支。除了只有一个节点的分支(参见节点17a),每层上必须只有一个节点。只要满足上述条件,分支的顺序并不重要。

MWE 显示了我的问题:即使手动,我也无法实现预期的结果。

我尝试了 、 的几种组合,grow=down无论是在声明分支边时在分支节点上,还是直接在分支边(即 在 上),或者在全局选项中,都没有结果(MWE 已经从那些不起作用的丑陋黑客中得到了完善)。唯一改变分支顺序的是交换线和,但这会导致一个非常丑陋的图表,所以如果答案考虑到这一点,我将非常感激(但即使是更简单的答案我也没问题)。grow'=downbranch left--graph17 -- 1817a -- 18

背景说明:

该图是通过 SAX 解析器生成的,并且只知道上一个和下一个节点(如果有)以及当前节点是否属于主分支。我知道一个节点是分支点还是连接点,所以我可以在weight=0分支边缘(或其他任何位置)上生成。

该图是非循环的(所有边实际上都指向下方,因此箭头是多余的,我只使用--,但只要没有箭头,我就可以打印'->',如果这让 TikZ 更开心的话)。

梅威瑟:

\documentclass[a5paper]{article}
\usepackage{tikz}
\usepackage[default]{sourcesanspro}
\usepackage[margin=1cm]{geometry}
\usetikzlibrary{graphdrawing,graphs,calc}
\usegdlibrary{layered}
\tikzset{linehead/.style={circle, fill=white, outer sep = 0pt, inner sep = 0pt, minimum size = 5pt, thick, draw=black}}
\tikzset{linestop/.style={circle, fill=black, outer sep = 0pt, inner sep = 0pt, minimum size = 4pt}}
\tikzset{variantgraphtxt/.style={near start, left, font=\scriptsize\bfseries}}

\begin{document}
\thispagestyle{empty}
\fontsize{8.25}{9}\selectfont
\begin{tikzpicture}
\graph[layered layout, level distance=\baselineskip, sibling distance=\baselineskip,
       edges={line width=1pt, rounded corners=0.3\baselineskip}, nodes={linestop}, empty nodes, branch left]
{
  % Main branch, must be vertical
  1[linehead] --  2,
  2  --  5,
  5  --  6,
  6  --  7,
  7  --  8,
  8  --  9,
  9  -- 10,
  10 -- 11,
  11 --[minimum layers=12] 23,
  23 -- 24,
  24 -- 25,
  25 -- 26,
  26 -- 27,
  27 -- 28,
  28 -- 29,
  29 -- 30,
  30 -- 31,
  31 -- 32,
  32 -- 33,
  33 -- 34,
  34 -- 35,
  35 -- 36,
  36 -- 37,
  37 -- 38,
  38 -- 39,
  39 -- 40,
  40 -- 41,
  41 -- 42,
  42 -- 43,
  43 -- 44,
  44 -- 45[linehead],
  % all the following branches must be on the left of the main one
  2  --[weight=0, edge node={node[variantgraphtxt] {C, D}}]  3,
  3  --  4,
  4  --  5,
  10 --[weight=0,minimum layers=2,edge node={node[variantgraphtxt] {B, D}}] 12,
  12 -- 13,
  13 -- 14,
  14 -- 15,
  15 -- 16,
  16 -- 17,
  17 -- 18,
  17a[linehead,edge node={node[variantgraphtxt, at start] {B2}}] -- 18, % B2 not showing up
  19 -- 20,
  18 -- 19,
  20 -- 21,
  21 -- 22,
  22 --[weight=0] 26,
  };
\node[text=red, align=center] (text) at ($(12) + (2, \baselineskip)$) {This branch\\should be\\on the other side!};
\draw[red, ->] (text) -- ($(12) + (0.1, \baselineskip)$);
\node[text=red, align=center] (text2) at ($(17a) + (1.7, 0)$) {This branch\\should extend\\on the left as well\\ and show B2!};
\draw[red, ->] (text2) -- ($(17a) + (0.2, 0)$);
\end{tikzpicture}
\end{document}

答案1

注意:我远非专家,因此无法做出解释,敬请谅解

我知道这个问题已经很久没有被问到了,但我今天没什么事,所以我想“为什么不学一点 Ti今天是 Z 吗?”。

据我从手册中了解到,这些图形的绘制是通过算法定位的,这些算法会考虑您传递给它们的选项(当然……呃)。所以当你传递时,weight=5你是说这个分支对图形的核心非常重要,所以它与核心的连接会更加紧密。同时,当你传递时,minimum layers=<num>它会在之后抛出节点<num>层,但这也意味着这个分支对核心的重要性较低,因此它会放松连接。我不明白的是,为什么在使用键时,minimum layers分支会被抛到右边而不是左边……

最后,您在问题中提到,17a -- 18从左侧获取分支只是交换位置,没错。关于标签B2,它只是在错误的位置上定义的。要将大分支移到左侧,您必须增加核心中节点的权重(而不是使用该minimum layer选项)。


问题:节点节点与使用时22对齐25minimum layersTiZ 会自动将分支推到右侧(无论在何处使用该选项)。如果有人可以解决这个问题或提供更好的答案,我很乐意删除它,因为它不完整。


\documentclass[border=10mm]{standalone}
\usepackage{tikz}
\usepackage[default]{sourcesanspro}
%\usepackage[margin=1cm]{geometry}
\usetikzlibrary{graphdrawing,graphs,calc}
\usegdlibrary{layered}
\tikzset{linehead/.style={circle, fill=white, outer sep = 0pt, inner sep = 0pt, minimum size = 5pt, thick, draw=black}}
\tikzset{linestop/.style={circle, fill=black, outer sep = 0pt, inner sep = 0pt, minimum size = 4pt}}
\tikzset{variantgraphtxt/.style={near start, left, font=\scriptsize\bfseries}}

\begin{document}
\thispagestyle{empty}
\fontsize{8.25}{9}\selectfont
\begin{tikzpicture}
\graph[layered layout, level distance=\baselineskip, sibling distance=\baselineskip, branch left=\baselineskip,
       edges={line width=1pt, rounded corners=0.3\baselineskip}, nodes={linestop}, empty nodes]
{
  % Main branch, must be vertical
  1[linehead] --  2,
  %First branch
    2  --[edge node={node[variantgraphtxt] {C, D}}]  3,
    3  --  4,
    4  --  5,
    %end
  2  --  5,
  5  --  6,
  6  --  7,
  7  --  8,
  8  --  9,
  9  -- 10,
%Second branch
    10 --[weight=0,minimum layers=2,edge node={node[variantgraphtxt] {B, D}}] 12,
    12 -- 13,
    13 -- 14,
    14 -- 15,
    15 -- 16,
    16 -- 17,
    % Sub branch
%       17a [linehead,edge node={node[variantgraphtxt, at start] {B2}}] -- 18, % B2 not showing up because of wrong definition
        17a [linehead] -- [edge node={node[variantgraphtxt, at start] {B2}}] 18, % << This works fine
        %end
    17 -- [weight=2] 18,
    19 -- 20,
    18 -- 19,
    20 -- 21,
    21 -- 22,
    22 -- 26,
    %end
  10 -- [weight=5] 11, % << using weight to make 10 closer to 11
  11 -- 23,            % << NOT using weight so 11 and 23 are distant
  23 -- [weight=5] 24, % << using weight to make 23 closer to 24
  24 -- [weight=5] 25, % << using weight to make 24 closer to 25
  25 -- [weight=5] 26, % << using weight to make 25 closer to 26
  26 -- 27,
  27 -- 28,
  28 -- 29,
  29 -- 30,
  30 -- 31,
  31 -- 32,
  32 -- 33,
  33 -- 34,
  34 -- 35,
  35 -- 36,
  36 -- 37,
  37 -- 38,
  38 -- 39,
  39 -- 40,
  40 -- 41,
  41 -- 42,
  42 -- 43,
  43 -- 44,
  44 -- 45[linehead],
  };
\end{tikzpicture}
\end{document}

相关内容