给定一个任意的细垂直符号,我可以从中创建一个新的数学分隔符吗(如果可以,如何创建)?
编辑:理想情况下,我希望能够创建一个可扩展的符号,要么构建现有的普通符号,要么从头开始创建。
编辑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 使用文件tfm
而modcmex10
不是,并使用修改后的文件cmex10
的常用字形。环境和内部使用和,因此显然我重新定义了这些可扩展分隔符。cmex10.pfb
tfm
amsmath
pmatrix
Vmatrix
\left(...\right)
\left\|...\right\|
如何做到这一点?简短的回答是:在 Unix 类型的系统上,您只需运行以下脚本即可生成modcmex10
由两个文件组成的虚拟字体modcmex10.tfm
,modcmex10.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)
)
这意味着将同时使用字体cmex10
和cmsy10
,并且后者将按 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.41
和0.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
包的分隔符。