我正在尝试编写一个宏,以便我可以编写 tikz-cd 箭头的简写。例如,不必写出完整的命令
\arrow[swap, dotted]{r}{f^*}
我想要一个简写
\A[s.]{r}{f^*}
命令\A
处理s
to 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}