XeTeX:结合 MathTime 和 Adobe 字体

忍了很久之后终于按捺不住诱惑,刚刚上手接触 XeTeX。选择字体实在太方便了,想想以前每次重配 LaTeX 安装字体时候花的功夫就觉得很崩溃…

现在好了,不管什么中文字体英文字体统统都是拿过来直接用,再也不用自己去生成 fontmap 之类的了。兴奋了一阵子之后,觉得要是能把 Arno Pro、Minion Pro 之类的字体融合到 MathTime 的符号多好… 可惜 fontspec 包对于数学的支持实在平平,作者另外搞了一个 unipre-math 据说不错,可是难道我们折腾半天就是为了用 Cambria Math?? 那么就自己来搞一下。

XeTeX 在 Windows 下的字体配置也很简单,只需要 fc-cache 一下,就可以用 fc-list 看到系统里面安装的字体了。MikTeX 2.8 把目录结构改了,虽然软件推荐另外找个目录,不过图省事,安装 MathTime Pro 就直接扔到 MikTeX 目录下。texhash 时候要加–admin 选项,否则这个目录就被它直接跳过去了。

首先不要让 fontspec 的数学模式插手了:

\documentclass[12pt,a4paper]{article}
\usepackage{mtpro}
\usepackage[no-math]{fontspec}

设置字体:Minion Pro/Myriad Pro

\setmainfont[]{Minion Pro}
\setsansfont[Mapping=tex-text]{Myriad Pro}

然后把所有的 letter 和 operator 全部重新定义一遍:

\DeclareSymbolFont{letters}{\encodingdefault}{\rmdefault}{m}{it}
\SetSymbolFont{letters}{bold}{\encodingdefault}{\rmdefault}{b}{it}
\DeclareSymbolFont{upright}{\encodingdefault}{\rmdefault}{m}{n}
\SetSymbolFont{upright}{bold}{\encodingdefault}{\rmdefault}{b}{n}
\DeclareSymbolFont{operators}{\encodingdefault}{\rmdefault}{m}{n}
\SetSymbolFont{operators}{normal}{\encodingdefault}{\rmdefault}{m}{n}
\SetMathAlphabetmathrm{normal}{\encodingdefault}{\rmdefault}{m}{n}
\SetMathAlphabetmathit{normal}{\encodingdefault}{\rmdefault}{m}{it}

注意这个 mathbf。如果直接把 mathbf 定义成 {\rmdefault}{bx}{it},那么拿到的是 MinionPro-Semibold。因为 Regular 的 bx 形式是 Semibold 而不是 Bold,Bold 则是另外一个字体。怎么才能知道合适的 family 值呢?(重新 setmainfont 之后用了 showrmdefault 看了一下…)

\setmainfont[]{Minion Pro Bold}
\SetMathAlphabetmathbf{normal}{\encodingdefault}{\rmdefault}{m}{it}
\setmainfont[]{Minion Pro}

由于已经回避了 fontspec 的数学处理,为了保险起见,整个把相关内容全部重定义:

