将 tikz matrix/tikzcd 包装在 vcenter 中

将 tikz matrix/tikzcd 包装在 vcenter 中

我怎样才能创建一个包装tikzcd(基本上是 tikz 矩阵)的环境\vcenter{...},同时保持语法完整?

我尝试过: 根据如何在环境中包装宏定义?我需要使用environNewDocumentComment{+b}(我更喜欢后者,因为它现在似乎是“原生的”)。但随后环境变成了宏,我遇到了麻烦&(请参阅定义 TikZ 矩阵的快捷方式的问题)。

/!\注意,我不想&变成\&所以我尝试去适应https://tex.stackexchange.com/a/611535/116348到环境,但不确定如何做。

梅威瑟:

\documentclass{article}
\usepackage{amsmath}
\usepackage{etoolbox}
\usepackage{tikz}
\usepackage{tikz-cd}
\usetikzlibrary{shapes,shapes.geometric,shapes.misc,positioning}

\NewDocumentEnvironment{vtikzcd}{O{}+b}{
  \ensuremath{%
    \vcenter{%
      \hbox{
        \begin{tikzcd}[#1]
          #2
        \end{tikzcd}
      }%
    }%
  }%
}

\begin{document}
% Ok
\begin{tikzcd}
  A & B\\
  C & D
\end{tikzcd}

% Fails:
\begin{vtikzcd}
  A & B\\
  C & D
\end{vtikzcd}

\end{document}

我尝试定义:

\newenvironment{vtikzcd}{
  \begingroup% To avoid ampersand issues https://tex.stackexchange.com/a/611535/116348
  \NewDocumentEnvironment{tmpZX}{O{}+b}{%
    \endgroup%
    \ensuremath{%
      \vcenter{%
        \hbox{%
          \begin{tikzcd}[##1]%
            ##2%
          \end{tikzcd}%
        }%
      }%
    }%
  }{}%
  \catcode`&=13
  \begin{tmpZX}%
}{\end{tmpZX}}

但它不能编译。

编辑 我没有使用\vcenter,而是通过编辑样式来适当地将图表(包括单线图)居中,使用如下方法:

baseline={([yshift=-.27em]current bounding box.center)},1-row diagram/.style={%
      /tikz/baseline={([yshift=-.27em]current bounding box.center)}%
    }]

我不确定我应该为 yshift 选择哪个值。话虽如此,我仍然对这个问题感兴趣,以防我以后想用任何命令包装我的环境。

答案1

在 Ti 中何时&使用Z 矩阵(tikzcd环境是其特例),其类别代码将更改为活动(13)。但当代码作为参数传递给另一个命令时,这是不可能的。

所以你的

\NewDocumentEnvironment{vtikzcd}{O{}+b}{% <--- this is necessary
  \ensuremath{% <--- this is not necessary
    \vcenter{% <--- this is not necessary
      \hbox{% <--- this is necessary
        \begin{tikzcd}[#1]
          #2
        \end{tikzcd}% <--- this is necessary
      }% <--- this is not necessary
    }% <--- this is not necessary
  }% <--- this is necessary
}
{}

不起作用(我添加了必要的%{}你错过的内容),因为环境的内容被抓取作为命令的参数。

b因此,如果您不想在里面添加ampersand replacement=\&和输入,则不应使用参数类型。\&vtikzcd

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

\newsavebox{\vtikzcdbox}

\NewDocumentEnvironment{vtikzcd}{O{}}{%
  \begin{lrbox}{\vtikzcdbox}
    $\vcenter\bgroup\hbox\bgroup
    \begin{tikzcd}[#1]
}{%
  \end{tikzcd}%
  \egroup\egroup$
  \end{lrbox}
  \usebox{\vtikzcdbox}%
}

\begin{document}
% no vcenter
X\begin{tikzcd}
  A & B\\
  C & D
\end{tikzcd}X

% vcenter
X\begin{vtikzcd}
  A & B\\
  C & D
\end{vtikzcd}X

\end{document}

在此处输入图片描述

如果要追求b方式,你可以将全部替换&\&

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

\ExplSyntaxOn

\NewDocumentEnvironment{vtikzcd}{O{}+b}
 {
  \ensuremath{\vcenter{\hbox{
    \begin{tikzcd}[ampersand~replacement=\&,#1]
    \tl_set:Nn \l_tmpa_tl { #2 }
    \tl_replace_all:Nnn \l_tmpa_tl { & } { \& }
    \tl_use:N \l_tmpa_tl
    \end{tikzcd}
  }}}
 }
 {}

\ExplSyntaxOff

\begin{document}
% no vcenter
X\begin{tikzcd}
  A & B\\
  C & D
\end{tikzcd}X

% vcenter
X\begin{vtikzcd}
  A & B\\
  C & D
\end{vtikzcd}X

\end{document}

不要过度使用b参数类型。它是一种可能性,但并不是所有情况下的最佳选择。

相关内容