在数学模式中替换希腊字母

在数学模式中替换希腊字母

我想换掉现代字体。我很确定我最终会得到多种字体。我无法提供所需功能的完整列表,但 Linux Libertine 的功能集几乎涵盖了所有功能。目前,它是我进行文本工作的基本字体,与 Linux Biolinum 一起使用。

不过,我需要调整数学字形。它们仍然取自 cm 字体,显然不适合。首先,我想使用 GFS 提供的那些,例如 GFS Bodoni(太好玩了)或 GFS Didot(均以 OTF 形式提供)。为了实现这个字形替换,我从其中一个 mathastext 示例开始:

\documentclass{article}

\usepackage[T1]{fontenc}
\renewcommand{\rmdefault}{bodoni}
\usepackage[LGRgreek,defaultmathsizes,italic]{mathastext}
\usepackage{libertine}
\let\varphi\phi
\linespread{1.06}

\begin{document}
  ff fi fj fi ffj fl ffl äÄ öÖ üÜ ß\\
  01234567890\\
  \begin{equation}
abcdefghijklmnopqrstuvwxyz
  \end{equation}
  \begin{equation}
\alpha \beta \gamma \delta
  \end{equation}
\end{document}

编译时没有任何错误,数学符号被 GFS Bodoni 中的符号替换,我得到了连字,正确的变音符号(这里出现了下一个问题:LL 提供了另一种 O-变音符号,我更喜欢它)。但是,我不知道如何从 LL 或 GFS Bodoni 访问文本图形,虽然两者都提供了它们。我的计划是将上述 mwe 转换为 LuaLaTeX 的有效代码,从而更好地控制字体选择。我失败了:

\documentclass{article}

\usepackage[no-math]{fontspec}
\renewcommand{\rmdefault}{bodoni}
\usepackage[LGRgreek,defaultmathsizes,italic]{mathastext}
\setmainfont{Linux Libertine O}
\setsansfont{Linux Biolinum O}

这将 mathnormal、mathrm、mathbf 和 mathit 设置为现代计算机(不好),但使用希腊字形(好)。使用的符号仍然取自 CM 字体,但我尚未尝试替换它们。我需要这样做,因为默认 int-symbol 的终端是球形的(例如)。

然后我找到了 unicode-math 包,但据我所知,它是用于提供完整 unicode 数学字母表的字体,而 GFS 字体则不提供。我尝试使用 unicode-math,但效果不如上面给出的示例。

最终,我需要一个字体选择程序,它不会被修改以适应某一特定情况。我想看看不同的字形在同一页上是如何协同工作的,我甚至可能会购买一种适合文本及其用途的字体,而不是由于我缺乏技能而导致的技术限制。我如何才能开发出一种选择字体和字形的程序,既强大又能给我所需的灵活性?

unicode-math 是可行的方法吗?


关于 \setmainfont 而不是 \renewcommand:我现在使用

\documentclass{article}
\usepackage{fontspec}
\setmainfont[%
]{GFSBodoni}
\usepackage[LGRgreek,defaultmathsizes,italic]{mathastext}

正如您所建议的,无论是否使用 fontspec 的无数学选项,lualatex 都会抱怨:

! Font \LGR/GFSBodoni(0)/m/it/7=grmn0700 at 7pt not loadable: metric data not found or bad.
! Font \LGR/GFSBodoni(0)/m/it/5=grmn0500 at 5pt not loadable: metric data not found or bad.

这些错误发生在

\begin{equation}
  abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ
\end{equation}

这可能是由于我使用了字体或 miktex 2.9 安装错误造成的。但是,生成了一个 pdf,具有以下特点:

  • 主要字体有GFS Bodoni,
  • 数学模式中的希腊字母是直立的,不再是 CM,但在GFS Bodoni 样本板也不知道它们从哪里来的。上面的序言是我使用的,它后面直接跟着 \begin{document}。

然后我从 GFS 网站下载了 otf 文件,并告诉 fontspec 直接使用它们。我甚至重命名了它们,以确保 lualatex 不会在其他地方找到任何其他 Bodoni 文件:

\setmainfont[%
  ItalicFont=GFS-Bodoni-Italic.otf,
  BoldFont=GFS-Bodoni-Bold.otf,
  BoldItalicFont=GFS-Bodoni-Bold-Italic.otf
]{GFS-Bodoni.otf}

我感到很困惑。我现在将按照您的建议,开始使用 unicode-math 进行同样的尝试。


