Latex使用CJK包添加字体

发布时间:2022-06-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了Latex使用CJK包添加字体脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

最近写论文时有个中文期刊提供的latex模板使用CJK宏包,大致是这样的:

documentclass{article}
usepackage{CJK}

begin{document}
begin{CJK*}{GBK}{song}
你好!
...
end{CJK*}
end{document}

用pDFlatex编译一直报错,类似如下的错误:

kpathsea: Running mktexpk --mfmode / --bdpi 600 --mag 1+120/600 --dpi 720 gbk40
mktexpk: don't know how to create bITmap font for gbk40.
kpathsea: ApPEnding font creation commands to missfont.LOG.

感觉是缺少字体,但是又不知道这个gbk40是个什么东西。查了好久才知道是缺少GBK编码的song字体(注意不是宋体,是song体,这个看到后面就会明白)。而且很多资料都建议使用xelatex,因为它可以使用系统字体,pdflatex+CJK系统已经接近淘汰了。然而毕竟是论文投稿,为了保险起见,希望还是可以使用pdflatex编译通过。pdflatex跟xelatex编译出来的文件可能格式上略有不同,这个是我以前遇到过的。再次查阅好久,很多字体生成教程已经很久远了,大多是零几年的教程,gbkfont之类的软件都不知道上哪里找。最后发现知乎上有一篇文章步骤比较完整,而且版本也比较新。经过尝试,还是踩了几个坑。这里详细记录一下。

文本编码

针对中文,CJK规定了四种编码:UTF8(C70), GBK(C19), GB(C10), Bg5(C00)。至于用处,那篇文章中有介绍:

它(CJK宏包)发现“您”,它就会把字体设置为 gbksong51, 然后取里面的第115个字符。为了达到这个目的,它把我们的汉字变成了 C19/song/m/n/10/51 s, C19/song/m/n/10/51 表示用 GBK 编码(C19) 的 song 体,粗细为 medium(m), 而不是 bold, 形状为uPRight(n), 而不是 italic, 大小是 10pt, 子集号码 51. 这个描述会被 C19song.fd 这个字体描述文件映射为gbksong51. 因为 C19song.fd 里有这样一行:

DeclareFontShape{C19}{song}{m}{n}{<-> CJK * gbksong}{}

... 到这里就可以了,后边的用处不大,可以省略。

操作

1.安装Fontforge软件。

2.创建工作目录

mkdir font_gen,随便起个名字,作为工作目录。将需要安装的字体复制到这个目录。如:FZSong.ttf

3.复制相关文件

在texlive的安装目录找到这几个文件:subfonts.peUnicode.sfdUGBK.sfd并复制到上面那个目录。在texlive2019版本,这三个文件分别在:

./teXMf-dist/source/latex/cjk/utils/subfonts/subfonts.pe
./texmf-dist/fonts/sfd/ttf2pk/Unicode.sfd
./texmf-dist/fonts/sfd/ttf2pk/UGBK.sfd

使用find命令很方便就能找到。

4.建立字体文件

使用fontforge -script subfonts.pe FZSong.ttf song UGBK.sfd生成tfm文件和pfb文件。这个命令会产生四种文件,我们只会用到这两种。要生成UTF8编码的字体,使用Unicode.sfd文件。

另外,这里的song也可以改成其他名字,不过后续步骤也要修改相应的名称。比如说你这里不用song,用了个apple,那么以后所有文件中的song都要改成apple,尤其是在编写tex文件时,要写成:begin{CJK}{GBK}{apple}

5.建立描述文件

这里使用GBK编码,所以建立c19song.fd

% This is c19song.fd for CJK package.
% created by Edward G.J. Lee
ProvidesFile{c19song.fd}
DeclareFontFamily{C19}{song}{hyphenchar fontm@ne}
DeclareFontShape{C19}{song}{m}{n}{<-> CJK * song}{}
DeclareFontShape{C19}{song}{bx}{n}{<-> CJKb * song}{CJKbold}
endinput

这里的cxx要按对应编码修改。注意命名需要统一

6.建立映射文件

建立song.map文件,可以使用如下脚本快速生成:

#!/bin/bash
for i in *.tfm
do
  cat >> song.map << EOF
  ${i%.tfm} ${i%.tfm} < ${i%.tfm}.pfb
  EOF
done

7.建立本地字体文件夹结构

texlive的用户文件夹为~/texmf/,可以自定义配置或安装宏包,用kpsewhich -expand-VAR '$TEXMFHOME'查看当前用户的文件夹。

mkdir -p ~/texmf/fonts/map/dvips/CJK
mkdir -p ~/texmf/fonts/tfm/CJK/song
mkdir -p ~/texmf/fonts/type1/CJK/song
mkdir -p ~/texmf/tex/latex/CJK/GBK # 如果创建的是UTF8的字体,则创建一个UTF8目录

8.复制文件到对应目录

cp song.map ~/texmf/fonts/map/dvips/CJK
cp *.tfm ~/texmf/fonts/tfm/CJK/song
cp *.pfb ~/texmf/fonts/type1/CJK/song
cp c19song.fd ~/texmf/tex/latex/CJK/GBK

9.更新字体映射

sudo texhash
updmap -user --enable Map song.map

之后,pdflatex就能够成功编译了。

脚本宝典总结

以上是脚本宝典为你收集整理的Latex使用CJK包添加字体全部内容,希望文章能够帮你解决Latex使用CJK包添加字体所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。