如何创建一个新的可扩展符号?

如何创建一个新的可扩展符号?

给定一个任意的细垂直符号,我可以从中创建一个新的数学分隔符吗(如果可以,如何创建)?

编辑:理想情况下,我希望能够创建一个可扩展的符号,要么构建现有的普通符号,要么从头开始创建。

编辑2:我很确定我想要的是如何.tfm为可扩展符号创建文件的解释(Werner 的回答描述了它的一般结构,但没有描述如何创建它)。


例如,假设我想使用\dagger( 在此处输入图片描述) 或\wr( 在此处输入图片描述) 符号作为分隔符,并编写如下表达式

\[\left\ldagger \sum_{n=1}^\infty a_n \right\rdagger\]

\vert符号会适当缩放。声明对称分隔符(如)与声明本质上具有不同“左”和“右”版本的分隔符(如[和)之间会有什么区别吗]

现在,即使不了解 TeX 的内部工作原理,我也能想象字体中必须包含大量信息,说明分隔符在不同情况下如何缩放,如果我尝试制作自己的分隔符,这些信息将不存在。我是否需要深入研究 FontForge 或同等软件来实现自定义分隔符,或者有没有更简单的方法?

答案1

斯科特·帕金全面的 LaTeX 符号列表识别节中可扩展分隔符的结构8.2 调整符号大小(第 100-102 页):

所有可变大小的分隔符都由相应的.tfm 文件定义,最多可分为五个段,如第 102 页的图 1 所示。顶部、中间和底部段的大小是固定的。顶部-中间和中间-底部段(限制为同一个字符)可根据需要重复多次,以达到所需的高度。

在此处输入图片描述

这只是提供信息,因为我不熟悉如何在文件中创建这些内容的过程.tfm

方便的是,scalerel提供\scaleleftright[<max width>]{<left obj>}{<stuff>}{<right obj>}(和类似的\stretchleftright)用于将<left obj>和缩放/拉伸<right obj>到高度<stuff>(如果需要且可选,则限制为宽度<max width>)。以下是一个简单的示例:

在此处输入图片描述

\documentclass{article}
\usepackage{scalerel}% http://ctan.org/pkg/scalerel
\begin{document}
\[ \stretchleftright{\dagger}{\displaystyle\sum_{i=1}^n i}{\dagger} \]
\[ \scaleleftright{\dagger}{\displaystyle\sum_{i=1}^n i}{\dagger} \]
\end{document}

答案2

好吧,您真的想知道如何使用tfm新的可扩展符号创建自己的文件吗?那么这里有一些解释。我只给出了一些玩具示例,使用标准的 Computer Modern 字体。这是我可以生成的输出;我不认为它很好或有用:

一些疯狂的可扩展分隔符

以下是 LaTeX 代码:

\documentclass[12pt]{article}
\usepackage{amsmath}
\DeclareFontShape{OMX}{cmex}{m}{n}{<->sfixed*modcmex10}{}
\pdfmapline{+modcmex10 CMEX10 <cmex10.pfb}
\begin{document}
\[
  \begin{pmatrix}
  1&0&0&0 \\ 0&1&0&0 \\ 0&0&1&0 \\ 0&0&0&1
  \end{pmatrix} +
  \begin{Vmatrix}
  1&0&0&0 \\ 0&1&0&0 \\ 0&0&1&0 \\ 0&0&0&1
  \end{Vmatrix}
\]
\end{document}

在第 3 行和第 4 行中,我告诉 LaTeX 使用文件tfmmodcmex10不是,并使用修改后的文件cmex10的常用字形。环境和内部使用和,因此显然我重新定义了这些可扩展分隔符。cmex10.pfbtfmamsmathpmatrixVmatrix\left(...\right)\left\|...\right\|

如何做到这一点?简短的回答是:在 Unix 类型的系统上,您只需运行以下脚本即可生成modcmex10由两个文件组成的虚拟字体modcmex10.tfmmodcmex10.vf这些文件是编译上述 LaTeX 代码所需的。谨防!  该虚拟字体提供了上面显示的三个可扩展分隔符,但它也会混淆许多其他分隔符。

