我怎样才能创建一个包装tikzcd
(基本上是 tikz 矩阵)的环境\vcenter{...}
,同时保持语法完整?
我尝试过: 根据如何在环境中包装宏定义?我需要使用environ
或NewDocumentComment{+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
参数类型。它是一种可能性,但并不是所有情况下的最佳选择。