LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2540|回复: 6

有没有人需要自动为Texlive2007安装UTF8中文字体的工具?(已上传)

[复制链接]
发表于 2007-6-25 12:08:36 | 显示全部楼层 |阅读模式
用Windows下的TTF字体生成供texlive2007使用的Unicode字体和GBK字体,兼容UTF8编码和GBK编码的Tex文件。
我已经装了simsun系列,华文系列,以及微软雅黑。

运行前提:已安装texlive2007,已安装fontforge。
使用方法:
解压之后,把要转换的TTF字体放进去。编辑font_list,默认内容如下:
produce: hei HeiTi from        simhei.ttf
produce: song SongTi from simsun.ttc
produce: kai KaiTi from        simkai.ttf
produce: li LiShu from simli.TTF
produce: fs FangSong from simfang.ttf
produce: you YouYuan from simyou.TTF
produce: yahei YaHei from 微软雅黑.ttf
produce: zhunyuan FangzhengZhunyuan from 方正准圆.TTF
produce: zhongsong HuawenZhongsong from 华文中宋.ttf
produce: stfs HuawenFangsong from 华文仿宋.ttf
produce: caiyun HuawenCaiyun from 华文彩云.ttf
produce: xinwei HuawenXinwei from 华文新魏.ttf
produce: hupo HuawenHupo from 华文琥珀.ttf
produce: xihei HuawenXihei from 华文细黑.ttf
produce: xingkai HuawenXingkai from 华文行楷.ttf
produce: stli HuawenLishu from 华文隶书.TTF

去掉行开头的p则程序运行时会略过相应行对应的字体。编辑完毕保存,在命令行运行begin
转换一个字体要五分钟左右。结束后在Mirror旁边生成一个文件夹texmf-var,
用它覆盖~/.texlive2007下面同名文件夹,以root身份运行texhash,再updmap即可,updmap也可用提供的register代劳。

整个程序分为“生成UTF8字体”“生成GBK虚拟字体”“生成Map”“生成.fd”几步,如果要略过某步,在"begin"这个主程序中注释掉相应行即可。
测试:
以雅黑为例,在Tex文档中引用该字体的方法为
\usepackage{CJKutf8}
……
\begin{CJK}{UTF8}{yahei}


下载:共1.9K http://www.fileden.com/files/2007/5/16/1083852/Mirror.tar.gz

相关说明:
我是按照yulewang的说明做的:http://mailboxpublic.googlepages.com/texlive2007cjkchinesehowto
他那个包只有教育网可以下载,所以我决定自己写个工具生成。
我的工作是用shell脚本把所有步骤自动化。
脚本中使用了gawk,sed,fontforge,如果要生成GBK编码字体则需要perl。
fontforge建议是2005年版本,具体在上面yulewang的链接里有。
发表于 2007-6-25 14:26:44 | 显示全部楼层
发上来总会有人需要的~~~
回复 支持 反对

使用道具 举报

发表于 2007-6-25 15:39:53 | 显示全部楼层
我从网上搜到的一个脚本用的是 ttf2pt1 和 afm2tfm,也是生成 UTF-8 的字体文件,效果不错。最早的版本在这里 http://www.study-area.org/tips/latex/pdftex.html

