为交换图的一部分创建宏

为交换图的一部分创建宏

我正在使用 tikz-cd 绘制交换图。它们中的大多数只是精确的三角形,它们被写成一个序列, a -> b -> c -> a[1] 或者其中两个或三个作为行,用 4 个单独的命名箭头连接。我认为如果可以将它们写成

\start{something}
\ExactTriangle{a, b, c} \\
\ExactTriangle{a, b, c} \\
\ExactTriangle{a, b, c} \\
\Morphism{1, 2}{x, y, z} 
\Morphism{2, 3}{x', y', z'}
\end{something}

代替

\[
\begin{tikzcd} 
    a \arrow[r] \arrow[d, "x"] & b \arrow[r] \arrow[d, "y"] & c \arrow[r] \arrow[d, "z"] & a[1] \arrow[d, "x{[1]}"] \\
    a \arrow[r] \arrow[d, "x'"] & b \arrow[r] \arrow[d, "y'"] & c \arrow[r] \arrow[d, "z'"] & a[1] \arrow[d, "x'{[1]}"] \\
    a \arrow[r] & b \arrow[r]  & c \arrow[r] & a[1]  \\
\end{tikzcd}
\]

并得到如下结果: 在此处输入图片描述 与阅读和写下所有这些相比,这将提高它们的可读性和创建/修复速度\arrow。但我读到的大多数类似问题的答案都是建议使用包装到某些命令中的 tikz-cd 环境,而我隐约觉得在 tikz 环境中没有办法定义这样的自定义命令。所以问题是:是否可以使用 tikz-cd 做这样的事情,是否有其他一些包允许做这样的事情,或者是否有一种方法可以与这种潜在的方法相比具有可读性和灵活性。

答案1

我认为使用 TiZ 和\pics 您可以获得与示例中足够接近的代码。

像这样:

\documentclass[tikz,border=2mm]{standalone}

\tikzset
{%
  pics/ExactTriangle/.style n args={3}{
      code={%
        \node[inner sep=1pt] (-4) at (4.5,0) {\strut$a[1]$};
        \foreach[count=\ii]\i in {#1,#2,#3}
          \node[inner sep=1pt] (-\ii) at (1.5*\ii-1.5,0) {\strut$\i$};
        \foreach\i in {1,2,3}
        {
          \pgfmathtruncatemacro\j{\i+1}
          \draw[-latex] (-\i.east) -- (-\j.west);
        }
    }},
  pics/Morphism/.style n args={5}{
      code={%
        \foreach[count=\ii]\i in {#3,#4,#5}
          \draw[-latex] (#1-\ii) -- (#2-\ii) node[midway,right] {\strut$\i$};
        \draw  [-latex] (#1-4)   -- (#2-4)   node[midway,right] {\strut$#3[1]$};
      }},
}

\begin{document}
\begin{tikzpicture}[y=-1cm]
  \pic (1) at (0,0)   {ExactTriangle={a}{b}{c}};
  \pic (2) at (0,1.5) {ExactTriangle={a}{b}{c}};
  \pic (3) at (0,3)   {ExactTriangle={a}{b}{c}};
  \pic {Morphism={1}{2}{x}{y}{z}};
  \pic {Morphism={2}{3}{x'}{y'}{z'}};
\end{tikzpicture}
\end{document}

在此处输入图片描述

相关内容