考虑这个例子
\documentclass[a4paper]{memoir}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage[T1]{fontenc}
\usepackage{kpfonts}
\begin{document}
\[
(\big(\Big(\bigg(\Bigg(
\]
\end{document}
这让我
将其与没有以下代码的相同代码进行比较:kpfonts
(
您将注意到,从到 的转变\big(
并没有那么明显。
有人知道这是否可以以某种方式改变吗?
跳跃使得这样的事情看起来很糟糕:
\[ \big\{ \{x\} : x \in X \big\} \]
下面 Steven 提供的解决方法似乎很有用
\newlength\axisht
\setlength{\axisht}{\dimexpr.5\ht\strutbox-.5\dp\strutbox}
\def\scalemathaxis#1#2{\raisebox{\dimexpr\axisht-#1\axisht}{\scalebox{#1}{$#2$}}}
\newcommand\mbigl[1]{\mathopen{\scalemathaxis{0.8}{\big#1}}}
\newcommand\mbigr[1]{\mathclose{\scalemathaxis{0.8}{\big#1}}}
\[ (\mbigl(\big( \]
将会给出更合理的中间步骤。
6 月 18 日更新。开发人员承认了这个问题,但没有时间去修复它。他最好的解决方案是从不同的字体中获取栅栏。这将需要重新映射正在使用的每一个栅栏,通过\DeclareMathDelimiter
合适的值,这还需要知道栅栏位于字体中的哪些位置。
答案1
查看转换成 PL 格式.tfm
的jkpex
(用于大符号的字体)文件,我们发现以下字符系列:
(CHARACTER O 0
(CHARWD R 0.381)
(CHARHT R 0.058499)
(CHARDP R 0.943999)
(NEXTLARGER O 20)
)
(CHARACTER O 20
(CHARWD R 0.395)
(CHARHT R 0.058499)
(CHARDP R 1.472)
(NEXTLARGER O 22)
)
(CHARACTER O 22
(CHARWD R 0.408)
(CHARHT R 0.058499)
(CHARDP R 1.982)
(NEXTLARGER O 40)
)
(CHARACTER O 40
(CHARWD R 0.422)
(CHARHT R 0.058499)
(CHARDP R 2.4885)
(NEXTLARGER C 0)
)
(CHARACTER C 0
(CHARWD R 0.441)
(CHARHT R 0.0259)
(CHARDP R 0.8335)
(VARCHAR
(TOP C 0)
(BOT O 100)
(REP C B)
)
)
故事到此结束:我们已经到达了由碎片构建括号的阶段。
\delcode
括号的 是,"28300
这意味着当 需要放大的开括号时\left
,TeX 将在"00
家族的位置中查找"3
。请注意\big
和 的朋友在内部使用\left
和。TeX 将从 位置开始并遵循 定义的字符系列,\right
尝试找到最适合的大小。"00
NEXTLARGER
如果我添加\showlists
你的数学显示,我\big(
发现
\OMX/jkp/m/n/10 ^^P
以下是相关诊断:
\mathopen
.\fam0 (
\mathord
.\hbox(10.1525+5.1525)x3.95
..\mathon
..\hbox(10.1525+5.1525)x3.95
...\hbox(0.58499+14.72)x3.95, shifted -9.5675
....\OMX/jkp/m/n/10 ^^P
...\vbox(8.46397+3.46396)x0.0
...\hbox(0.0+0.0)x0.0, shifted -2.5
..\mathoff
在 TeX 用于这些诊断消息的格式中,^^P
表示字符八进制 20。\Big(
我们得到
\OMX/jkp/m/n/10 ^^R
(八进制 22),\bigg(
我们得到
\OMX/jkp/m/n/10
(八进制 40,因为是空格所以什么都看不见),因为\Bigg(
我们得到
...\vbox(0.25899+27.43994)x4.40999, shifted -16.09047
....\hbox(0.25899+8.33499)x4.40999
.....\OMX/jkp/m/n/10 0
....\hbox(-0.19+2.93)x4.40999
.....\OMX/jkp/m/n/10 B
....\hbox(-0.19+2.93)x4.40999
.....\OMX/jkp/m/n/10 B
....\hbox(-0.19+2.93)x4.40999
.....\OMX/jkp/m/n/10 B
....\hbox(-0.19+2.93)x4.40999
.....\OMX/jkp/m/n/10 B
....\hbox(-0.19+8.33499)x4.40999
.....\OMX/jkp/m/n/10 @
(我展示了整个框,因为这证明了使用了内置括号)。
发生了什么? 最小的插槽被遗漏了。 字符太小,无法拾取。 这显然是字体中的一个错误; 我尝试了\delimitershortfall
和的各种组合\delimiterfactor
,但没有成功。
以下应该可以澄清这个问题。该amsmath
包重新定义了宏\big
等等;它使用一个钩子来重置bBigg
构建变体的数学支柱。如果我使用比通常计算结果更小的维度重新定义宏,则会选择正确的系列:
\documentclass[a4paper]{memoir}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{kpfonts}
\usepackage{amsmath}
\makeatletter
\def\resetMathstrut@{%
\setbox\z@\hbox{%
\mathchardef\@tempa\mathcode`\(\relax
\def\@tempb##1"##2##3{\the\textfont"##3\char"}%
\expandafter\@tempb\meaning\@tempa \relax
}%
\ht\[email protected]\ht\z@ \dp\[email protected]\dp\z@
}
\renewcommand{\big}{\bBigg@{0.99}}
\makeatother
\begin{document}
\[
(\big(\Big(\bigg(\Bigg(%\showlists
\]
\end{document}
您可以清楚地看到前两个括号是不同的:第一个是来自普通字体,第二个是从插槽中拾取"00
的jkpex
。您可以清楚地看到它的大小是几乎一模一样与普通括号相同。这就是为什么它不会被选中,除非\big
执行重新定义的狡猾技巧;但即使选择了它,它也是无用的,因为它实际上并不比普通括号大。
因此,主要问题是正常括号太大;其实这不是问题,因为数学支柱的设置可以如图所示进行修复。但变\big
体应该更大。
答案2
完全修改的答案:
在我最初的困惑消退之后,关于 OP 是否对字形不满意(不)或字形大小不满意(是),在与他的离线讨论中,我意识到关键是尺寸括号中的\big
,以及我们意识到阻碍轻松修复的问题是简单的缩放不能保留数学轴。
因此,在这个解决方案中,我创建了宏\scalemathaxis{number}{math expression}
来缩放字形,同时保留数学轴。虽然\scalemathaxis{0.85}{\big(}
每次想要稍微小一点时都输入内容\big(
显然会很繁琐,但如果需要,可以直接将其放入宏中。
这里的关键是认识到数学轴位于.5\ht\strutbox-.5\dp\strutbox
基线上方的高度。
\documentclass[a4paper]{memoir}
\usepackage[utf8]{inputenc}
\usepackage{amsmath,graphicx}
\usepackage[T1]{fontenc}
\usepackage{kpfonts}
\newlength\axisht
\setlength{\axisht}{\dimexpr.5\ht\strutbox-.5\dp\strutbox}
\def\scalemathaxis#1#2{\raisebox{\dimexpr\axisht-#1\axisht}{\scalebox{#1}{$#2$}}}
\begin{document}
\fboxsep=0pt
\[
(\big(\Big(\bigg(\Bigg( \quad (^2\big(^2\Big(^2\bigg(^2\Bigg(^2
\]
\[
(\scalemathaxis{0.85}{\big(}\Big(\bigg(\Bigg( \quad
(^2\scalemathaxis{0.85}{\big(}^2\Big(^2\bigg(^2\Bigg(^2
\]
\end{document}