这是我第一次使用 Tikz,并尝试制作这个图表,但是......这有点难。
1.关于定位:
我正在使用相对定位,我认为这不是一个好主意(看橙色线),但我不知道如何做得更好。例如:
%Group 1
\node[cuadrado] (g1_1) {$y_m$};
\node[circulo] (g1_2) [left of=g1_1] {$y_m$};
\node[circulo] (g1_3) [right of=g1_1] {$\neg y_m$};
\node[cuadrado] (g1_4) [above left of=g1_2] {$y_m$};
...
也许使用工作表内的绝对位置?
另一方面,边缘元素(文本)在右侧的位置不正确(查看绿色圆圈)。是否可以使它们看起来像镜子(与左侧相比)?
2. 关于节点尺寸
是否可以保持节点的固定尺寸?当我在节点内有大量文本时,我不知道如何解决它。例如,在大图的右侧:
3. 关于一般提示
你们觉得有没有更简单的方法来画这个图?正如我所说,我对 Tikz 不是很熟悉。我认为最好的选择是将大图分成两部分(左侧和右侧),但我不知道将整个图放在一张纸上是否“容易”(这将是理想的情况)。
问题太多,抱歉。
欢迎提供提示、建议和链接来帮助我!提前致谢。
答案1
恭喜您第一次尝试使用如此复杂的图表的 TikZ!
- 除了使用相对位置,您还可以使用 TikZ
matrix
。这看起来并不容易,但实际上却很容易。矩阵就像一个tabular
,您可以使用 引用每个单元格matrixname-rownumber-columnnumber
。例如,在下面的代码中,m-3-2
是矩阵 的第 3 行和第 2 列的节点m
。
至于对称箭头,您可以使用标签节点位置。始终参阅下面的示例。 - 要使节点具有相同的尺寸,您可以使用
minimum width
、text width
、text height
、来设置它们text depth
。我使用椭圆形作为带有大文本的圆圈。再次参见下面的示例。 - 我认为你会发现范达克教授的文章很有帮助。阅读第 2 部分这里对于 Tikz 矩阵和第 3 节这里对于 TikZ 来说一般如此。
当然,这个例子并不完整,但我认为你会在这里找到一些有用的提示:
\documentclass[border=1cm]{standalone}
\usepackage{amsmath}
\usepackage{tikz}
\usetikzlibrary{matrix}
\usetikzlibrary{arrows.meta, bending}
\tikzset{
mymatr/.style = {
matrix of math nodes,
row sep=30pt,
column sep=10pt,
nodes={cuadrado}
},
base/.style = {
draw,
very thick,
text=black,
text centered,
text height=13pt,
text depth=7pt,
},
cuadrado/.style = {
blue,
fill=blue!10!white,
base,
minimum width=30pt,
},
circulo/.style = {
cyan,
fill=cyan!10!white,
circle,
base,
text width=20pt,
inner sep=1pt,
},
oval/.style = {
red,
fill=red!10!white,
rounded corners=14,
base,
minimum width=30pt,
inner sep=4pt,
},
}
\begin{document}
\begin{tikzpicture}[>=Stealth]
\matrix[mymatr] (m) {
&& x^1_1 &[-16pt]&[-16pt] \neg x^1_1 &&&[30pt]\\[20pt]
x_1 && x^k_1 && \neg x^k_1 && \neg x_1 \\
& |[circulo]|x_1 && x_1 && |[circulo]|\neg x_1 \\
x_1 &&&&&& \neg x_1 \\[-40pt]
&& x^1_m && \neg x^1_m &&&|[oval]|c_1\vee\neg x_n\vee y_1\\[20pt]
x_n && x^k_m && \neg x^k_m && \neg x_n \\
& |[circulo]|x_n && x_n && |[circulo]|\neg x_n \\
x_n &&&&&& \neg x_n \\
};
\draw[->] (m-3-2) -- node[right=4pt] {$1$} (m-4-1);
\draw[->] (m-3-2) -- node[below left] {$n-1$} (m-2-1);
\draw[->] (m-3-2) to[bend left] node[above=30pt,left=-8pt] {$1$} (m-1-3);
\draw[->] (m-3-2) -- node[left=4pt] {$1$} (m-2-3);
\draw[->] (m-3-2) -- node[below] {$k+1$} (m-3-4);
\draw[->] (m-3-6) -- node[left=4pt] {$1$} (m-4-7);
\draw[->] (m-3-6) -- node[below right] {$n-1$} (m-2-7);
\draw[->] (m-3-6) to[bend right] node[above=30pt,right=-8pt] {$1$} (m-1-5);
\draw[->] (m-3-6) -- node[right=4pt] {$1$} (m-2-5);
\draw[->] (m-3-6) -- node[below] {$k+1$} (m-3-4);
\draw[->] (m-7-2) -- node[right=4pt] {$1$} (m-8-1);
\draw[->] (m-7-2) -- node[below left] {$n-1$} (m-6-1);
\draw[->] (m-7-2) to[bend left] node[above=30pt,left=-8pt] {$1$} (m-5-3);
\draw[->] (m-7-2) -- node[left=4pt] {$1$} (m-6-3);
\draw[->] (m-7-2) -- node[below] {$k+1$} (m-7-4);
\draw[->] (m-7-6) -- node[left=4pt] {$1$} (m-8-7);
\draw[->] (m-7-6) -- node[below right] {$n-1$} (m-6-7);
\draw[->] (m-7-6) to[bend right] node[above=30pt,right=-8pt] {$1$} (m-5-5);
\draw[->] (m-7-6) -- node[right=4pt] {$1$} (m-6-5);
\draw[->] (m-7-6) -- node[below] {$k+1$} (m-7-4);
\draw[->] (m-5-8) to[in=50, out=90] node[right=6pt] {$2M-2$} (m-1-3.70);
\end{tikzpicture}
\end{document}