似乎仅仅加载graphdrawing
库就会搞乱使用标准 TikZ 语法绘制树。有没有办法避免这种不良影响?
例如:
\documentclass[tikz,border=10pt]{standalone}
\usetikzlibrary{arrows.meta}
\tikzset{
my tree/.style={
->,
nodes={draw, circle, minimum size = .5cm},
>=Stealth[],
},
}
\begin{document}
\tikz [ my tree ]
\node {$\land$}
child {
node {$\lnot$}
child {
node {$a$}
}
}
child {
node {$\rightarrow$}
child {
node {$b$}
}
child {
node {$c$}
}
};
\end{document}
产生以下预期结果:
然而
\documentclass[tikz,border=10pt]{standalone}
\usetikzlibrary{arrows.meta,graphdrawing}
\tikzset{
my tree/.style={
->,
nodes={draw, circle, minimum size = .5cm},
>=Stealth[],
},
}
\begin{document}
\tikz [ my tree ]
\node {$\land$}
child {
node {$\lnot$}
child {
node {$a$}
}
}
child {
node {$\rightarrow$}
child {
node {$b$}
}
child {
node {$c$}
}
};
\end{document}
导致节点重叠和树过于紧凑:
有没有办法将效果限制在graphdrawing
实际上是图形的图片上?
该问题是由以下代码行引起的tikzlibrarygraphdrawing.code.tex
:
\tikzset{level distance=1cm, sibling distance=1cm}
如果我注释掉这行代码,那么树就会按预期呈现。这行代码的注释解释了它包含的内容:
% Patch the level and sibling distances so that gd and plain tikz are
% in sync
但是为什么该graphdrawing
库坚持要求普通的 TikZ 必须与其同步?如果这很重要,那么该库肯定应该自行配置为使用标准 TikZ 默认级别和兄弟距离,而不是将其值强加在标准 TikZ 树上?无论如何,“同步”它们的动机究竟是什么?
这看起来太过分了:图书馆故意地干扰普通 TikZ 的默认设置,导致使用常规语法的树变形。这是图形绘制库的某种暗中营销活动吗?我破解了你的代码,然后为你提供了这个很棒的解决方案,解决了你遇到的那些令人讨厌的树问题,而这些问题恰好需要切换到我新改进的语法?!希望有一个不那么阴险的解释……?
我怀疑这一定是重复的,但我找不到它。
答案1
我想我找到答案了。(然后我看到了你的编辑。)
在 1322-1323 行中tikz.code.tex
,有
\tikzleveldistance=15mm \tikzsiblingdistance=15mm
然而在tikzlibrarygraphdrawing.code.tex
第 18-20 行,有
% Patch the level and sibling distances so that gd and plain tikz are % in sync \tikzset{level distance=1cm, sibling distance=1cm}
到目前为止,这些是我发现的唯一冲突。
你之前这么说
该库故意干扰普通 TikZ 的默认设置
这可能是真的,因为graphdrawing
这个库似乎不是由 Till Tantau 编写的。然而,它似乎也在 2011 年被移交给了 Till Tantau。
然而,在tikz.code.tex
第 937-938 行中,
\tikzoption{node distance}{\def\tikz@node@distance{#1}} \def\tikz@node@distance{1cm}
现在你看到了悖论
- 钛钾Z
1cm
用于\node(b1)[above=of a1]{fooy};
。 - 钛钾Z 用于
1.5cm
语法child
。 graphdrawing
不幸的是,库实现了一些算法,其能力是上述两个算法的超集。(分层布局。)因此它统一了长度参数。
毕竟,我并不惊讶这些.default
s 和.initial
s 有一天会互相争斗。最后,手册不断提到level distance
(69 场比赛) 和sibling distance
(41 场比赛)。我的理解是作者希望我们自己设置参数。