Mathastext:数学模式中的错误数字

Mathastext:数学模式中的错误数字

我使用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(在加载时)。在加载之后的mathastextMWE 中,此编码默认值为,因此,它不是将(由 Fourier 包为数字设置的)存储在自己的数字字体中以进行柔和模式,而是存储。这会导致:mathastextfontspecTU\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\encodingdefaultT1,不是 ,TU并且一切顺利。

我已经忘记了使用 的原理\encodingdefault。还有一些代码故意OT1T1if \encodingdefaultis替换OT1。所有这些都是在开发阶段完成的,mathastext当时它从未用 xelatex/lualatex/fontspec 进行过测试。

人们可以想象一下,对于 OP 的问题,在加载期间从 修改回,\encodingdefault但是TU从简单的代码来看,由于包代码中的其他一些用法,这会带来意想不到的后果。T1mathastextfontspec\encodingdefault

当然,也可以通过重新执行mathastexthack 来修复这个问题,但这段代码有点吓人。它看起来像这样:

\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仍然会更改一些数学模式字体指标衬线字体,但我可以忍受。

相关内容