我使用fourier
和作为erewhon
我的主要(衬线)文本和数学字体。我想使用TeX Gyre Heros
无字体。因为这个字体不支持数学运算,所以我用mathastext
它来伪造它仅有的对于 sans 字体,无需改变衬线字型。
然而,尽管使用了subdued
选项mathastext
,它还是改变了衬线数学模式下的字体。
添加nodigits
选项可以mathastext
修复衬线字体的问题,但不再更改无衬线字体的数字。
有谁知道如何解决这一问题?
梅威瑟:
\documentclass{article}
\usepackage{fourier}
\usepackage[no-math]{fontspec}
\setmainfont{erewhon}
\usepackage[subdued,italic]{mathastext}
\setsansfont{Tex Gyre Heros}
\renewcommand\familydefault\sfdefault
\Mathastext[sans]
\renewcommand\familydefault\rmdefault
\begin{document}
123 $123$
\textsf{123 \MTversion{sans}{$123$}}
\end{document}
答案1
这似乎是一个错误mathastext
相对于其“柔和”模式。简要说明:mathastext
重新设置字母和数字以及一些 ASCII 字符的数学代码。添加“柔和”模式时,这不是通过恢复数学代码更改(该包不保留先前情况的记忆)来完成的,而是通过侵入 LaTeX 数学版本来完成的,以便字体可用于匹配原始的、未修改的字母或运算符字体。
由于某种原因我忘记了,在将原始的“字母”和“运算符”状态复制到mathastext
自己的数学组时,mathastext
故意将字体编码修改为\encodingdefault
(在加载时)。在加载之后的mathastext
MWE 中,此编码默认值为,因此,它不是将(由 Fourier 包为数字设置的)存储在自己的数字字体中以进行柔和模式,而是存储。这会导致:mathastext
fontspec
TU
\T1/futs/m/n
\TU/futs/m/n
LaTeX Font Warning: Font shape `TU/futs/m/n' undefined
(Font) using `TU/lmr/m/n' instead on input line 37.
这解释了数学模式下数字外观的改变。
如果 在mathastext
之前 加载fontspec
,并且在 之后fourier
,\encodingdefault
是T1
,不是 ,TU
并且一切顺利。
我已经忘记了使用 的原理\encodingdefault
。还有一些代码故意OT1
用T1
if \encodingdefault
is替换OT1
。所有这些都是在开发阶段完成的,mathastext
当时它从未用 xelatex/lualatex/fontspec 进行过测试。
人们可以想象一下,对于 OP 的问题,在加载期间从 修改回,\encodingdefault
但是TU
从简单的代码来看,由于包代码中的其他一些用法,这会带来意想不到的后果。T1
mathastext
fontspec
\encodingdefault
当然,也可以通过重新执行mathastext
hack 来修复这个问题,但这段代码有点吓人。它看起来像这样:
\documentclass{article}
\usepackage{fourier}
\usepackage[no-math]{fontspec}
\setmainfont{erewhon}
\usepackage[subdued,italic]{mathastext}
\makeatletter
\def\mst@reserved#1\getanddefine@fonts\symletters#2#3\@nil{%
\def\mst@normalmv@letter{#2}}
\expandafter\mst@reserved\mv@normal\@nil
\def\mst@reserved#1\getanddefine@fonts\symletters#2#3\@nil{%
\def\mst@boldmv@letter{#2}}
\expandafter\mst@reserved\mv@bold\@nil
\def\mst@reserved#1\getanddefine@fonts\symoperators#2#3\@nil{%
\def\mst@normalmv@operator{#2}}
\expandafter\mst@reserved\mv@normal\@nil
\def\mst@reserved#1\getanddefine@fonts\symoperators#2#3\@nil{%
\def\mst@boldmv@operator{#2}}
\expandafter\mst@reserved\mv@bold\@nil
%%
% \edef\mst@tmp{\encodingdefault} % NO!
\def\mst@reserved#1/#2/#3/#4/{\gdef\mst@debut{#1}\gdef\mst@reste{#2/#3/#4}}
\begingroup\escapechar\m@ne
% \xdef\mst@funnyoti{\expandafter\string\csname OT1\endcsname}
\expandafter\expandafter\expandafter
\mst@reserved\expandafter\string\mst@normalmv@operator/
\endgroup
% \ifx\mst@debut\mst@funnyoti\ifx\mst@tmp\mst@oti\def\mst@tmp{T1}\fi\fi
\edef\mst@normalmv@operator{\expandafter\noexpand\csname
%\mst@tmp/\mst@reste\endcsname}
\mst@debut/\mst@reste\endcsname}
\begingroup\escapechar\m@ne
\expandafter\expandafter\expandafter
\mst@reserved\expandafter\string\mst@boldmv@operator/
\endgroup
% \ifx\mst@debut\mst@funnyoti\ifx\mst@tmp\mst@oti\def\mst@tmp{T1}\fi\fi
\edef\mst@boldmv@operator{\expandafter\noexpand\csname
%\mst@tmp/\mst@reste\endcsname}
\mst@debut/\mst@reste\endcsname}
% \AtEndOfPackage{
\typeout{** ...correcting subdued mode...}
\expandafter\SetSymbolFont@ \expandafter\mv@normal\mst@normalmv@letter\symmtletterfont
\expandafter\SetSymbolFont@ \expandafter\mv@bold\mst@boldmv@letter\symmtletterfont
\expandafter\SetSymbolFont@ \expandafter\mv@normal\mst@normalmv@operator\symmtoperatorfont
\expandafter\SetSymbolFont@ \expandafter\mv@bold\mst@boldmv@operator\symmtoperatorfont
\typeout{** ...done.}
% }
\makeatother
\setsansfont{TeX Gyre Heros}
\renewcommand\familydefault\sfdefault
\Mathastext[sans]
\renewcommand\familydefault\rmdefault
\begin{document}
123 $123$
% \textsf{123 \MTversion{sans}{$123$}}
\MTversion{sans}
123 $123$
\MTversion{normal}
\thispagestyle{empty}\showoutput
\end{document}
当然,在序言中添加如此大的 hack 是不切实际的(我可以减小它的大小,但保持接近原始大小,只是在这里和那里进行修改)。希望一些更新可以mathastext
解决这个问题,但作者必须记住为什么首先坚持使用代码\encodingdefault
(一定有原因……)。
答案2
错误数字的问题已修复,如果mathastext
加载前 fontspec
:
\documentclass{article}
\usepackage{fourier}
\usepackage[subdued,italic]{mathastext}
\usepackage[no-math]{fontspec}
\setmainfont{erewhon}
\setsansfont{Tex Gyre Heros}
\renewcommand\familydefault\sfdefault
\Mathastext[sans]
\renewcommand\familydefault\rmdefault
\begin{document}
123 $123$
\textsf{123 \MTversion{sans}{$123$}}
\end{document}
然而,文件mathastext
明确指出,这不应该做(第 21 页)!
尽管修复了数字,但mathastext
仍然会更改一些数学模式字体指标衬线字体,但我可以忍受。