这个问题很普遍,但出现的原因是我使用的是 Times 字体;在 CM 中,我不会进行这些更改。在 CM 中,分隔符的高度大于大写字母的高度,而在 Times 中,分隔符的高度相同。
我希望普通分隔符(例如()[]|\|\{\}\langle\rangle
)来自它们原来的相同字体,仅比正常字体大 1pt。当它是一个宏时,这并不太难,因为我可以重新定义它。|
我认为这只剩下 了。
我的限制如下(这正在一本已经写好的 720 页的书中使用,因此有些问题已经修复):它应该是(e)plain tex。我不想让任何这些字符处于活动状态,因为它们可能会导致某些宏出现问题(我有很多这样的宏)。我不介意使用新系列,但不想使用 2 个新系列。我确实有一个临时系列,用于通过宏定义的符号;该系列可以随时更改为 中的任何字体\hbox
。我不想用宏替换所有出现的分隔符。此外,我不想更改来自扩展字体(如\big(
)的分隔符。毫无疑问我可以创建新字体,但我不知道如何做到这一点,也不知道如何安装它们;此外,这会使其他人(例如我的合著者)更难访问TeX
书籍文件。
请注意()[]
来自 rm 字体,而其他来自 sy 字体。
为了处理前者,我可以使用以下命令,先建立一个新系列,该系列只是现有的 rm 系列,但大 1pt(这似乎很浪费,但有效):
\multiply\buildfam by "100
\count255=\mathcode`(
\advance\count255 by \buildfam
\mathcode`(=\count255
\count255=\mathcode`)
\advance\count255 by \buildfam
\mathcode`)=\count255
\count255=\mathcode`[
\advance\count255 by \buildfam
\mathcode`[=\count255
\count255=\mathcode`]
\advance\count255 by \buildfam
\mathcode`]=\count255
我可以对其他符号做类似的事情,但这需要一个新的符号系列。
即使如此,这也只在数学模式下有效;这是一个可以接受的限制,但并不完美。
下面显示了罗马字体的样子(前两个没有变化,第三个有变化):
为了进行比较,CM 看起来没有变化的样子如下:
作为替代方案,我很乐意提高这些分隔符的轴(事实上,使用更大的字体确实会提高轴),但更改\fontdimen22
仅考虑 ex 字体(在数学模式下),并且还会更改其他符号的轴。(CM 的分隔符比 Times 的分隔符具有更大的深度,以弥补其更大的高度,以保持轴不变。)
我也想对分隔符做同样的事情/
,但那是第三种字体,mi。
我发现我可以使用\mathcode="8000
仅在数学模式下激活字符。这似乎可以避免宏的任何问题,至少到目前为止是这样。此外,我不需要创建任何新的字体系列,即使是从头开始。例如,我可以执行以下操作:
\def\hboxmathit#1#2{\hbox{$#1#2$}}
{\catcode`|=\active
\gdef|{{\mathpalette\hboxmathit{\biggersize\vert}}}}
\mathcode`|="8000
这里,我已经定义了字体环境,例如\tenpoint
、\ninepoint
、\elevenpoint
(有时我想更改整体字体大小),并且有一个宏\biggersize
,它只是将字体环境增加 1。在本例中,我将整个内容放在一个额外的分组层中,因为它可以作为 的参数出现\mathopen
。它甚至在 之后也能工作\big
,尽管我不知道为什么。
但是,我不知道如何用 做类似的事情,\langle
以便它在 之后工作\big
。字符的扩展似乎\mathcode"8000
与宏的扩展发生的时间不同。例如,\big|
使用更简单的定义
\gdef|{{\hbox{$\biggersize\vert$}}}}
展开如下:
\big #1->{\hbox {$\left #1\vbox to8.5pt{}\right .\n@space $}}
#1<-|
\n@space ->\nulldelimiterspace \z@ \m@th
\m@th ->\mathsurround \z@
|->{\hbox {$\biggersize \vert $}}
...
\vert ->\delimiter "26A30C
另一方面,如果我尝试$\big{{\hbox{$\biggersize\vert$}}} X|$
,那么它会扩展为missing delimiter
:
\big #1->{\hbox {$\left #1\vbox to8.5pt{}\right .\n@space $}}
#1<-{\hbox {$\biggersize \vert $}}
! Missing delimiter (. inserted).
<to be read again>
{
<argument> {
\hbox {$\biggersize \vert $}}
\big #1->{\hbox {$\left #1
\vbox to8.5pt{}\right .\n@space $}}
l.183 $\big{{\hbox{$\biggersize\vert$}}}
X|$
? r
答案1
这个答案分为3个部分。
第1部分
就我最初的目的而言,这整个努力是没有必要的,因为事实上,我使用的 Times 字体确实有稍大的分隔符;它们只是在与我所知道的不同的位置。因此,只需重新定义它们就足够了。
第2部分
尽管如此,这里是如何实现剩余的分隔符的,我在问题中没有看到如何做到这一点。
它的工作原理是设置一个新字符,例如^^B
,与\langle
和并行|
,然后将定义\langle
为^^B
。因此:
\def\hboxmath#1#2{\hbox{$#1#2$}}
{\catcode`|=\active
\gdef|{{\mathpalette\hboxmath{\biggersize\vert}}}}
\mathcode`|="8000
\let\oldlangle=\langle
{\catcode`^^B=\active
\gdef^^B{{\mathopen{\mathpalette\hboxmath{\biggersize\oldlangle}}}}}
\catcode`^^B=12
\delcode`^^B="26830A
\mathcode`^^B="8000
\def\langle{^^B}
\let\oldrangle=\rangle
{\catcode`^^C=\active
\gdef^^C{{\mathclose{\mathpalette\hboxmath{\biggersize\oldrangle}}}}}
\catcode`^^C=12
\delcode`^^C="26830B
\mathcode`^^C="8000
\def\rangle{^^C}
相同的方法适用于\{
和\}
。
所有这些变化都会影响部首(例如\sqrt
),因为它们会给内部原子增加高度和深度。TeX 并不总是能很好地设置部首,尤其是在 displaystyle 中,高度可能会增加太多。(出现此问题的原因是扩展字体只能以离散增量扩展。)以下修复并不完美,但可以针对上述变化进行调整。(请参阅 TeXbook 附录 G 中的规则 11,其中仅在样式 D 和 D' 中,(1/4)\fontdimen5\textfont2
高度会增加,而不是(1/4)\fontdimen8\textfont3
原本会增加的高度。)它似乎效果不错。
\def\smftd{\dimen0=\fontdimen5\textfont2 \advance\dimen0 by
-2\fontdimen8\textfont3 \fontdimen5\textfont2=\dimen0 }
\def\rsftd{\dimen0=\fontdimen5\textfont2 \advance\dimen0 by
2\fontdimen8\textfont3 \fontdimen5\textfont2=\dimen0 }
\let\oldsqrt=\sqrt
\def\sqrt#1{\mathchoice
{\setbox0=\hbox{$\displaystyle #1$}\smftd
\hbox{$\displaystyle \oldsqrt{\box0}$}\rsftd }
{\oldsqrt{#1}}
{\oldsqrt{#1}}
{\oldsqrt{#1}}
}
第 3 部分
无论采用哪种解决方案,甚至在 CM 中,正如我所写,TeX 并不总是能很好地设置部首。这似乎是不可避免的,因为扩展字体是离散的。然而,在高度和深度之间进行权衡可以改善外观。
通过使用下列方法可以更快地进行这种微调,即使在 CM 中也很有用:
\def\updown#1#2#3{\vrule width0pt height #1 pt depth #2 pt \smash{#3}}
例如,\sqrt{\updown{7.5}{3.5}{1 - \Phi_E^2}}
。