如果想要以“数学字体”排版但实际上以单个单词的形式出现的数学定义,那么在 LaTeX 中一个众所周知的技巧就是用 将其包围\mathit{}
。
例如,比较以下两种渲染functional typesetting
:
下面的图使用了\mathit{}
,这会产生将字符挤压在一起的效果。这在f
和之间尤其明显u
。
如果我们现在切换到eulervm
,我们希望实现同样的效果。遗憾的是,它实际上不起作用:
我们可以看到,顶部使用的是 Euler 字体。底部则不是,因为使用的是常规斜体文本字体。之前我们没有注意到这一点,因为数学和斜体文本的 CM 字体(几乎?)相同。
第一个问题是 Euler 是直立字体。因此,我们应该使用\mathrm
而不是\mathit
。
但这并没有改善情况,因为它仍然使用默认的文本字体。当然,我们可以尝试切换默认的文本字体,以找到更接近欧拉字符的字体。但是对于这种用例,应该使用哪种字体?有没有办法直接使用欧拉字体,但让它正确地调整字母的字距?
PS:应评论者要求,以下是两张图片使用的代码(区别在于一行):
\documentclass{article}
\usepackage{amsmath}
\usepackage{eulervm} % comment this line out for the first picture
\begin{document}
\begin{align*}
&functional\ typesetting\\
&\mathit{functional\ typesetting}\\
&\mathrm{functional\ typesetting} % bonus: using \mathrm, not shown in the pictures
\end{align*}
\end{document}
答案1
当 D. Knuth 创建他的 Computer Modern 系列时,他使用 Metafont 来渲染形状。此渲染的来源是“函数”(每个字母一个函数)。这些函数使用 Besier 曲线描述形状,并且还设置了度量值。这些函数依赖于许多全局参数。Computer Modern 系列中有 62 个全局参数。通过相同函数对参数值进行微小更改和渲染会导致不同的字体。例如\rm
,\bf
形状使用相同的源函数渲染,但全局参数不同。光学尺寸的创建思路相同:只更改全局参数。这意味着 Computer Modern 系列(其中有 75 种字体)中的不同字体是通过调整全局 Metafont 参数创建的,而不是仅使用线性变换。
Computer Modern 系列中有文本斜体字体:cmti10
和数学斜体字体cmmi10
。它们是不同的字体(它们使用不同的 Metafont 参数呈现),并且用于不同的目的。字体cmmi10
在数学模式下用于表示变量和其他数学内容,cmti10
字体用于斜体文本。您cmmi10
在第一行中显示(我们必须将您的行读作 f 乘以 u 乘以 n 乘以 c 等,因为它们是变量 f、u、n、c,如果它们一个挨着一个,那么它意味着数学公式中变量的乘积)。cmti10
第二行中显示(我们将其读作“功能排版”)。您可以看到,不仅空间不同,而且第一行中的形状也略宽(由于不同的 Metafont 参数值)。
Euler 字体仅用于数学公式,不用于文本。因此,只有数学字体zeurm10
,没有用于文本的替代字体。您可以尝试在文本中使用它,但必须\fontdimen
从另一种文本字体复制文本中使用的间距参数,因为这些参数在数学字体中为零:
\font\euler=zeurm10
\font\cmr=cmr10
This is normal text {\euler this is Euler without spacing parameters}.
\fontdimen2\euler=\fontdimen2\cmr % basic space
\fontdimen3\euler=\fontdimen3\cmr % stretching value
\fontdimen3\euler=\fontdimen4\cmr % shrinking value
\fontdimen7\euler=\fontdimen7\cmr % extra stretching value
And now: {\euler this is Euler with spacing parameters from cmr10}
\letterspacefont\eulersp\euler -30 % use it in pdfTeX only
\fontdimen2\eulersp=\fontdimen2\cmr % basic space
\fontdimen3\eulersp=\fontdimen3\cmr % stretching value
\fontdimen3\eulersp=\fontdimen4\cmr % shrinking value
\fontdimen7\eulersp=\fontdimen7\cmr % extra stretching value
And font: {\eulersp with smaller spaces between letters}
\bye
最后一个例子\eulersp
展示了如何设置字母之间的较小间距,这是文本字体所需要的。\letterspacefont
这里使用了 pdfTeX 原语。如果您使用的是其他 TeX 引擎,那么您必须使用不同的方法来设置字母间距。
由于 Euler 字体最初是用于数学排版,所以这里缺少一些文本排版所需的重要字符,例如逗号、点等。因此,如果您想在文本中使用 Euler 字体,则必须使用一种结合了各种原始字体的字母的虚拟字体。
答案2
使用@wipet 的技巧\letterspacefont
,可以构建以下命令:
\newcommand{\eulerrm}[1]{\mathchoice%
{{\letterspacefont\eulersp=\the\textfont1 -80\relax\text{\eulersp{#1}}}}%
{{\letterspacefont\eulersp=\the\textfont1 -80\relax\text{\eulersp{#1}}}}%
{{\letterspacefont\eulersp=\the\scriptfont1 -110\relax\text{\eulersp{#1}}}}%
{{\letterspacefont\eulersp=\the\scriptscriptfont1 -130\relax\text{\eulersp{#1}}}}}
只要数学字体是欧拉字体,此命令就可以在数学模式下使用,并将字符排版得更紧密。字母间间距减少的量由值 80(用于普通文本)、110(用于下标)和 130(用于双下标)定义。值为 80 表示字符间距缩小 8%。这些是我的个人偏好,您的情况可能会有所不同。
上面的命令非常 hack,但我找不到更好的方法。我很高兴能学到更好的方法。其中一个 hack 之处在于字符实际上是作为文本排版的,因此不支持在 \eulerrm 中使用数学运算。