kpfonts 与栅栏缩放

kpfonts 与栅栏缩放

考虑这个例子

\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 格式.tfmjkpex(用于大符号的字体)文件,我们发现以下字符系列:

(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尝试找到最适合的大小。"00NEXTLARGER

如果我添加\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}

在此处输入图片描述

您可以清楚地看到前两个括号是不同的:第一个是来自普通字体,第二个是从插槽中拾取"00jkpex。您可以清楚地看到它的大小是几乎一模一样与普通括号相​​同。这就是为什么它不会被选中,除非\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}

在此处输入图片描述

相关内容