我用 tikz 制作了一个图表,如下所示,经过一番折腾,我终于能够正确对齐所有节点。我说“折腾”是因为我发现文档无法浏览,所以我只能随机尝试命令和语法。但我无法解决的一个问题是如何对齐边缘在图中:
我希望右侧的边缘连接$\overline{1}$
到 和$\overline{H}$
,并且$\overline{H}$
表达式$\overline{G}$
和$=H/N$
突出$=G/N$
到侧面。这是我目前的代码:
\documentclass{report}
\usepackage[dutch]{babel}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\node at (1.0,4.5) [] (A1) {$G$};
\node at (2.5,4.5) [right] (B1) {$\overline{G}=G/N$};
\node at (1.0,3.0) [] (A2) {$H$};
\node at (2.5,3.0) [right] (B2) {$\overline{H}=H/N$};
\node at (1.0,1.5) [] (A3) {$N$};
\node at (2.5,1.5) [right] (B3) {$\overline{1}$};
\node at (1.0,0.0) [] (A4) {$1$};
\path[-stealth] (A1) edge node[above] {$\pi$} (B1)
edge[-] (A2)
(A2) edge node[above] {} (B2)
edge[-] (A3)
(A3) edge node[above] {} (B3)
edge[-] (A4)
(B1) edge[-] (B2)
(B2) edge[-] (B3);
\end{tikzpicture}
\end{document}
答案1
快速解决方案:
加载 mathtools 包\usepackage{mathtools}
并使用\rlap
让方程的右侧部分不计入节点的边界框:
\node at (2.5,4.5) [right] (B1) {$\overline{G}\mathrlap{{}=G/N}$};
\node at (2.5,3.0) [right] (B2) {$\overline{H}\mathrlap{{}=H/N}$};
但是,这有一些缺点。$\overline{1}$
和\overline{H}
的宽度不一样,所以边缘不会完全垂直。 为了解决这个问题,你可以将所有节点的文本宽度设置为相同的值[text width=1em,align=center]
:
\documentclass{report}
\usepackage{tikz}
\usepackage{mathtools}
\begin{document}
\begin{tikzpicture}
\tikzset{symbol/.style={text width=1em,align=center}}
\node at (1.0,4.5) [symbol] (A1) {$G$};
\node at (2.5,4.5) [symbol,right] (B1) {$\overline{G}\mathrlap{{}=G/N}$};
\node at (1.0,3.0) [symbol] (A2) {$H$};
\node at (2.5,3.0) [symbol,right] (B2) {$\overline{H}\mathrlap{{}=H/N}$};
\node at (1.0,1.5) [symbol] (A3) {$N$};
\node at (2.5,1.5) [symbol,right] (B3) {$\overline{1}$};
\node at (1.0,0.0) [symbol] (A4) {$1$};
\path[-stealth] (A1) edge node[above] {$\pi$} (B1)
edge[-] (A2)
(A2) edge node[above] {} (B2)
edge[-] (A3)
(A3) edge node[above] {} (B3)
edge[-] (A4)
(B1) edge[-] (B2)
(B2) edge[-] (B3);
\end{tikzpicture}
\end{document}
答案2
我总是使用matrix of math nodes
这样的图表(有些人更喜欢錄音包)。这样,您可以将图表中的对象放置在矩阵/数组中,然后随意添加箭头。
对于你的图表我写了类型:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}[looseness=.5,auto]
\matrix (M)[matrix of math nodes,row sep=1cm,column sep=16mm]{
G & \overline{G}=G/N\\
H & \overline{H}=H/N\\
N & \overline{1}\\
1\\
};
\draw[->] (M-1-1)--node{$\pi$}(M-1-2);
\foreach \x [evaluate=\x as \xx using int(\x+1)] in {1,2} {
\draw(M-\x-1)--(M-\xx-1);
\draw(M-\x-2)--(M-\xx-2);
}
\draw[->](M-2-1)--(M-2-2);
\draw[->](M-3-1)--(M-3-2);
\draw[->](M-3-1)--(M-4-1);
\end{tikzpicture}
\end{document}
生成结果:
如果你已经熟悉蒂克兹那么这基本上是不言自明的。最有趣的一点是,(M)
后面的\matrix
表示tikz
可以使用来引用矩阵中的节点M-<row>-<col>
。您可以将其更改(M)
为任何您喜欢的内容。
编辑
我个人喜欢上图中的对齐方式,但我承认这并不符合每个人的口味。通过添加一些样式,可以移动图表右侧的线条。矩阵内部节点的样式可以通过将其放入矩阵内部来实现|[<style>]|
- 即,通过为[<style>]
用于矩阵条目(然后括在 中|...|
)的隐式节点命令提供一个可选参数。使用样式,我们可以使节点左对齐且足够宽。之后,我们可以调整右侧的垂直线以产生:
修改后的代码如下:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}[looseness=.5,auto,
leftnodes/.style={text width=3em, align=left}]
\matrix (M)[matrix of math nodes,row sep=1cm,column sep=16mm]{
G & |[leftnodes]|\overline{G}=G/N\\
H & |[leftnodes]|\overline{H}=H/N\\
N & |[leftnodes]|\overline{1}\\
1\\
};
\draw[->] (M-1-1)--node{$\pi$}(M-1-2);
\draw(M-1-1)--(M-2-1);
\draw([xshift=2mm]M-1-2.south west)--([xshift=2mm]M-2-2.north west);
\draw(M-2-1)--(M-3-1);
\draw([xshift=2mm]M-2-2.south west)--([xshift=2mm]M-3-2.north west);
\draw[->](M-2-1)--(M-2-2);
\draw[->](M-3-1)--(M-3-2);
\draw[->](M-3-1)--(M-4-1);
\end{tikzpicture}
\end{document}
A简单得多这样做的方法是简单地将方程式的“有问题”部分放在里面\rlap{$...$}
,这实际上是告诉 LaTeX 排版它们,但不要改变光标。通过这个小小的改变,代码变成了:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}[looseness=.5,auto]
\matrix (M)[matrix of math nodes,row sep=1cm,column sep=16mm]{
G & \overline{G}\rlap{$=G/N$}\\
H & \overline{H}\rlap{$=H/N$}\\
N & \overline{1}\\
1\\
};
\draw[->] (M-1-1)--node{$\pi$}(M-1-2);
\foreach \x [evaluate=\x as \xx using int(\x+1)] in {1,2} {
\draw(M-\x-1)--(M-\xx-1);
\draw(M-\x-2)--(M-\xx-2);
}
\draw[->](M-2-1)--(M-2-2);
\draw[->](M-3-1)--(M-3-2);
\draw[->](M-3-1)--(M-4-1);
\end{tikzpicture}
\end{document}
输出与上面第二张图相同。
答案3
我觉得这是一个典型的tikz-cd
用例,因此,我建议如下:
\documentclass{report}
\usepackage[dutch]{babel}
\usepackage{tikz-cd}
\begin{document}
\[
\begin{tikzcd}
G \arrow[r,"\pi"]\arrow[dash,d] & \overline{G}=G/N \arrow[dash,d] \\
H \arrow[r] \arrow[dash,d] & \overline{H}=H/N \arrow[dash,d] \\
N \arrow[r] \arrow[dash,d] & \overline{1} \\
1
\end{tikzcd}
\]
\end{document}
如果你仍然喜欢左对齐(当然我不喜欢,但这是你的问题),你可以像这样使用 tikzcd:
\[
\begin{tikzcd}
G \arrow[r,"\pi"]\arrow[dash,d] & \arrow[dash,d] \mathrlap{\overline{G}=G/N} \\
H \arrow[r] \arrow[dash,d] & \arrow[dash,d] \mathrlap{\overline{H}=H/N} \\
N \arrow[r] \arrow[dash,d] & \mathrlap{\overline{1}} \\
1
\end{tikzcd}
\]
答案4
您可以使用xshift
来移动连接线的端点:
([xshift=-18pt]B1.south) edge[-] ([xshift=-19pt]B2.north)
([xshift=-19pt]B2.south) edge[-] (B3)
另一种选择是将节点分成两部分(以下代码基于positioning
库以避免写入精确的坐标):
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}[node distance=1.5cm] % standard distance between nodes
\node (A1) {$G$};
\node [right of=A1] (B1) {$\overline{G}$};
\node [right=0.25cm of B1] (C1) {$= G/N$}; % second part of B1
\node [below of=A1] (A2) {$H$};
\node [below of=B1] (B2) {$\overline{H}$};
\node [right=0.25cm] (C2) {$= H/N$}; % second part of B2
\node [below of=A2] (A3) {$N$};
\node [below of=B2] (B3) {$\overline{1}$};
\node [below of=A3] (A4) {$1$};
\path[-stealth] (A1) edge node [above] {$\pi$} (B1)
edge[-] (A2)
(A2) edge (B2)
edge[-] (A3)
(A3) edge (B3)
edge[-] (A4)
(B1) edge[-] (B2)
(B2) edge[-] (B3);
\end{tikzpicture}
\end{document}