我在 Tikz 中有一个简单的图表。问题是,当我在节点外添加标签时,它会以某种方式移动图表的其他部分。例如,在下面的示例中,G
由于标签而被推向左侧O
。
有什么方法可以告诉 Tikz 不考虑标签占用的空间并绘制图形,就好像根本没有标签一样?我尝试使用\mathllap{}
。它有点帮助,但即使是空标签也会影响图表。
谢谢
工作示例
\documentclass[a5paper]{article}
\usepackage{tikz, mathtools}
\usetikzlibrary{
arrows.meta,
graphs,
matrix,
positioning,
}
\tikzset{
o/.style={
draw, circle, minimum width=5mm, minimum height=5mm, thick,
fill=black,
},
u/.style={
draw, circle, minimum width=5mm, minimum height=5mm, thick,
fill=white
},
m/.style={
draw, circle, minimum width=5mm, minimum height=5mm, thick,
fill=black!30,
},
}
\begin{document}
{%
\centering
\begin{tikzpicture}
\matrix (v) [
matrix of math nodes,
column sep=2.5mm,
row sep=12mm,
] {
|[u,label=above:{G}]| && |[u,label=above:{A}]| & \\
& |[m,label=left:{\mathllap{O}}]| && |[o,label=right:{C}]| \\
&& |[o,label=below:\hat{O}]| & \\
};
\graph[edges={>=Latex, semithick, color=black}] {
(v-1-1) -> (v-2-2);
(v-1-3) -> {(v-2-2), (v-2-4)};
(v-2-2) -> (v-3-3);
(v-2-4) -> (v-3-3);
};
\end{tikzpicture}\par}
\end{document}
答案1
xscale
我建议采用不同的方法。手动设置坐标并通过设置和调整间距yscale
。为了缩短代码,每个节点的坐标可以放在一个列表中,其中每个条目的形式为x/y/s/l/t
,其中坐标为(x,y)
,样式为s
,标签为,l
标签相对于节点的角度为t
。节点会自动编号,因此可以在第二个循环中绘制箭头。完整代码如下。
\documentclass{article}
\usepackage{tikz}
\tikzset{
o/.style={
draw, circle, minimum width=5mm, minimum height=5mm, thick,
fill=black,
},
u/.style={
draw, circle, minimum width=5mm, minimum height=5mm, thick,
fill=white
},
m/.style={
draw, circle, minimum width=5mm, minimum height=5mm, thick,
fill=black!30,
},
}
\begin{document}
\begin{tikzpicture}[xscale=.75,yscale=1.5]
\foreach \x/\y/\s/\l/\t[count=\n] in {-2/2/u/G/90,0/2/u/A/90,-1/1/m/O/180,1/1/o/C/0,0/0/o/\hat{O}/270}
\node[\s,label=\t:{$\l$}] (n\n) at (\x,\y){};
\foreach \a/\b in {1/3,2/3,2/4,3/5,4/5} \draw[semithick, -latex](n\a)--(n\b);
\end{tikzpicture}
\end{document}