我正在尝试定义一个命令,该命令以交换正方形的顶点和箭头作为输入。但我遇到了问题。以下是代码:
\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
和上、下、左、右。请注意,指定键的顺序无关紧要;如果您不想标记箭头,则不要指定相关键。l
r
您还可以说\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}