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.

Consider the follwing command:

 \newcommand{\vektor}[3]{\left(\negthinspace\begin{smallmatrix}#1\\#2\\#3    \end{rsmallmatrix}
 \right)}

I can use it like

$\vektor{1}{2}{3}$

Now my question is whether it is possible to redefine the command such that the arguments are a comma separated list, such that I could write:

$\vektor{1,2,3}$
share|improve this question
3  
Have a look at tex.stackexchange.com/q/15716/3240 –  Thorsten Jun 2 '11 at 14:07
add comment

5 Answers 5

up vote 5 down vote accepted

It's easy to do this sort of thing using \def, if you don't mind putting the argument inside delimiters that are not braces.

\documentclass{minimal}
\usepackage{amsmath}
\def\vektor(#1,#2,#3) {\left(\negthinspace\begin{smallmatrix}#1\\#2\\#3 \end{smallmatrix} \right)}
\begin{document}
\[ \vektor(a,b,c) \]
\end{document}

Obviously, the above would go horribly wrong if you replace the parentheses with braces.

EDIT

See Ryan Reich's answer (or Aditya's comment) for a neat modification that allows you to use braces.

share|improve this answer
    
Thanks, that's nice! –  student Jun 2 '11 at 14:41
1  
Actually, it is easy to go from this solution to one that uses braces. \def\vektorwrapper#1{\vektor(#1)}. –  Aditya Jun 2 '11 at 15:39
add comment

You can do it with \def and braces too, if you use two steps to hide Ian Thompson's code inside another macro.

\documentclass{minimal}
\usepackage{amsmath}
\def\vektor#1{\innervector(#1)}
\def\innervector(#1,#2,#3) {\left(\negthinspace\begin{smallmatrix}#1\\#2\\#3 \end{smallmatrix} \right)}
\begin{document}
\[ \vektor{a,b,c} \]
\end{document}
share|improve this answer
    
very nice! –  Ian Thompson Jun 2 '11 at 14:41
    
That's cheating! –  Seamus Jun 2 '11 at 15:09
add comment

As an after thought. You can make it a lot more general with a variable number of arguments and different row or column delimiters

\documentclass{article}
\usepackage{amsmath}
\makeatletter

\newcommand\myvector[2][\\]{%
    \global\def\my@delim{#1}%
    \left(\negthinspace\begin{smallmatrix}
        \my@vector #2,\relax\noexpand\@eolst%
    \end{smallmatrix}\right)}

\def\my@vector #1,#2\@eolst{%
   \ifx\relax#2\relax
      #1
   \else
      #1\my@delim
      \my@vector #2\@eolst%
   \fi}

\makeatother
\begin{document}
$x   = \myvector{1,2,3,:}$ and
$x^T = \myvector[,&]{1,2,3,...}$
\end{document}

This will give

enter image description here

share|improve this answer
add comment

Here is a solution that uses the xparse package:

\usepackage{xparse}
\NewDocumentCommand{\InternalVector}{mmm}{%
  \left(\begin{smallmatrix}#1\\#2\\#3\end{smallmatrix}\right)%
}
\NewDocumentCommand{\vektor}{>{\SplitArgument{2}{,}}m}{\InternalVector#1}
share|improve this answer
add comment
\documentclass[a4paper]{article}
\usepackage{amsmath} % for smallmatrix

\begingroup\lccode`~=`,
  \lowercase{\endgroup\def\vekcomma{\mathcode`\,=\string"8000 \def~{\\}}}
\newcommand\vektor[1]{\left(\vekcomma
  \!\begin{smallmatrix}
  #1
  \end{smallmatrix}\!\right)}

\begin{document}
$a,b\vektor{a,b,c,d}\vektor{x,y,z}$
\end{document}

You are not limited to three components. The a,b part is to show that uses of the comma outside the argument of \vektor are allowed.

The fact that \left-\right make a group is fundamental, because this ensures that changes to the \mathcode of the comma are confined to that place. The special mathcode "8000 means that the comma behaves like an active character; the definition of the active comma is given in an indirect way, so as not to conflict with possible other meanings as an active character.

share|improve this answer
add comment

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.