带有 tikzcd 的简单宏 - 分叉图

带有 tikzcd 的简单宏 - 分叉图

我正在尝试创建一个宏来轻松绘制如下所示的叉子:

在此处输入图片描述

我尝试过这个:

 \newcommand{\fork}[6]{
 \begin{center}
 \begin{tikzcd}
 #1 \arrow[r, "#2"] & #3 \arrow[r,shift left, "#4"] 
 \arrow[r,shift right, "#5"'] & #6
 \end{tikzcd}
 \end{center} 
}

但是我收到一条错误“单个 & 符号与错误的 catcode 一起使用”。

答案1

您实际上并不想使用该center环境,但主要问题是&

\newcommand{\fork}[6]{%
  \begin{tikzcd}[ampersand replacement=\&]
  #1 \arrow[r, "#2"] \& #3 \arrow[r,shift left, "#4"] 
  \arrow[r,shift right, "#5"'] \& #6
  \end{tikzcd}%
}

ampersand replacement每次TiZ 矩阵(例如tikzcd图表)用于另一个命令的参数。

在显示环境中使用它,比如

\[
\fork{K}{k}{A}{f}{0}{B}
\]

这是处理均衡器和共均衡器图的另一个建议。图中的每个项目都使用键值方法定义(如果您愿意,可以使用不同的键);指示*绘制共均衡器图。与大多数键值方法一样,键的顺序无关紧要。

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

\ExplSyntaxOn

\keys_define:nn { soap/forks }
 {
  s .tl_set:N = \l__soap_fork_source_tl,
  t .tl_set:N = \l__soap_fork_target_tl,
  e .tl_set:N = \l__soap_fork_end_tl,
  u .tl_set:N = \l__soap_fork_up_tl,
  d .tl_set:N = \l__soap_fork_down_tl,
  c .tl_set:N = \l__soap_fork_center_tl,
  * .bool_set:N = \l__soap_fork_co_bool,
  * .default:n = true,
 }

\NewDocumentCommand{\fork}{m}
 {
  \keys_set:nn { soap/forks } { #1 }
  \begin{tikzcd}[ampersand~replacement=\&]
  \bool_if:NF \l__soap_fork_co_bool
   {% false, equalizer
    \l__soap_fork_end_tl
    \arrow[r,"\l__soap_fork_center_tl"] \&
   }
  \l__soap_fork_source_tl
  \arrow[r,shift~left,"\l__soap_fork_up_tl"]
  \arrow[r,shift~right,"\l__soap_fork_down_tl",swap] \&
  \l__soap_fork_target_tl
  \bool_if:NT \l__soap_fork_co_bool
   {% true, coequalizer
    \arrow[r,"\l__soap_fork_center_tl"] \&
    \l__soap_fork_end_tl
   }
  \end{tikzcd}
 }

\ExplSyntaxOff

\begin{document}

\begin{gather}
\fork{s=A,t=B,e=K,u=f,d=0,c=k}
\\
\fork{*,s=A,t=B,e=K,u=f,d=0,c=k}
\end{gather}

\end{document}

在此处输入图片描述

相关内容