[Tex/LaTex] siunitx uses math mode for symbols – workaround needed when using different fonts for math and text

fontsmath-modesiunitxxetex

This is a follow up question from Using old style fonts of palatino (mathpazo) in math mode. The original problem has been solved using siunitx instead of dcolumn. However, the problem is that I am using mathpazo with osf as my main body font and eulervm as my math font. With siunitx used to decimal align tables this results in []() symbols being drawn in the math font, but the digits being drawn in the text font, as the following MWE example illustrates.

Is it possible to draw the symbols in the normal text font or redefine the mathfont for S columns completely?

\documentclass{scrartcl}
\usepackage{booktabs}
\usepackage[osf]{mathpazo}
\usepackage[euler-digits]{eulervm}

% For Tables created by estout
\newcommand{\sym}[1]{\ensuremath{^{#1}}} % for symbols in Table
\usepackage{siunitx}
\sisetup{ detect-mode, 
          group-digits            = false ,
          input-signs             = ,
          input-symbols           = ()[]-+ ,
          input-open-uncertainty  = ,
          input-close-uncertainty = ,
          table-align-text-post   = false 
        }
\begin{document}
\begin{tabular*}{\textwidth}{
    l @{\extracolsep\fill} *{2}{S[table-format=4.4]} @{}}
\toprule
\multicolumn{1}{@{}l}{\emph{Age}}  \\[0.5ex]
18--24 &   [-1360.228]\sym{*}  &  -1371.941\sym{*}  \\
       &       (6.915)         &    (-7.953)        \\
25--34 &     -219.216          &   -240.271         \\
       &     (514.894)         &   (515.348)        \\
35--44 &     -310.715          &   -311.438         \\
       &     (485.780)         &   (486.013)        \\
55$+$  &       -5.135          &     [2.656]        \\
       &      (53.267)         &   (533.875)        \\
\bottomrule
\end{tabular*}
\end{document}

Edit: Thanks to David the problem has been solved including a fix for amsmath and extending to XeTeX. On a side note, the command for * generated by estoutshould now be simply plain text:

\newcommand{\sym}1{#1} % for symbols in Table

\newcommand{\sym}[1]{\rlap{$#1$}} % Thanks to David Carlise again.

Best Answer

If siuintx doesn't have customisation for this, one way, without having to mess with the math font layout, is to make the brackets switch to text mode, either globally, or, as here, just for a single envrironment

\documentclass{scrartcl}
\usepackage{booktabs}
\usepackage[osf]{mathpazo}
\usepackage[euler-digits]{eulervm}


% For Tables created by estout
\newcommand{\sym}[1]{\ensuremath{^{#1}}} % for symbols in Table
\usepackage{siunitx}
\sisetup{ detect-mode, 
          group-digits            = false ,
          input-signs             = ,
          input-symbols           = ()[]-+ ,
          input-open-uncertainty  = ,
          input-close-uncertainty = ,
          table-align-text-post   = false 
        }


\def\xxx#1{%
  \bgroup\uccode`\~\expandafter`\string#1%
  \uppercase{\egroup\edef~{\noexpand\text\string#1}}%
  \mathcode\expandafter`\string#1"8000 }
\def\textsymbols{\xxx[\xxx]\xxx(\xxx)}



\begin{document}

{\textsymbols
\begin{tabular*}{\textwidth}{
    l @{\extracolsep\fill} *{2}{S[table-format=4.4]} @{}}
\toprule
\multicolumn{1}{@{}l}{\emph{Age}}  \\[0.5ex]
18--24 &   [-1360.228]\sym{*}  &  -1371.941\sym{*}  \\
       &       (6.915)         &    (-7.953)        \\
25--34 &     -219.216          &   -240.271         \\
       &     (514.894)         &   (515.348)        \\
35--44 &     -310.715          &   -311.438         \\
       &     (485.780)         &   (486.013)        \\
55$+$  &       -5.135          &     [2.656]        \\
       &      (53.267)         &   (533.875)        \\
\bottomrule
\end{tabular*}}
\end{document}

If you are using amsmath, you need to make a slight correction after loading the package

\usepackage{amsmath}

\makeatletter
\edef\originalbmathcode{%
    \noexpand\mathchardef\noexpand\@tempa\the\mathcode`\(\relax}
\def\resetMathstrut@{%
  \setbox\z@\hbox{%
    \originalbmathcode
    \def\@tempb##1"##2##3{\the\textfont"##3\char"}%
    \expandafter\@tempb\meaning\@tempa \relax
  }%
  \ht\Mathstrutbox@\ht\z@ \dp\Mathstrutbox@\dp\z@
}
\makeatother

This still leaves - signs in math mode as noted in comments, that could be changed by adding - to the list of text symbols:

\def\yyy{%
  \bgroup\uccode`\~\expandafter`\string-%
  \uppercase{\egroup\edef~{\noexpand\text{\char"2212\relax}}}%
  \mathcode\expandafter`\string-"8000 }
\def\textsymbols{\xxx[\xxx]\xxx(\xxx)\yyy}

That is using (xetex) unicode slot for a - (−) sign however with the fonts as in the MWE the signs all disappear and the log says

Missing character: There is no − in font pplr9o!
Missing character: There is no − in font pplr9o!
Missing character: There is no − in font pplr9o!
Missing character: There is no − in font pplr9o!

however if you have a font that does have this character or a LaTeX command that produces something in that font, you could adapt \yyy to match.