在 tikz 中对齐边缘

在 tikz 中对齐边缘

我用 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}

相关内容