Adds font metrics to support font commands.

This is part 1 of 3.  Rendering, screenshots, MathML, and unit tests will
follow in susbequent pull requests.
This commit is contained in:
Kevin Barabash
2015-07-04 15:20:05 -06:00
parent 549c2bf858
commit 67147b18ac
6 changed files with 579 additions and 15 deletions

View File

@@ -31,7 +31,11 @@ def main():
'cmsy10.tfm',
'cmti10.tfm',
'msam10.tfm',
'msbm10.tfm'
'msbm10.tfm',
'eufm10.tfm',
'cmtt10.tfm',
'rsfs10.tfm',
'cmss10.tfm',
]
# Extracted by running `\font\a=<font>` and then `\showthe\skewchar\a` in
@@ -48,7 +52,11 @@ def main():
'cmsy10': 48,
'cmti10': None,
'msam10': None,
'msbm10': None
'msbm10': None,
'eufm10': None,
'cmtt10': None,
'rsfs10': None,
'cmss10': None,
}
font_name_to_tfm = {}
@@ -68,7 +76,11 @@ def main():
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)
if family == "Script-Regular":
tfm_char = font_name_to_tfm[font].get_char_metrics(tex_char_num,
fix_rsfs=True)
else:
tfm_char = font_name_to_tfm[font].get_char_metrics(tex_char_num)
height = round(tfm_char.height + yshift / 1000.0, 5)
depth = round(tfm_char.depth - yshift / 1000.0, 5)

View File

@@ -153,7 +153,11 @@ $map{cmmi10} = {
"Main-Italic" => [
0x7B => 0x131, # \imath
0x7C => 0x237, # \jmath
]
],
"Caligraphic-Regular" => [
[0x30,0x39] => 0x30, # Oldstyle 0-9
],
};
$map{cmsy10} = {
@@ -257,6 +261,10 @@ $map{cmsy10} = {
"Math-Italic" => [
0x36 => 0x2F # \not
],
"Caligraphic-Regular" => [
[0x41,0x5A] => 0x41, # A-Z
],
};
$map{cmex10} = {
@@ -939,6 +947,106 @@ $map{msbm10} = {
],
};
$map{eufm10} = {
"Fraktur-Regular" => [
[0,7] => 0xE300, # variants
0x12 => 0x2018, # left quote
0x13 => 0x2019, # right quote
0x21 => 0x21, # !
[0x26,0x2F] => 0x26, # &, ', (, ), *, +, comma, -, ., /
[0x30,0x39] => 0x30, # 0-9
[0x3A,0x3B] => 0x3A, # :, ;
0x3D => 0x3D, # =
0x3F => 0x3F, # ?
[0x41,0x5A] => 0x41, # A-Z
0x5B => 0x5B, # [
[0x5D,0x5E] => 0x5D, # ], ^
[0x61,0x7A] => 0x61, # a-z
0x7D => 0x22, # "
],
};
$map{cmtt10} = {
"Typewriter-Regular" => [
[0,1] => 0x393, # \Gamma, \Delta
2 => 0x398, # \Theta
3 => 0x39B, # \Lambda
4 => 0x39E, # \Xi
5 => 0x3A0, # \Pi
6 => 0x3A3, # \Sigma
[7,8] => 0x3A5, # \Upsilon, \Phi
[9,0xA] => 0x3A8, # \Psi, \Omega
0xD => 0x2032, # '
0x10 => 0x131, # \imath (roman)
0x11 => 0x237, # \jmath (roman)
0x12 => [0x300,-525,0], # \grave (combining)
0x13 => [0x301,-525,0], # \acute (combining)
0x14 => [0x30C,-525,0], # \check (combining)
0x15 => [0x306,-525,0], # \breve (combining)
0x16 => [0x304,-525,0], # \bar (combining)
0x17 => [0x30A,-525,0], # ring above (combining)
[0x21,0x7F] => 0x21,
0x27 => 2018, # left quote
0x60 => 2019, # right quote
0x5E => [0x302,-525,0], # \hat (combining)
0x7E => [0x303,-525,0], # \tilde (combining)
0x7F => [0x308,-525,0], # \ddot (combining)
],
};
$map{rsfs10} = {
"Script-Regular" => [
[0x41,0x5A] => 0x41, # A-Z
],
};
$map{cmss10} = {
"SansSerif-Regular" => [
[0,1] => 0x393, # \Gamma, \Delta
2 => 0x398, # \Theta
3 => 0x39B, # \Lambda
4 => 0x39E, # \Xi
5 => 0x3A0, # \Pi
6 => 0x3A3, # \Sigma
[7,8] => 0x3A5, # \Upsilon, \Phi
[9,0xA] => 0x3A8, # \Psi, \Omega
0x10 => 0x131, # \imath (roman)
0x11 => 0x237, # \jmath (roman)
0x12 => [0x300,-500,0], # \grave (combining)
0x13 => [0x301,-500,0], # \acute (combining)
0x14 => [0x30C,-500,0], # \check (combining)
0x15 => [0x306,-500,0], # \breve (combining)
0x16 => [0x304,-500,0], # \bar (combining)
0x17 => [0x30A,-542,0], # ring above (combining)
[0x21,0x2F] => 0x21, # !, ", #, $, %, &, ', (, ), *, +, comma, -, ., /
0x22 => 0x201D, # "
0x27 => 0x2019, # '
[0x30,0x39] => 0x30, # 0-9
[0x3A,0x3B] => 0x3A, # :, ;
0x3D => 0x3D, # =
[0x3F,0x40] => 0x3F, # ?, @
[0x41,0x5A] => 0x41, # A-Z
0x5B => 0x5B, # [
0x5C => 0x201C, # ``
[0x5D,0x5E] => 0x5D, # ], ^
0x5E => [0x302,-500,0], # \hat (combining)
0x5F => [0x307,-389,0], # \dot (combining)
0x60 => 0x2018, # `
[0x61,0x7A] => 0x61, # a-z
[0x7B,0x7C] => 0x2013, # \endash, \emdash
0x7B => [0x5F,0,-350], # underline
0x7D => [0x30B,-500,0], # double acute (combining)
0x7E => [0x7E,0,-350], # ~
0x7E => [0x303,-500,0], # \tilde (combining)
0x7F => [0x308,-500,0], # \ddot (combining)
],
};
foreach $cmfont (keys %map) {
foreach $mjfont (keys %{$map{$cmfont}}) {
$style = $mjfont; $style =~ s/.*?(-|$)//; $style = "Regular" unless $style;

View File

@@ -64,11 +64,21 @@ class TfmFile(object):
self.ligkern_program = LigKernProgram(ligkern_table)
self.kern_table = kern_table
def get_char_metrics(self, char_num):
def get_char_metrics(self, char_num, fix_rsfs=False):
"""Return glyph metrics for a unicode code point.
Arguments:
char_num: a unicode code point
fix_rsfs: adjust for rsfs10.tfm's different indexing system
"""
if char_num < self.start_char or char_num > self.end_char:
raise RuntimeError("Invalid character number")
info = self.char_info[char_num + self.start_char]
if fix_rsfs:
# all of the char_nums contained start from zero in rsfs10.tfm
info = self.char_info[char_num - self.start_char]
else:
info = self.char_info[char_num + self.start_char]
char_kern_table = {}
if info.has_ligkern():