我想画出像这样的无根树:
我可以使用以下代码创建一个:
\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:
上面的代码没有任何问题,它生成了我想要的东西。唯一的问题是它很繁琐。例如,创建根树,有非常好的包如forest
、qtree
等,它们对制作这样的有根树有很大帮助。
答案1
两种可能性。如果精确布局不重要,你可以使用 Ti钾Z 的图形绘制功能(使用 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>
在绘制期间传递给键。最后一个用于在第二个示例中绘制红色键,通过传递red
TikZ 代码(注意:在 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
分组为一个公共分子,因此箭头相对于、和集中。c3
c4
c2
c1
c2
c5
\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
经验的人来说,学习难度可能更大。所以这可能不是一个好主意。算了。