Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

I am trying to define a command which takes as an argument a string containing ampersands, and replaces every ampersand by a space. Following the ideas in Replacing characters in argument strings, I defined my command as follows:

\DeclareRobustCommand\colvec[1]{%
    \saveexpandmode\expandarg
    \StrSubstitute{\noexpand#1}&\ [\vectorentries]%
    \restoreexpandmode[\vectorentries]^T}

This works great, except in align environments, where the ampersands get recognized as column markers and latex gets confused. How should I fix my code to work in align environments as well?

Here is a minimum-non-working-example:

\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}
share|improve this question
    
Why don't you use a different token? –  cgnieder May 8 '12 at 17:42
    
Because i'm using it in a 500-page book and the command shows up many many times. But maybe you're right; I should use some regular expression search and replace to change the token... I thought there might be a simple answer to my question. –  Yori May 8 '12 at 17:46
3  
At second thought -- there is: place the interior of the command between {...}. This should hide the & from align's scanning mechansim. –  cgnieder May 8 '12 at 17:51
    
Awesome! That's what I meant by "simple solution"! :) –  Yori May 8 '12 at 17:54

2 Answers 2

up vote 6 down vote accepted

Transforming my comment into an answer: you need to hide the ampersand from align's scanning mechanism.

The easiest way to do this is placing the command in braces:

\begin{align}
 x = {\colvec{3 & 3}}
\end{align}

To have a more comfortable syntax one can add the braces to the definition of \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}
share|improve this answer
1  
Thanks, and looking back, I regret having asked the question because the solution is embarrassingly simple. I expected that it was going to take catcodes etc. Pfew! –  Yori May 8 '12 at 21:22

Why not using a simpler strategy?

\newcommand{\colvec}[1]{
  {
   \setlength{\arraycolsep}{.16667em}
   [\begin{matrix}#1\end{matrix}]^T
  }
}

A different way of replacing the & with a space is with xparse and 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

This doesn't even require the extra braces.

share|improve this answer
    
Thanks for the idea, but this is what I used before. The problem with it is that if you use this in a sentence, the vertical alignment does not always come out correctly. Also, if there are subscripts or superscripts, the brackets become bigger than necessary. –  Yori May 8 '12 at 21:38
    
I changed the macro; can you show a place where the alignment is not correct? Just curious. –  egreg May 8 '12 at 21:50
    
see my next question, tex.stackexchange.com/questions/55007/matrix-vertical-alignment . it's driving me crazy! –  Yori May 9 '12 at 1:59

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.