unicode-math:在不同选项组合之间来回切换之后,我首先想到的是:

\documentclass{article}
\usepackage{unicode-math}
\setmathfont{XITS Math}
\setmainfont{Linux Libertine O}
\setsansfont{Linux Biolinum O}
\setmathfont[
    math-style=ISO,
    range=\mathit/{greek,Greek},
]{GFSBodoni-Italic}
\setmathfont[
    math-style=ISO,
    range=\mathrm/{greek,Greek},
]{GFSBodoni}

希腊字形现在已按预期替换。我可以用同样的技巧将拉丁字符更改为 Linux Libertine,使用两个新块和范围选项中的 {latin,Latin}。我最初的问题已经得到解答,因为我被鼓励使用 unicode-math。谢谢 Ulrike!

然而,探索仍在继续。使用 unicode 数学字体会留下不想要的数字,我也可以用 GFS Bodoni 或 Linux Libertine 中的数字替换它们。不幸的是,以下所有想法都行不通(第一个想法取自 unicode-math 文档):

\setmathfont[
  math-style=ISO,
  range=\mathit/{num},
]{Linux Libertine O}

\setmathfont[
  math-style=ISO,
  range=\mathrm/{num},
]{Linux Libertine O}

\setmathfont[
  math-style=ISO,
  range=\mathit/{"0030-"0039},
]{Linux Libertine O}

\setmathfont[
  math-style=ISO,
  range=\mathrm/{"0030-"0039},
]{Linux Libertine O}

一个主要缺点是我需要使用 unicode 数学字体,如上所示。目前我的选择仅限于 XITS、Asana Math 和(部分)Neo Euler。Neo Euler 似乎在缩放括号方面存在问题。除此之外,我并不喜欢这些选择中的任何一个,仅从更突出的数学符号(如 int、括号、n 元和和 n 元积符号)来判断,但这不是这个问题的重点。

答案1

在您的 lualatex 示例中,它将不起作用。它将查找不存在的 eu2bodoni.fd。在加载 mathattext 之前,\renewcommand{\rmdefault}{bodoni}使用合适的字体(如文档中所述)切换到您希望 mathastext 选择的字体。\setmainfont

除此之外:字体选择很大程度上取决于实际字体。替换字母和数字的字体相当容易,但当涉及到符号时,您需要一种或多种包含它们的字体,并且您可能需要调整各种字体尺寸。如果您真的想为符号使用另一种开放类型字体,我认为最好的选择是 unicode-math,但如果符号不存在,它就无法产生奇迹:

\documentclass{article}
\usepackage{unicode-math}
\setmainfont{Arial}
\setmathfont{Arial}
\begin{document}
$ a = \sin{0} \int \boxtimes \mp$
\end{document}

答案2

Ulrike 是对的。请注意,当 LuaLaTeX 抱怨并写入时, \LGR/GFSBodoni(0)/m/it/7=grmn0700grmn根本不是 GFS Bodoni。它是 Claudio Beccari cbfonts 中的一种字体,我猜它是从\DeclareFontShape{LGR}{lmr}{m}{n} 的声明中来lgrlmr.fd的。在某个时候,LuaLaTeX 没有找到 GFS Bodoni,所以尝试了 Latin Modern,在 LGR 编码中它找到了字体grmn。我对 LuaLaTeX 和 fontspec 了解不够,无法理解和/或解释更多。

另一方面,如果您的目标是使用 Bodoni 的希腊字形,同时又对 Linux Libertine 和 Biolinum 感到满意,那么您可以尝试以下操作:

\documentclass{article}

\usepackage[no-math]{fontspec}

\setmainfont{Linux Libertine O}
\setsansfont{Linux Biolinum O}

\usepackage[LGRgreek,defaultmathsizes,italic]{mathastext}
   \SetSymbolFont{mtlgrfontlower}{normal}{LGR}{bodoni}{m}{it}
   \SetSymbolFont{mtlgrfontupper}{normal}{LGR}{bodoni}{m}{n}
   \SetSymbolFont{mtlgrfontlower}{bold}{LGR}{bodoni}{\bfdefault}{it}
   \SetSymbolFont{mtlgrfontupper}{bold}{LGR}{bodoni}{\bfdefault}{n}

\begin{document}
abcd  $\mathrm{abcd}$ $\mathbf{abcd}$ 

\textit{abcd} $abcd$  $\mathnormal{abcd}$

