[Tex/LaTex] How to align decimal separator inside a specific table

best practiceshorizontal alignmenttables

The table comes from the excellent answer of Philippe Goutet about this question :

\documentclass[a4paper,12pt]{article}      
\usepackage{array,booktabs} % I add booktabs AM
\usepackage[hmargin=2cm]{geometry}
\usepackage{xcolor}

\makeatletter
%http://groups.google.com/group/comp.text.tex/msg/7e812e5d6e67fcc5
\def\convertto#1#2{\strip@pt\dimexpr #2*65536/\number\dimexpr 1#1}
\makeatother

\begin{document}  % 

\begin{center}\begin{tabular}  % Philippe Goutet 
  {>{\def\colunit{pt}}l<{\convertto{\rowunit}{1\colunit}}
   >{\def\colunit{mm}}l<{\convertto{\rowunit}{1\colunit}}
   >{\def\colunit{cm}}l<{\convertto{\rowunit}{1\colunit}}
   >{\def\colunit{ex}}l<{\convertto{\rowunit}{1\colunit}}
   >{\def\colunit{em}}l<{\convertto{\rowunit}{1\colunit}}
   >{\def\colunit{bp}}l<{\convertto{\rowunit}{1\colunit}}
   >{\def\colunit{dd}}l<{\convertto{\rowunit}{1\colunit}}
   >{\def\colunit{pc}}l<{\convertto{\rowunit}{1\colunit}}
   >{\def\colunit{in}}l<{\convertto{\rowunit}{1\colunit}}
   >{\bfseries}l}
\multicolumn{1}{l}{\bfseries 1pt} & \multicolumn{1}{l}{\bfseries 1mm} &         
\multicolumn{1}{l}{\bfseries 1cm} & \multicolumn{1}{l}{\bfseries 1ex} &   
\multicolumn{1}{l}{\bfseries 1em} & \multicolumn{1}{l}{\bfseries 1bp} & 
\multicolumn{1}{l}{\bfseries 1dd} & \multicolumn{1}{l}{\bfseries 1pc} & 
\multicolumn{1}{l}{\bfseries 1in} & \\
\gdef\rowunit{pt} & & & & & & & & & \rowunit\\
\gdef\rowunit{mm} & & & & & & & & & \rowunit\\
\gdef\rowunit{cm} & & & & & & & & & \rowunit\\
\gdef\rowunit{ex} & & & & & & & & & \rowunit\\
\gdef\rowunit{em} & & & & & & & & & \rowunit\\
\gdef\rowunit{bp} & & & & & & & & & \rowunit\\
\gdef\rowunit{dd} & & & & & & & & & \rowunit\\
\gdef\rowunit{pc} & & & & & & & & & \rowunit\\
\gdef\rowunit{in} & & & & & & & & & \rowunit\\
\end{tabular}\end{center}

\end{document}

I would like to align the decimal separator in each column. I try with numprint and siunitx. I know the trick r@{.}l but here … I'm waiting to see …

Best Answer

\usepackage{dcolumn}
\newcolumntype{Z}[1]{D{.}{.}{2.5}<{\convertto{\rowunit}{1#1}}}
% for a comma as decimal separator use the following line
%\newcolumntype{Z}[1]{D{.}{,}{2.5}<{\convertto{\rowunit}{1#1}}}

Then the table can be input as

\begin{tabular}{Z{pt}Z{mm}Z{cm}Z{ex}Z{em}Z{bp}Z{dd}Z{pc}Z{in}>{\bfseries}l}
\multicolumn{1}{c}{\bfseries 1pt} & \multicolumn{1}{c}{\bfseries 1mm} &
\multicolumn{1}{c}{\bfseries 1cm} & \multicolumn{1}{c}{\bfseries 1ex} &
\multicolumn{1}{c}{\bfseries 1em} & \multicolumn{1}{c}{\bfseries 1bp} &
\multicolumn{1}{c}{\bfseries 1dd} & \multicolumn{1}{c}{\bfseries 1pc} &
\multicolumn{1}{c}{\bfseries 1in} & \\
\gdef\rowunit{pt} & & & & & & & & & \rowunit\\
\gdef\rowunit{mm} & & & & & & & & & \rowunit\\
\gdef\rowunit{cm} & & & & & & & & & \rowunit\\
\gdef\rowunit{ex} & & & & & & & & & \rowunit\\
\gdef\rowunit{em} & & & & & & & & & \rowunit\\
\gdef\rowunit{bp} & & & & & & & & & \rowunit\\
\gdef\rowunit{dd} & & & & & & & & & \rowunit\\
\gdef\rowunit{pc} & & & & & & & & & \rowunit\\
\gdef\rowunit{in} & & & & & & & & & \rowunit\\
\end{tabular}

enter image description here

In order to format the table using facilities of siunitx one can build it before typesetting:

\documentclass{article}
\usepackage{array,booktabs} % I add booktabs AM
\usepackage{siunitx}
\makeatletter
%http://groups.google.com/group/comp.text.tex/msg/7e812e5d6e67fcc5
\def\convertto#1#2{\strip@pt\dimexpr #2*65536/\number\dimexpr 1#1\relax\relax}
\makeatother

\begin{document}

\begingroup
\def\arow#1{
  \convertto{#1}{1pt}&
  \convertto{#1}{1mm}&
  \convertto{#1}{1cm}&
  \convertto{#1}{1ex}&
  \convertto{#1}{1em}&
  \convertto{#1}{1bp}&
  \convertto{#1}{1dd}&
  \convertto{#1}{1pc}&
  \convertto{#1}{1in}&
  #1}
\edef\rows{%
  \unexpanded{%
    \begin{tabular}{*{9}{S[table-format=2.5]}>{\bfseries}l}
    \multicolumn{1}{c}{\bfseries 1pt} & \multicolumn{1}{c}{\bfseries 1mm} &         
    \multicolumn{1}{c}{\bfseries 1cm} & \multicolumn{1}{c}{\bfseries 1ex} &
    \multicolumn{1}{c}{\bfseries 1em} & \multicolumn{1}{c}{\bfseries 1bp} &
    \multicolumn{1}{c}{\bfseries 1dd} & \multicolumn{1}{c}{\bfseries 1pc} &
    \multicolumn{1}{c}{\bfseries 1in} & \\
  }
  \arow{pt}\noexpand\\
  \arow{mm}\noexpand\\
  \arow{cm}\noexpand\\
  \arow{ex}\noexpand\\
  \arow{em}\noexpand\\
  \arow{bp}\noexpand\\
  \arow{dd}\noexpand\\
  \arow{pc}\noexpand\\
  \arow{in}
  \noexpand\end{tabular}
}
\rows
\endgroup
\end{document}

enter image description here

Add to the S column specification all other options that are needed.