如何确保 TikZ 立方体的边缘平行?

如何确保 TikZ 立方体的边缘平行?

我有时会使用 TikZ 排版交换立方体。这是我的代码。

\documentclass{article}

\usepackage{tikz}

\usetikzlibrary{matrix}

\tikzset
{
  over/.style={preaction={draw=white,-,line width=6pt}},
}

\begin{document}

\begin{tikzpicture}
  \matrix[matrix of math nodes,column sep={2.5em},row sep={2.5em},
    text height=1.5ex,text depth=.25ex]
  {
      |(e)|  X X X X & & |(0)|   X_0     \\
    & |(1)|  X_1     & & |(01)|  X_{01}  \\
      |(2)|  X_2     & & |(02)|  X_{02}  \\
    & |(12)| X_{12}  & & |(012)| X_{012} \\
  };

  \draw[->] (e)  to (2);
  \draw[->] (0)  to (02);
  \draw[->] (e)  to (0);
  \draw[->] (2)  to (02);

  \draw[->,over] (1)  to (12);
  \draw[->]      (01) to (012);
  \draw[->,over] (1)  to (01);
  \draw[->]      (12) to (012);

  \draw[->] (e)  to (1);
  \draw[->] (0)  to (01);
  \draw[->] (2)  to (12);
  \draw[->] (02) to (012);
\end{tikzpicture}

\end{document}

我经常遇到的问题是,如果其中一个节点比其他节点大,那么我的立方体就会有点扭曲。

cube0

我的临时解决方法是调整其中一列的宽度,例如将矩阵中的第一行更改为

|(e)|  X X X X & & |(0)|   X_0     &[1em] \\

那么结果就相当不错了:

立方体1

我尝试的另一件事是将column seprow sep选项更改为:

column sep={5em,between origins},row sep={5em,between origins}

但边缘仍然不太平行:

立方体2

我对第二张图片的外观非常满意,但这种方法有一个缺点,我必须猜测一个好的偏移值,这通常很麻烦。有没有办法让 TikZ 自己找出这个值?或者也许有更好的使用方法between origins或其他完全不同的东西?

答案1

这个选项between origins是正确的。问题是这个选项只在第一行被考虑,而且你指定了三列,而不是四列。效果可以放大:

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}
\tikzset
{
  over/.style={preaction={draw=white,-,line width=6pt}},
}

\begin{document}
\begin{tikzpicture}
  \matrix[matrix of math nodes,column sep={1.5em,between origins},row sep={1em,between origins},nodes={inner sep=0.2pt}]
  {
      |(e)|  X & & |(0)|   X  \\
    & |(1)|  X & & |(01)|  X  \\
      |(2)|  X & & |(02)|  X  \\
    & |(12)| X & & |(012)| X \\
  };

  \draw[->] (e)  to (2);
  \draw[->] (0)  to (02);
  \draw[->] (e)  to (0);
  \draw[->] (2)  to (02);

  \draw[->,over] (1)  to (12);
  \draw[->]      (01) to (012);
  \draw[->,over] (1)  to (01);
  \draw[->]      (12) to (012);

  \draw[->] (e)  to (1);
  \draw[->] (0)  to (01);
  \draw[->] (2)  to (12);
  \draw[->] (02) to (012);
\end{tikzpicture}

\end{document}

原来的

如果将四列添加到第一行:

  \matrix[matrix of math nodes,column sep={1.5em,between origins},row sep={1em,between origins},nodes={inner sep=0.2pt}]
  {
      |(e)|  X & & |(0)|   X & \\
    & |(1)|  X & & |(01)|  X  \\
      |(2)|  X & & |(02)|  X  \\
    & |(12)| X & & |(012)| X \\
  };

那么结果就是预期的结果:

在此处输入图片描述

答案2

您应该使用tikz-cd此类图表。如果您稍微调整一下索引,您可能会发现它在视觉上更令人愉悦。看看右侧,我把所有索引都打碎了,以便在左侧看起来更均匀。

% arara: pdflatex

\documentclass{article}
\usepackage{tikz-cd}
\usepackage{mathtools}

\begin{document}
\begin{tikzcd}[%
    ,column sep={5em,between origins}
    ,row sep={5em,between origins}
    ]
    XXXX \arrow{rr}\arrow{dd}\arrow{dr} & & X_{\mathrlap{0}} \arrow{dd}\arrow{dr} & \\
    & X_1 \arrow[crossing over]{rr} & & X_{\mathrlap{01}} \arrow{dd} \\
    X_2 \arrow{rr}\arrow{dr} & & X_{\mathrlap{02}} \arrow{dr} & \\
    & X_{12} \arrow{rr}\arrow[<-,crossing over]{uu} & & X_{\mathrlap{012}}
\end{tikzcd}
\end{document}

在此处输入图片描述

相关内容