我的设置:TL 2014(与 Debian 8 一起打包)
我正在尝试创建虚拟字体并用其覆盖原始字体。想法是复制带有前缀“o”的原始字体的必要文件,并在虚拟字体中引用该文件。
所有文件都将在当前目录中进行测试:
mkdir mydir && cd mydir
复制要覆盖的默认字体:
cp `kpsewhich cmr10.tfm` ocmr10.tfm
创建虚拟字体(替换M
为i
):
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
现在我们有vf
和tfm
文件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 >