动机

动机

动机

对于我的 CJK 文档,我将 TeX Gyre Termes(Times 克隆版)与来源宋体和 TeX Gyre Heros(Helvetica 克隆版)思源黑体。我还在使用MathTime 专业版 2我的公式的字体。但是,拉丁字母和数学字母看起来比 CJK 字符小,所以我需要放大前者。

  1. 罗马家族:四种 TeX Gyre Termes 字体中最大的大写字母高度为676/1000(TeX Gyre Termes bold),而 Source Han Serif 的大写字母高度为729/1000。因此缩放比例为1.078402(729/676) 即可。
  2. sans 家族:TeX Gyre Heros 的大写字母高度为729/1000,而 Source Han Sans 的大写字母高度为733/1000。因此,比例因子1.005487(733/729) 是合适的。
  3. 数学家族:比例因子为1.078402(与罗马家族相同)即可。

我的尝试

前两个请求可以通过一行代码来满足:

\usepackage[scaled=1.078402,helvratio=0.932386]{newtxtext}

其中 TeX Gyre Heroes 按比例加载1.078402*0.932386

mtpro2包没有附带scaled键值选项。为了满足第三个请求,我采取了手动解决方案:\DeclareMathSizes。并且,根据这个答案amsmath应加载该包以使用数学中适当调整大小的文本字体更改命令。但使用\DeclareMathSizes会导致意外结果:

脚本中的奇怪缩放

通过扩展mtpro2 手动通过\DeclareMathSizes,缩放newtxtext 自动地通过scaled=并加载amsmath,我注意到数学脚本中存在奇怪的缩放行为。如果您希望重现以下结果,请确保NotoSerifCJKsc-[重量].otf已安装并请编译XeLaTeX

% Please install Noto Serif CJK SC and compile by XeLaTeX
\documentclass[zihao=5,fontset=none,no-math,linespread=1.25]{ctexart}
\usepackage[lite]{mtpro2}
% Scale up math sizes manually
% Based on \DeclareMathSizes{10.5bp}{10.5bp}{7pt}{5pt} from the CTeX classes
\DeclareMathSizes{10.5bp}{11.365687pt}{7.548817pt}{5.392012pt}
% Scale up Latin size automatically
\usepackage[scaled=1.078402,helvratio=0.932386]{newtxtext}
% Set up CJK font
\setCJKmainfont{Noto Serif CJK SC}
\usepackage{amsmath}
\usepackage[T1]{fontenc}
\usepackage{xcolor}

