@@ -1958,6 +1958,7 @@ def __init__(self):
1958
1958
p .customspace = Forward ()
1959
1959
p .end_group = Forward ()
1960
1960
p .float_literal = Forward ()
1961
+ p .float_with_wo_unit = Forward ()
1961
1962
p .font = Forward ()
1962
1963
p .frac = Forward ()
1963
1964
p .dfrac = Forward ()
@@ -1995,6 +1996,7 @@ def __init__(self):
1995
1996
p .symbol_name = Forward ()
1996
1997
p .token = Forward ()
1997
1998
p .underset = Forward ()
1999
+ p .unit = Forward ()
1998
2000
p .unknown_symbol = Forward ()
1999
2001
2000
2002
# Set names on everything -- very useful for debugging
@@ -2004,6 +2006,10 @@ def __init__(self):
2004
2006
2005
2007
p .float_literal <<= Regex (r"[-+]?([0-9]+\.?[0-9]*|\.[0-9]+)" )
2006
2008
p .int_literal <<= Regex ("[-+]?[0-9]+" )
2009
+ p .unit <<= Regex ("(pt|mm|cm|in|em|mu|"
2010
+ "sp|bp|dd|pc|nc|nd|cc)" )
2011
+ p .float_with_wo_unit <<= Group ((p .float_literal + p .unit ) |
2012
+ p .float_literal )
2007
2013
2008
2014
p .lbrace <<= Literal ('{' ).suppress ()
2009
2015
p .rbrace <<= Literal ('}' ).suppress ()
@@ -2093,7 +2099,7 @@ def __init__(self):
2093
2099
+ (p .lbrace
2094
2100
+ Optional (p .ambi_delim | p .right_delim_safe , default = '' )
2095
2101
+ p .rbrace )
2096
- + (p .lbrace + p .float_literal + p .rbrace )
2102
+ + (p .lbrace + p .float_with_wo_unit + p .rbrace )
2097
2103
+ p .simple_group + p .required_group + p .required_group )
2098
2104
| Error ("Expected "
2099
2105
r"\genfrac{ldelim}{rdelim}{rulesize}{style}{num}{den}" ))
@@ -2322,6 +2328,22 @@ def _make_space(self, percentage):
2322
2328
r'\!' : - 0.16667 , # -3/18 em = -3 mu
2323
2329
}
2324
2330
2331
+ _unit_multipliers = {
2332
+ # pt|mm|cm|in|mu|sp|bp|dd|pc|nc|nd|cc
2333
+ "pt" : 1 ,
2334
+ 'mm' : 7227 / 2540 ,
2335
+ 'cm' : 7227 / 254 ,
2336
+ 'in' : 7227 / 100 ,
2337
+ 'mu' : 7227 / 2540000 ,
2338
+ 'sp' : 1 / 65536 ,
2339
+ 'bp' : 803 / 800 ,
2340
+ 'dd' : 1238 / 1157 ,
2341
+ 'pc' : 12 ,
2342
+ 'nc' : 1370 / 107 ,
2343
+ 'nd' : 685 / 642 ,
2344
+ 'cc' : 14856 / 1157
2345
+ }
2346
+
2325
2347
def space (self , s , loc , toks ):
2326
2348
tok , = toks
2327
2349
num = self ._space_widths [tok ]
@@ -2741,7 +2763,7 @@ def _genfrac(self, ldelim, rdelim, rule, style, num, den):
2741
2763
thickness = state .font_output .get_underline_thickness (
2742
2764
state .font , state .fontsize , state .dpi )
2743
2765
2744
- rule = float (rule )
2766
+ rule = self . _get_float_with_unit (rule , state . fontsize )
2745
2767
2746
2768
if style is not self ._MathStyle .DISPLAYSTYLE :
2747
2769
num .shrink ()
@@ -2786,22 +2808,33 @@ def frac(self, s, loc, toks):
2786
2808
thickness = state .font_output .get_underline_thickness (
2787
2809
state .font , state .fontsize , state .dpi )
2788
2810
(num , den ), = toks
2789
- return self ._genfrac ('' , '' , thickness , self ._MathStyle .TEXTSTYLE ,
2811
+ return self ._genfrac ('' , '' , [ thickness ] , self ._MathStyle .TEXTSTYLE ,
2790
2812
num , den )
2791
2813
2792
2814
def dfrac (self , s , loc , toks ):
2793
2815
state = self .get_state ()
2794
2816
thickness = state .font_output .get_underline_thickness (
2795
2817
state .font , state .fontsize , state .dpi )
2796
2818
(num , den ), = toks
2797
- return self ._genfrac ('' , '' , thickness , self ._MathStyle .DISPLAYSTYLE ,
2819
+ return self ._genfrac ('' , '' , [ thickness ] , self ._MathStyle .DISPLAYSTYLE ,
2798
2820
num , den )
2799
2821
2800
2822
def binom (self , s , loc , toks ):
2801
2823
(num , den ), = toks
2802
- return self ._genfrac ('(' , ')' , 0.0 , self ._MathStyle .TEXTSTYLE ,
2824
+ return self ._genfrac ('(' , ')' , [ 0.0 ] , self ._MathStyle .TEXTSTYLE ,
2803
2825
num , den )
2804
2826
2827
+ def _get_float_with_unit (self , val , fontsize ):
2828
+ ret = float (val [0 ])
2829
+ if len (val ) == 2 :
2830
+ if val [1 ].lower () == 'em' :
2831
+ # "1 em is a distance equal to the type size"
2832
+ ret = ret * fontsize
2833
+ else :
2834
+ # Remaining units
2835
+ ret = ret * self ._unit_multipliers [val [1 ]]
2836
+ return ret
2837
+
2805
2838
def _genset (self , s , loc , toks ):
2806
2839
(annotation , body ), = toks
2807
2840
state = self .get_state ()
0 commit comments