我先贴上修改过的用来生成 UTF-8 字体的版本(包含斜体支持),楼主可以比较下看看哪个更方便。
  1. #!/bin/sh
  2. #
  3. # Origin By Edward G.J. Lee 2001.11.25
  4. # http://www.study-area.org/tips/latex/pdftex.html
  5. # This code is Public Domain.
  6. #
  7. # Enhanced by intron AT intron DOT ac, 2006.1.9
  8. # Modified for NetBSD by jungle AT soforge DOT com, 2006.1.14
  9. # Italic support added by robert.zhangle AT gmail DOT com, 2006.5.19
  10. #
  11. # Modified for TeXLive 2005 by cyfdecyf AT gmail DOT com 2006.12.23
  12. #
  13. if [ $# -ne 3 ]
  14. then
  15.   cat << EOF
  16. Usage: `basename $0` font.ttf <TeX_Internal_Font_Name> <Tex_Font_Name>
  17.   <TeX_Internal_Font_Name>: Used to name *.enc, *.afm, *.pfb, *.tfm & *.map
  18.   <Tex_Font_Name>: Used in TeX source:   \CJKencfamily{UTF8}{Tex_Font_Name}
  19.   An example:  `basename $0`  gbsn00lp.ttf gbsn00lp songpt1
  20. EOF
  21.   exit 1
  22. fi
  23. if ! which ttf2pt1; then
  24.   echo "Please install ttf2pt1 before you can run me."
  25.   exit 1
  26. fi
  27. #if ! which t1asm; then
  28. # echo "Please install t1utils before you can run me."
  29. # exit 1
  30. #fi
  31. if ! which extconv; then
  32.   echo "Please CJK before you can run me."
  33.   exit 1
  34. fi
  35. cat <<EOF
  36. ***************************************************************************
  37. * Please confirm that current working directory is EMPTY except scripts   *
  38. * and HAS ENOUGH SPACE to contain so many intermediate files.             *
  39. * If it is not empty, this script may DAMAGE INNOCENT FILES!!!            *
  40. ***************************************************************************
  41. EOF
  42. #read -p "Go ahead?[n]" a
  43. #if [ "$a" != "y" ] && [ "$a" != "Y" ]; then
  44. # exit 0
  45. #fi
  46. FONTFILENAME="$1"
  47. FONTNAME="$2"
  48. FONTTEXNAME="$3"
  49. TEXMFHOME=`kpsexpand '$TEXMFHOME'`
  50. ENCDIR=${TEXMFHOME}/fonts/enc/dvips/chinese/${FONTNAME}
  51. AFMDIR=${TEXMFHOME}/fonts/afm/chinese/${FONTNAME}
  52. TFMDIR=${TEXMFHOME}/fonts/tfm/chinese/${FONTNAME}
  53. PFBDIR=${TEXMFHOME}/fonts/type1/chinese/${FONTNAME}
  54. MAPDIR=${TEXMFHOME}/fonts/map/dvips
  55. UPDMAPCFGDIR=${TEXMFHOME}/web2c
  56. UPDMAPCFG=${UPDMAPCFGDIR}/updmap.cfg
  57. if [ ! -f $UPDMAPCFG ]
  58. then
  59.     SYSUPDMAPCFG=`kpsewhich -format 'web2c files' updmap.cfg`
  60.     if [ ! -d ${UPDMAPCFGDIR} ]; then
  61.         mkdir -p ${UPDMAPCFGDIR}
  62.     fi
  63.     cp $SYSUPDMAPCFG $UPDMAPCFG
  64. fi
  65. CIDXMAPDIR=${TEXMFHOME}/fonts/map/dvipdfm/dvipdfmx/
  66. CIDXMAP=${CIDXMAPDIR}/cid-x.map
  67. if [ ! -f $CIDXMAP ]
  68. then
  69.     if [ ! -d ${CIDXMAPDIR} ]; then
  70.         mkdir -p ${CIDXMAPDIR}
  71.     fi
  72.     touch $CIDXMAP
  73. fi
  74. CJKDIR=${TEXMFHOME}/tex/latex/CJK/UTF8
  75. INSTALLDIRMODE="-m 0755"
  76. INSTALLMODE="-m 0644"
  77. FONTFILEBASENAME=`basename "$FONTFILENAME"`
  78. FDNAME=c70${FONTTEXNAME}.fd
  79. #MAPFILE=/usr/local/share/ttf2pt1/maps/cugb.map
  80. PLANENUM=255
  81. # Initialize ${FONTNAME}.map
  82. echo -n "" > ${FONTNAME}.map
  83. n=0
  84. echo "Generating subfonts from plane $n to plane $PLANENUM ..."
  85. while [ $n -le $PLANENUM ]
  86. do
  87.   m=`printf %02x $n`
  88.   
  89.   echo -n "[$n]"
  90.   
  91.   SUBFONTNAME=${FONTNAME}${m}
  92.   
  93.   # Generate *.t1a *.afm *.enc
  94.   ttf2pt1 -b -GAEF -p ft -Ohub -W0 -l plane+pid=3,eid=1,0x$m \
  95.           "$FONTFILENAME" ${SUBFONTNAME}
  96.   
  97.   # avoid dvips(k)(before v5.86) t1part module bug.
  98.   #perl -pi -e 's/_/Z/g' ${SUBFONTNAME}.t1a ${SUBFONTNAME}.afm
  99.   # Generate *.pfb
  100.   #t1asm -b ${SUBFONTNAME}.t1a > ${SUBFONTNAME}.pfb 2>/dev/null
  101.   
  102.   # Generate *.tfm
  103.   afm2tfm ${FONTNAME}$m.afm ${FONTNAME}$m.tfm >/dev/null
  104.   afm2tfm ${FONTNAME}$m.afm -s .167 ${FONTNAME}sl$m.tfm >/dev/null
  105.   
  106.   # Generate ${FONTNAME}.map
  107.   AFMNAME=`grep -m 1 -i fontname ${SUBFONTNAME}.afm | cut -d ' ' -f 2`
  108.   echo "${FONTNAME}$m ${AFMNAME}  <${FONTNAME}$m.pfb" >> ${FONTNAME}.map
  109.   echo "${FONTNAME}sl$m ${AFMNAME} " .167 SlantFont " <${FONTNAME}$m.pfb" \
  110.        >> ${FONTNAME}.map
  111.   n=`expr $n + 1`
  112. done
  113. echo
  114. cat > ${FDNAME} << EOF
  115. % This file is automatically generated by `basename $0`
  116. \\def\\fileversion{0.0.1}
  117. \\def\\filedate{`date +%Y/%m/%d`}
  118. \\ProvidesFile{${FDNAME}}[\\filedate\\space\\fileversion]
  119. \\DeclareFontFamily{C70}{${FONTTEXNAME}}{\\hyphenchar \\font\\m@ne}
  120. \\DeclareFontShape{C70}{${FONTTEXNAME}}{m}{n}{<-> CJK * ${FONTNAME}}{}
  121. \\DeclareFontShape{C70}{${FONTTEXNAME}}{bx}{n}{<-> CJKb * ${FONTNAME}}{}
  122. \\DeclareFontShape{C70}{${FONTTEXNAME}}{m}{it}{<-> CJK * ${FONTNAME}sl}{}
  123. \\DeclareFontShape{C70}{${FONTTEXNAME}}{bx}{it}{<-> CJKb * ${FONTNAME}sl}{}
  124. \\DeclareFontShape{C70}{${FONTTEXNAME}}{m}{sl}{<-> CJK * ${FONTNAME}sl}{}
  125. \\DeclareFontShape{C70}{${FONTTEXNAME}}{bx}{sl}{<-> CJKb * ${FONTNAME}sl}{}
  126. \\endinput
  127. EOF
  128. #exit 0;
  129. echo
  130. echo "Installing ..."
  131. install -d $INSTALLDIRMODE $ENCDIR $AFMDIR $TFMDIR $PFBDIR $MAPDIR $CJKDIR
  132. n=0
  133. while [ $n -le $PLANENUM ]
  134. do
  135.   m=`printf %02x $n`
  136.   echo -n "[$n]"
  137.   install $INSTALLMODE ${FONTNAME}${m}.enc $ENCDIR
  138.   install $INSTALLMODE ${FONTNAME}${m}.afm $AFMDIR
  139.   install $INSTALLMODE ${FONTNAME}${m}.tfm $TFMDIR
  140.   install $INSTALLMODE ${FONTNAME}sl${m}.tfm $TFMDIR
  141.   install $INSTALLMODE ${FONTNAME}${m}.pfb $PFBDIR
  142.   n=`expr $n + 1`
  143. done
  144. echo
  145. install $INSTALLMODE ${FONTNAME}.map $MAPDIR
  146. install $INSTALLMODE $FDNAME $CJKDIR
  147. echo "Map ${FONTNAME}.map" >> $UPDMAPCFG
  148. # update cid-x.map
  149. FONTFILEBASENAME=`basename ${FONTFILENAME}`
  150. echo "${FONTNAME}@Unicode@    UniGB-UCS2-H    :0:${FONTFILEBASENAME}" >> $CIDXMAP
  151. echo "${FONTNAME}sl@Unicode@    UniGB-UCS2-H    :0:${FONTFILEBASENAME}" >> $CIDXMAP
  152. #mktexlsr
  153. #updmap-sys
  154. #updmap
  155. #read -p "Do you want remove all intermediate files?[n]"
  156. #if [ "$a" = "y" ] || [ "$a" = "Y" ]; then
  157.   n=0
  158.   while [ $n -le $PLANENUM ]
  159.   do
  160.     m=`printf %02x $n`
  161.     echo -n "[$n]"
  162.   
  163.     rm -f ${FONTNAME}${m}.enc ${FONTNAME}${m}.afm \ #${FONTNAME}${m}.t1a \
  164.        ${FONTNAME}${m}.pfb ${FONTNAME}sl${m}.tfm ${FONTNAME}${m}.tfm
  165.   
  166.     n=`expr $n + 1`
  167.   done
  168.   echo
  169.   
  170.   rm -fv $FDNAME ${FONTNAME}.map
  171. #fi
  172. echo
  173. echo "OK, all done. :-)"
  174. echo
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-6-26 12:43:30 | 显示全部楼层
楼主及ls的,辛苦了!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-26 21:30:33 | 显示全部楼层
发现一个小问题:set_env里面的三行gawk应该用这三行替换:

gawk '/produce:/{print $2}' font_list|cat >>new
gawk '/produce:/{print $2,$5}' font_list|gawk '{print NR,$1,$2}'|sed 's/ /:/g' |cat >>new2
gawk '/produce:/{print $2,$3}' font_list|gawk '{print NR,$1,$2}'|sed 's/ /:/g' |cat >>new3

否则去掉font_list里面的produce:不会略过生成该行对应的字体。
回复 支持 反对

使用道具 举报

发表于 2008-7-12 15:47:16 | 显示全部楼层
压缩包解不开
回复 支持 反对

使用道具 举报

发表于 2008-7-21 21:48:45 | 显示全部楼层
非常需要这方面的资料,谢谢各位 !
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表