\textsf{abcd} $\mathsf{abcd}$

$\alpha\beta\Gamma\Delta$
\end{document}

这是一种不同的方法,但存在缺陷:

\documentclass{article}

\usepackage[no-math]{fontspec}

\let\savedrmdefault\rmdefault
\renewcommand{\rmdefault}{bodoni}
\usepackage[LGRgreek,defaultmathsizes,italic]{mathastext}

%% at this stage the normal math version is not functional
%% because eu2bodoni.fd does not exist, but the Greek
%% letters are correctly set up.
\renewcommand{\rmdefault}{\savedrmdefault}

\setmainfont{Linux Libertine O}
\setsansfont{Linux Biolinum O}

\Mathastext[libertine]
%% We have to use it with the optional parameter, else it
%% will reset the Greek letters. Also make sure to have
%% version 1.14c of mathastext, and do not use LGRgreeks as
%% an option, but as done here LGRgreek. The LGRgreeks
%% option is for people who want the Greek font to be reset
%% in each math version.

\begin{document}
%% the first thing we do is to change the "normal"
%% (non-functional) for the "libertine" math version.
\Mathastextversion{libertine}

abcd  $\mathrm{abcd}$ $\mathbf{abcd}$ 

\textit{abcd} $abcd$  $\mathnormal{abcd}$

\textsf{abcd} $\mathsf{abcd}$

$\alpha\beta\Gamma\Delta$

\end{document}

缺陷是数学版本normalbold无法发挥作用。

顺便指出,对于mathastext字母表mathrm、和,mathbf必须引用数学模式中拉丁字母使用的字体。如果您想要其他字体,可以使用选项。或者,您可以在序言中自己设置字母表。还有一个限制,当它重新定义和时,这必须引用具有mathnormalmathitdefaultalphabetsmathastext\mathsf\mathtt相同的编码为数学模式下拉丁字母和数字使用的字体。

但是,既然我已经这样做了,为什么不厚颜无耻地为我的 libgreek 包做一些发布呢?

\documentclass{article}
\usepackage[no-math]{fontspec}
\setmainfont{Linux Libertine O}
\setsansfont{Linux Biolinum O}

\usepackage{libgreek}
\usepackage[defaultmathsizes,italic]{mathastext}

\begin{document}
abcd  $\mathrm{abcd}$ $\mathbf{abcd}$ 

\textit{abcd} $abcd$  $\mathnormal{abcd}$

\textsf{abcd} $\mathsf{abcd}$

$\alpha\beta\Gamma\Delta$

\end{document}

然后一切都与 Libertine/Biolinum 有关!

答案3

我再次简要回复了在数学模式下用字体替换字形的可能用途和局限性mathastext:如文档中所述,mathastext主要涉及拉丁字母、数字和一些其他符号,几乎全部来自 Basic Latin-1。它还为希腊字形(无变音符号)提供了一些选项。关于您的初次尝试,使其工作的方法是:

\usepackage[no-math]{fontspec}

\renewcommand\rmdefault{bodoni}

\let\savedencoding\encodingdefault % EU2 with Luatex
\renewcommand\encodingdefault{T1}

\usepackage[LGRgreek,defaultmathsizes,italic]{mathastext}
\renewcommand\encodingdefault{\savedencoding}

\setmainfont{Linux Libertine O}
\setsansfont{Linux Biolinum O}

请注意,、、、mathrm都将使用 T1 编码的 Bodoni。将使用 T1 编码的 Latin modern sans。如果我们将 放在 之前,将尝试使用 OpenType Linux Biolinum,但采用不存在的 T1 编码(而不是 EU2)。mathitmathbfmathnormalmathsf\setsansfontmathastext\mathsf

另一方面,如果你输入:

\setmainfont{GFS Bodoni}
\setsansfont{Linux Biolinum O}
\usepackage[defaultmathsizes,italic]{mathastext}
\setmainfont{Linux Libertine O}

那么 OpenType Bodoni 将用于数学模式下的拉丁字母和数字,并且\mathsf将正确使用 OpenType Linux Biolinum。但无法使用 LGRgreek 选项,该选项将尝试加载不存在的 LGR/GFSBodoni(0) 字体,而不是 TeX 字体 LGR/bodoni。

简而言之,unicode-math这绝对是可行的方法,mathastext它不是为 Unicode 字体设计的,尽管它可以在其适度范围内与它们一起使用。

相关内容