\newcommand{\measurement}[1]{%
  \setbox0=\hbox{#1}%
  #1 has width \the\wd0\relax}

\newcommand{\drawembox}[1]{%
  \setlength{\fboxrule}{.1pt}%
  \setlength{\fboxsep}{-\fboxrule}%
  \fbox{\rule[\dimexpr\the\fontdimen22#1-.5\fontdimen6#1\relax]{0pt}{\the\fontdimen6#1\relax}%
        \rule{\the\fontdimen6#1\relax}{0pt}}}
\newcommand{\drawcapline}[1]{%
  \leavevmode\rlap{\color{red}%
    \rule[\dimexpr#1-.05pt\relax]{\linewidth}{.1pt}}}

\newcommand*{\ideographicbaseline}{-.12}
\newcommand{\drawcembox}[1]{%
  \setlength{\fboxrule}{.1pt}%
  \setlength{\fboxsep}{-\fboxrule}%
  \fbox{\rule[\ideographicbaseline#1]{0pt}{#1}%
        \rule{#1}{0pt}}}

\begin{document}

$\null$%
\verb|\the\ccwd|: \the\ccwd\relax

\verb|\fontdimen6\font|: \the\fontdimen6\font\relax

\verb|\fontdimen6\textfont2|: \the\fontdimen6\textfont2\relax

\verb|\fontdimen6\scriptfont2|: \the\fontdimen6\scriptfont2

\verb|\fontdimen6\scriptscriptfont2|: \the\fontdimen6\scriptscriptfont2

\medskip

\hrule

\medskip

\noindent
\begin{minipage}{.333\linewidth}
\verb|$M$|:

\leavevmode\rlap{\drawembox{\textfont2}}%
\drawcapline{.675\fontdimen6\textfont2}%
\measurement{$M$}

\leavevmode\rlap{\drawembox{\textfont2}}%
\drawcapline{.675\fontdimen6\textfont2}%
\measurement{$\displaystyle M$}

\leavevmode\rlap{\drawembox{\textfont2}}%
\drawcapline{.675\fontdimen6\textfont2}%
\measurement{$\textstyle M$}

\leavevmode\rlap{\drawembox{\scriptfont2}}%
\drawcapline{.722\fontdimen6\scriptfont2}%
\measurement{$\scriptstyle M$}

\leavevmode\rlap{\drawembox{\scriptscriptfont2}}%
\drawcapline{.732\fontdimen6\scriptscriptfont2}%
\measurement{$\scriptscriptstyle M$}
\end{minipage}%
\begin{minipage}{.333\linewidth}
\verb|\textbf{M}|:

\leavevmode\rlap{\drawembox{\textfont2}}%
\drawcapline{.676em}%
\measurement{\textbf{M}}

\leavevmode\rlap{\drawembox{\textfont2}}%
\drawcapline{.676\fontdimen6\textfont2}%
\measurement{$\displaystyle\textbf{M}$}

\leavevmode\rlap{\drawembox{\textfont2}}%
\drawcapline{.676\fontdimen6\textfont2}%
\measurement{$\textstyle\textbf{M}$}

\leavevmode\rlap{\drawembox{\scriptfont2}}%
\drawcapline{.729\fontdimen6\scriptfont2}%
\measurement{$\scriptstyle\textbf{M}$}

\leavevmode\rlap{\drawembox{\scriptscriptfont2}}%
\drawcapline{.729\fontdimen6\scriptscriptfont2}%
\measurement{$\scriptscriptstyle\textbf{M}$}
\end{minipage}%
\begin{minipage}{.333\linewidth}
字:

\leavevmode\rlap{\drawcembox{\ccwd}}%
\measurement{字}

\leavevmode\rlap{\drawcembox{\ccwd}}%
\measurement{$\displaystyle\text{字}$}

\leavevmode\rlap{\drawcembox{\ccwd}}%
\measurement{$\textstyle\text{字}$}

\leavevmode\rlap{\drawcembox{\fontdimen6\scriptfont2\relax}}%
\measurement{$\scriptstyle\text{字}$}

\leavevmode\rlap{\drawcembox{\fontdimen6\scriptscriptfont2\relax}}%
\measurement{$\scriptscriptstyle\text{字}$}
\end{minipage}

\end{document}

脚本内的缩放不一致

我的观察

  1. \ccwd得出 CJK 字符的 em-box 大小:10.5bp = 10.539375pt
  2. 前 3 行:对于\displaystyle\textstyle,拉丁字母大写字母框和数学字母大写字母框均按照 进行正确缩放1.078402,符合预期。
    • 数学时间专业版 2:设计的大写高度为675/1000,手动缩放后,缩放后的大写高度与数学公式和比例分别\ccwd0.6750.72792(0.675*729/676),符合预期。
    • TeX Gyre Termes 粗体:设计的大写字母高度为676/1000。自动缩放后,缩放后的大写字母高度与拉丁字母 em 和 的比例分别\ccwd0.6760.729,符合预期。
  3. 正如预期的那样,前三行的 6 条大写线几乎没有任何区别,尽管 MathTime Pro 2 的线实际上略低一些。
  4. 第四行: 因为\scriptstyle,看起来所有 em-box 的大小都相同,如声明的那样,意思是:数学 em = 拉丁语 em = \ccwd
    • 数学时间专业版 2:设计的大写字母高度为722/1000,其与 (= math em) 的比率\ccwd精确为0.722
    • TeX Gyre Termes 粗体:设计大写字母高度为676/1000,但实际大写字母高度与拉丁字母 em (= \ccwd) 的比率以某种方式变成 0.729!看起来字形被放大了,1.078402但不知何故,全角框保持相同的大小。为什么?
    • 数学上限线略低于拉丁上限线:0.722<0.729。
  5. 第五行: 因为\scriptscriptstyle,似乎所有 em-box 的大小都相同,如声明的那样
    • 数学时间专业版 2:设计的大写字母高度为732/1000,其与 (= math em) 的比率\ccwd精确为0.732
    • TeX Gyre Termes 粗体:同样,实际大写字母高度与拉丁字母 em (= \ccwd) 的比率以某种方式变成 0.729! 为什么?
    • 数学大写线略高于拉丁大写线(如果 PDF 放大 6400%,则按像素计算):0.732>0.729。

概括

MWE 中绘制了 15 个字形,除 2 外其中可以理解的是进行了缩放。中间列底部的 2 个字形似乎进行了缩放,但不知何故保持了其全角框不变。

纯属巧合(即使有前面提到的“错误”),实际的大写字母高度与\ccwd比率在 3 种字体和 3 种数学样式中出奇地接近,而这正是0.729最初的目标。

                     Table: Actual cap height to \ccwd ratio
---------------------------------------------------------------------------------
                    display/text style      script style     script script style
---------------------------------------------------------------------------------
 mtpro2             0.72792              0.722                0.732
 Termes bold        0.729                0.729*, why?         0.729*, why?
 Source Han Serif   0.729 (by design)    0.729 (by design)    0.729 (by design)
---------------------------------------------------------------------------------
* These should be 0.676, shouldn’t they?

添加于 2018 年 7 月 4 日:这是显示数学脚本中奇怪的缩放行为的完整表格。

扩展结果

如何正确地从newtxtext和放大字体mtpro2

我非常幸运,大写字母的高度都恰到好处。这是匹配上述字体的正确方法吗?更具体地说:

  1. 有没有更好的方法来扩展 MathTime Pro 2? 就像 一样使用它就好了\usepackage[scaled=1.1]{newtxmath}

    • 我愿意修改该mtpro2.sty文件,因为它包含许多已知问题。例如,这个答案由 @egreg 和此评论作者:@DavidCarlisle。

    • 事实上,重新定义\left\right会破坏\LEFTRIGHT命令访问大括号和大括号的功能。我通过替换解决了这个问题

        \def\PEX@#1{\setbox\Pbox@\vbox{$$\left.\vcenter{\copy\prePbox@}\right)$$}%
      

        \def\PEX@#1{\setbox\Pbox@\vbox{$$\originalleft.\vcenter{\copy\prePbox@}\originalright)$$}%
      
  2. 为什么不同数学样式的文本字体缩放不一致?

答案1

我想我终于找到了满意的答案。

  • 问题 1:有没有更好的方法来扩展 MathTime Pro 2?

    • A:是的!!!而且无需修改mtpro2.sty
  • 第二季度:为什么不同数学样式的文本字体缩放不一致?

    • A:不是。文本字体已缩放始终如一

      当内部\scriptstyle\scriptscriptstyle,索赔

      所有 em-box 的大小都相同,如声明的那样

      不对。事实上,拉丁文 em-box 的缩放比例由1.078402指定newtxtext。我错误地为拉丁文和 CJK 文绘制了数学 em-box,这导致了错误的观察。

边注:如果\usepackage[scaled=1.078402]{mtpro2}可能的话,它会让数学大写字母高度和 CJK em 之间的比例在 3 种数学样式中分别等于 和 (即 )。那么,最后两个比例可能无法与 Source Han Serif 很好0.727920.77861融合0.789391.078402 * <designed values>

我的实现

字体声明源代码可以找到这里在 CTAN 上。我们可以简单地覆盖 MathTime Pro 2 字体的加载方式。

MathTime Pro 2 的 68 种字体(完整版)。5 种字体mt2xlmt2exemt2xxxlmt2exf包含mt2exg超大括号、大括号、根号、积分等。这 5 种字体有绝对设计尺寸,所以他们不是需要进行扩展。

为了允许将不同的缩放因子应用于不同的光学尺寸,我创建了 3 个宏:\mtpscale@scaled\mtpscale@scriptscaled\mtpscale@scriptscriptscaled。这 3 个宏将应用于其他 63 种字体。虽然大符号mt2examt2bexamt2hexa没有光学尺寸,但它们也应该使用这 3 个不同的因子进行缩放。

\DeclareFontShape因此,我们需要覆盖的 的总数恰好是(63+3*2)/3 = 23。在这 23\DeclareFontShape个 中,其中 12 个写在文件中.sty,而另外 11 个写在四个.fd文件中。所以我们也需要文件\DeclareFontFamily中的四个.fd

% Please install Noto Serif CJK SC and compile by XeLaTeX
\documentclass[12pt]{article}
\usepackage[no-math]{xeCJK}
\setCJKmainfont{Noto Serif CJK SC}
\usepackage[scaled=1.0976331,helvratio=0.9160502]{newtxtext}
\usepackage[lite]{mtpro2}
\usepackage{amsmath}

% My implementation
\makeatletter
% Customize different scaling factors here
\newcommand*{\mtpscale@scaled}{1.0814815}
\newcommand*{\mtpscale@scriptscaled}{1.0124654}
\newcommand*{\mtpscale@scriptscriptscaled}{1}
% Fonts available in the `lite' version
% Source code found in `mtpro2.sty'
\DeclareFontShape{LMP1}{mtt}{m}{it}{%
  <-7> s*[\mtpscale@scriptscriptscaled] mt2mif
  <7-9> s*[\mtpscale@scriptscaled] mt2mis
  <9-> s*[\mtpscale@scaled] mt2mit}{}
\DeclareFontShape{LMP2}{mtt}{m}{n}{%
  <-7> s*[\mtpscale@scriptscriptscaled] mt2syf
  <7-9> s*[\mtpscale@scriptscaled] mt2sys
  <9-> s*[\mtpscale@scaled] mt2syt}{\skewchar\font32}
\DeclareFontShape{LMP3}{mtt}{m}{n}{%
  <-7> s*[\mtpscale@scriptscriptscaled] mt2exa
  <7-9> s*[\mtpscale@scriptscaled] mt2exa
  <9-> s*[\mtpscale@scaled] mt2exa}{}
\DeclareFontShape{U}{mtt}{b}{n}{%
  <-7> s*[\mtpscale@scriptscriptscaled] mt2mbf
  <7-9> s*[\mtpscale@scriptscaled] mt2mbs
  <9-> s*[\mtpscale@scaled] mt2mbt}{}% (MJ)
% Fonts available in the `complete' version
\ifmtp@full
% Source code found in `mtpro2.sty'
\DeclareFontShape{LMP1}{mtt}{b}{it}{%
  <-7> s*[\mtpscale@scriptscriptscaled] mt2bmif
  <7-9> s*[\mtpscale@scriptscaled] mt2bmis
  <9-> s*[\mtpscale@scaled] mt2bmit}{}
\DeclareFontShape{LMP2}{mtt}{b}{n}{%
  <-7> s*[\mtpscale@scriptscriptscaled] mt2bsyf
  <7-9> s*[\mtpscale@scriptscaled] mt2bsys
  <9-> s*[\mtpscale@scaled] mt2bsyt}{\skewchar\font32}
\DeclareFontShape{LMP2}{mtt}{eb}{n}{%
  <-7> s*[\mtpscale@scriptscriptscaled] mt2hsyf
  <7-9> s*[\mtpscale@scriptscaled] mt2hsys
  <9-> s*[\mtpscale@scaled] mt2hsyt}{\skewchar\font32}
\DeclareFontShape{LMP3}{mtt}{b}{n}{%
  <-7> s*[\mtpscale@scriptscriptscaled] mt2bexa
  <7-9> s*[\mtpscale@scriptscaled] mt2bexa
  <9-> s*[\mtpscale@scaled] mt2bexa}{}
\DeclareFontShape{LMP3}{mtt}{eb}{n}{%
  <-7> s*[\mtpscale@scriptscriptscaled] mt2hexa
  <7-9> s*[\mtpscale@scriptscaled] mt2hexa
  <9-> s*[\mtpscale@scaled] mt2hexa}{}
\DeclareFontShape{U}{mt2sya}{m}{n}{%
  <-7> s*[\mtpscale@scriptscriptscaled] mt2syaf
  <7-9> s*[\mtpscale@scriptscaled] mt2syas
  <9-> s*[\mtpscale@scaled] mt2syat}{}%
\DeclareFontShape{U}{mt2sya}{b}{n}{%
  <-7> s*[\mtpscale@scriptscriptscaled] mt2bsyaf
  <7-9> s*[\mtpscale@scriptscaled] mt2bsyas
  <9-> s*[\mtpscale@scaled] mt2bsyat}{}%
\DeclareFontShape{U}{mt2sya}{eb}{n}{%
  <-7> s*[\mtpscale@scriptscriptscaled] mt2hsyaf
  <7-9> s*[\mtpscale@scriptscaled] mt2hsyas
  <9-> s*[\mtpscale@scaled] mt2hsyat}{}%
% Source code found in `umt2ms.fd'
\DeclareFontFamily{U}{mt2ms}{\skewchar\font42}%
\DeclareFontShape{U}{mt2ms}{m}{n}{%
  <-7> s*[\mtpscale@scriptscriptscaled] mt2mcf
  <7-9> s*[\mtpscale@scriptscaled] mt2mcs
  <9-> s*[\mtpscale@scaled] mt2mct}{}%
\DeclareFontShape{U}{mt2ms}{m}{it}{%
  <-7> s*[\mtpscale@scriptscriptscaled] mt2msf
  <7-9> s*[\mtpscale@scriptscaled] mt2mss
  <9-> s*[\mtpscale@scaled] mt2mst}{}%
\DeclareFontShape{U}{mt2ms}{b}{it}{%
  <-7> s*[\mtpscale@scriptscriptscaled] mt2bmsf
  <7-9> s*[\mtpscale@scriptscaled] mt2bmss
  <9-> s*[\mtpscale@scaled] mt2bmst}{}%
% Source code found in `umt2mf.fd'
\DeclareFontFamily{U}{mt2mf}{}%
\DeclareFontShape{U}{mt2mf}{m}{n}{%
  <-7> s*[\mtpscale@scriptscriptscaled] mt2mff
  <7-9> s*[\mtpscale@scriptscaled] mt2mfs
  <9-> s*[\mtpscale@scaled] mt2mft}{}%
\DeclareFontShape{U}{mt2mf}{b}{n}{%
  <-7> s*[\mtpscale@scriptscriptscaled] mt2bmff
  <7-9> s*[\mtpscale@scriptscaled] mt2bmfs
  <9-> s*[\mtpscale@scaled] mt2bmft}{}%
% Source code found in `umt2bb.fd'
\DeclareFontFamily{U}{mt2bb}{\skewchar\font45}%
\DeclareFontShape{U}{mt2bb}{m}{n}{%
  <-7> s*[\mtpscale@scriptscriptscaled] mt2bbf
  <7-9> s*[\mtpscale@scriptscaled] mt2bbs
  <9-> s*[\mtpscale@scaled] mt2bbt}{}%
\DeclareFontShape{U}{mt2bb}{m}{it}{%
  <-7> s*[\mtpscale@scriptscriptscaled] mt2bbif
  <7-9> s*[\mtpscale@scriptscaled] mt2bbis
  <9-> s*[\mtpscale@scaled] mt2bbit}{}%
\DeclareFontShape{U}{mt2bb}{b}{n}{%
  <-7> s*[\mtpscale@scriptscriptscaled] mt2bbdf
  <7-9> s*[\mtpscale@scriptscaled] mt2bbds
  <9-> s*[\mtpscale@scaled] mt2bbdt}{}%
% Source code found in `umt2hrb.fd'
\DeclareFontFamily{U}{mt2hrb}{\skewchar\font45}%
\DeclareFontShape{U}{mt2hrb}{m}{n}{%
  <-7> s*[\mtpscale@scriptscriptscaled] mt2hrbf
  <7-9> s*[\mtpscale@scriptscaled] mt2hrbs
  <9-> s*[\mtpscale@scaled] mt2hrbt}{}%
\DeclareFontShape{U}{mt2hrb}{m}{it}{%
  <-7> s*[\mtpscale@scriptscriptscaled] mt2hbif
  <7-9> s*[\mtpscale@scriptscaled] mt2hbis
  <9-> s*[\mtpscale@scaled] mt2hbit}{}%
\DeclareFontShape{U}{mt2hrb}{b}{n}{%
  <-7> s*[\mtpscale@scriptscriptscaled] mt2hrbdf
  <7-9> s*[\mtpscale@scriptscaled] mt2hrbds
  <9-> s*[\mtpscale@scaled] mt2hrbdt}{}%
\fi
\makeatother

\begin{document}
$M\text{M字}_{M\text{M字}_{M\text{M字}}}$.
\end{document}

瞧!

缩放后

以下是未缩放时的输出:

缩放之前

我的解决方案也可以应用于这个问题

答案2

这种方法允许您使用现代 OpenType 字体,并尽可能为您自动缩放尽可能多的字体。

它仍然使用ctexatdocumentclass,但设置了字体,mathspec以便您仍然可以将 OTF 文本字体与您选择的数学字体一起使用。由于您使用的是newtxtext,我使用 newtx 集合中的 OpenType 版本的 Termes,但如果不需要,您可以替换任何其他字体。我还用文本字体替换了字母和数字,以便文本模式和数学模式下的数字匹配。(如果您宁愿使用 OTF 数学字体,您可以加载,unicode-math数学字体也会自动缩放。)

为了加载旧式数学字体,本文档计算了文本字体和数学字体的 x 高度比,以及主数学字体、脚本字体和脚本-脚本字体的字体大小。您将需要使用您的软件包支持的任何选项来缩放它,直到 x 高度比为 1.0。(之后我没有费心删除虚假的 pt。)

由于我没有您选择的商业字体,因此我用newtxmath这个示例来代替。

% Please install all the fonts needed, and compile by XeLaTeX
\RequirePackage[no-math]{fontspec} % Workaround for option clash
\documentclass[zihao=5,fontset=none,no-math,linespread=1.25]{ctexart}
\usepackage{amsmath}
%\usepackage[lite]{mtpro2} % I do not have these fonts to test.
\usepackage[scaled=1.05159]{newtxmath} % For testing purposes.
\usepackage{mathspec}

\defaultfontfeatures{Scale=MatchUppercase}
\setmainfont{TeXGyreTermesX} % Matches newtxtext.
\setCJKmainfont{Noto Serif CJK SC}
\setsansfont{TeX Gyre Heros}
\setCJKsansfont{Noto Sans CJK SC}
\setmonofont{Inconsolata}
\setCJKmonofont{Source Han Sans SC}

\newlength{\textxheight}
\newlength{\mathxheight}
\newlength{\xratio}

\settoheight{\textxheight}{x}
\settoheight{\mathxheight}{\(x\)}
\setlength{\xratio}{\dimexpr 1.0pt*(\numexpr\textxheight\relax)/(\numexpr\mathxheight\relax)\relax}

% Now that we’ve computed the ratio of x-heights, change the letters of the
% math font to match the text.  If you don’t want to, at least consider
% changing the digits.
\setmathsfont(Digits,Latin,Greek){TeXGyreTermesX}

\begin{document}
The ratio of the heights of x and \(x\) is {\the\xratio}.

I did not remove the spurious ``pt."  Thank e-tex.

Scale your math font until the above says 1.0pt.

\( \text{\the\fontdimen6\textfont2}_{\text{\the\fontdimen6\scriptfont2}_\text{\the\fontdimen6\scriptscriptfont2}} \)

\( \emptyset M\text{M字}_{\emptyset M\text{M字}_{\emptyset M\text{M字}}} \).
\end{document}

量表测试

还请注意,如果单一东亚文字不够用polyglossia,您可以切换不同的东亚文字。\setCJKmainfont

相关内容