绘制无根树

绘制无根树

我想画出像这样的无根树:

在此处输入图片描述

我可以使用以下代码创建一个:

\documentclass{article}
\usepackage{tikz}


\begin{document}

\begin{tikzpicture}
\node at (0,3) {$T_1$};
\draw (-2,0) -- node[above] {$B_1$} (0,0);
\draw (0,0) -- node[above] {$B_2$} (2,0);
\draw (-2,0) -- (-3.5,1.5) node[above] {A};
\draw (-2,0) -- (-3.5,-1.5) node[below] {B};
\draw (0,0) -- (0,1.5) node[above] {C};
\draw (2,0) -- (3.5,1.5) node[above] {D};
\draw (2,0) -- (3.5,-1.5) node[below] {E};
\end{tikzpicture}

\end{document}

这将创建:

在此处输入图片描述

有没有更好的方法来构建这种无根树?

编辑1:

上面的代码没有任何问题,它生成了我想要的东西。唯一的问题是它很繁琐。例如,创建树,有非常好的包如forestqtree等,它们对制作这样的有根树有很大帮助。

编辑2: 下面是另一个示例: 在此处输入图片描述

答案1

两种可能性。如果精确布局不重要,你可以使用 TiZ 的图形绘制功能(使用 LuaTeX)。您可以使用各种库来使结果看起来更漂亮和/或使它们符合各种要求,但示例应该能让您了解语法。

如果精确的布局(而不仅仅是结构)很重要,那么也许使用matrix of nodes

\RequirePackage{luatex85}
\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{graphs,graphdrawing,matrix}
\begin{document}
\begin{tikzpicture}
  \graph [grow right]
  {
    {A,B} -- x/""[coordinate] -- y/""[coordinate] -- { C , z/""[coordinate] -- {D,E}  }
  };
\end{tikzpicture}
\begin{tikzpicture}
  \matrix (m) [matrix of nodes, column sep=5mm, row sep=5mm, nodes in empty cells]
  {
    A & & C & & D\\
     & & & & \\
    B & & & & E \\
  };
  \draw (m-1-1) -- (m-2-2.center) edge (m-3-1) -- (m-2-3.center) edge (m-1-3) -- (m-2-4.center) edge (m-1-5) -- (m-3-5);
\end{tikzpicture}
\end{document}

可能性

答案2

这是一个不太可能的候选者,但我认为在这种情况下使用 的chemfig宏来绘制图形/无根树可能是合适的。(这对您来说是否更有效率是另一个问题:p)——请参阅最后的免责声明。

在我的解释中,我将把这些线称为键(如化学键),只是为了使解释与符号兼容\chemfig,以防你想阅读包装文档了解更多信息。

使用的关键宏的解释:

  • -[::45]意味着在相对的45 度角。
  • -[1]是缩写形式,-[:45]意思是在绝对45度角。-[2]是 的缩写-[:90],依此类推,直到-[7]是 的缩写-[:315]。注意-[7]也与 相同-[-1]
  • 绘制键的(并非真正)完整语法是:-[<angle>,<length>,,,<tikz code>],其中我省略了两个中间可选输入。<angle>上面讨论了,<length>是键长乘以的乘法常数,并<tikz code>在绘制期间传递给键。最后一个用于在第二个示例中绘制红色键,通过传递redTikZ 代码(注意:在 4 个逗号之后)。
  • @{<node>}是命名节点的语法,以便您以后可以引用它。我在这里将它用作\namebond宏,定义为在键的中间放置标签。您将在快速演示中看到它的用法。
  • \definesubmol{a}{(-[5]2)(-[3]1)}将产生这样的结果:

亚摩尔

这是用宏生成的\chemfig{!{a}}。请注意,感叹号用于调用名称定义的子分子a

这里的要点是使用子分子定义树中的每个“分支”,并将它们附加到主结构上\chemfig,确保使用-[1]等宏来绘制键。当您必须绘制扩展方案时,这将特别有用,就像在第二种情况下一样。

快速演示

考虑以下代码:

\documentclass[]{article}
\usepackage{chemfig}