\DeclareMathSymbol{!}{\mathclose}{upright}{33}
\DeclareMathSymbol{\mathrel} {upright}{58}
\DeclareMathSymbol{;}{\mathpunct}{upright}{59}
\DeclareMathSymbol{.}{\mathord}{upright}{46}
\DeclareMathSymbol{,}{\mathpunct}{upright}{44}
\DeclareMathSymbol{?}{\mathclose}{upright}{63}
\DeclareMathSymbol{0}{\mathalpha}{upright}{`0}
\DeclareMathSymbol{1}{\mathalpha}{upright}{`1}
\DeclareMathSymbol{2}{\mathalpha}{upright}{`2}
\DeclareMathSymbol{3}{\mathalpha}{upright}{`3}
\DeclareMathSymbol{4}{\mathalpha}{upright}{`4}
\DeclareMathSymbol{5}{\mathalpha}{upright}{`5}
\DeclareMathSymbol{6}{\mathalpha}{upright}{`6}
\DeclareMathSymbol{7}{\mathalpha}{upright}{`7}
\DeclareMathSymbol{8}{\mathalpha}{upright}{`8}
\DeclareMathSymbol{9}{\mathalpha}{upright}{`9}
\DeclareMathSymbol{+}{\mathbin}{upright}{43}
\DeclareMathSymbol{=}{\mathrel}{upright}{61}
\DeclareMathSymbol{.}{\mathord}{upright}{46}
\DeclareMathSymbol{,}{\mathpunct}{upright}{44}
\DeclareMathSymbol{}{\mathrel}{letters}{62}
\DeclareMathDelimiter{(}{\mathopen} {upright}{40}{largesymbols}{0}
\DeclareMathDelimiter{)}{\mathclose}{upright}{41}{largesymbols}{1}
\DeclareMathDelimiter{[}{\mathopen} {upright}{91}{largesymbols}{2}
\DeclareMathDelimiter{]}{\mathclose}{upright}{93}{largesymbols}{3}
\DeclareMathDelimiter{/}{\mathord}{upright}{47}{largesymbols}{14}
\DeclareMathSymbol{\mathdollar}{\mathord}{upright}{36}
\renewcommand{\vec}[1]{\mathbf{#1}}
\renewcommand{\partial}{\mathrm{∂}}
\renewcommand{\imath}{\mathit{ı}}
\renewcommand{\jmath}{\mathit{ȷ}}

\renewcommand{\alpha}{\mathit{α}}
\renewcommand{\beta}{\mathit{β}}
\renewcommand{\gamma}{\mathit{γ}}
\renewcommand{\delta}{\mathit{δ}}
\renewcommand{\epsilon}{\mathit{ε}}
\renewcommand{\zeta}{\mathit{ζ}}
\renewcommand{\eta}{\mathit{η}}
\renewcommand{\theta}{\mathit{θ}}
\renewcommand{\iota}{\mathit{ι}}
\renewcommand{\kappa}{\mathit{κ}}
\renewcommand{\nu}{\mathit{ν}}
\renewcommand{\xi}{\mathit{ξ}}
\renewcommand{\pi}{\mathit{π}}
\renewcommand{\rho}{\mathit{ρ}}
\renewcommand{\sigma}{\mathit{σ}}
\renewcommand{\tau}{\mathit{τ}}
\renewcommand{\upsilon}{\mathit{υ}}
\renewcommand{\phi}{\mathit{φ}}
\renewcommand{\chi}{\mathit{χ}}
\renewcommand{\Gamma}{\mathit{Γ}}
\renewcommand{\Delta}{\mathit{Δ}}
\renewcommand{\Theta}{\mathit{Θ}}
\renewcommand{\Xi}{\mathit{Ξ}}
\renewcommand{\Pi}{\mathit{Π}}
\renewcommand{\Sigma}{\mathit{Σ}}
\renewcommand{\Upsilon}{\mathit{Υ}}
\renewcommand{\Phi}{\mathit{Φ}}
\renewcommand{\varphi}{\mathit{ϕ}}
\renewcommand{\Lambda}{\mathit{Λ}}
\renewcommand{\Psi}{\mathit{Ψ}}
\renewcommand{\Omega}{\mathit{Ω}}
\renewcommand{\mu}{\mathit{μ}}
\renewcommand{\omega}{\mathit{ω}}
\renewcommand{\psi}{\mathit{ψ}}
\renewcommand{\lambda}{\mathit{λ}}
\renewcommand{\vartheta}{\mathit{ϑ}}
\renewcommand{\varsigma}{\mathit{ς}}
\renewcommand{\varpi}{\mathit{ϖ}}
\renewcommand{\varkappa}{\mathit{ϰ}}

\renewcommand{\upalpha}{\mathrm{α}}
\renewcommand{\upbeta}{\mathrm{β}}
\renewcommand{\upgamma}{\mathrm{γ}}
\renewcommand{\updelta}{\mathrm{δ}}
\renewcommand{\upepsilon}{\mathrm{ε}}
\renewcommand{\upzeta}{\mathrm{ζ}}
\renewcommand{\upeta}{\mathrm{η}}
\renewcommand{\uptheta}{\mathrm{θ}}
\renewcommand{\upiota}{\mathrm{ι}}
\renewcommand{\upkappa}{\mathrm{κ}}
\renewcommand{\upnu}{\mathrm{ν}}
\renewcommand{\upxi}{\mathrm{ξ}}
\renewcommand{\uppi}{\mathrm{π}}
\renewcommand{\uprho}{\mathrm{ρ}}
\renewcommand{\upsigma}{\mathrm{σ}}
\renewcommand{\uptau}{\mathrm{τ}}
\renewcommand{\upupsilon}{\mathrm{υ}}
\renewcommand{\upphi}{\mathrm{φ}}
\renewcommand{\upchi}{\mathrm{χ}}
\renewcommand{\upGamma}{\mathrm{Γ}}
\renewcommand{\upDelta}{\mathrm{Δ}}
\renewcommand{\upTheta}{\mathrm{Θ}}
\renewcommand{\upXi}{\mathrm{Ξ}}
\renewcommand{\upPi}{\mathrm{Π}}
\renewcommand{\upSigma}{\mathrm{Σ}}
\renewcommand{\upUpsilon}{\mathrm{Υ}}
\renewcommand{\upPhi}{\mathrm{Φ}}
\renewcommand{\upvarphi}{\mathrm{ϕ}}
\renewcommand{\upLambda}{\mathrm{Λ}}
\renewcommand{\upPsi}{\mathrm{Ψ}}
\renewcommand{\upOmega}{\mathrm{Ω}}
\renewcommand{\upmu}{\mathrm{μ}}
\renewcommand{\upomega}{\mathrm{ω}}
\renewcommand{\uppsi}{\mathrm{ψ}}
\renewcommand{\uplambda}{\mathrm{λ}}
\renewcommand{\upvartheta}{\mathrm{ϑ}}
\renewcommand{\upvarsigma}{\mathrm{ς}}
\renewcommand{\upvarpi}{\mathrm{ϖ}}
\renewcommand{\upvarkappa}{\mathrm{ϰ}}

这个过程看起来很傻… 不过反正最后都裹起来不给人家看到就是了…

中文的内容要放到这个之后,诸如

\usepackage[CJKaddspaces]{xeCJK}
\usepackage{xunipre}
\usepackage{xltxtra}

\setCJKmainfont{Adobe Song Std}
\setCJKsansfont{Adobe Heiti Std}
\setCJKfamilyfont{song}{Adobe Song Std}

\XeTeXlinebreaklocale "zh"
\XeTeXlinebreakskip = 0pt plus 1pt

看看效果

5 thoughts on “XeTeX:结合 MathTime 和 Adobe 字体

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.