让 siunitx 使用文本数字,但仅当它不在带有 fontspec 的表中时才使用

让 siunitx 使用文本数字,但仅当它不在带有 fontspec 的表中时才使用

我想要的:S表格中的列类型使用表格/衬线数字。\SI,,,\num等都\SIrange使用旧式/比例数字。

我最近问过一个问题关于siunitx使用旧式数字。当时我遇到的问题是所有siunitx数字都是直线数字。

现在我已开始使用fontspec//并遇到了相反的问题:所有内容都是按比例的旧式数字,即使在表格内部也是如此,我希望它们是表格/衬线的lualatexnewcomputermodern

siunitxdetect-all设置不再起任何作用,这意味着我无法使用以前的答案。

MNWE:

\documentclass{article}
\usepackage{fontspec}
\defaultfontfeatures+{Numbers=OldStyle}
\usepackage{newcomputermodern}
\usepackage{siunitx}

\begin{document}

\sisetup{detect-all=false}
\string\sisetup{detect-all=false}

\noindent 1234567890 Text \\
\(1234567890\) Math \\
\SI{1234567890}{\angstrom} siunitx

\begin{tabular}{Sl}
    1.234(5678) &   12345678901234567890\\
    1.111(1111) &   11111111111111111111  \\
\end{tabular}

\vspace{1 cm}
\sisetup{detect-all=true}
\string\sisetup{detect-all=true}

\noindent 1234567890 Text \\
\(1234567890\) Math \\
\SI{1234567890}{\angstrom} siunitx

\begin{tabular}{Sl}
    1.234(5678) &   12345678901234567890\\
    1.111(1111) &   11111111111111111111  \\
\end{tabular}

\end{document}

这表明数学环境是衬线图形,文本是旧式,而 \si 和 S 列忽略这两种设置,是旧式

答案1

siunitx我认为让宏\SI\numS类型正常工作的关键是执行\DeclareSymbolFontAlphabet{\mathrm}{operators}是执行您在询问几周前,但在新的查询中停止了代码。

以下代码在 pdfLaTeX、LuaLaTeX 和 XeLaTEX 下产生完全相同的所需输出 - 由\num和产生的旧式数字\SI,但不由S列类型产生。(衬线数字以黄色突出显示。我使用Latin Modern而不是newcomputermodern包,因为我不熟悉后者。)

在此处输入图片描述

\documentclass{article}

\usepackage{iftex} % for \ifpdftex macro
\ifpdftex
  \usepackage[T1]{fontenc}
  \usepackage{cfr-lm} % text fonts
  % (use default math font, i.e., CM Math)
\else
  \usepackage{unicode-math} % loads 'fontspec' automatically
  \setmainfont{Latin Modern Roman}[Numbers=OldStyle]
  \setmathfont{Latin Modern Math} % optional
\fi

\usepackage{siunitx}
\DeclareSymbolFontAlphabet{\mathrm}{operators} % <-- very important

