使用 Kurier 字体将数字转换为旧样式

使用 Kurier 字体将数字转换为旧样式

我正在尝试转换我无法控制的混合字符串的数字,比如说

+1 (234) 567 890 abcd

使用 kurier 字体时,会切换到旧样式。
我知道\oldstylenums,但它会切换到不支持“+”、“(”等符号的 OML 编码

尝试了几件事之后(比如用 xstring 解析字符串并用 \oldstylenums{number} 替换数字——我陷入了恼人的 TeX 扩展问题),我终于找到了一种方法,即重新定义普通的数学字体版本,并将数字声明为一种特殊的符号类别,即

\SetSymbolFont{operators}{normal}{T1}{kurier}{l}{n}
\SetSymbolFont{letters}{normal}{T1}{kurier}{l}{n}
\SetSymbolFont{symbols}{normal}{T1}{kurier}{l}{n}
\SetSymbolFont{largesymbols}{normal}{T1}{kurier}{l}{n}
\DeclareSymbolFont{numbers}{OML}{kurier}{l}{n}
\DeclareMathSymbol{0}\mathalpha{numbers}{"30}
\DeclareMathSymbol{1}\mathalpha{numbers}{"31}
\DeclareMathSymbol{2}\mathalpha{numbers}{"32}
\DeclareMathSymbol{3}\mathalpha{numbers}{"33}
\DeclareMathSymbol{4}\mathalpha{numbers}{"34}
\DeclareMathSymbol{5}\mathalpha{numbers}{"35}
\DeclareMathSymbol{6}\mathalpha{numbers}{"36}
\DeclareMathSymbol{7}\mathalpha{numbers}{"37}
\DeclareMathSymbol{8}\mathalpha{numbers}{"38}
\DeclareMathSymbol{9}\mathalpha{numbers}{"39}

然后我可以简单地使用$+1 (234) 567 890 abcde$。为了解决数学间距问题,我实际上这样做

$\StrSubstitute{+1 (234) 567 890 abcde}{ }{$ $}$

但这可能是很久以来我写过的最丑陋的黑客程序了……

关于如何以优雅的方式做到这一点有什么想法吗?

答案1

效率极低,但对于有限的使用来说可能还不错:

\documentclass[a4paper]{article}

\makeatletter
\newcommand{\pmos}{%
  \begingroup
  \pmos@assign{0}%
  \pmos@assign{1}%
  \pmos@assign{2}%
  \pmos@assign{3}%
  \pmos@assign{4}%
  \pmos@assign{5}%
  \pmos@assign{6}%
  \pmos@assign{7}%
  \pmos@assign{8}%
  \pmos@assign{9}%
  \catcode`0=\active
  \catcode`1=\active
  \catcode`2=\active
  \catcode`3=\active
  \catcode`4=\active
  \catcode`5=\active
  \catcode`6=\active
  \catcode`7=\active
  \catcode`8=\active
  \catcode`9=\active
  \@pmos}
\newcommand{\pmos@assign}[1]{%
  \begingroup\lccode`~=`#1\relax
    \lowercase{\endgroup\def~}{\oldstylenums{#1}}}
\newcommand{\@pmos}[1]{#1\endgroup}
\sbox0{\oldstylenums{0}}

\begin{document}
\pmos{+1 (234) 567 890 abcd}
\end{document}

\sbox0{\oldstylenums{0}}在 LaTeX 尝试使用字体之前\pmos(穷人的旧风格),可以确保加载正确的字体,因此请在执行此代码之前加载字体包。

答案2

您是否愿意并且能够从 (pdf)latex 切换到 XeLaTeX?(如果您运行的是 TeXLive2011 或 MikTeX2.9,则可以使用 XeLaTeX。)如果是这样,那么有个好消息:Kurier 字体系列以 OpenType 格式提供,因此可以非常直接地与 XeLaTeX 一起使用。以下 MWE 显示了如何使用 XeLaTeX 来实现您的目的:

% !TEX program = xelatex
\documentclass{article}
\usepackage[no-math]{fontspec}
\defaultfontfeatures{Ligatures=TeX,
   Numbers={OldStyle,Proportional}}
\setmainfont{Kurier} 
\begin{document}
+1 (234) 567 8900 abcd
\end{document}

在此处输入图片描述

相关内容