我想要的:S
表格中的列类型使用表格/衬线数字。\SI
,,,\num
等都\SIrange
使用旧式/比例数字。
我最近问过一个问题关于siunitx
使用旧式数字。当时我遇到的问题是所有siunitx
数字都是直线数字。
现在我已开始使用fontspec
//并遇到了相反的问题:所有内容都是按比例的旧式数字,即使在表格内部也是如此,我希望它们是表格/衬线的lualatex
。newcomputermodern
siunitx
的detect-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}
答案1
siunitx
我认为让宏\SI
和\num
列S
类型正常工作的关键是执行\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]
。