动机
对于我的 CJK 文档,我将 TeX Gyre Termes(Times 克隆版)与来源宋体和 TeX Gyre Heros(Helvetica 克隆版)思源黑体。我还在使用MathTime 专业版 2我的公式的字体。但是,拉丁字母和数学字母看起来比 CJK 字符小,所以我需要放大前者。
- 罗马家族:四种 TeX Gyre Termes 字体中最大的大写字母高度为
676/1000
(TeX Gyre Termes bold),而 Source Han Serif 的大写字母高度为729/1000
。因此缩放比例为1.078402
(729/676) 即可。 - sans 家族:TeX Gyre Heros 的大写字母高度为
729/1000
,而 Source Han Sans 的大写字母高度为733/1000
。因此,比例因子1.005487
(733/729) 是合适的。 - 数学家族:比例因子为
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}
我的观察
\ccwd
得出 CJK 字符的 em-box 大小:10.5bp = 10.539375pt
。- 前 3 行:对于
\displaystyle
或\textstyle
,拉丁字母大写字母框和数学字母大写字母框均按照 进行正确缩放1.078402
,符合预期。- 数学时间专业版 2:设计的大写高度为
675/1000
,手动缩放后,缩放后的大写高度与数学公式和比例分别\ccwd
为0.675
和0.72792
(0.675*729/676),符合预期。 - TeX Gyre Termes 粗体:设计的大写字母高度为
676/1000
。自动缩放后,缩放后的大写字母高度与拉丁字母 em 和 的比例分别\ccwd
为0.676
和0.729
,符合预期。
- 数学时间专业版 2:设计的大写高度为
- 正如预期的那样,前三行的 6 条大写线几乎没有任何区别,尽管 MathTime Pro 2 的线实际上略低一些。
- 第四行: 因为
\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。
- 数学时间专业版 2:设计的大写字母高度为
- 第五行: 因为
\scriptscriptstyle
,似乎所有 em-box 的大小都相同,如声明的那样。- 数学时间专业版 2:设计的大写字母高度为
732/1000
,其与 (= math em) 的比率\ccwd
精确为0.732
。 - TeX Gyre Termes 粗体:同样,实际大写字母高度与拉丁字母 em (=
\ccwd
) 的比率以某种方式变成0.729
! 为什么? - 数学大写线略高于拉丁大写线(如果 PDF 放大 6400%,则按像素计算):0.732>0.729。
- 数学时间专业版 2:设计的大写字母高度为
概括
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
?
我非常幸运,大写字母的高度都恰到好处。这是匹配上述字体的正确方法吗?更具体地说:
有没有更好的方法来扩展 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)$$}%
为什么不同数学样式的文本字体缩放不一致?
答案1
我想我终于找到了满意的答案。
问题 1:有没有更好的方法来扩展 MathTime Pro 2?
- A:是的!!!而且无需修改
mtpro2.sty
!
- A:是的!!!而且无需修改
第二季度:为什么不同数学样式的文本字体缩放不一致?
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.72792
地0.77861
融合0.78939
。1.078402 * <designed values>
我的实现
字体声明源代码可以找到这里在 CTAN 上。我们可以简单地覆盖 MathTime Pro 2 字体的加载方式。
有MathTime Pro 2 的 68 种字体(完整版)。5 种字体mt2xl
、mt2exe
、mt2xxxl
和mt2exf
包含mt2exg
超大括号、大括号、根号、积分等。这 5 种字体有绝对设计尺寸,所以他们不是需要进行扩展。
为了允许将不同的缩放因子应用于不同的光学尺寸,我创建了 3 个宏:\mtpscale@scaled
、\mtpscale@scriptscaled
和\mtpscale@scriptscriptscaled
。这 3 个宏将应用于其他 63 种字体。虽然大符号mt2exa
、mt2bexa
和mt2hexa
没有光学尺寸,但它们也应该使用这 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 字体,并尽可能为您自动缩放尽可能多的字体。
它仍然使用ctexat
documentclass,但设置了字体,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