编辑

编辑

Tree diagram 我想了解如何向边和顶点添加标签,以及如何创建不可见的顶点,以便边可以从中开始或结束,但顶点本身不可见。我只对这种类型的上升树感兴趣,但我找不到任何类似的问题或有关它的任何具体文档。如果可能的话,我宁愿了解如何改进我的(糟糕的)代码,而不是完全改变它。

代码:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{graphs}
\begin{document}
\begin{tikzpicture}
\graph [chain shift=(45:1), branch left, nodes={inner sep=0pt, minimum size=2.5pt, circle, fill, draw}, empty nodes]
{a -- b -- {c,d,e -- {f,g}}
};
\end{tikzpicture}
\end{document}

任何帮助,将不胜感激。

答案1

弄清楚如何使用图形语法实际上只是阅读手册的相关部分和/或查看示例的问题。如果它是一棵树,我会使用 Forest,因为无论如何你都不会使用自动布局算法。但是,这里有一个基于您的代码的示例,它使用库quotes来标记边和label顶点的标准选项。coordinate用于覆盖您为单个节点考虑的默认节点键,以便不绘制它。

\documentclass[border=10pt,multi,tikz]{standalone}
\usetikzlibrary{graphs,quotes}
\begin{document}
\begin{tikzpicture}
  \graph [chain shift=(45:1), branch left, nodes={inner sep=0pt, minimum size=2.5pt, circle, fill, draw}, empty nodes, every edge quotes/.append style={font=\scriptsize, inner sep=0pt}]
  {%
    a -- ["$a$"'] b[shape=coordinate] -- {c[label=0:$w$, >"$c$"'],d[label=0:$v$],e[label=180:$u$, >"$b$"] -- {f,g}}
  };
\end{tikzpicture}
\end{document}

tree in graph syntax

编辑

请注意,节点的放置方式取决于所使用的放置策略。chain shift将节点转移到新的级别。45:1表示节点放置在与当前节点成 45 度角且距离为 1 的位置。branch left表示分支始终向左。

你可以

  1. 手动放置节点(您精确指定放置每个节点的位置);
  2. 使用在线放置策略,就像您尝试过的策略一样(您指定一个考虑迄今为止的图表但不考虑尚未出现的图表的策略);
  3. 使用离线放置策略,这需要 LuaTeX 支持的高级功能(您指定一个考虑整个图的策略)。

坚持当前的策略类型,您可以例如将其更改为grow up, branch left

a different strategy

请注意,图表的指定方式相同 - 只有指定的策略之一(针对新级别的节点而不是新分支要做什么)会发生变化。

\begin{tikzpicture}
  \graph [grow up, branch left, nodes={inner sep=0pt, minimum size=2.5pt, circle, fill, draw}, empty nodes, every edge quotes/.append style={font=\scriptsize, inner sep=0pt}]
  {%
    a -- ["$a$"'] b[shape=coordinate] -- {c[label=0:$w$, >"$c$"'],d[label=0:$v$],e[label=180:$u$, >"$b$"] -- {f,g}}
  };
\end{tikzpicture}

如果你想要更多类似的东西:

tree layout

那么您可能需要考虑将graphdrawing算法库与trees图形绘制库一起使用。这是一种离线布局策略,需要使用 LuaTeX 进行编译。

\documentclass[border=10pt,multi,tikz]{standalone}
\usepackage{luatex85}
\usetikzlibrary{graphs,quotes,graphdrawing}
\usegdlibrary{trees}
\begin{document}
\begin{tikzpicture}
  \graph [tree layout, grow=up, nodes={inner sep=0pt, minimum size=2.5pt, circle, fill, draw}, empty nodes, every edge quotes/.append style={font=\scriptsize, inner sep=0pt}]
  {%
    a -- ["$a$"'] b -- {c[label=0:$w$, >"$c$"'],d[label=0:$v$],e[label=180:$u$, >"$b$"] -- {f,g}}
  };
\end{tikzpicture}
\end{document}

如果出于某种原因无法使用 LuaTeX,那么您可以尝试 Forest 之类的东西。(正如我上面提到的,Forest 可以轻松做到这一点。它可能是绘制树的最强大和最灵活的软件包,尽管它显然不支持 LuaTeX 算法支持的其他类型的图形。)

答案2

出于好玩,我用堆栈实现了这个功能。但我不建议将其用于一般用途。

\documentclass{article}
\usepackage{stackengine,graphicx}
\newcommand\undertheline[5][1in]{\raisebox{.5\baselineskip}{%
  \rotatebox{#2}{\smash{\stackon[\dimexpr-5pt#3.9\baselineskip]{\rule{#1}{.5pt}}{%
    \rotatebox{-\numexpr#2}{$#4$}}\ifx\relax#5\relax\else\,\raisebox{-.15\baselineskip}{%
      \llap{\rotatebox[origin=right]{-\numexpr#2}{$#5\,\,\,$}}$\bullet$}\fi%
}}}}
\begin{document}
\savestack{\levelA}{\makebox[-.5\baselineskip]{%
  \undertheline{135}{+}{c}{}\llap{$v\,$}$\bullet$\undertheline{45}{-}{f}{}}}
\stackengine{0pt}{\levelA}{\undertheline{135}{+}{b}{}%
  \stackengine{3pt}{$\bullet$\smash{\brlap[8pt]{\,$r$}}}{%
    \undertheline[.5in]{90}{+}{a}{}}{U}{c}{F}{T}{S}%
  \stackengine{-43pt}{\undertheline{45}{+}{c}{}}{%
    \,\undertheline[1.5in]{20}{-}{d}{w}}{U}{l}{F}{T}{S}}
  {U}{l}{F}{F}{S}
\end{document}

enter image description here

为了正确理解所提供的宏,调用\undertheline[1.5in]{55}{+}{X}{Z}将产生以下结果:

enter image description here

可选参数#1是线长度,#2是旋转角度,#3定义标签是从(+)逆时针方向还是从(-)顺时针方向,#4是线标签,#5如果存在,则是可选项目符号的标签。

相关内容