答案1
这是一个无论是否有该fontspec
包都可以使用的解决方案。
该解决方案由 (a) 一个名为 的 Lua 函数组成ttnumbers
,该函数使用 Lua 的强大string.gsub
功能将输入流中找到的所有数字实例封装在\texttt
指令中,以及 (b) 两个实用 Latex 宏,称为\ttnumbersOn
和\ttnumbersOff
,用于激活和停用该函数。请注意,和指令ttnumbers
的操作不会在遇到相应宏的行上生效,而只会在\ttnumbersOn
\ttnumbersOff
下一个线。
\documentclass{article}
\usepackage{luacode} % for "\luaexec" macro
\luaexec{ %% Set up the Lua function:
function ttnumbers ( s )
return ( s:gsub ( "\%d+" , "\\texttt{\%0}" ) )
end
}
\newcommand\ttnumbersOn{\directlua{luatexbase.add_to_callback(
"process_input_buffer", ttnumbers , "ttnumbers" )}}
\newcommand\ttnumbersOff{\directlua{luatexbase.remove_from_callback(
"process_input_buffer", "ttnumbers" )}}
\begin{document}
%% roman text font
1234567890 vs.\
\ttnumbersOn
1234567890
\ttnumbersOff
% math font
$1234567890$ vs.\
\ttnumbersOn
$1234567890$
\ttnumbersOff
% sans-serif text font
\sffamily
1234567890 vs.\
\ttnumbersOn
1234567890
\end{document}
答案2
使用 lualatex 可以设置组合字体。但我认为这种排版相当糟糕。
\documentclass{article}
\usepackage{combofont}
\setupcombofont{ttnumber-regular}
{
{file:lmroman10-regular.otf:\combodefaultfeat} at #1pt,
{file:lmmono10-regular.otf:mode=node;} at #1pt
}
{
{},
0x30-0x39
}
\setupcombofont{ttnumber-bold}
{
{file:lmroman10-bold.otf:\combodefaultfeat} at #1pt,
{file:lmmonolt10-bold:mode=node; } at #1pt
}
{
{},
0x30-0x39
}
\DeclareFontFamily{TU}{ttnumber}{}
\DeclareFontShape {TU}{ttnumber}{m}{n} {<->combo*ttnumber-regular}{}
\DeclareFontShape {TU}{ttnumber}{b}{n}{<->combo*ttnumber-bold}{}
\renewcommand\rmdefault{ttnumber}
\begin{document}
some text 1234567890 \bfseries some text 1234567890
\end{document}
答案3
使用 ConTeXt,可以通过字体回退机制实现这一点,您可以用另一种字体的字母替换某些字母。
\definefallbackfamily [teletypenumbers] [rm] [Latin Modern Typewriter]
[range=digitsnormal,
force=yes]
\definefontfamily [teletypenumbers] [rm] [Latin Modern Roman]
\setupbodyfont[10pt]
\starttext
Number test: 0123456789
\setupbodyfont [teletypenumbers]
Number test: 0123456789
\stoptext