设为首页收藏本站

CTEX社区

 找回密码
 注册
搜索
查看: 4548|回复: 4
打印 上一主题 下一主题

[求助中] 数学字体调用

[复制链接]

4

主题

0

好友

7

积分

新手上路

Rank: 1

跳转到指定楼层
1#
发表于 2010-1-31 03:57:52 |只看该作者 |倒序浏览
我读了LaTeX font Selection 那个教程,其中说到如何定义新的数学符号,要用\DeclareMathSymbol。比如\DeclareMathSymbol{\test}{\mathrel}{MnSymbolA}{0},然后用\test就能产生MnSymbolA字体下的箭头符号。这是我实验出来的。但是如果想要打出字体中包含的某个符号,最后的那个参数该怎样选择?

\DeclareMathSymbol {<symbol>} {<type>} {<sym-font>} {<slot>}
我如何知道哪一个特定符号的到底在哪个slot?

还有,我想知道,如果对大部分数学符号我用默认字体,但某些特殊符号想用其它字体,比如我只想使用MnSymbol字体中的\ddots符号,但又不想加入MnSymbol这个宏包,有没有好的办法?

新手上路,请多多指教。

130

主题

0

好友

1万

积分

超级版主

圡人|无良吐槽水车

Rank: 8Rank: 8

2#
发表于 2010-1-31 23:45:35 |只看该作者
本帖最后由 milksea 于 2010-2-1 00:13 编辑

假定你已经有了字体文件(TeX 字体 metrics 文件 .tfm,加上 Type1 实际字体 .pfb,或者点阵字体 .pk,或者字体源文件 .mf)。

首先,你需要一个字体符号表。这个表可以通过各种途径得到,如使用一些字体查看软件(类似于 Windows 的字符映射表,fontforge 即有此功能)。比较方便的是使用 fonttable 宏包,可以指定实际字体名(即 .tfm 文件名),也可以指定 NFSS 下的字体族等。

其次,你需要确保字体已经按一般 NFSS 的方式安装,即存在对应的 .fd 文件。多数字体包是这样做的,如 txfonts 宏包就定义了一大堆这 .fd 文档(在 TEXMF 树的 tex/latex/txfont/ 目录);但也有的字体包把 .fd 文档中的字体定义命令放进了 .sty 宏包里,很不幸 MnSymbol 宏包就是这样做的,那么你就需要参照 fntguide 文档 4.2 Font definition file commands 中的介绍,自己定义对应的字体族、字型等。

第三,如果你要单独使用某个符号字体,那么你需要单独定义一个数字符号字体集,使用 fntguide 文档 3.5 Declaring symbol fonts 中介绍的命令。

最后,你需要定义具体你需要的符号,使用 fntguide 文档 3.6 Declaring math symbols 中介绍的命令。

完成这几个任务你就相当于为 LaTeX2e 安装了一套数字字体,过程是比较长的。不过对于已有宏包的数学字体,其中二、三、四几个步骤可以照抄你要复制的数学字体宏包。
入门文档网页搜索提问事宜
——milksea @ bbs.ctex.org

130

主题

0

好友

1万

积分

超级版主

圡人|无良吐槽水车

Rank: 8Rank: 8

3#
发表于 2010-1-31 23:56:47 |只看该作者
本帖最后由 milksea 于 2010-2-1 00:01 编辑

举个例子。你需要 MnSymbol 中的符号 \rightlsquigarrow。

查 mnsymbol 的代码(宏包文档里就有带说明的源代码),可以知道 \rightlsquigarrow 符号是 MnSynA 符号集中的。而 mnsymbol 宏包没有定义 .fd 档,所以字体集需要抄 mnsymbol.sty 中的定义:
  1. \DeclareFontFamily{U} {MnSymbolA}{}

  2. \DeclareFontShape{U}{MnSymbolA}{m}{n}{
  3.   <-6> MnSymbolA5
  4.   <6-7> MnSymbolA6
  5.   <7-8> MnSymbolA7
  6.   <8-9> MnSymbolA8
  7.   <9-10> MnSymbolA9
  8.   <10-12> MnSymbolA10
  9.   <12-> MnSymbolA12}{}
  10. \DeclareFontShape{U}{MnSymbolA}{b}{n}{
  11.   <-6> MnSymbolA-Bold5
  12.   <6-7> MnSymbolA-Bold6
  13.   <7-8> MnSymbolA-Bold7
  14.   <8-9> MnSymbolA-Bold8
  15.   <9-10> MnSymbolA-Bold9
  16.   <10-12> MnSymbolA-Bold10
  17.   <12-> MnSymbolA-Bold12}{}
复制代码
数学字体集的定义也一样搬过来,说明 MnSyA 就是使用的 MnSymbolA 这个 family:
  1. \DeclareSymbolFont{MnSyA} {U} {MnSymbolA}{m}{n}
复制代码
查清、定义清楚字体,现在可以回过头来生成一个字体符号表了(如果宏包文档里面有,可以不用自己生成)。在任意一个 TeX 文档中引入 fonttable 宏包,用
  1. \fonttable{MnSymbolA10}
复制代码
命令就可以得到字体符号表如下:
mnsymbol10.png

最后定义查到你的符号在位置 160。注意到这是一个数学关系符,即 \mathrel 决定的类型 3,故使用
  1. \DeclareMathSymbol{\rightlsquigarrow}{3}{MnSyA}{160} % 3 means mathrel
复制代码
就完成了符号的定义。
这里的位置 160 可以换成以单引号开头的八进制数 '240,或以双引号开头的十六进制数 "A0。还可以用以反引号开头的 ACSII 字符(不过这里 160 号字符是不可见字符)。

现在,你就可以使用 \rightlsquigarrow 这个命令了。
入门文档网页搜索提问事宜
——milksea @ bbs.ctex.org

130

主题

0

好友

1万

积分

超级版主

圡人|无良吐槽水车

Rank: 8Rank: 8

4#
发表于 2010-2-1 00:04:41 |只看该作者
顺便说一下 mnsymbol 宏包中看起来比较怪异的 \Decl@Mn@Char。这个命令没有指定符号的编码值,而是利用技巧从 LaTeX 本来定义好的符号中读取符号编码值,再用 \DeclareMathSymbol 完成定义。
入门文档网页搜索提问事宜
——milksea @ bbs.ctex.org

4

主题

0

好友

7

积分

新手上路

Rank: 1

5#
发表于 2010-2-2 14:49:14 |只看该作者
非常感谢,太牛了!原来是用\fonttable搞出来字符表的,以前从未听说过,学习了!
您需要登录后才可以回帖 登录 | 注册

手机版|Archiver|CTEX.ORG ( 京ICP备05002166号  

GMT+8, 2012-9-24 23:13 , Processed in 0.016935 second(s), 9 queries , Gzip On, Apc On.

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部