解决 tikzcd/externalize/align 不兼容问题

解决 tikzcd/externalize/align 不兼容问题

我一直在尝试理解以下帖子中的见解:

(用户 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}

相关内容