为交换平方创建新的命令

为交换平方创建新的命令

我正在尝试定义一个命令,该命令以交换正​​方形的顶点和箭头作为输入。但我遇到了问题。以下是代码:

\newcommand{\csq}[8]{
\begin{tikzcd}
#1 \arrow{r}{#5} \arrow{d}{#8} & #2 \arrow{d}{#6} \\
#4 \arrow{r}{#7} & #3
\end{tikzcd}
}

答案1

使用ampersand replacement

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

\newcommand{\csq}[8]{
\begin{tikzcd}[ampersand replacement=\&]
#1 \arrow[r,#5] \arrow[d,#8] \& #2 \arrow[d,#6] \\
#4 \arrow[r,#7] \& #3
\end{tikzcd}
}


\begin{document}

\csq{A}{B}{C}{D}{"\phi"}{"f"}{"\psi",swap}{"g",swap}

\end{document}

在此处输入图片描述

我使用箭头选项的参数将您的语法更改为现代语法。

答案2

Gonzalo Medina 给出了正确答案:ampersand replacement=\&直接使用\pgfmatrixnextcell。我想介绍一种不同的实现,使用键值接口而不是难以记住的八个参数。

指定角的键有tl“左上”、“tr右上”、bl“左下”和br“右下”;箭头有t、、b和上、下、左、右。请注意,指定键的顺序无关紧要;如果您不想标记箭头,则不要指定相关键。lr

您还可以说\ksq[<tikz options>]{<keys>}以便为tikzcd环境指定选项,例如row sep或类似的。

\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse,tikz-cd}

\ExplSyntaxOn
\NewDocumentCommand{\ksq}{O{}m}
 {
  \group_begin:
  \keys_set:nn { abelian/ksq } { #2 }
  \__abelian_make_ksq:n { #1 }
  \group_end:
 }

\keys_define:nn { abelian/ksq }
 {
  tl .tl_set:N = \l__abelian_tl_tl,
  tr .tl_set:N = \l__abelian_tr_tl,
  bl .tl_set:N = \l__abelian_bl_tl,
  br .tl_set:N = \l__abelian_br_tl,
  t  .tl_set:N = \l__abelian_t_tl,
  l  .tl_set:N = \l__abelian_l_tl,
  r  .tl_set:N = \l__abelian_r_tl,
  b  .tl_set:N = \l__abelian_b_tl,
 }

\cs_new_protected:Npn \__abelian_make_ksq:n #1
 {
  \begin{tikzcd}[#1]
    \l__abelian_tl_tl
    \arrow[r,"\l__abelian_t_tl"]
    \arrow[d,"\l__abelian_l_tl",swap]
    \pgfmatrixnextcell
    \l__abelian_tr_tl
    \arrow[d,"\l__abelian_r_tl"]
    \\
    \l__abelian_bl_tl
    \arrow[r,"\l__abelian_b_tl"]
    \pgfmatrixnextcell
    \l__abelian_br_tl
  \end{tikzcd}
 }
\ExplSyntaxOff

\begin{document}

\[
\ksq{
  tl=A,
  tr=B,
  bl=C,
  br=D,
  t=\phi,
  b=\psi,
  l=f,
  r=g
}
\qquad
\ksq[row sep=3em,column sep=3em]{
  tl=A,
  tr=B,
  bl=C,
  br=D,
  t=\phi,
  b=\psi,
  l=f,
  r=g
}
\]

\end{document}

在此处输入图片描述

相关内容