summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/latex/thuthesis/zhfonts.py
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2014-11-27 23:12:33 +0000
committerKarl Berry <karl@freefriends.org>2014-11-27 23:12:33 +0000
commit92dfd63f1480de91bdf82d2ae9fd7a76110f39d7 (patch)
treea6824ed8436ab708f18b2686a1b49d9be0f91f34 /Master/texmf-dist/doc/latex/thuthesis/zhfonts.py
parentf39b020808e1b16e0a959969d72ef9dbd6c72c7b (diff)
thuthesis (27nov14)
git-svn-id: svn://tug.org/texlive/trunk@35672 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/doc/latex/thuthesis/zhfonts.py')
-rwxr-xr-xMaster/texmf-dist/doc/latex/thuthesis/zhfonts.py184
1 files changed, 184 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/latex/thuthesis/zhfonts.py b/Master/texmf-dist/doc/latex/thuthesis/zhfonts.py
new file mode 100755
index 00000000000..43df37270b8
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/thuthesis/zhfonts.py
@@ -0,0 +1,184 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""This script can help to choose Chinse fonts found by `fc-list`, which will be
+used in thuthesis.
+
+This script prefers the font name in ASCII to the one containing Unicode
+character, in order to avoid the problem with 'Adobe 宋体 Std L'.
+
+This script should work with Python 2.6, 2.7 and Python 3.2, providing that your
+locale is utf-8. Please report issues if you find.
+"""
+
+from __future__ import print_function
+from __future__ import unicode_literals
+
+try:
+ from subprocess import check_output
+except ImportError: # python 2.6 has no check_output
+ from subprocess import Popen, PIPE
+ def check_output(cmdline):
+ return Popen(cmdline, stdout=PIPE).communicate()[0]
+
+# Py3K renames raw_input to input.
+try:
+ input = raw_input
+except:
+ pass
+
+import re
+
+# The return value is of type byte string (in py3k).
+zh_fonts_str = check_output(['fc-list', '-f', '%{family}\n', ':lang=zh'])
+all_fonts_str = check_output(['fc-list', '-f', '%{family}\n'])
+if not zh_fonts_str:
+ print('No Chinese font exists! Leaving...')
+ exit(1)
+
+# strip out ':style=BLABLA' stuff
+zh_fonts_list = sorted(set([x.split(b':')[0] for x in zh_fonts_str.splitlines()]))
+all_fonts_list = sorted(set([x.split(b':')[0] for x in all_fonts_str.splitlines()]))
+
+# Convert to unicode string, assuming utf-8 encoding of byte string.
+# Thus following variables are all unicode string.
+zh_fonts_list = [x.decode('utf-8') for x in zh_fonts_list]
+all_fonts_list = [x.decode('utf-8') for x in all_fonts_list]
+
+final_fonts = {'songti': {'name': '宋体',
+ 'candidates': [],
+ 'keyword': '宋|Ming',
+ 'font': ''},
+ 'heiti': {'name': '黑体',
+ 'candidates': [],
+ 'keyword': '黑|Hei|Sans|Gothic',
+ 'font': ''},
+ 'kaiti': {'name': '楷体',
+ 'candidates': [],
+ 'keyword': '楷|Kai',
+ 'font': ''},
+ 'fangsong': {'name': '仿宋',
+ 'candidates': [],
+ 'keyword': '仿宋|Fang',
+ 'font': ''},
+ 'lishu': {'name': '隶书',
+ 'candidates': [],
+ 'keyword': '隶|Li',
+ 'font': ''},
+ 'youyuan': {'name': '幼圆',
+ 'candidates': [],
+ 'keyword': '圆|Yuan',
+ 'font': ''}}
+
+for zh_font in zh_fonts_list:
+ for key in final_fonts:
+ if re.search(final_fonts[key]['keyword'], zh_font, re.IGNORECASE):
+ final_fonts[key]['candidates'].append(zh_font)
+ break
+
+def select_font(font_list):
+ if not font_list:
+ if not zh_fonts_list:
+ if not all_fonts_list:
+ return ''
+ else:
+ return select_font(all_fonts_list)
+ else:
+ return select_font(zh_fonts_list)
+
+ print('-' * 60);
+ for i, v in enumerate(font_list):
+ print('{0:d}.\t{1}'.format(i, v))
+ print('-' * 60);
+ while True:
+ # Note input/raw_input in Python 2.x do not accept unicode string.
+ print('选择序号(默认0,z: 所有中文字体中选择,a: 所有字体中选择): ', end='')
+ n_str = input()
+ if not n_str:
+ n = 0
+ else:
+ if n_str == 'z' or n_str =='Z':
+ return select_font(zh_fonts_list)
+ elif n_str == 'a' or n_str == 'A':
+ return select_font(all_fonts_list)
+ else:
+ try:
+ n = int(n_str)
+ except ValueError:
+ continue
+ if 0 <= n < len(font_list):
+ break
+ ascii_font_name = ''
+ for x in font_list[n].split(','):
+ try:
+ x.encode('ascii')
+ except UnicodeEncodeError:
+ pass
+ else:
+ ascii_font_name = x
+ break
+ if ascii_font_name:
+ return ascii_font_name
+ else:
+ print('ASCII font name not found!')
+ print('You might encounter error using this font with XeLaTeX...')
+ return font_list[n].split(',')[-1]
+
+
+print('>> 请选择字体:')
+for key in final_fonts:
+ print('{0}:'.format(final_fonts[key]['name']))
+ final_fonts[key]['font'] = select_font(final_fonts[key]['candidates'])
+ print()
+
+if not all((final_fonts['songti']['font'],
+ final_fonts['heiti']['font'],
+ final_fonts['kaiti']['font'])):
+ print('错误:缺少宋体、黑体或楷体字体。')
+ exit(2)
+
+print('>> 生成字体文件fontname.def')
+with open('fontname.def', 'w') as f:
+ f.write('% vim: set ft=tex:\n')
+ f.write('% This file is auto-generated by zhfonts.py script\n\n')
+ f.write('\\ProvidesFile{fontname.def}\n')
+
+ f.write('\\setCJKmainfont[BoldFont={' + final_fonts['heiti']['font'] + '},ItalicFont={' + final_fonts['kaiti']['font'] + '}]{' + final_fonts['songti']['font'] + '}\n')
+ f.write('\\setCJKsansfont{' + final_fonts['heiti']['font'] + '}\n')
+ f.write('\\setCJKmonofont{' + final_fonts['kaiti']['font'] + '}\n')
+
+ f.write('\\setCJKfamilyfont{zhsong}{' + final_fonts['songti']['font'] + '}\n')
+ f.write('\\setCJKfamilyfont{zhhei}{' + final_fonts['heiti']['font'] + '}\n')
+ f.write('\\setCJKfamilyfont{zhkai}{' + final_fonts['kaiti']['font'] + '}\n')
+ if final_fonts['fangsong']['font']:
+ f.write('\\setCJKfamilyfont{zhfs}{' + final_fonts['fangsong']['font'] + '}\n')
+ else:
+ print('>>> 缺少仿宋,宋体代替')
+ f.write('\\setCJKfamilyfont{zhfs}{' + final_fonts['songti']['font'] + '}\n')
+ if final_fonts['lishu']['font']:
+ f.write('\\setCJKfamilyfont{zhli}{' + final_fonts['lishu']['font'] + '}\n')
+ else:
+ print('>>> 缺少隶书,宋体代替')
+ f.write('\\setCJKfamilyfont{zhli}{' + final_fonts['songti']['font'] + '}\n')
+ if final_fonts['youyuan']['font']:
+ f.write('\\setCJKfamilyfont{zhyou}{' + final_fonts['youyuan']['font'] + '}\n')
+ else:
+ print('>>> 缺少幼圆,宋体代替')
+ f.write('\\setCJKfamilyfont{zhyou}{' + final_fonts['songti']['font'] + '}\n')
+ f.write('''
+\\newcommand*{\\songti}{\\CJKfamily{zhsong}}
+\\newcommand*{\\heiti}{\\CJKfamily{zhhei}}
+\\newcommand*{\\kaishu}{\\CJKfamily{zhkai}}
+\\newcommand*{\\fangsong}{\\CJKfamily{zhfs}}
+\\newcommand*{\\lishu}{\\CJKfamily{zhli}}
+\\newcommand*{\\youyuan}{\\CJKfamily{zhyou}}
+''')
+
+print('>> 替换shuji.tex中的仿宋字体')
+import fileinput
+for line in fileinput.input('shuji.tex', inplace=True):
+ line = line.decode('utf-8')
+ if line.startswith(' \setCJKfamilyfont{zhfs}[RawFeature={vertical:}]'):
+ line = ' \setCJKfamilyfont{zhfs}[RawFeature={vertical:}]{' + final_fonts['fangsong']['font'] + '}\n'
+ print(line.encode('utf-8'), end='')
+
+print('>> 中文字体处理结束。')