替换参数中的 & 符号

替换参数中的 & 符号

我正在尝试定义一个命令,该命令将包含 & 符号的字符串作为参数,并将每个 & 符号替换为空格。遵循 替换参数字符串中的字符,我定义我的命令如下:

\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
  }
}

&用空格替换 的另一种方法是用xparseexpl3

\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

这甚至不需要额外的括号。

相关内容