我正在尝试转换我无法控制的混合字符串的数字,比如说
+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}