我一直在尝试理解以下帖子中的见解:
(用户 tobiasBora 似乎对实现与我非常相似的事情很感兴趣。)然而,我最终陷入了在所有可能的情况下都无法正常工作的混乱境地。
简而言之,我想使用一个 tikzcd 环境
- 正如您所期望的那样工作(呃!)
- 还可以与 externalize 包一起使用
- 如果你想将其嵌入到 amsmath align 环境中,也可以使用
- 与 Beamer 文档类配合使用
我目前的尝试是在下面的 MWE 中:
\documentclass{article}
\usepackage{tikz}
\usepackage{amsmath,xparse,etoolbox}
\usetikzlibrary{cd,external}
%we don't actually need externalisation to demonstrate the problem, so turn it off for now
%\tikzexternalize
\makeatletter
\NewDocumentEnvironment{quantikz}{O{}+b}{%
%local redefinition of catcode
\begingroup \catcode`&=\active
\def\@temp{\tikzcd@[#1]\scantokens{#2}}%
\expandafter\@temp\endtikzcd\endgroup
}{}
%replace commands with environment. seems to help with externalize.
\patchcmd\tikzcd@{\tikzpicture}{\begin{tikzpicture}}{}{}
\patchcmd\endtikzcd{\endtikzpicture}{\end{tikzpicture}}{}{}
\makeatother
\tikzcdset{nodes in empty cells}
%this works
%also works with external switched on
%also works when documentclass is beamer
\begin{document}
\begin{quantikz}
H & \ar[l]
\end{quantikz}
%this does not work
%neither does ampersand replacement
% \begin{align*}
% \begin{quantikz}
% & \ar[l]
% \end{quantikz}
% \end{align*}
%original environment works with ampersand replacement
%but does not externalize
\begin{align*}
\begin{tikzcd}[ampersand replacement=\&]
H \& \ar[l]
\end{tikzcd}
\end{align*}
\end{document}
我曾想过一个简单的解决方案是否能让“&”替换在新环境中再次工作。但即使我直接用 \pgfmatrixnextcell 替换所有 & 实例,quantikz 环境似乎也无法在 align 内工作。
答案1
这是 的定义,quantikz
它抓取主体并将其中的所有内容替换&
为\pgfmatrixnextcell
。
然后,它将tikzpicture
环境放置在接受它的方式external
(未\end{tikzpicture}
隐藏在另一个宏中)并禁用tikzpicture
内部环境。为此, ( )tikzcd
的选项将移动到环境中,而环境通常是放置在那里的。\tikzcd
\begin{tikzcd}
tikzpicture
这确实没有补丁环境tikzcd
在任何方面都只是提供了一个新的quantikz
环境,它应该像原始tikzcd
环境一样工作,但&
甚至在宏的参数内部并且激活外部化。
代码
\documentclass{article}
\usepackage{tikz}
\usepackage{amsmath}
\usetikzlibrary{cd, external}
\tikzexternalize
\ExplSyntaxOn
\NewDocumentEnvironment{quantikz}{O{}+b}{
\begin{tikzpicture}[commutative~diagrams/.cd, every~diagram, #1]
\tl_set:Nn \l_tmpa_tl { #2 }
\tl_replace_all:Nnn \l_tmpa_tl { & } { \pgfmatrixnextcell }
\begingroup
\def\tikzpicture[##1]{}
\let\endtikzpicture\relax
\tikzcd
\l_tmpa_tl
\endtikzcd
\endgroup
\end{tikzpicture}
}{}
\ExplSyntaxOff
\tikzcdset{
nodes in empty cells,
diagrams={baseline=-axis_height}}% https://tex.stackexchange.com/a/678935/16595
\begin{document}
\begin{quantikz}
H & \ar[l]
\end{quantikz}
\begin{align*}
\left\{\begin{quantikz}
H & \ar[l] X \\
B \ar[ur]
\end{quantikz}\right\}
& = \{ x + 2 \}
\end{align*}
\end{document}