我正在尝试定义一个命令,该命令将包含 & 符号的字符串作为参数,并将每个 & 符号替换为空格。遵循 替换参数字符串中的字符,我定义我的命令如下:
\DeclareRobustCommand\colvec[1]{%
\saveexpandmode\expandarg
\StrSubstitute{\noexpand#1}&\ [\vectorentries]%
\restoreexpandmode[\vectorentries]^T}
这很有效,但在align
某些环境下除外,在这些环境下,& 符号会被识别为列标记,而 latex 会感到困惑。我该如何修复我的代码,使其align
也能在环境中正常工作?
这是一个最小非工作示例:
\documentclass{article}
\usepackage{xstring}
\usepackage{amsmath}
\DeclareRobustCommand\colvec[1]{%
\saveexpandmode\expandarg
\StrSubstitute{\noexpand#1}&\ [\vectorentries]%
\restoreexpandmode[\vectorentries]^T}
\begin{document}
\begin{align}
x = \colvec{3 & 3}
\end{align}
\end{document}
答案1
将我的评论转换成答案:您需要从align
扫描机制中隐藏“&”符号。
最简单的方法是将命令放在括号中:
\begin{align}
x = {\colvec{3 & 3}}
\end{align}
为了获得更舒适的语法,可以将括号添加到定义中\colvec
:
\documentclass{article}
\usepackage{xstring}
\usepackage{amsmath}
\DeclareRobustCommand\colvec[1]{%
{\saveexpandmode\expandarg
\StrSubstitute{\noexpand#1}&\ [\vectorentries]%
\restoreexpandmode[\vectorentries]^T}}
\begin{document}
\begin{align}
x &= \colvec{3 & 3} \\
E &= mc^2 % to show that alignment still works
\end{align}
\end{document}
答案2
为什么不采用更简单的策略?
\newcommand{\colvec}[1]{
{
\setlength{\arraycolsep}{.16667em}
[\begin{matrix}#1\end{matrix}]^T
}
}
&
用空格替换 的另一种方法是用xparse
和expl3
:
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\colvec}{m}
{
\tl_set:Nn \l_tmpa_tl {#1}
\tl_replace_all:Nnn \l_tmpa_tl { & } { \ }
[\tl_use:N \l_tmpa_tl]^T
}
\ExplSyntaxOff
这甚至不需要额外的括号。