# Create a patch file:
echo '22a23,29
> (MAPFONT D 0
>    (FONTNAME cmex10)
>    )
> (MAPFONT D 1
>    (FONTNAME cmsy10)
>    (FONTAT R 2)
>    )
106c113
<       (REP O 15)
---
>       (REP O 75)
314a322
>       (MID O 74)
324a333
>       (MID O 75)
423a433,437
>    (MAP
>       (SELECTFONT D 0)
>       (MOVELEFT R 0.1)
>       (SETCHAR O 74)
>       )
429,430c443,450
<    (CHARWD R 0.888891)
<    (CHARDP R 1.800018)
---
>    (CHARWD R 0.888892)
>    (CHARHT R 1.41)
>    (CHARDP R 0.41)
>    (MAP
>       (SELECTFONT D 1)
>       (MOVERIGHT R 0.08)
>       (SETCHAR O 172)
>       )' > cmex.diff
# Create modified cmex font:
tftopl $(kpsewhich cmex10.tfm) > modcmex10.vpl
patch modcmex10.vpl cmex.diff
vptovf modcmex10.vpl
rm cmex.diff
# Remove the following line if you want to study the virtual font:
rm modcmex10.vpl

虚拟字体如何工作?

作为基础cmex10.pl,我使用了 Computer Modern 字体的属性列表,其中包含可扩展符号。首先,我添加了以下行

(MAPFONT D 0
   (FONTNAME cmex10)
   )
(MAPFONT D 1
   (FONTNAME cmsy10)
   (FONTAT R 2)
   )

这意味着将同时使用字体cmex10cmsy10,并且后者将按 2 的倍数缩放。我\ddagger从这个双倍大小中取出cmsy10,并将其用作可扩展分隔符的组成部分的替换\|。在我的vpl文件(虚拟属性列表)中,这在以下几行中实现:

(CHARACTER O 15
   (CHARWD R 0.555557)
   (CHARDP R 0.600006)
   (VARCHAR
      (REP O 75)
      )
   )

这告诉我们,位置 15 中的字符是一个可变字符,它将由应从位置 75 中获取的 REPeatable 片段构造而成。(原始字体使用位置 15 本身。请注意,这些是八进制数,因此实际上它是第 13 和第 61 个位置!)位置 75 中有什么?答案可以在以下几行中找到:

(CHARACTER O 75
   (CHARWD R 0.888892)
   (CHARHT R 1.41)
   (CHARDP R 0.41)
   (MAP
      (SELECTFONT D 1)
      (MOVERIGHT R 0.08)
      (SETCHAR O 172)
      )
   (VARCHAR
      (REP O 167)
      )
   )

它是字体 的 172 号槽中的字符D 1,上面定义为cmsy10,所以它是双匕首。此外,该字符向右移动了一点。我不得不摆弄一下才能找到(相对)高度和深度1.410.41

TeX 如何选择合适的分隔符大小?

我们来看一下原文中的以下几行cmex10.pl

(CHARACTER O 0
   (CHARWD R 0.458336)
   (CHARHT R 0.039999)
   (CHARDP R 1.160013)
   (NEXTLARGER O 20)
   )

这说明(除其他事项外)插槽 0(左括号)中的字符在插槽 20 中具有更大的版本。越来越大的版本链通过插槽 20、22 和 40 继续延伸到插槽 60 中字符的最大版本。这就是您在我的虚拟字体的插槽 60 中找到的内容:

(CHARACTER O 60
   (CHARWD R 0.875003)
   (CHARHT R 0.039999)
   (CHARDP R 1.760019)
   (VARCHAR
      (TOP O 60)
      (MID O 74)
      (BOT O 100)
      (REP O 102)
      )
   )

它又是一个可变字符,由四种类型的部分组成:顶部、中间和底部部分,以及中间的可重复部分。我从插槽 74 添加了中间部分,这样你就得到了圆括号和大括号之间的这种混合。当 TeX 看到一个\left...\right构造时,它会遍历这一行越来越大的分隔符版本,直到找到一个足够大的版本。在最好的情况下,最后一个版本是可扩展的!

答案3

如果您需要某种意义上类似于扩展的现有分隔符\wr,则可以使用例如\leftwave\rightwave来自mathdesign包的分隔符。

相关内容