为 tikz-cd 箭头选项编写宏

为 tikz-cd 箭头选项编写宏

我正在尝试编写一个宏,以便我可以编写 tikz-cd 箭头的简写。例如,不必写出完整的命令

\arrow[swap, dotted]{r}{f^*}

我想要一个简写

\A[s.]{r}{f^*}

命令\A处理sto meanswap.to mean dotted。使用 xstring 包,可以很容易地编写一个命令,该命令接受s.输入和输出,swap,dotted,但我不知道如何将其作为参数输入\arrow。我今天早些时候问了一个比较简单的问题我以为这会向我展示如何处理一般问题,但事实证明,处理乳胶如何扩展宏比我想象的要复杂得多。

无论如何,我尝试编写的代码(在结合了 Steven B. Segletes 关于如何解决我较简单的问题的建议之后)是这样的:

\documentclass{article}

\usepackage{xstring} 
\usepackage{xifthen}

\usepackage{tikz-cd}

\newcommand{\arrowformatting}[1]{%
    \IfSubStr{#1}{s}{swap,}{}%
    \IfSubStr{#1}{.}{dotted,}{}%
    % Add more commands here later
}

\newcommand{\A}[3][]{%
    \ifthenelse{\isempty{#1}}{%
        \arrow{#2}{#3}%
    }{%
        \expandafter\arrow\expandafter[\arrowformatting{#1}]{#2}{#3}%
    }%
}

\begin{document} 

\[ \begin{tikzcd}
    A \A[s.]{r}{f^*} & B 
\end{tikzcd} \]

\end{document}

该函数\arrowformatting本身可以正常工作 - 如果我调用\arrowformatting{s.}文档,它会swap,dotted,按预期打印出来。但如果我使用\A所示的命令,它会给出错误

! Argument of \XC@definec@lor has an extra }.
<inserted text> 
                \par 
l.29 \end{tikzcd}
                  \]

有没有一种简单的方法可以解决这个问题,并让 的输出\arrowformatting被解释为\arrow我想要的输入?或者我会遇到很多复杂的扩展顺序问题,我最好尝试其他方法吗(比如我相信有一个包可以让你在 latex 中运行 python 代码,希望它可以生成\arrow我想要的正确命令)?

答案1

s您可以通过创建名为和的 TikZ 样式来完成类似的事情.

\documentclass[margin=10pt,convert]{standalone}
\usepackage{tikz-cd}
\tikzset{commutative diagrams/.cd, 
    s/.style = {swap},
    ./.style = {dotted},
    s./.style = {s,.}
    }
\newcommand{\A}{\ar}

\begin{document}

% Two different keys, separated by commas:
\begin{tikzcd}
A \ar[s,.]{r}{f^*} & B
\end{tikzcd}

% A single, specially defined key `s.`:
\begin{tikzcd}
A \A[s.]{r}{f^*} & B
\end{tikzcd}
\end{document}

我还创建了一种名为 的样式s.来证明这种事情是可能的。但是,如果您希望能够处理超过两个或三个缩写键的所有可能排列,那么这种省略逗号的方法并不实用。

输出:

在此处输入图片描述

答案2

我想这有点晚了,但使用你/utils/exec=\pgfkeysalso可以得到你想要的:

\documentclass{article}

\usepackage{xstring}
\usepackage{tikz-cd}

\newcommand{\arrowformatting}[1]{%
    \IfSubStr{#1}{s}{\pgfkeysalso{swap}}{}%
    \IfSubStr{#1}{.}{\pgfkeysalso{dotted}}{}%
    % Add more commands here later
}

\newcommand{\A}[3][]{%
        \arrow[/utils/exec=\arrowformatting{#1}]{#2}{#3}%
}

\begin{document}

\[ \begin{tikzcd}
    A \A[s.]{r}{f^*} & B
\end{tikzcd} \]

\end{document} 

相关内容