@@ -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,9 @@ 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|ex|em|mu|"
2010
+ "sp|bp|dd|pc|nc|nd|cc)" )
2011
+ p .float_with_wo_unit <<= Group ((p .float_literal + p .unit ) | p .float_literal )
2007
2012
2008
2013
p .lbrace <<= Literal ('{' ).suppress ()
2009
2014
p .rbrace <<= Literal ('}' ).suppress ()
@@ -2093,7 +2098,7 @@ def __init__(self):
2093
2098
+ (p .lbrace
2094
2099
+ Optional (p .ambi_delim | p .right_delim_safe , default = '' )
2095
2100
+ p .rbrace )
2096
- + (p .lbrace + p .float_literal + p .rbrace )
2101
+ + (p .lbrace + p .float_with_wo_unit + p .rbrace )
2097
2102
+ p .simple_group + p .required_group + p .required_group )
2098
2103
| Error ("Expected "
2099
2104
r"\genfrac{ldelim}{rdelim}{rulesize}{style}{num}{den}" ))
@@ -2322,6 +2327,24 @@ def _make_space(self, percentage):
2322
2327
r'\!' : - 0.16667 , # -3/18 em = -3 mu
2323
2328
}
2324
2329
2330
+ _unit_multipliers = {
2331
+ # pt|mm|cm|in|ex|em|mu|sp|bp|dd|pc|nc|nd|cc
2332
+ "pt" : 1 ,
2333
+ 'mm' : 7227 / 2540 ,
2334
+ 'cm' : 7227 / 254 ,
2335
+ 'in' : 7227 / 100 ,
2336
+ 'ex' : 35271 / 8192 ,
2337
+ 'em' : 655361 / 65536 ,
2338
+ 'mu' : 7227 / 2540000 ,
2339
+ 'sp' : 1 / 65536 ,
2340
+ 'bp' : 803 / 800 ,
2341
+ 'dd' : 1238 / 1157 ,
2342
+ 'pc' : 12 ,
2343
+ 'nc' : 1370 / 107 ,
2344
+ 'nd' : 685 / 642 ,
2345
+ 'cc' : 14856 / 1157
2346
+ }
2347
+
2325
2348
def space (self , s , loc , toks ):
2326
2349
tok , = toks
2327
2350
num = self ._space_widths [tok ]
@@ -2740,8 +2763,10 @@ def _genfrac(self, ldelim, rdelim, rule, style, num, den):
2740
2763
state = self .get_state ()
2741
2764
thickness = state .font_output .get_underline_thickness (
2742
2765
state .font , state .fontsize , state .dpi )
2743
-
2744
- rule = float (rule )
2766
+ ruleval = float (rule [0 ])
2767
+ if len (rule ) == 2 :
2768
+ # Units
2769
+ ruleval = ruleval * self ._unit_multipliers [rule [1 ]]
2745
2770
2746
2771
if style is not self ._MathStyle .DISPLAYSTYLE :
2747
2772
num .shrink ()
@@ -2753,7 +2778,7 @@ def _genfrac(self, ldelim, rdelim, rule, style, num, den):
2753
2778
cden .hpack (width , 'exactly' )
2754
2779
vlist = Vlist ([cnum , # numerator
2755
2780
Vbox (0 , thickness * 2.0 ), # space
2756
- Hrule (state , rule ), # rule
2781
+ Hrule (state , ruleval ), # rule
2757
2782
Vbox (0 , thickness * 2.0 ), # space
2758
2783
cden # denominator
2759
2784
])
@@ -2786,20 +2811,20 @@ def frac(self, s, loc, toks):
2786
2811
thickness = state .font_output .get_underline_thickness (
2787
2812
state .font , state .fontsize , state .dpi )
2788
2813
(num , den ), = toks
2789
- return self ._genfrac ('' , '' , thickness , self ._MathStyle .TEXTSTYLE ,
2814
+ return self ._genfrac ('' , '' , [ thickness ] , self ._MathStyle .TEXTSTYLE ,
2790
2815
num , den )
2791
2816
2792
2817
def dfrac (self , s , loc , toks ):
2793
2818
state = self .get_state ()
2794
2819
thickness = state .font_output .get_underline_thickness (
2795
2820
state .font , state .fontsize , state .dpi )
2796
2821
(num , den ), = toks
2797
- return self ._genfrac ('' , '' , thickness , self ._MathStyle .DISPLAYSTYLE ,
2822
+ return self ._genfrac ('' , '' , [ thickness ] , self ._MathStyle .DISPLAYSTYLE ,
2798
2823
num , den )
2799
2824
2800
2825
def binom (self , s , loc , toks ):
2801
2826
(num , den ), = toks
2802
- return self ._genfrac ('(' , ')' , 0.0 , self ._MathStyle .TEXTSTYLE ,
2827
+ return self ._genfrac ('(' , ')' , [ 0.0 ] , self ._MathStyle .TEXTSTYLE ,
2803
2828
num , den )
2804
2829
2805
2830
def _genset (self , s , loc , toks ):
0 commit comments