7

I'd like to be able to write permutations in the correct way: Typesetting permutations with latex but I would like a command to do it automatically.

I have simply done it manually: (1\ 2\ 3) etc. - no thank you. I can make a command for each one:

\newcommand{\threeperm}[3]{({#1}\ {#2}\ {#3})}
\newcommand{\fourperm}[4]{({#1}\ {#2}\ {#3}\ {#4})}

But (a) that doesn't seem like an efficient way around it considering I could easily be writing a permutation of up to 15 elements or so, and (b) I'd also like to be able to use it in subscript and have smaller spaces between the elements: enter image description here and don't want to have to duplicate all of my commands like this:

\newcommand{\smallthreeperm}[3]{({#1}\, {#2}\, {#3}\, {#4})}

and so on.

Is there a way to create a macro to perform this task?

Thank you in advance for any help provided.

1

5 Answers 5

5

In order to process multiple items in the same way, I'd suggest processing the content as a list (separated by commas, say):

enter image description here

\documentclass{article}

\usepackage{etoolbox}

\newcommand{\permutation}[1]{
  \gdef\itemdelim{\gdef\itemdelim{\mathchoice{\ }{\ }{\,}{\,}}}
  (\dopermutation{#1})}
% https://tex.stackexchange.com/a/89187/5764
\newcommand{\dopermutation}[1]{
  \renewcommand*{\do}[1]{\itemdelim##1}
  \docsvlist{#1}}

\begin{document}

\begin{tabular}{l}
  $(1\ 3\ 2\ 4)$ \\
  $\permutation{1,3,2,4}$
\end{tabular}

\begin{tabular}{l}
  $S_{(1\,3\,2\,4)}$ \\
  $S_{\permutation{1,3,2,4}}$
\end{tabular}

\end{document}

You can update the spacing depending on the math mode you're in.

References:

5

Here the separators are spaces; if you prefer a syntax like \perm{1,2,3,4} (but output just blank space), change { ~ } in the code below with { , }.

\documentclass{article}
\usepackage{xparse}

\newcommand{\permsep}{%
  \mathchoice
    {\mskip\thickmuskip}% display
    {\mskip\medmuskip}% text
    {\mskip1.5mu}% first level sub/superscript
    {\mskip1.5mu}% second level or deeper
}

\ExplSyntaxOn
\NewDocumentCommand{\perm}{m}
 {
  \seq_set_split:Nnn \l_tmpa_seq { ~ } { #1 }
  ( \seq_use:Nn \l_tmpa_seq { \permsep } )
 }
\ExplSyntaxOff

\begin{document}

$\perm{1 2 3 4}\in S_{\perm{1 2 3 4}}$
\[
\perm{1 2 3 4}
\]

\end{document}

With \mathchoice you can decide what spacing you want for each math style.

enter image description here

0
4
\documentclass{scrartcl}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand \perm { r() } { \percy_perm:n {#1} }
\cs_new_protected:Npn \percy_perm:n #1
 {
  (
   \seq_set_split:Nnn \l_tmpa_seq { ~ } { #1 }
   \mathchoice
    { \seq_use:Nn \l_tmpa_seq { \  } }
    { \seq_use:Nn \l_tmpa_seq { \  } }
    { \seq_use:Nn \l_tmpa_seq { \, } }
    { \seq_use:Nn \l_tmpa_seq { \, } }
  )
 }
\ExplSyntaxOff

\begin{document}
$\perm(1 2 3 4)$ and $S_{\perm(1 2 3 4)}$
\end{document}
2

I suggest using the natural syntax of \perm(1 2 3 4) to accomplish the task. Here, I use listofitems package to parse the list, and scalerel to achieve a smaller gap for the smaller math sizes.

\documentclass{article}
\usepackage{listofitems,scalerel}
\setsepchar{ }
\def\perm(#1){(%
  \readlist\permlist{#1}%
  \ThisStyle{%
    \foreachitem\pitem\in\permlist{\pitem{}\kern3\LMpt\kern-1pt}%
  \kern-2\LMpt%
  })%
}
\begin{document}
\[
\perm(1 2 3 4)_{{\perm(1 2 3 4)}_{\perm(1 2 3 4)}}
\]
\end{document}

enter image description here

1

Here is solution based on TeX primitives:

\def\permsep{\mathchoice {\mskip5mu} {\mskip4mu plus2mu}
                         {\mskip1.5mu} {\mskip1mu}}
\def\perm#1{\permA #1 {} }
\def\permA#1 {\bgroup(#1\permB}
\def\permB#1 {\ifx\relax#1\relax)\egroup \else \permsep#1\expandafter\permB\fi}

$\perm{1 2 3 4},\ S_\perm{1 2 3 4}$

\end

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .