
Summary: Instead of using the metrics from our generated TTF files, use the fonts that TeX ships with. Pull the mapping out of the MathJax-dev repo from makeFF to get the correct mapping of metrics to font characters, and use our own tfm reader to extract metrics out of the tfm files into a useable format. Add a README and Makefile rule to make this process easier in the future. Also remove the silly 0.05em we put on supsubs because our italic correction works now. Test Plan: - Run huxley tests, see that changes are because of font metric changes. - See that the extension piece of `\bigl |` now extends above the top, as it is supposed to. Reviewers: alpert Reviewed By: alpert Differential Revision: http://phabricator.khanacademy.org/D12867
71 lines
1.8 KiB
Python
Executable File
71 lines
1.8 KiB
Python
Executable File
#!/usr/bin/env python
|
|
|
|
import collections
|
|
import json
|
|
import parse_tfm
|
|
import subprocess
|
|
import sys
|
|
|
|
|
|
def find_font_path(font_name):
|
|
try:
|
|
font_path = subprocess.check_output(['kpsewhich', font_name])
|
|
except OSError:
|
|
raise RuntimeError("Couldn't find kpsewhich program, make sure you" +
|
|
" have TeX installed")
|
|
except subprocess.CalledProcessError:
|
|
raise RuntimeError("Couldn't find font metrics: '%s'" % font_name)
|
|
return font_path.strip()
|
|
|
|
|
|
def main():
|
|
mapping = json.load(sys.stdin)
|
|
|
|
fonts = [
|
|
'cmbsy10.tfm',
|
|
'cmbx10.tfm',
|
|
'cmex10.tfm',
|
|
'cmmi10.tfm',
|
|
'cmmib10.tfm',
|
|
'cmr10.tfm',
|
|
'cmsy10.tfm',
|
|
'cmti10.tfm',
|
|
'msam10.tfm',
|
|
'msbm10.tfm'
|
|
]
|
|
|
|
font_name_to_tfm = {}
|
|
|
|
for font_name in fonts:
|
|
font_basename = font_name.split('.')[0]
|
|
font_path = find_font_path(font_name)
|
|
font_name_to_tfm[font_basename] = parse_tfm.read_tfm_file(font_path)
|
|
|
|
families = collections.defaultdict(dict)
|
|
|
|
for family, chars in mapping.iteritems():
|
|
for char, char_data in chars.iteritems():
|
|
char_num = int(char)
|
|
|
|
font = char_data['font']
|
|
tex_char_num = int(char_data['char'])
|
|
yshift = float(char_data['yshift'])
|
|
|
|
tfm_char = font_name_to_tfm[font].get_char_metrics(tex_char_num)
|
|
|
|
height = round(tfm_char.height + yshift / 1000.0, 3)
|
|
depth = round(tfm_char.depth - yshift / 1000.0, 3)
|
|
italic = round(tfm_char.italic_correction, 3)
|
|
|
|
families[family][char_num] = {
|
|
'height': height,
|
|
'depth': depth,
|
|
'italic': italic
|
|
}
|
|
|
|
sys.stdout.write(
|
|
json.dumps(families, separators=(',', ':'), sort_keys=True))
|
|
|
|
if __name__ == '__main__':
|
|
main()
|