\newcommand\namebond[4][5pt]{\chemmove{\path(#2)--(#3)node[midway,sloped,yshift=#1]{#4};}} % From chemfig documentation: Adds label midway above bond

\begin{document}
    \schemedebug{true} % Just to show bounding boxes etc. Set to false, or remove in the main document!
    \schemestart
    \definesubmol{test}{B-[1]@{a}(-[3]A)-@{b}(-[2]C)-@{c}(-[1]D)-[-1]E}
    \Chemabove[1.5em]{\chemfig{!{test}}}{T_1} % Label T_1 above, if required
    \namebond{a}{b}{\chemfig{B_1}} % Labelling B_1 above bond
    \namebond{b}{c}{\chemfig{B_2}} % Labelling B_2 above bond
    \schemestop
\end{document}

快速演示

您会发现这与您给出的第一个示例相对应。与使用 TikZ direct(使用命令等)进行绘图相比,这似乎没有太大改进\node,但绘图是在没有指定实际坐标的情况下完成的。您只需要熟悉角度命令,即-[::90]-[4]

分子的实际主干仅用一条线(线definesubmol)绘制,这比用节点绘制更紧凑。其他一切都只是标记。


第二个示例(附方案)

现在来看第二个例子。它可能看起来很复杂,但你可以一步一步地画出来(就像我一样):

  • 首先定义一个子分子,例如\definesubmol{b}{(-[5]3)(-[7]4)}(这是 3-4 叉)
  • 用 画出来\chemfig{!b}
  • 定义另一个亚分子,例如\definesubmol{a}{(-[5]2)(-[3]1)}(这是 1-2 叉)
  • 将其添加到现有\chemfig命令中,如下所示:\chemfig{!b-[2]-[4]!a-}并查看输出(尝试添加键,熟悉角度符号)
  • 等等..

我最后要提到的一点是使用,它允许将和(参见输出中边界框的标签)\subscheme分组为一个公共分子,因此箭头相对于、和集中。c3c4c2c1c2c5

\documentclass[]{article}
\usepackage{chemfig}

\newcommand\namebond[4][5pt]{\chemmove{\path(#2)--(#3)node[midway,sloped,yshift=#1]{#4};}} % From documentation: Adds label midway above bond

\begin{document}
    \schemedebug{true} % Just to show bounding boxes etc. Set to false, or remove in the main document!
    \definesubmol{a}{(-[5]2)(-[3]1)} % The 1-2 fork
    \definesubmol{b}{(-[5]3)(-[7]4)} % The 3-4 fork
    \definesubmol{c}{(-[::45]5)(-[::-45]6)} % The 5-6 fork
    \definesubmol{d}{(-[::45,,,,red]\textcolor{red}{8})(-[::-45,,,,red]\textcolor{red}{7})} % The 7-8 fork
    \definesubmol{e}{(-[::45,,,,red]\textcolor{red}{9})(-[::-45,,,,red]\textcolor{red}{10})} % The 9-10 fork

    \schemestart
    \chemfig{!b-[2]-[4]!a--(-[2]!c)-[,0.5]% Black half
        -[,0.5,,,red](-[6,,,,red]!d)-[,,,,red]!e}% Red half
    \arrow(@c1--)[-90]% Note the c1 label in the bounding box of the first graph/tree
    \subscheme{%
        \chemfig{!b-[2]@{x}-[4]@{y}!a--!c} % Black half (c3)
        \namebond{x}{y}{\color{red}$\downarrow$} % Adds the red arrow
        \arrow[,0.4,draw=none] % Add spacing between the c3 and c4
        \chemfig[,,,,red]{[:90]-(-[::40]!e)(-[::-40]!d)} % Red half (c4)
    }
    \arrow(@c2--)[-90]
    \chemfig{!a-[,0.8]% 1-2 block
        ([:90,,,,red]-(-[::40,,,,red]!e)(-[::-40,,,,red]!d))-% red chunk
        (-[6,0.8]!b)(-!c)% 3-4 and 5-6 block
    }
    \schemestop
\end{document}

最终的

免责声明

打完这些之后,我意识到它不像@cfr的代码那么短。:x对于没有chemfig经验的人来说,学习难度可能更大。所以这可能不是一个好主意。算了。

相关内容