\usepackage{letltxmacro}
%% redefine \SI and \num -- carefully
\LetLtxMacro\origSI\SI
\LetLtxMacro\orignum\num
\renewcommand\SI[3][mode=text]{\origSI[#1]{#2}{#3}}
\renewcommand\num[2][mode=text]{\orignum[#1]{#2}}

\begin{document}

\begin{tabular}{@{} l l @{}}
1234567890     & Text   \\
$1234567890$   & Math   \\[1ex]
\SI{1234567890}{\meter}     & \string\SI     \\
\origSI{1234567890}{\meter} & \string\origSI \\[1ex]
\num{1234567}               & \string\num    \\
\orignum{1234567}           & \string\orignum\\[1ex]
\end{tabular}

\begin{tabular}{@{} l S[table-format=1.3] @{}}
    l & {S} \\
    \hline
    1.2345 &   1.2345  \\
    1.1111 &   1.1111  \\
\end{tabular}

\end{document}

答案2

新答案

您可以使用选项设置\SI和使用不同的字体。以下是将两者都设置为使用固定宽度、旧式数字的 MWE:\begin{tabular}{S}text-rm=

\documentclass{article}
\usepackage{unicode-math}

\setmainfont{NewComputerModernBook}[Numbers=OldStyle]
\setsansfont{NewComputerModernSansBook}[Numbers=OldStyle]
\setmonofont{NewComputerModernMonoBook}[Numbers=OldStyle]
\setmathfont{NewCMMath-Book}
%\setmathrm{NewComputerModernBook}[Numbers={Lining,Tabular}]
\newfontface\tablefont{NewComputerModernBook}[Numbers={OldStyle,Tabular}]

\usepackage[text-rm=\tablefont, detect-all=true]{siunitx}

\begin{document}

\noindent 1234567890 Text \\
\(1234567890\) Math \\
\SI{1234567890}{\angstrom} siunitx

\begin{tabular}{Sl}
    1.234(5678) &   12345678901234567890\\
    1.111(1111) &   11111111111111111111  \\
\end{tabular}

\end{document}

新电脑现代表格旧式

这是一个新的表格环境,它在本地重新定义了字体的siunitx使用:

\documentclass{article}
\usepackage{unicode-math}

\setmainfont{NewComputerModernBook}[Numbers=OldStyle]
\setsansfont{NewComputerModernSansBook}[Numbers=OldStyle]
\setmonofont{NewComputerModernMonoBook}[Numbers=OldStyle]
\setmathfont{NewCMMath-Book}
%\setmathrm{NewComputerModernBook}[Numbers={Lining,Tabular}]
\newfontface\tablefont{NewComputerModernBook}[Numbers={Lining,Tabular}]

\usepackage[detect-all=true]{siunitx}
\usepackage{xparse} % Included by default in recent versions of LaTeX.

\NewDocumentEnvironment{SItabular}{o m}%
  {\sisetup{detect-all=true, text-rm=\tablefont}\begin{tabular}[#1]{#2}}
  {\end{tabular}}

\begin{document}

\noindent 1234567890 Text \\
\(1234567890\) Math \\
\SI{1234567890}{\angstrom} siunitx
\bigskip

\begin{SItabular}{Sl}
    1.234(5678) &   12345678901234567890\\
    1.111(1111) &   11111111111111111111  \\
\end{SItabular}

\bigskip
\SI{1234567890}{\angstrom} siunitx

\end{document}

新计算机现代样本

这避免了重新定义现有的命令。

原始答案

一种解决方案是将\mathrm字体设置为带有的文本字体版本Numbers={Lining,Tabular},并告诉siunitx使用该字体[math-rm]

\documentclass{article}
\usepackage{unicode-math}
\usepackage[math-rm]{siunitx}

\setmainfont{NewComputerModernBook}[Numbers=OldStyle]
\setsansfont{NewComputerModernSansBook}[Numbers=OldStyle]
\setmonofont{NewComputerModernMonoBook}[Numbers=OldStyle]
\setmathfont{NewCMMath-Book}
\setmathrm{NewComputerModernBook}[Numbers={Lining,Tabular}]

\begin{document}

\sisetup{detect-all=false}
\string\sisetup{detect-all=false}

\noindent 1234567890 Text \\
\(1234567890\) Math \\
\SI{1234567890}{\angstrom} siunitx

\begin{tabular}{Sl}
    1.234(5678) &   12345678901234567890\\
    1.111(1111) &   11111111111111111111  \\
\end{tabular}

\vspace{1 cm}
\sisetup{detect-all=true}
\string\sisetup{detect-all=true}

\noindent 1234567890 Text \\
\(1234567890\) Math \\
\SI{1234567890}{\angstrom} siunitx

\begin{tabular}{Sl}
    1.234(5678) &   12345678901234567890\\
    1.111(1111) &   11111111111111111111  \\
\end{tabular}

\end{document}

在此示例中,\SI命令和S第一个表的列(带有detect-all=false)显示内衬表格数字。

另一个是使用\tablenums来自 的命令siunitx。另一个是使用字体[text-tt]

相关内容