文本

文本

我想将 Minion Pro 字体与 MnSymbol 中的数学符号一起使用(http://www.ctan.org/tex-archive/fonts/mnsymbol)。这可能吗?这里已经讨论过了 ->http://www.latex-community.org/forum/viewtopic.php?f=48&t=16231。还没有找到解决方案,但这已经是两年前的事情了。

如果我理解正确,unicode-math 可以直接使用 OTF 字体。我想知道为什么这对 MnSymbol 不起作用。http://www.ctan.org/tex-archive/fonts/mnsymbol/otf您找到了 OTF 文件,但我不知道如何处理它们。 是否可以转换它们? 有什么想法吗?

这是一个例子。我没有安装 Minion Pro 作为系统字体,所以你可能需要调整路径。这个例子有效,但我想要类似“\setmathfont{MnSymbol.otf}”的“功能”。

% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{fontspec}
\usepackage{unicode-math}
\setmainfont[
    BoldFont       = MinionPro-Bold,
    BoldItalicFont = MinionPro-BoldIt,
    Extension      = .otf,
    ItalicFont     = MinionPro-It,
    Ligatures      = TeX,
    Path           = ../Font/MinionPro/
]{MinionPro-Regular}
\setmathfont{latinmodern-math.otf} % <-- here I want to use MnSymbol
\setmathfont[range=\mathup/{num,latin,Latin,greek,Greek}, Path = ../Font/MinionPro/]{MinionPro-Regular}
\setmathfont[range=\mathbfup/{num,latin,Latin,greek,Greek}, Path = ../Font/MinionPro/]{MinionPro-Bold}
\setmathfont[range=\mathit/{num,latin,Latin,greek,Greek}, Path = ../Font/MinionPro/]{MinionPro-It}
\setmathfont[range=\mathbfit/{num,latin,Latin,greek,Greek}, Path = ../Font/MinionPro/]{MinionPro-BoldIt}
\begin{document}
$\forall x$
\end{document}

答案1

请注意,这个解释实际上只是猜测。我对这些东西的工作原理了解不够,所以无法确定。买者自负。

如果能真正解决这个问题那就太好了。

我认为,真正的解决方案需要对 MnSymbol 的 opentype 版本进行相当大的扩展。(我将在下面解释原因 - 我并不是说覆盖范围不够。)

理论上,提到的 MnSymbol OpenType 版本应该允许适当的解决方案,对吗?

不,这是不正确的。

此外,如果能解释一下为什么设置 MinionPro+MnSymbol 一开始就不简单,那就太好了。毕竟,MinionPro+MnSymbol 可以在普通的 pdflatex 中使用,如果它不能在 lualatex 中使用,那将有点令人失望,因为 lualatex 应该可以改善字体的使用。

不幸的是,即使是文本,情况也更加复杂。数学的情况又要复杂好几倍。我从文本情况开始,因为它比较简单。

文本

XeTeX 和 LuaTeX 的作用是让您能够访问复杂的 opentype 字体中的所有功能。这对于提供对“常规”字体的访问来说非常棒。突然之间,您不需要任何特殊的支持包就可以使用系统中其他应用程序使用的相同字体来编写文本或数学运算。

缺点是 opentype 字体需要一些花哨的功能。例如:

$ otfinfo -f fonts/opentype/public/lm/lmroman10-regular.otf 
aalt    Access All Alternates
cpsp    Capital Spacing
dlig    Discretionary Ligatures
frac    Fractions
kern    Kerning
liga    Standard Ligatures
lnum    Lining Figures
onum    Oldstyle Figures
pnum    Proportional Figures
size    Optical Size
tnum    Tabular Figures
zero    Slashed Zero

因此,opentype 将允许您通过字体的功能访问旧式数字onum。这是什么意思?当然,这意味着字体具有相关字符。也就是说,它必须实际包含 0、1、2 等旧式数字。但它还需要做其他事情,正如以下屏幕截图所示fontforge

Latin Modern Roman

如果字体包含字符但不包含字体功能所需的映射onum,我们就会陷入困境。

相比之下,(pdf)TeX 无法使用没有专门支持文件的字体。这当然限制了您可以使用的字体。即使您知道如何自己准备这样的文件,这样做也很耗时且繁琐。

另一方面,字体本身需要提供的信息相对较少。本质上,它们需要提供字形(每个字符的图片)、每个字符的一些基本信息(宽度、高度等)以及理想的字距信息(说明当出现特定字符对时应如何调整间距),以及字体本身的一些一般信息(名称、编码、x 高度等)。如果其中一些信息有误,您实际上可以在准备支持文件时进行补偿。例如,您可以告诉 TeX 插槽 83 中的字符是逗号,即使字体本身声称它是大写字母 A。这需要更多工作,但这是可行的。

此外,任何花哨的功能都会在支持文件中指定。例如,假设您想要启用e.swash作为字尾花饰字符。在 opentype 字体中,您必须希望字体将其指定为字体功能的一部分,该功能可以通过 Xe/LuaTeX 直接访问。在 (pdf)TeX 中,您不必希望 - 没有意义。这无法在 type1 字体中指定,而且 (pdf)TeX 无论如何也无法使用该信息。相反,支持文件必须向 TeX 提供此信息。因此,无论谁编写了这些文件,都要指定相关的关系。

因此,对于 Xe/LuaTeX 和 opentype 字体(没有特殊解决方法等),责任很大程度上在于正确配置字体功能。Xe/LuaTeX 提供了一般的接口任何字体,只要字体具有相关功能

对于使用 type1(或 pdfTeX 的 truetype)字体的 (pdf)TeX,责任在很大程度上在于在 TeX 支持文件中配置的字体功能。这就是为什么编写一个包(例如)是有意义的,它提供对与cfr-lm完全相同的 type1 字体的访问lmoderncfr-lm提供对 不支持的字体功能的访问lmodern(这就是我编写它的原因)。

因此,LuaTeX 或 XeTeX 是否提供更好的访问在很大程度上取决于所讨论的字体。对于没有 TeX 支持文件或没有 type1/truetype 格式的字体,任何访问显然都是改进。对于具有复杂 TeX 支持包的字体,Lua/XeTeX 可能会也可能不会提供更好的访问,具体取决于

  • 涉及的 opentype 字体的功能
  • TeX 提供的支持中与所涉及的特定 type1/truetype 字体相关的任何一般限制
    • 例如,需要单一字体包含超过 256 个字符的功能
  • 所涉及的特定 type1/truetype 字体实际可用的支持文件中是否存在任何特定限制
    • 例如,lmodern虽然可以按照演示提供访问权限,但不能提供对旧式、比例数字的访问权限作为文本中的默认设置cfr-lm

数学

数学更复杂。(pdf)TeX 需要专门设计的字体专门的支持文件,以便正确排版数学。与文本情况不同,您无法尝试为任意字体创建支持文件。就字体本身而言,这里的问题主要与覆盖范围有关 - 您需要各种符号,并且它们需要组合在一起才能使整个字体正常工作。通常,只有为 TeX 设计的字体才具有这些。

Xe/LuaTeX 类似地需要覆盖,即所需的字符必须存在。但是,就像在文本情况下需要以相关字体特征的形式提供更多内容(例如onum),在数学情况下也需要更多内容。

据我了解,unicode-math它提供了对 Microsoft 为 Office 2007 开发的 opentype 规范的数学扩展的访问。这本质上定义了一些类似于文本的 opentype 功能,但针对的是数学。仅仅拥有具有 opentype 格式的必要字符的字体是不够的。字体还需要实现数学扩展的相关部分。

要查看问题,请考虑以下屏幕截图fontforge。这些屏幕截图是使用Element> Other Info> Math Info>拍摄的Exten Shapes。第一个显示了拉丁现代数学表格的一部分:

Latin Modern Math

第二个是 10pt 的 MnSymbol 表格:

MnSymbol

可以对这些字体的数学配置的其他方面进行类似的比较。

结论

总结一下,MinionPro + MnSymbol(pdf)TeX 对它的支持比 更好unicode-math。要直接与 Xe/LuaTeX 和 配合使用unicode-math,MnSymbol 的 opentype 版本需要进行扩展,以支持 opentype 数学扩展的相关部分。

后记

事实证明,OpenType 版本的 MnSymbol 与 LuaTeX 结合使用时还存在另一个问题,而这与其缺乏数学支持无关。这实际上是 LuaLaTeX 失败并出现致命错误的原因,而不仅仅是生成看起来很糟糕的 PDF。

以下 MWE 可用于重现错误:

\documentclass{article}
\usepackage{fontspec}

\newfontfamily \mymnsymbolfont {MnSymbol10.otf}

\begin{document}

\mymnsymbolfont +
\end{document}

LuaLaTeX 因致命错误而失败。XeLaTeX 可以正常编译文档。我不确定这是 LuaLaTeX 还是 MnSymbol 或两者的错误。使用 MdSymbol 的类似文档在两个引擎上都可以正常工作。

了解使用不支持数学的 OpenType 字体的效果

为了了解为什么不支持数学扩展的 opentype 字体无法直接使用,我将 MdSymbol 与 MinionPro 结合使用。以下示例将此组合与默认的 Latin Modern 与 Latin Modern Math 进行比较。

\documentclass{article}
\usepackage{amsmath}
\usepackage{unicode-math}
\begin{document}

\section*{Latin Modern with Latin Modern Math}

\begin{align*}
        p(A_j/B)  &= \frac{p(B/A_j) p(A_j)}{p(B)}\\
                  &= \frac{p(B/A) p(A)}{\sum_{i=1}^{n} p(B/A_i) p(A_i)}\\
\end{align*}
\[
    v( A_i ) = \sum_{j=1}^\mathrm{n} v(A_i | B_j) \times p(B_j)
\]
\begin{gather*}
    \max_{i=1,2} v(A_i|B_j) \neq \min_{i=1,2} v(A_i|B_j)\quad j=1,2\\
    \text{but}\;
    \bigl(\max_{i=1,2} v(A_i|B_2) - \min_{i=1,2} v(A_i|B_2)\bigr) > \bigl(\max_{i=1,2} v(A_i|B_1) - \min_{i=1,2} v(A_i|B_1)\bigr)
\end{gather*}


\setmainfont[
    Ligatures      = TeX,
]{Minion Pro}
\setmathfont{MdSymbol}
\setmathfont[range=\mathup/{num,latin,Latin,greek,Greek}]{MinionPro-Regular}
\setmathfont[range=\mathbfup/{num,latin,Latin,greek,Greek}]{MinionPro-Bold}
\setmathfont[range=\mathit/{num,latin,Latin,greek,Greek}]{MinionPro-It}
\setmathfont[range=\mathbfit/{num,latin,Latin,greek,Greek}]{MinionPro-BoldIt}

\section*{Minion Pro with MdSymbol}

\begin{align*}
        p(A_j/B)  &= \frac{p(B/A_j) p(A_j)}{p(B)}\\
                  &= \frac{p(B/A) p(A)}{\sum_{i=1}^{n} p(B/A_i) p(A_i)}\\
\end{align*}
\[
    v( A_i ) = \sum_{j=1}^\mathrm{n} v(A_i | B_j) \times p(B_j)
\]
\begin{gather*}
    \max_{i=1,2} v(A_i|B_j) \neq \min_{i=1,2} v(A_i|B_j)\quad j=1,2\\
    \text{but}\;
    \bigl(\max_{i=1,2} v(A_i|B_2) - \min_{i=1,2} v(A_i|B_2)\bigr) > \bigl(\max_{i=1,2} v(A_i|B_1) - \min_{i=1,2} v(A_i|B_1)\bigr)
\end{gather*}

\end{document}

Why opentype is not enough...

答案2

我只找到了一种针对 LuaLaTeX 的方法,虽然很混乱,但有效:

  1. 不加载unicode-math
  2. 加载amsmath和之后amsthm,加载fontspec
  3. 等之后\setmainfont{}\usepackage[retainmissing,abx]{MnSymbol}
  4. 例如,如果你想写$\sum 3x$,你就必须写$\sum \text{3}\textit{x}$,所以这就是丑陋的部分(我很确定这可以避免,但我缺乏必要的知识:/)

我希望它能有所帮助,并且我也对“干净”的解决方案非常感兴趣

编辑:使用 MdSymbol (对于 MyriadPro) 看起来相当不错:

\documentclass[tikz,border=0.125cm]{standalone}

\usepackage{fontspec} 
\usepackage{unicode-math}
\setmathfont{MdSymbol-Regular.otf}
\setmathfont[range=\mathup/{num,latin,Latin,greek,Greek}]{Minion Pro}
\setmathfont[range=\mathbfup/{num,latin,Latin,greek,Greek}]{MinionPro-Bold}
\setmathfont[range=\mathit/{num,latin,Latin,greek,Greek}]{MinionPro-It}
\setmathfont[range=\mathbfit/{num,latin,Latin,greek,Greek}]{MinionPro-BoldIt}
\setmathfont[range=\mathscr,StylisticSet={1}]{MinionPro-It}

\begin{document}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{equation}%
\sum\int a\otimes b \vec{c}
\label{eq:test}%
\end{equation}%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\end{document}

结果是https://www.dropbox.com/s/w3uck3t5qalgaok/test.pdf

答案3

您应该考虑购买 MinionMath,它实际上并不昂贵!

\documentclass{article}
\usepackage{unicode-math}
\setmainfont[
    BoldFont       = MinionPro-Bold,
    BoldItalicFont = MinionPro-BoldIt,
    ItalicFont     = MinionPro-It,
    Ligatures      = TeX,
]{MinionPro-Regular}
\setmathfont{MinionMath-Regular} 

\begin{document}
$\forall x$
\end{document}

enter image description here

voss@shania:~/tmp> pdffonts test.pdf
name                        type         encoding    emb sub uni object ID
--------------------------- ------------ ----------- --- --- --- ---------
WCXZLN+MinionMath-Regular   CID Type 0C  Identity-H  yes yes yes      4  0
BXDYTB+MinionPro-Regular    CID Type 0C  Identity-H  yes yes yes      5  0

相关内容