如何使用虚拟字体覆盖默认字体

如何使用虚拟字体覆盖默认字体

我的设置:TL 2014(与 Debian 8 一起打包)

我正在尝试创建虚拟字体并用其覆盖原始字体。想法是复制带有前缀“o”的原始字体的必要文件,并在虚拟字体中引用该文件。

所有文件都将在当前目录中进行测试:

mkdir mydir && cd mydir

复制要覆盖的默认字体:

cp `kpsewhich cmr10.tfm` ocmr10.tfm

创建虚拟字体(替换Mi):

tftopl cmr10 > cmr10.vpl
patch cmr10.vpl << EOF
0a1
> (MAPFONT D 0 (FONTNAME ocmr10))
564a566
>    (MAP (SETCHAR C i))
EOF
vptovf cmr10.vpl

创建测试文件并编译:

echo "\font\tenrm=cmr10 \tenrm M \bye" > test.tex
tex test.tex

现在,如果我们运行dvipdfmx test.dvi并查看生成的 pdf 文档,则一切都会正常处理,不会出现错误,但文档包含原始符号(即,好像没有使用虚拟字体)。如果我们直接通过 dvi 文件打开xdvi test.dvi,则会打印正确的符号,但会出现以下警告:

kpathsea: Running mktexpk --mfmode / --bdpi 600 --mag 1+0/600 --dpi 600 ocmr10
mktexpk: don't know how to create bitmap font for ocmr10.
mktexpk: perhaps ocmr10 is missing from the map file.
kpathsea: Appending font creation commands to missfont.log.

应该怎么做才能用虚拟字体覆盖默认字体,以便所有程序都可以处理它?

答案1

对于 dvipdfmx 来说,如果原始映射有效,则似乎不会读取 cmr10.vf。下面给出了 Igor 想要的输出:

\special{pdf:mapline -cmr10 CMR10 <cmr10.pfb}
\special{pdf:mapline +ocmr10 CMR10 <cmr10.pfb}
\nopagenumbers
\font\xxx=cmr10
\xxx M
\bye

答案2

免责声明:我不建议更改标准字体文件的度量,尤其是在系统级别。使用新的字体名称并配置 TeX 文件/包/... 以使用新的字体名称对我来说似乎是更干净的方法。


在虚拟字体中,ocmr10.tfm被引用。但只有度量值存在。需要实际的字体映射,但您无法使用原始字体cmr10,因为您已用cmr10.tfm修补的虚拟版本覆盖了该文件。

当使用 PDF 模式的 pdfTeX 时,从ocmr10.tfm到 Type 1 版本的映射很容易:

 \pdfmapline{+ocmr10 CMR10 <cmr10.pfb}

ocmr.map在其他情况下,需要包含内容的地图文件

ocmr10 CMR10 <cmr10.pfb

TeX 还不需要映射文件,因为它只使用 VF 和 TFM 文件,但驱动程序必须配置才能使用映射文件。但您要使用的每个驱动程序都必须进行相应的配置才能使用该.map文件。

或者,可以通过管理地图文件updmap,但这适用于整个 TeX 系统。

另一点是不同cmr10.tfm。因此必须配置 TeX 和驱动程序的搜索路径,以便首先找到正确的版本。

dvips

设置字体dvips相当复杂。

地图文件不能直接在命令行上给出,而是通过配置文件指定地图文件config.ocmr

    p -deletecm.map
    p +ocm.map

文件 filedeletecm.map包含 的旧条目cmr10

cmr10 CMR10 <cmr10.pfb

(为了进行实验,我使用了“p -cm.map”,它排除了所有 CM 字体)。cmr10必须删除此映射,否则不会查找虚拟字体,而是直接使用 PFB 字体文件。

配置文件在当前目录中无法直接找到,因此对 dvips 的调用需要改变环境变量TEXCONFIG,其中包括当前目录:

TEXCONFIG=:. dvips -P ocmr test

或者您可以创建一个 TDS 树,例如./texmf.home,将文件放入正确的子目录中。然后调用TEXMFHOME指向此 TDS 树的程序:

TEXMFHOME=./texmf.home tex test
TEXMFHOME=./texmf.home dvips -P ocmr test

答案3

作为评论有点长,所以我将其添加为答案。由于您似乎没有考虑字体指标,因此这里有一个示例向您展示您不能简单地交换字形。

以下文档仅使用一种“真实”字体:sftt1000.pfb。第一段使用普通罗马字体系列的度量来设置此字体,第二段使用 tt 字体的正确度量来设置此字体。

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{lipsum}
%replace the real font, needs pdflatex:
\pdfmapline{=ecrm1000 SFRM1000 " T1Encoding ReEncodeFont " <cm-super-t1.enc <sftt1000.pfb}
\begin{document}
\lipsum[1]

\ttfamily   
\lipsum[1]
\end{document}

在此处输入图片描述

答案4

警告
这会导致 TeX 安装不兼容。请先了解自己在做什么,然后再执行此操作。


感谢大家!在你们的回答的帮助下,我找到了解决方案。总结一下,以下是所有步骤:

所有文件都将在当前目录中进行测试:

mkdir mydir && cd mydir

复制要覆盖的默认字体:

cp `kpsewhich cmr10.tfm` ocmr10.tfm

创建虚拟字体(将 A 替换为 B):

笔记这个例子仅仅是为了演示基本原理,我们假设 tfm 文件中的度量已经与新的字形相对应(在真实情况下,它将正确创建包含几个“物理”字体的虚拟字体)。

tftopl cmr10 > cmr10.vpl
patch cmr10.vpl << EOF
0a1
> (MAPFONT D 0 (FONTNAME ocmr10))
482a4845
>    (MAP (SETCHAR C B))
EOF
vptovf cmr10.vpl

现在我们有vftfm文件cmr10

$ ls
cmr10.vf cmr10.tfm cmr10.vpl ocmr10.tfm

创建测试文件并编译:

笔记当我们重建格式时,该\font\tenrm=cmr10 \tenrm部分将不再需要,它在这里只是为了简化示例

echo "\font\tenrm=cmr10 \tenrm A \bye" > test.tex
tex test.tex

对于xdvi,将前者复制pk为新的ocmr10

cp `kpsewhich cmr10.pk` ocmr10.600pk

pk(如果给定字体没有-file,mf则复制 -file)

对于dvipdfmx,必须更改 map 文件。就我而言,我不需要保护系统树免受更新的影响,因此我只需更改 pdftex.map:

sudo perl -i -pe 's/^cmr10/ocmr10/' `kpsewhich pdftex.map`

现在检查一切是否正常:

$ xdvi test.dvi
$ dvipdfmx test.dvi
< view pdf file >

相关内容