siunitx 使用数学模式来表示符号 - 当对数学和文本使用不同的字体时需要解决方法

siunitx 使用数学模式来表示符号 - 当对数学和文本使用不同的字体时需要解决方法

这是来自在数学模式中使用 palatino (mathpazo) 的旧式字体。原始问题已使用siunitx而不是解决dcolumn。但是,问题是我使用mathpazoosf作为我的主要字体和eulervm我的数学字体。siunitx使用 来对齐表格会导致[]()符号绘制在数学字体中,但数字绘制在文本字体中,如下面的 MWE 示例所示。

是否可以在普通文本字体中绘制符号或完全重新定义 S 列的数学字体?

\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}

编辑:感谢 David,问题已得到解决,包括对amsmathXeTeX 的修复和扩展。顺便提一下,*generated by 的命令estout现在应该只是纯文本:

\newcommand{\sym}1{#1} % 表示表中的符号

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

答案1

如果siuintx没有对此进行自定义,一种方法是让括号切换到文本模式,而不必弄乱数学字体布局,无论是全局的,还是像这里一样,只针对单个环境

\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}

如果你使用 amsmath,则需要稍微修正一下加载包

\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

正如评论中所述,这仍然保留了数学模式中的 - 符号,可以通过将 - 添加到文本符号列表中来更改:

\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}

那是使用 (xetex) unicode 插槽作为 - (−) 符号,但是使用 MWE 中的字体时,符号全部消失,日志显示

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!

然而,如果您有一种具有此字符的字体,或者有一种可以生成该字体内容的 LaTeX 命令,那么您可以进行调整\yyy以进行匹配。

相关内容