
    hC                   L   S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSKrSSK	r	SSK
r
SSKrSSKrSSKrSSKJr  SSKrSSKJrJrJrJrJrJrJrJrJrJrJrJrJrJ r J!r!J"r"J#r#J$r$J%r%  SSK&r'SSK(J)r)  SSK*J+r+J,r,J-r-J.r.  SS	K/J0r0J1r1J2r2  SS
K3J4r4J5r5J6r6J7r7  SSK8J9r:  SSKJ;r<  \:" \<5      Rz                  S:  a  SSKJ>r?  OSSKJ?r?  \R                  (       a  SSKAJBrB  SSK3JCrC  \R                  " 5         \R                  " S5      rFSS jrG " S S\5      rHS\HlI         " S S\5      rJS\JlI         " S S5      rK " S S\5      rL " S S\5      rM " S S\R                  5      rO " S  S!\O\R                  S"9rQ " S# S$\Q5      rR " S% S&\Q5      rS " S' S(\S\R                  S"9rT " S) S*\T5      rU " S+ S,\T5      rV " S- S.\S5      rW " S/ S0\W5      rXS1rYS2rZ " S3 S45      r[ " S5 S6\[5      r\ " S7 S8\[5      r] " S9 S:\[5      r^ " S; S<\[5      r_ " S= S>\[5      r`0 S?\`_S@\`_SA\__SB\\_SC\\_SD\\_SE\\_SF\\_SG\\_SH\\_SI\]_SJ\]_SK\]_SL\]_SM\]_SN\]_SO\]_\`\`SP.EraSSR jrb " SS ST5      rc " SU SV\c5      rd " SW SX\d5      re " SY SZ\d5      rf " S[ S\\c5      rg " S] S^\g5      rh " S_ S`\d5      ri " Sa Sb\i5      rj " Sc Sd\i5      rk " Se Sf\d5      rl " Sg Sh\l5      rm " Si Sj\l5      rn " Sk Sl\5      ro\o" SmSnSSmS5      \o" SmSnSoSmS5      \o" SmSnSSmS5      \o" SmSmSSnS5      \o" SmSmSSnSo5      \o" SmSmSSnS5      \o" SmSmSSmS5      \o" SmSnSSpS5      Sq.\olp         " Sr Ss\c5      rq " St Su\j5      rr " Sv Sw\k5      rs " Sx Sy\c5      rt " Sz S{\j5      ru " S| S}\j5      rvSSS~ jjrwSS jrx " S SQ5      rySS jrz " S S5      r{g)z.
Implementation details for :mod:`.mathtext`.
    )annotationsN)
NamedTuple)EmptyForwardLiteralNotAnyoneOf	OneOrMoreOptionalParseBaseExceptionParseExceptionParseExpressionParseFatalExceptionParserElementParseResultsQuotedStringRegex	StringEnd
ZeroOrMorepyparsing_commonGroup   )cbook)latex_to_bakomastix_glyph_fixesstix_virtual_fontstex2uni)FontPropertiesfindfontget_font)FT2FontFT2ImageKerning	LoadFlags)parse)__version__   )
nestedExpr)nested_expr)Iterable)Glyphzmatplotlib.mathtextc                     [        U 5      $ ! [         a     Of = f [        U R                  S5         $ ! [         a  n[        U < S35      UeSnAff = f)z
Return the integer index (from the Unicode table) of *symbol*.

Parameters
----------
symbol : str
    A single (Unicode) character, a TeX command (e.g. r'\pi') or a Type1
    symbol name (e.g. 'phi').
\z5 is not a valid Unicode character or TeX/Type1 symbolN)ord	TypeErrorr   stripKeyError
ValueError)symbolerrs     F/var/www/html/env/lib/python3.13/site-packages/matplotlib/_mathtext.pyget_unicode_indexr6   5   sg    6{ v||D)** jMN	s!   
 
6 
A AAc                  L    \ rS rSr% SrS\S'   S\S'   S\S'   S\S'   S	\S
'   Srg)VectorParseK   z
The namedtuple type returned by ``MathTextParser("path").parse(...)``.

Attributes
----------
width, height, depth : float
    The global metrics.
glyphs : list
    The glyphs including their positions.
rect : list
    The list of rectangles.
floatwidthheightdepthz.list[tuple[FT2Font, float, int, float, float]]glyphsz'list[tuple[float, float, float, float]]rects N__name__
__module____qualname____firstlineno____doc____annotations____static_attributes__r@       r5   r8   r8   K   s$     LML::22rI   r8   c                  V    \ rS rSr% SrS\S'   S\S'   S\S'   S\S'   S\S'   S	\S
'   Srg)RasterParsea   z
The namedtuple type returned by ``MathTextParser("agg").parse(...)``.

Attributes
----------
ox, oy : float
    The offsets are always zero.
width, height, depth : float
    The global metrics.
image : FT2Image
    A raster image.
r:   oxoyr;   r<   r=   r"   imager@   NrA   r@   rI   r5   rK   rK   a   s'     	IILMLOrI   rK   c                  6    \ rS rSrSrSS jrS	S jrS
S jrSrg)Outputx   z
Result of `ship`\ping a box: lists of positioned glyphs and rectangles.

This class is not exposed to end users, but converted to a `VectorParse` or
a `RasterParse` by `.MathTextParser.parse`.
c                ,    Xl         / U l        / U l        g Nboxr>   r?   )selfrV   s     r5   __init__Output.__init__   s    ;=>@
rI   c                    [        [        R                  U R                  R                  U R                  R
                  U R                  R                  /5      u  pnU R                   VVVs/ s H:  u  pEnUR                  UR                  UR                  XBU-
  UR                  -   4PM<     nnnnU R                   VV	V
Vs/ s H  u  ppXU-
  X-
  X-
  4PM     nn
n	nn[        XU-   X7U5      $ s  snnnf s  snn
n	nf rT   )mapnpceilrV   r;   r<   r=   r>   fontfontsizenumoffsetr?   r8   )rW   whdrM   rN   infogsx1y1x2y2rss                r5   	to_vectorOutput.to_vector   s    GGdhhnndhhootxx~~FHa #'++/"-,"$ yy$--22v7KL"- 	 / %)JJ0$.."" r627BG,$. 	 01!eQB//	/0s   -AC1C8
c               j   [        / U R                   VVVs/ s H  u  p#oBUR                  R                  -   PM      snnnQU R                   VVVVs/ s H  u  pVpxUPM
     snnnnQSP5      S-
  n	[        / U R                   VVVs/ s H  u  p#oCUR                  R
                  -
  PM      snnnQU R                   VVVVs/ s H  u  pVpxUPM
     snnnnQSP5      S-
  n
[        / U R                   VVVs/ s H  u  p#oBUR                  R                  -   PM      snnnQU R                   VVVVs/ s H  u  pVpxUPM
     snnnnQSP5      S-   n[        / U R                   VVVs/ s H  u  p#oCUR                  R                  -
  PM      snnnQU R                   VVVVs/ s H  u  pVpxUPM
     snnnnQSP5      S-   nX-
  nX-
  U R                  R                  -
  nX-
  U R                  R                  -
  n[        [        [        R                  " U5      5      [        [        R                  " U[        US5      -   5      5      5      n[!        U R                  U	* U
* 45      nUR                   HU  u  p#nUR"                  R%                  U[        U5      [        X4R                  R&                  -
  5      UR(                  US9  MW     UR                   H  u  pVpx[        [        X-
  5      S-
  S5      nUS:X  a  X-   S-  n[        UUS-   S-  -
  5      nO[        U5      nUR+                  [        U5      U[        [        R                  " U5      5      UU-   5        M     [-        SSXU-   UU5      $ s  snnnf s  snnnnf s  snnnf s  snnnnf s  snnnf s  snnnnf s  snnnf s  snnnnf )Nr   r   )antialiased   )minr>   metricsxminr?   ymaxmaxxmaxyminrV   r=   r<   r"   intr\   r]   shipr^   draw_glyph_to_bitmapicebergglyphdraw_rect_filledrK   )rW   ro   rM   rN   re   rg   rh   ri   rj   rs   rw   rv   rt   rb   rc   rd   rO   shiftedr<   centerys                        r5   	to_rasterOutput.to_raster   s3     ?M4<<,,,M ?/3zz:z^RRbz:?<=? @BCD ?M4<<,,,M ?/3zz:z^RRbz:?<=? @BCD ?M4<<,,,M ?/3zz:z^RRbz:?<=? @BCD ?M4<<,,,M ?/3zz:z^RRbz:?<=? @BCDKK$((..(K$((//)RWWQZ#bgga#a)m.D*EF txx4%$0#NNLBDII**s2wB)=)=$= >

' + ) + &mmNBBRW)1-F{'Q&1*!112G""3r7As2772;/?VL , 1aE1e44? N:M:M:M:s/   %M9N %NN7%N2N'%N&"N-rU   N)rV   Box)returnr8   )ro   boolr   rK   )	rB   rC   rD   rE   rF   rX   rl   r   rH   r@   rI   r5   rQ   rQ   x   s    A
0"5rI   rQ   c                  t    \ rS rSr% SrS\S'   S\S'   S\S'   S\S'   S\S'   S\S	'   S\S
'   S\S'   S\S'   Srg)FontMetrics   a  
Metrics of a font.

Attributes
----------
advance : float
    The advance distance (in points) of the glyph.
height : float
    The height of the glyph in points.
width : float
    The width of the glyph in points.
xmin, xmax, ymin, ymax : float
    The ink rectangle of the glyph.
iceberg : float
    The distance from the baseline to the top of the glyph. (This corresponds to
    TeX's definition of "height".)
slanted : bool
    Whether the glyph should be considered as "slanted" (currently used for kerning
    sub/superscripts).
r:   advancer<   r;   rs   rv   rw   rt   r{   r   slantedr@   NrA   r@   rI   r5   r   r      s6    ( NML
K
K
K
KNMrI   r   c                  \    \ rS rSr% S\S'   S\S'   S\S'   S\S	'   S
\S'   S\S'   S\S'   Srg)FontInfo   r!   r^   r:   r_   strpostscript_namer   rr   rx   r`   r+   r|   ra   r@   NrB   rC   rD   rE   rG   rH   r@   rI   r5   r   r      s'    
MO	HLMrI   r   c                      \ rS rSrSrSS jr            SS jrSS jr    SS jr    SS jr	          SS jr
          SS	 jrSS
 jrSS jr    SS jrSrg)Fonts   z
An abstract base class for a system of fonts to use for mathtext.

The class must be able to take symbol keys and font file names and
return the character metrics.  It also delegates to a backend class
to do the actual drawing.
c                    Xl         X l        g)a>  
Parameters
----------
default_font_prop : `~.font_manager.FontProperties`
    The default non-math font, or the base font for Unicode (generic)
    font rendering.
load_glyph_flags : `.ft2font.LoadFlags`
    Flags passed to the glyph loader (e.g. ``FT_Load_Glyph`` and
    ``FT_Load_Char`` for FreeType-based fonts).
Ndefault_font_propload_glyph_flags)rW   r   r   s      r5   rX   Fonts.__init__   s     "3 0rI   c
                    g)z
Get the kerning distance for font between *sym1* and *sym2*.

See `~.Fonts.get_metrics` for a detailed description of the parameters.
        r@   )
rW   font1
fontclass1sym1	fontsize1font2
fontclass2sym2	fontsize2dpis
             r5   get_kernFonts.get_kern   s     rI   c                    [         erT   NotImplementedError)rW   r^   s     r5   	_get_fontFonts._get_font   s    !!rI   c                    [         erT   r   )rW   r^   
font_classsymr_   r   s         r5   	_get_infoFonts._get_info      !!rI   c                @    U R                  XX4U5      nUR                  $ )a{  
Parameters
----------
font : str
    One of the TeX font names: "tt", "it", "rm", "cal", "sf", "bf",
    "default", "regular", "bb", "frak", "scr".  "default" and "regular"
    are synonyms and use the non-math font.
font_class : str
    One of the TeX font names (as for *font*), but **not** "bb",
    "frak", or "scr".  This is used to combine two font classes.  The
    only supported combination currently is ``get_metrics("frak", "bf",
    ...)``.
sym : str
    A symbol in raw TeX form, e.g., "1", "x", or "\sigma".
fontsize : float
    Font size in points.
dpi : float
    Rendering dots-per-inch.

Returns
-------
FontMetrics
)r   rr   )rW   r^   r   r   r_   r   re   s          r5   get_metricsFonts.get_metrics  s     2 ~~dsC||rI   c	                d    U R                  XEXgU5      n	UR                  R                  X#U	45        g)z
At position (*ox*, *oy*), draw the glyph specified by the remaining
parameters (see `get_metrics` for their detailed description).
N)r   r>   append)
rW   outputrM   rN   r^   r   r   r_   r   re   s
             r5   render_glyphFonts.render_glyph!  s,     ~~dsCbd^,rI   c                >    UR                   R                  X#XE45        g)z<
Draw a filled rectangle from (*x1*, *y1*) to (*x2*, *y2*).
N)r?   r   rW   r   rg   rh   ri   rj   s         r5   render_rect_filledFonts.render_rect_filled*  s    
 	RR,-rI   c                    [        5       e)z6
Get the xheight for the given *font* and *fontsize*.
r   rW   r^   r_   r   s       r5   get_xheightFonts.get_xheight1  s     "##rI   c                    [        5       e)z~
Get the line thickness that matches the given font.  Used as a
base unit for drawing lines such as in a fraction or radical.
r   r   s       r5   get_underline_thicknessFonts.get_underline_thickness7  s    
 "##rI   c                
    X4/$ )z
Override if your font provides multiple sizes of the same
symbol.  Should return a list of symbols matching *sym* in
various sizes.  The expression renderer will select the most
appropriate size for a given situation from this list.
r@   rW   fontnamer   s      r5   !get_sized_alternatives_for_symbol'Fonts.get_sized_alternatives_for_symbol>  s       rI   r   Nr   r   r   r$   r   r   r   r   r   r   r   r:   r   r   r   r   r   r   r   r:   r   r:   r   r:   )r^   r   r   r!   )r^   r   r   r   r   r   r_   r:   r   r:   r   r   )r^   r   r   r   r   r   r_   r:   r   r:   r   r   )r   rQ   rM   r:   rN   r:   r^   r   r   r   r   r   r_   r:   r   r:   r   Noner   rQ   rg   r:   rh   r:   ri   r:   rj   r:   r   r   r^   r   r_   r:   r   r:   r   r:   r   r   r   r   r   zlist[tuple[str, str]])rB   rC   rD   rE   rF   rX   r   r   r   r   r   r   r   r   r   rH   r@   rI   r5   r   r      s    1),47DI %"""!)"#.8-!$-+.-:?-FK-PT-.$.*/.5:.@E.JN.$$!/2!7L!rI   r   c                     ^  \ rS rSrSrSU 4S jjrSS jr    SS jr    SS jr    SS jr	SS jr
SS	 jr            SU 4S
 jjrSrU =r$ )TruetypeFontsiI  zU
A generic base class for all font setups that use Truetype fonts
(through FT2Font).
c                  > [         TU ]  X5        [        R                  " U R                  5      U l        0 U l        0 U l        [        U R                  5      n[        U5      nX@R
                  S'   X@R
                  S'   g )Ndefaultregular)
superrX   	functoolscacher   _fontsfontmapr   r   r    )rW   r   r   filenamedefault_font	__class__s        r5   rX   TruetypeFonts.__init__O  se    *="8-/D223)!-I!-IrI   c                   XR                   ;   a  U R                   U   nO[        R                  " [        U5      nU R                  R                  U5      nUc{  [        R                  R                  U5      (       aW  [        U5      nX0R                  U'   X0R                  UR                  '   X0R                  UR                  R                  5       '   [        R                  " [        U5      $ rT   )r   Tcastr   r   getospathexistsr    r   lowerr!   )rW   r^   basenamecached_fonts       r5   r   TruetypeFonts._get_font[  s    <<||D)H vvc4(Hkkooh/277>>(#;#;"8,K$/KK!7BKK334?JKK3399;<vvg{++rI   c                `    UR                   S:X  a  UR                  S-  S-  US-  U-  S-  -   $ g)NCmex10@   rp   r'   H   r   )r   r<   )rW   r^   r|   r_   r   s        r5   _get_offsetTruetypeFonts._get_offsetj  s:    8+LL2%)hqj3.>r.ABBrI   c                    [         erT   r   )rW   r   r   r   s       r5   
_get_glyphTruetypeFonts._get_glyphp  r   rI   c                   U R                  XU5      u  pgnUR                  XE5        UR                  XpR                  S9n	S U	R                   5       u  ppU R                  XiXE5      n[        U	R                  S-  U	R                  S-  U	R                  S-  U
UX-   X-   U	R                  S-  U-   US9	n[        UUUR                  UUU	US9$ )N)flagsc              3  *   #    U  H	  oS -  v   M     g7f)r   Nr@   ).0vals     r5   	<genexpr>*TruetypeFonts._get_info.<locals>.<genexpr>{  s     !Ajs(js      r   )	r   r<   r;   rs   rv   rw   rt   r{   r   )r^   r_   r   rr   r`   r|   ra   )r   set_size	load_charr   bboxr   r   linearHoriAdvancer<   r;   horiBearingYr   r   )rW   r   r   r   r_   r   r^   r`   r   r|   rs   rw   rv   rt   ra   rr   s                   r5   r   TruetypeFonts._get_infou  s    !__X3G7h$s*?*?@!Aejj!AD!!$x=++e3<<"$++"&&+f4
  00
 	
rI   c                    U R                  U5      nUR                  X#5        UR                  S5      nUc1  U R                  U[        R
                  S   SX#5      nUR                  $ US   S-  US-  -  US-  -  nU$ )Npcltmathtext.defaultxxHeightg      P@g      (@g      Y@)r   r   get_sfnt_tabler   mplrcParamsr{   )rW   r   r_   r   r^   r   rr   r  s           r5   r   TruetypeFonts.get_xheight  s    ~~h'h$""6*<&&#,,'9:CPG??"	?T)ho>#+NrI   c                    SU-  U-  S-  $ )Ng      ?g      R@r@   r   s       r5   r   %TruetypeFonts.get_underline_thickness  s     (3.$66rI   c
                  > X:X  ao  XH:X  aj  U R                  XX4U	5      n
U R                  XVXxU	5      nU
R                  nUR                  U
R                  UR                  [        R
                  5      S-  $ [        TU ]  XX4XVXxU	5	      $ )Nr   )r   r^   get_kerningr`   r#   DEFAULTr   r   )rW   r   r   r   r   r   r   r   r   r   info1info2r^   r   s                r5   r   TruetypeFonts.get_kern  s     >i4NN5dsKENN5dsKE::D##EIIuyy'//JROOw4 %4CI 	IrI   )r   r   r   r   )r^   z	str | intr   r!   )
r^   r!   r|   r+   r_   r:   r   r:   r   r:   r   r   r   r   r   r   r   ztuple[FT2Font, int, bool])r   r   r   r   r   r   r_   r:   r   r:   r   r   )r   r   r_   r:   r   r:   r   r:   r   r   )rB   rC   rD   rE   rF   rX   r   r   r   r   r   r   r   rH   __classcell__r   s   @r5   r   r   I  s    

.,#("" 9"


!)
>
7	I	I),	I47	IDI	I	I %	I 	IrI   r   )	metaclassc                  |  ^  \ rS rSrSrSSSSSSS	S
.rS8U 4S jjr\" SR                  5       5      r	    S9S jr
0 S/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_S/ SQ_S / S!Q_S"/ S#Q_S$/ S%Q_S&/ S'Q_S(/ S)Q_S*/ S+Q_S,/ S-Q_S./ S/Q_S0S1/S2S3/S4.ErS5 H  u  rr\\   \\'   M         S:S6 jrS7rU =r$ );BakomaFontsi  z
Use the Bakoma TrueType fonts for rendering.

Symbols are strewn about a number of font files, each of which has
its own proprietary 8-bit encoding.
cmsy10cmr10cmtt10cmmi10cmb10cmss10cmex10)calrmttitbfsfexc                   > [        X5      U l        [        TU ]  X5        U R                  R                  5        H,  u  p4[        U5      nXPR                  U'   XPR                  U'   M.     g rT   )	StixFonts_stix_fallbackr   rX   _fontmapitemsr   r   )rW   r   r   keyr   fullpathr   s         r5   rX   BakomaFonts.__init__  sY    '(9L*=++-HC}H (LL (LL .rI   
\int \ointc                |   S nXR                   ;   aA  U[        ;   a7  [        U   u  pVUS:H  =(       d    X0R                  ;   nU R                  U5      nO3[	        U5      S:X  a$  US:H  nU R                  U5      nUb  [        U5      nUb  UR                  W5      S:w  a  XFW4$ U R                  R                  XU5      $ )Nr  r   r   r   )	r   r   _slanted_symbolsr   lenr.   get_char_indexr&  r   )rW   r   r   r   r^   r   r`   r   s           r5   r   BakomaFonts._get_glyph  s    ||#(>+C0MH8+L7L7L0LG>>(+DX]4'G>>(+D#h 3 3C 8A =g%%&&11(LLrI   ())r  r2  )r#     ¡)r#     ³)r#     µ)r#     Ã)))r  r7  )r#     ¢)r#     ´)r#     ¶)r#  !{))r  r<  )r#     ©)r#  n)r#     ½)r#  r2  }))r  r@  )r#     ª)r#  o)r#     ¾)r#  r7  [))r  rD  )r#     £)r#  rc   )r#  "]))r  rG  )r#     ¤)r#  i)r#  #z\lfloor))r#     ¥)r#  j)r#     ¹)r#  $z\rfloor))r#     ¦)r#  k)r#     º)r#  %z\lceil))r#     §)r#  l)r#     »)r#  &z\rceil))r#     ¨)r#  m)r#     ¼)r#  'z\langle))r#     ­r#  D)r#     ¿)r#  *z\rangle))r#     ®r#  E)r#     À)r#  +	\__sqrt__))r#  p)r#  q)r#  r)r#  sz
\backslash))r#     ²)r#  /)r#     Â)r#  -rk  ))r  rk  )r#     ±)r#  .)r#     Ë)r#  ,z\widehat))r  ^)r#  b)r#  c)r#  rd   z
\widetilde))r  ~)r#  e)r#  f)r#  g)r  rc   r\  )r  rI  ra  )<>)
)z
\leftparenr2  )z\rightparentr7  )z
\leftbracer<  )z\rightbracer@  )z\leftbracketrD  )z\rightbracketrG  )\{r<  )\}r@  )\[rD  )\]rG  c                >    U R                   R                  X!U4/5      $ rT   )_size_alternativesr   r   s      r5   r   -BakomaFonts.get_sized_alternatives_for_symbol  s     &&**3C0ABBrI   )r&  r   r  r   )rB   rC   rD   rE   rF   r'  rX   setsplitr.  r   r  aliastargetr   rH   r  r  s   @r5   r  r    s    H) =..01MM 9M('
 8'
 	 8'

 	 8'
 	 8'
 	 ('
 	 ('
 	 8'
" 	 8#'
& 	 8''
* 	 8+'
. 	 8/'
2 	 83'
6 	 87'
: 	 8;'
> 	 8?'
B 	 (C'
F 	 (G'
J %k2$k2M'
R	(v %7v$>5!	(C/2C7LC CrI   r  c                     ^  \ rS rSrSrSSS.rSU 4S jjr\" SR                  5       5      r	    SS jr
    SS	 jr    SS
 jrSrU =r$ )UnicodeFontsi  aD  
An abstract base class for handling Unicode fonts.

While some reasonably complete Unicode fonts (such as DejaVu) may
work in some situations, the only Unicode font I'm aware of with a
complete set of math symbols is STIX.

This class will "fallback" on the Bakoma fonts when a required
symbol cannot be found in the font.
      )   i"  c                ^  > [         R                  S   n[        [        [        S.R                  U5      nU(       a  U" X5      OS U l        [        TU ]!  X5        SR                  5        H2  n[         R                  SU-      n[        U5      nXpR                  U'   M4     [        S5      n[        U5      nXpR                  S'   [        U R                  [        5      (       aJ  SSS	S
SSS.nUR                  5        H,  u  p[        U
5      nXR                  U	'   XR                  U
'   M.     g g )Nzmathtext.fallback)stixstixsanscmzcal rm tt it bf sf bfitz	mathtext.r  r#  STIXGeneralSTIXSizeOneSymSTIXSizeTwoSymSTIXSizeThreeSymSTIXSizeFourSymSTIXSizeFiveSym)r   r   rp   r'         )r  r  r%  StixSansFontsr  r   _fallback_fontr   rX   r  r   r   r   
isinstancer(  )rW   r   r   fallback_rcfont_clstexfontpropr^   stixsizedaltfontssizenamer*  r   s               r5   rX   UnicodeFonts.__init__0  s$   ll#67%0
 #k
	 	 #+  ((9L04 	 	*=0668G<<g 56DD>D$(LL! 9 h'~!T d))955!$$&%%!' 0557
#D>%-T"%-T" 8 6rI   r,  c                    X4$ rT   r@   )rW   r   r   uniindexs       r5   _map_virtual_fontUnicodeFonts._map_virtual_fontU  s    !!rI   c                    [        U5      nSnU R                  XU5      u  pUnU(       a  US:X  aZ  US:  aT  [        U5      n[        R                  " U5      S   S:w  d*  [        R                  " U5      R                  S	5      (       a  S
nUS:H  =(       d    X0R                  ;   nSnU R                  U5      n	U	bf  X@R                  ;   a>  U	R                  S:X  a.  [        [         R"                  " S5      5      n	U R                  U   nU	R%                  U5      n
U
S:w  a  SnU(       Gd  U R&                  (       a  US;   a!  [)        U R&                  [*        5      (       a  S
nU R&                  R-                  XU5      nUS   R                  nU[/        [0        R2                  R5                  5       5      ;   a  Sn[        R7                  SX<5        U$ US;   a'  [)        U [*        5      (       a  U R-                  S
X#5      $ [        R	                  SXcU5        U R                  S
5      n	SnSnW	UW4$ ! [         a'    [        S5      nSn[        R	                  SU5         GNQf = f)NT?Fz!No TeX to Unicode mapping for %a.r   r   r   LzGREEK CAPITALr  r  zfonts/ttf/cmsy10.ttf)r   r   zComputer ModernzSubstituting symbol %s from %szNFont %r does not have a glyph for %a [U+%x], substituting with a dummy symbol.   )r6   r2   r.   _logwarningr  chrunicodedatacategoryr  
startswithr.  r   _cmr10_substitutionsfamily_namer    r   _get_data_pathr0  r  r  r%  r   listr  r'  valuesre   )rW   r   r   r   r  found_symbolnew_fontnamecharr   r^   
glyphindexrx  familys                r5   r   UnicodeFonts._get_glyphY  s@   	C(-HL "33(,   4Hw$68}((.q1S8&++D1<<_MM#'L#t+L7L7L0LG L>>,/D 9 99 ,,7#,,-CDFD#88BH!00:
?#'L"" 11&t':':IFF#H''228M1))T+"6"6"="="?@@.F		:CH  11&tY77??4AA A): ~~d+Xw&&q  	C3xH LLL<cB	Cs   H0 0-I! I!c                b    U R                   (       a  U R                   R                  X5      $ X4/$ rT   )r  r   r   s      r5   r   .UnicodeFonts.get_sized_alternatives_for_symbol  s2    &&HH   rI   )r  r   r   r   r   r   r  rx   r   ztuple[str, int]r  r   )rB   rC   rD   rE   rF   r  rX   r  r  r.  r  r   r   rH   r  r  s   @r5   r  r    sy    	 
!.F =..01"$'",;"='=' 9='~!/2!7L! !rI   r  c                  N   ^  \ rS rSr% 0 rS\S'   SS jr    SU 4S jjrSrU =r	$ )	DejaVuFontsi  dict[str | int, str]r'  c                   [        U [        5      (       a  [        X5      U l        O[	        X5      U l        [        X5      U l        [        R                  XU5        U R                  R                  SSSSSS.5        U R                  R                  5        H,  u  p4[        U5      nXPR                  U'   XPR                  U'   M.     g )Nr  r  r  r  r  )r   rp   r'   r  r  )r  DejaVuSerifFontsr%  r  r  r  bakomar   rX   r'  updater(  r   r   rW   r   r   r)  r  r*  s         r5   rX   DejaVuFonts.__init__  s    d,--"+,="PD"/0A"TD!"3Ft8HI!  
 	 ,,.IC~H (LL!)LL /rI   c                   > US:X  a  U R                   R                  XU5      $ [        U5      nU R                  S5      nUb'  UR	                  U5      nUS:w  a  [
        TU ]  SX#5      $ [
        TU ]  XU5      $ )N\primer#  r   )r  r   r6   r   r0  r   )rW   r   r   r   r  r^   r  r   s          r5   r   DejaVuFonts._get_glyph  s     );;))(DD )-H>>$'D!00:
? 7-dJDD7%hC@@rI   )r  r  r   r  )
rB   rC   rD   rE   r'  rG   rX   r   rH   r  r  s   @r5   r  r    s1    %'H"'**AA 9A ArI   r  c            	      .    \ rS rSrSrSSSSSSS	SS
.rSrg)r  i  zj
A font handling class for the DejaVu Serif fonts

If a glyph is not found it will fallback to Stix Serif
DejaVu SerifzDejaVu Serif:italiczDejaVu Serif:weight=boldzDejaVu Serif:italic:boldDejaVu SansDejaVu Sans MonozDejaVu Serif Displayr  r   r!  bfitr"  r  r#  r   r@   NrB   rC   rD   rE   rF   r'  rH   r@   rI   r5   r  r    s(     #(* $	HrI   r  c            	      .    \ rS rSrSrSSSSSSSSS	.rS
rg)DejaVuSansFontsi  zh
A font handling class for the DejaVu Sans fonts

If a glyph is not found it will fallback to Stix Sans
r  zDejaVu Sans:italiczDejaVu Sans:weight=boldzDejaVu Sans:italic:boldr  zDejaVu Sans Displayr  r@   Nr  r@   rI   r5   r  r    s(     "') #	HrI   r  c                      \ rS rSr% SrSSSSSSS	SS
SSSSS.rS\S'   SrSrSS jr	    SS jr
\R                        SS j5       rSrg)r%  i  aE  
A font handling class for the STIX fonts.

In addition to what UnicodeFonts provides, this class:

- supports "virtual fonts" which are complete alpha numeric
  character sets with different font styles at special Unicode
  code points, such as "Blackboard".

- handles sized alternative characters for the STIXSizeX fonts.
r  zSTIXGeneral:italiczSTIXGeneral:weight=boldzSTIXGeneral:italic:boldSTIXNonUnicodezSTIXNonUnicode:italiczSTIXNonUnicode:weight=boldr  r  r  r  r  )r  r   r!  r  nonunirmnonuniitnonunibfr   r   rp   r'   r  r  r  r'  NFc                    [         R                  XU5        U R                  R                  5        H,  u  p4[	        U5      nXPR
                  U'   XPR
                  U'   M.     g rT   )r   rX   r'  r(  r   r   r  s         r5   rX   StixFonts.__init__  sM    t8HI,,.IC~H (LL!)LL /rI   c                   [         R                  " U5      nU R                  (       a  Uc  US;  a  [         S   nSnOSn[        U[        5      (       a   XB   nO[        U[        5      (       a  UnOS nUb  Sn[        U5      nXx:  a+  Xx-   S-  n	Xi   n
X:S   :  a  U	nOX:S   ::  a  OU	S-   nXx:  a  M+  W
S   Us=::  a	  U
S   ::  a  O  OX:S   -
  U
S	   -   nU
S   nOU(       d  Sn[        R                  S
   nUS;   a  [        R                  " X35      nUS;   a  SUs=::  a  S::  a
  O  X4$ SU-   nX4$ ! [
         a    US   n Nf = f)N)r   r   r"  TFr  r   rp   r   r'   r  )r  r   )r   r  r!  r  i   i  nonuni)r   r   _sansr  dictr1   r  r/  r  r  r   )rW   r   r   r  font_mappingdoing_sans_conversionmappinglohimidranges              r5   r  StixFonts._map_virtual_font  s    *--h7JJ</$::-d3L$(!$)!lD))-&2 d++"GGBWB'uqjAh&Bq)qB ' Qx8/uQx/#Ah.q9 8*<<(:; |#'++H?H 11f6RF6R !!  (*H!!K  -&t,-s   D5 5EEc                2   SSSSSSS.nUR                  X"5      n [        U5      n[        S5       Vs/ s H6  nU R	                  U5      R                  U5      S	:w  d  M)  U[        U5      4PM8     nnUS
:X  a  US S nU$ ! [         a    X4/s $ f = fs  snf )Nr<  r@  rD  rG  u   ⟨u   ⟩)r{  r|  r}  r~  ry  rz     r   re  )r   r6   r2   r  r   r0  r  )rW   r   r   fixesr  rI  alternativess          r5   r   +StixFonts.get_sized_alternatives_for_symbolH  s     s3s67

 ii!	%(-H 5:!H LHq>>!,;;HEJ +CM*H L ,',L  	%O$$	%Ls   B  (B B BBr@   r   r  )r   r   r   r   r   z-list[tuple[str, str]] | list[tuple[int, str]])rB   rC   rD   rE   rF   r'  rG   r  r  rX   r  r   r   r   rH   r@   rI   r5   r%  r%    s    
 "')$+0&H"  NE*4"$'4",;4"l __  G rI   r%  c                      \ rS rSrSrSrSrg)r  i`  zX
A font handling class for the STIX fonts (that uses sans-serif
characters by default).
Tr@   N)rB   rC   rD   rE   rF   r  rH   r@   rI   r5   r  r  `  s     ErI   r  ffffff?r  c                      \ rS rSr% SrSrS\S'   SrS\S'   SrS\S	'   S
r	S\S'   Sr
S\S'   SrS\S'   SrS\S'   SrS\S'   Srg)FontConstantsBasei  z
A set of constants that controls how certain things, such as sub-
and superscripts are laid out.  These are all metrics that can't
be reliably retrieved from the font metrics in the font itself.
皙?zT.ClassVar[float]script_spaceg?subdropr  sup1333333?sub1      ?sub2g?delta皙?delta_slanted皙?delta_integralr@   N)rB   rC   rD   rE   rF   r  rG   r  r  r  r  r  r  r  rH   r@   rI   r5   r  r    so     '+L#* "%G$ "D
! "D
! "D
!  %E$
 (+M$* ),N%+rI   r  c                  4    \ rS rSrSrSrSrSrSrSr	Sr
SrSrg)ComputerModernFontConstantsi  g333333?r  g?r  r@   N)rB   rC   rD   rE   r  r  r  r  r  r  r  r  rH   r@   rI   r5   r  r    s*    LGDDDEMNrI   r  c                  ,    \ rS rSrSrSrSrSrSrSr	Sr
g)	STIXFontConstantsi  r  皙?333333?r  r  r@   N)rB   rC   rD   rE   r  r  r  r  r  r  rH   r@   rI   r5   r   r     s     LDDEMNrI   r   c                  $    \ rS rSrSrSrSrSrSrg)STIXSansFontConstantsi  r  r  r  r  r@   N)	rB   rC   rD   rE   r  r  r  r  rH   r@   rI   r5   r  r    s    LDMNrI   r  c                      \ rS rSrSrg)DejaVuSerifFontConstantsi  r@   NrB   rC   rD   rE   rH   r@   rI   r5   r  r        rI   r  c                      \ rS rSrSrg)DejaVuSansFontConstantsi  r@   Nr  r@   rI   r5   r
  r
    r  rI   r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  )zBitstream Vera SanszBitstream VeraParserStatec                    [         R                  U R                  R                  U R                  5      R
                  [        5      nU[        L a%  [        U R                  [        5      (       a  [        $ U$ rT   )_font_constant_mappingr   fontsetr   r^   r  r  r   r  r  r  )state	constantss     r5   _get_font_constant_setr    sZ    &**

+779JLI 	&&u}}m44$$rI   c                  J    \ rS rSrSrS
S jrSS jrSS jrS
S jrSS jr	Sr
g	)Nodei  zA node in the TeX box model.c                    SU l         g Nr   r  rW   s    r5   rX   Node.__init__  s	    	rI   c                ,    [        U 5      R                  $ rT   )typerB   r  s    r5   __repr__Node.__repr__  s    Dz"""rI   c                    gNr   r@   )rW   nexts     r5   r  Node.get_kerning  s    rI   c                .    U =R                   S-  sl         g)zr
Shrinks one level smaller.  There are only three levels of
sizes, after which things will no longer get smaller.
r   Nr  r  s    r5   shrinkNode.shrink  s    
 			Q	rI   c                    g)zRender this node.Nr@   rW   r   r  r   s       r5   renderNode.render  s    rI   r  Nr   r   r   r   r  zNode | Noner   r:   r   rQ   r  r:   r   r:   r   r   )rB   rC   rD   rE   rF   rX   r  r  r"  r&  rH   r@   rI   r5   r  r    s    &# rI   r  c                  ^   ^  \ rS rSrSrSU 4S jjrSU 4S jjr          S	S jrSrU =r	$ )
r   i	  z A node with a physical location.c                F   > [         TU ]  5         Xl        X l        X0l        g rT   )r   rX   r;   r<   r=   )rW   r;   r<   r=   r   s       r5   rX   Box.__init__  s    

rI   c                   > [         TU ]  5         U R                  [        :  aL  U =R                  [
        -  sl        U =R                  [
        -  sl        U =R                  [
        -  sl        g g rT   )r   r"  r  NUM_SIZE_LEVELSr;   SHRINK_FACTORr<   r=   rW   r   s    r5   r"  
Box.shrink  sH    99&JJ=(JKK=(KJJ=(J 'rI   c                    g rT   r@   r   s         r5   r&  
Box.render  s    rI   )r=   r<   r;   )r;   r:   r<   r:   r=   r:   r   r   r(  r   )
rB   rC   rD   rE   rF   rX   r"  r&  rH   r  r  s   @r5   r   r   	  sB    *)#).49>B rI   r   c                  0   ^  \ rS rSrSrSU 4S jjrSrU =r$ )Vboxi  z$A box with only height (zero width).c                &   > [         TU ]  SX5        g r  r   rX   )rW   r<   r=   r   s      r5   rX   Vbox.__init__!  s    V+rI   r@   )r<   r:   r=   r:   rB   rC   rD   rE   rF   rX   rH   r  r  s   @r5   r7  r7    s    ., ,rI   r7  c                  0   ^  \ rS rSrSrSU 4S jjrSrU =r$ )Hboxi%  z.A box with only width (zero height and depth).c                (   > [         TU ]  USS5        g r  r9  rW   r;   r   s     r5   rX   Hbox.__init__(  s    B'rI   r@   r;   r:   r;  r  s   @r5   r=  r=  %  s    8( (rI   r=  c                  r   ^  \ rS rSrSrSU 4S jjrSS jrSS jrSS jrSS jr	SS jr
SU 4S	 jjrS
rU =r$ )Chari,  a  
A single character.

Unlike TeX, the font information and metrics are stored with each `Char`
to make it easier to lookup the font metrics when needed.  Note that TeX
boxes have a width, height, and depth, unlike Type1 and TrueType which use
a full bounding box and an advance in the x-direction.  The metrics must
be converted to the TeX model, and the advance (if different from width)
must be converted into a `Kern` node when the `Char` is added to its parent
`Hlist`.
c                   > [         TU ]  5         Xl        UR                  U l        UR                  U l        UR
                  U l        UR                  U l        UR                  U l        U R                  5         g rT   )	r   rX   rt  r  r^   r   r_   r   _update_metrics)rW   rt  r  r   s      r5   rX   Char.__init__9  sZ    }}JJ	**99 	rI   c                     SU R                   -  $ )Nz`%s`rt  r  s    r5   r  Char.__repr__E  s    rI   c                x   U R                   R                  U R                  U R                  U R                  U R
                  U R                  5      =ol        U R                  S:X  a  UR                  U l	        OUR                  U l	        UR                  U l        UR                  UR                  -
  * U l        g )N )r  r   r^   r   rt  r_   r   _metricsr   r;   r{   r<   r=   rW   rr   s     r5   rE  Char._update_metricsH  s    "&,,":":IIttxx#I 	I-66S= DJ DJoo78
rI   c                .    U R                   R                  $ rT   )rL  r   r  s    r5   
is_slantedChar.is_slantedR  s    }}$$$rI   c                x   U R                   R                  U R                  -
  nSn[        U[        5      (       a}  U R
                  R                  U R                  U R                  U R                  U R                  UR                  UR                  UR                  UR                  U R                  5	      nX#-   $ )z
Return the amount of kerning between this and the given character.

This method is called when characters are strung together into `Hlist`
to create `Kern` nodes.
r   )rL  r   r;   r  rC  r  r   r^   r   rt  r_   r   )rW   r  r   kerns       r5   r  Char.get_kerningU  s     --''$**4dD!!<<((		4??DFFDMM		4??DFFDMMD ~rI   c           
         U R                   R                  XUU R                  U R                  U R                  U R
                  U R                  5        g rT   )r  r   r^   r   rt  r_   r   r%  s       r5   r&  Char.rendere  s9    !!qIIttxx	IrI   c                  > [         TU ]  5         U R                  [        :  ae  U =R                  [
        -  sl        U =R                  [
        -  sl        U =R                  [
        -  sl        U =R                  [
        -  sl        g g rT   )	r   r"  r  r0  r_   r1  r;   r<   r=   r2  s    r5   r"  Char.shrinkj  sV    99&MM]*MJJ]*JKK]*KJJ]*J	 'rI   )
rL  rt  r=   r   r^   r   r  r_   r<   r;   )rt  r   r  r  r)  r(  )r   r   r*  r+  )rB   rC   rD   rE   rF   rX   r  rE  rP  r  r&  r"  rH   r  r  s   @r5   rC  rC  ,  s1    

9% I
+ +rI   rC  c                  D   ^  \ rS rSrSrSS jrSU 4S jjrSS jrSrU =r	$ )	Accentis  z
The font metrics need to be dealt with differently for accents,
since they are already offset correctly from the baseline in
TrueType fonts.
c                8   U R                   R                  U R                  U R                  U R                  U R
                  U R                  5      =ol        UR                  UR                  -
  U l
        UR                  UR                  -
  U l        SU l        g r  )r  r   r^   r   rt  r_   r   rL  rv   rs   r;   rt   rw   r<   r=   rM  s     r5   rE  Accent._update_metricsy  sm    "&,,":":IIttxx#I 	I-\\GLL0
llW\\1
rI   c                B   > [         TU ]  5         U R                  5         g rT   )r   r"  rE  r2  s    r5   r"  Accent.shrink  s    rI   c           
        U R                   R                  XU R                  R                  -
  X0R                  R                  -   U R
                  U R                  U R                  U R                  U R                  5        g rT   )
r  r   rL  rs   rw   r^   r   rt  r_   r   r%  s       r5   r&  Accent.render  sU    !!***A0B0B,BIIttxx	IrI   )rL  r=   r<   r;   r(  r+  )
rB   rC   rD   rE   rF   rE  r"  r&  rH   r  r  s   @r5   rZ  rZ  s  s    
I IrI   rZ  c                  b   ^  \ rS rSrSrSU 4S jjrS	U 4S jjr    S
S jrSU 4S jjrSr	U =r
$ )Listi  z0A list of nodes (either horizontal or vertical).c                r   > [         TU ]  SSS5        SU l        / UQU l        SU l        SU l        SU l        g )Nr   r   )r   rX   shift_amountchildrenglue_set	glue_sign
glue_orderrW   elementsr   s     r5   rX   List.__init__  s<    R$#(rI   c                  > SR                  [        TU ]	  5       U R                  U R                  U R
                  U R                  SR                  U R                   Vs/ s H  n[        U5      PM     sn5      5      $ s  snf )Nz/{}<w={:.02f} h={:.02f} d={:.02f} s={:.02f}>[{}]z, )
formatr   r  r;   r<   r=   rd  joinre  repr)rW   r  r   s     r5   r  List.__repr__  se    @GGGJJJJ))II61tAw67	9 	9 7s   A?c                `  ^ [        U4S j[        [        T5      5      S S S2    5       S5      =U l        nX l        TU   S:w  a  UTU   -  U l        OSU l        SU l        US:X  aG  [        U R                  5      (       a,  [        R                  SU[        U 5      R                  U 5        g g g )Nc              3  >   >#    U  H  nTU   S :w  d  M  Uv   M     g7f)r   Nr@   )r   rI  totalss     r5   r   !List._set_glue.<locals>.<genexpr>  s     C01F1INQQ0s   	r  r   r   z	%s %s: %r)r  r  r/  rh  rg  rf  
glue_ratiore  r  r  r  rB   )rW   r  signrs  
error_typerB  s      `  r5   	_set_glueList._set_glue  s    "Cc&k*4R40CQH 	H! !9?q	MDMDN DO64==!!['d)<)<dD " rI   c                   > U R                    H  nUR                  5         M     [        TU ]  5         U R                  [        :  a3  U =R
                  [        -  sl        U =R                  [        -  sl        g g rT   )re  r"  r   r  r0  rd  r1  rf  )rW   childr   s     r5   r"  List.shrink  sT    ]]ELLN #99&.MM.M 'rI   )re  rh  ru  rf  rg  rd  )rj  T.Sequence[Node]r)  )
r  r:   rv  rx   rs  zlist[float]rw  r   r   r   r(  )rB   rC   rD   rE   rF   rX   r  rx  r"  rH   r  r  s   @r5   rb  rb    s2    :9D!D&*D / /rI   rb  c                  b   ^  \ rS rSrSr   S   SU 4S jjjrS	S jr  S
   SS jjrSrU =r	$ )Hlisti  zA horizontal list of boxes.c                p   > [         TU ]  U5        U(       a  U R                  5         U R                  X#S9  g )N)rb   rX  )r   rX   rS  hpack)rW   rj  rb   rX  do_kernr   s        r5   rX   Hlist.__init__  s,     	"IIK

Q
rI   c                V   / n[        U R                  5      nU(       a  [        U5       Hu  nU R                  U   nX2S-
  :  a  U R                  US-      nOSnUR                  U5        UR	                  U5      nUS:w  d  MY  [        U5      nUR                  U5        Mw     Xl        gg)z
Insert `Kern` nodes between `Char` nodes to set kerning.

The `Char` nodes themselves determine the amount of kerning they need
(in `~Char.get_kerning`), and this function just creates the correct
linked list.
r   Nr   )r/  re  r  r   r  Kern)rW   new_childrennum_childrenrI  elemr  kerning_distancerS  s           r5   rS  
Hlist.kern  s     4==)<(}}Q'a''==Q/DD##D)#'#3#3D#9 #r) 01D ''- ) )M rI   c                Z   SnSnSnS/S-  nS/S-  nU R                    GH  n[        U[        5      (       a:  XXR                  -  n[	        X8R
                  5      n[	        XHR                  5      nMS  [        U[        5      (       a  XXR                  -  n[        R                  " UR
                  5      (       dg  [        R                  " UR                  5      (       d?  [        USS5      n	[	        X8R
                  U	-
  5      n[	        XHR                  U	-   5      nM  GM  GM  [        U[        5      (       a]  UR                  n
XZR                  -  nXjR                  ==   U
R                  -  ss'   XzR                  ==   U
R                   -  ss'   GMw  [        U["        5      (       d  GM  XXR                  -  nGM     X0l        X@l        US:X  a  X-  nXl        X-
  nUS:X  a  SU l        SU l        SU l        gUS:  a  U R+                  USUS5        gU R+                  US	US
5        g)a  
Compute the dimensions of the resulting boxes, and adjust the glue if
one of those dimensions is pre-specified.  The computed sizes normally
enclose all of the material inside the new box; but some items may
stick out if negative glue is used, if the box is overfull, or if a
``\vbox`` includes other boxes that have been shifted left.

Parameters
----------
w : float, default: 0
    A width.
m : {'exactly', 'additional'}, default: 'additional'
    Whether to produce a box whose width is 'exactly' *w*; or a box
    with the natural width of the contents, plus *w* ('additional').

Notes
-----
The defaults produce a box with the natural width of the contents.
r   r  rd  
additionalr   Nr   Overfulr  Underful)re  r  rC  r;   ru   r<   r=   r   r\   isinfgetattrGlue	glue_specstretch_orderstretchshrink_orderr"  r  rg  rh  ru  rx  )rW   rb   rX  rc   rd   r  total_stretchtotal_shrinkrf  ri  r  s              r5   r  Hlist.hpack  s   0 qtaxA!T""WW88$77OAs##WWxx))"((1772C2C>26AAxx!|,AAww{+A 3D) At$$KK	__$556):K:KK6334	8H8HH4At$$WW# $ 
FA
E7DNDO DOr6NN1a	:NN1b,
;rI   )re  r=   rh  ru  rg  r<   r;   )r   r  T)rj  r}  rb   r:   rX  "T.Literal['additional', 'exactly']r  r   r(  r   r  )rb   r:   rX  r  r   r   )
rB   rC   rD   rE   rF   rX   rS  r  rH   r  r  s   @r5   r  r    sP    %>A9E!%6 )2  #6B?<3?<GK?< ?<rI   r  c                  l   ^  \ rS rSrSr  S S	U 4S jjjrSS\R                  4     S
S jjrSr	U =r
$ )Vlisti  zA vertical list of boxes.r   r  c                B   > [         TU ]  U5        U R                  X#S9  g )N)rc   rX  )r   rX   vpack)rW   rj  rc   rX  r   s       r5   rX   Vlist.__init__  s    "

Q
rI   c                   SnSnSnS/S-  nS/S-  nU R                    GHF  n	[        U	[        5      (       ak  XeU	R                  -   -  nU	R                  n[
        R                  " U	R                  5      (       d'  [        U	SS5      n
[        XIR                  U
-   5      nM  M  [        U	[        5      (       ab  Xe-  nSnU	R                  nXkR                  -  nX{R                  ==   UR                  -  ss'   XR                  ==   UR                  -  ss'   M  [        U	[         5      (       a  XeU	R                  -   -  nSnGM&  [        U	["        5      (       d  GM>  [%        S5      e   X@l        XS:  a  XeU-
  -  nX0l        OXPl        US:X  a  X-  nXl        X-
  nUS:X  a  SU l        SU l        SU l        gUS:  a  U R-                  USUS	5        gU R-                  US
US5        g)a  
Compute the dimensions of the resulting boxes, and to adjust the glue
if one of those dimensions is pre-specified.

Parameters
----------
h : float, default: 0
    A height.
m : {'exactly', 'additional'}, default: 'additional'
    Whether to produce a box whose height is 'exactly' *h*; or a box
    with the natural height of the contents, plus *h* ('additional').
l : float, default: np.inf
    The maximum height.

Notes
-----
The defaults produce a box with the natural height of the contents.
r   r  rd  z1Internal mathtext error: Char node found in Vlistr  r   Nr   r  r  r  )re  r  r   r<   r=   r\   r  r;   r  ru   r  r  r  r  r  r"  r  rC  RuntimeErrorrg  rh  ru  rx  )rW   rc   rX  rT  rb   rd   r  r  r  rf  ri  r  s               r5   r  Vlist.vpack$  s   0 qtaxA!S!!\!GGxx((>26AAww{+A ) At$$KK	__$556):K:KK6334	8H8HH4At$$[ At$$"GI I% * 
5QJAJJFAE6DNDO DOr6NN1a	:NN1b,
;rI   )r=   rh  ru  rg  r<   r;   r  )rj  r}  rc   r:   rX  r  )rc   r:   rX  r  rT  r:   r   r   )rB   rC   rD   rE   rF   rX   r\   infr  rH   r  r  s   @r5   r  r    sT    #>A9E6 
  #6BG<3G<G<$(G< G<rI   r  c                  N   ^  \ rS rSrSrSU 4S jjr          SS jrSrU =r$ )Rulein  a}  
A solid black rectangle.

It has *width*, *depth*, and *height* fields just as in an `Hlist`.
However, if any of these dimensions is inf, the actual value will be
determined by running the rule up to the boundary of the innermost
enclosing box.  This is called a "running dimension".  The width is never
running in an `Hlist`; the height and depth are never running in a `Vlist`.
c                H   > [         TU ]  XU5        UR                  U l        g rT   )r   rX   r  )rW   r;   r<   r=   r  r   s        r5   rX   Rule.__init__y  s    .}}rI   c                H    U R                   R                  XX2U-   X5-   5        g rT   )r  r   )rW   r   r  r   rb   rc   s         r5   r&  Rule.render}  s    ''1!eQUCrI   )r  )r;   r:   r<   r:   r=   r:   r  r  )r   rQ   r  r:   r   r:   rb   r:   rc   r:   r   r   )	rB   rC   rD   rE   rF   rX   r&  rH   r  r  s   @r5   r  r  n  sF    %DD!D&+D05D:>D DrI   r  c                  4   ^  \ rS rSrSrSSU 4S jjjrSrU =r$ )Hrulei  z.Convenience class to create a horizontal rule.c                v   > Uc  UR                  5       nUS-  =p4[        TU ]	  [        R                  X4U5        g )Nr  get_current_underline_thicknessr   rX   r\   r  )rW   r  	thicknessr<   r=   r   s        r5   rX   Hrule.__init__  s8    ==?I"S(6rI   r@   rT   )r  r  r  float | Noner;  r  s   @r5   r  r    s    87 7rI   r  c                  0   ^  \ rS rSrSrSU 4S jjrSrU =r$ )Vrulei  z,Convenience class to create a vertical rule.c                   > UR                  5       n[        TU ]	  U[        R                  [        R                  U5        g rT   r  )rW   r  r  r   s      r5   rX   Vrule.__init__  s,    99;	BFFBFFE:rI   r@   )r  r  r;  r  s   @r5   r  r    s    6; ;rI   r  c                  H    \ rS rSr% S\S'   S\S'   S\S'   S\S'   S\S'   S	rg
)	_GlueSpeci  r:   r;   r  rx   r  r"  r  r@   Nr   r@   rI   r5   r  r    s    LNMrI   r  r         ?rp   g      )filfillfilllneg_filneg_fill	neg_filllemptyssc                  D   ^  \ rS rSrSr  SU 4S jjrSU 4S jjrSrU =r$ )r  i  z
Most of the information in this object is stored in the underlying
``_GlueSpec`` class, which is shared between multiple glue objects.
(This is a memory optimization which probably doesn't matter anymore, but
it's easier to stick to what TeX does.)
c                   > [         TU ]  5         [        U[        5      (       a  [        R
                  U   nO#[        U[        5      (       a  UnO[        S5      eX l        g )Nz.glue_type must be a glue spec name or instance)r   rX   r  r   r  _namedr2   r  )rW   	glue_typer  r   s      r5   rX   Glue.__init__  sP     	i%%!((3I	9--!IMNN"rI   c                   > [         TU ]  5         U R                  [        :  a2  U R                  nUR                  UR                  [        -  S9U l        g g )Nr;   )r   r"  r  r0  r  _replacer;   r1  )rW   rx  r   s     r5   r"  Glue.shrink  sB    99&AZZagg.EZFDN 'rI   )r  )r  z`_GlueSpec | T.Literal['fil', 'fill', 'filll', 'neg_fil', 'neg_fill', 'neg_filll', 'empty', 'ss']r(  )	rB   rC   rD   rE   rF   rX   r"  rH   r  r  s   @r5   r  r    s$    #A#G GrI   r  c                  0   ^  \ rS rSrSrSU 4S jjrSrU =r$ )	HCenteredi  z`
A convenience class to create an `Hlist` whose contents are
centered within its enclosing box.
c                P   > [         TU ]  [        S5      /UQ[        S5      PSS9  g )Nr  Fr  r   rX   r  ri  s     r5   rX   HCentered.__init__  s*    $t*<x<d<eLrI   r@   rj  z
list[Node]r;  r  s   @r5   r  r    s    
M MrI   r  c                  0   ^  \ rS rSrSrSU 4S jjrSrU =r$ )	VCenteredi  z_
A convenience class to create a `Vlist` whose contents are
centered within its enclosing box.
c                R   > [         TU ]  [        S5      /UQ[        S5      P5        g )Nr  r  ri  s     r5   rX   VCentered.__init__  s%    $t*<x<d<=rI   r@   r  r;  r  s   @r5   r  r    s    
> >rI   r  c                  R   ^  \ rS rSrSrSrSrSU 4S jjrS	S jrS
U 4S jjr	Sr
U =r$ )r  i  a}  
A `Kern` node has a width field to specify a (normally
negative) amount of spacing. This spacing correction appears in
horizontal lists between letters like A and V when the font
designer said that it looks better to move them closer together or
further apart. A kern node can also appear in a vertical list,
when its *width* denotes additional spacing in the vertical
direction.
r   c                .   > [         TU ]  5         Xl        g rT   )r   rX   r;   r?  s     r5   rX   Kern.__init__  s    
rI   c                     SU R                   -  $ )Nzk%.02fr  r  s    r5   r  Kern.__repr__  s    $**$$rI   c                ~   > [         TU ]  5         U R                  [        :  a  U =R                  [
        -  sl        g g rT   )r   r"  r  r0  r;   r1  r2  s    r5   r"  Kern.shrink  s,    99&JJ-'J 'rI   r  rA  r)  r(  )rB   rC   rD   rE   rF   r<   r=   rX   r  r"  rH   r  r  s   @r5   r  r    s(     FE%( (rI   r  c                  <   ^  \ rS rSrSr S   SU 4S jjjrSrU =r$ )AutoHeightChari  a  
A character as close to the given height and depth as possible.

When using a font with multiple height versions of some characters (such as
the BaKoMa fonts), the correct glyph will be selected, otherwise this will
always just return a scaled version of the glyph.
c                |  > UR                   R                  UR                  U5      nUR                   R                  UR                  UR                  UR
                  5      nUR                  5       nX#-   n	U H;  u  pXl        [        X5      nUR                  UR                  -   U	SU-  -
  :  d  M;    O   SnUR                  S:w  d  [        U5      S:X  aN  Uc  U	WR                  UR                  -   -  nU=R                  U-  sl        [        WU5      nX<R                  -
  n[        TU ]1  W/5        Xl        g )Nr  r   r   r   )r  r   r^   r   r_   r   copyrC  r<   r=   r/  r   rX   rd  )rW   rt  r<   r=   r  alwaysfactorr  r  target_totalr   r   r  shiftr   s                 r5   rX   AutoHeightChar.__init__  s   }}FFJJ --++JJ		3 

~)MH!J#D {{TZZ'<#-+GG * ::?c,/14~%tzz)ABNNf$NU#DZZ'E$ !rI   )rd  )FN)rt  r   r<   r:   r=   r:   r  r  r  r   r  r  r;  r  s   @r5   r  r    s(     ?C""/;" "rI   r  c                  :   ^  \ rS rSrSrS\4 SU 4S jjjrSrU =r$ )AutoWidthChari  z
A character as close to the given width as possible.

When using a font with multiple width versions of some characters (such as
the BaKoMa fonts), the correct glyph will be selected, otherwise this will
always just return a scaled version of the glyph.
Fc                d  > UR                   R                  UR                  U5      nUR                  5       nU H%  u  pxXsl        U" X5      n	U	R                  U:  d  M%    O   UW	R                  -  n
U=R
                  U
-  sl        U" WU5      n	[        TU ]  U	/5        U	R                  U l        g rT   )r  r   r^   r  r;   r_   r   rX   )rW   rt  r;   r  r  
char_classr  r   r   r  r  r   s              r5   rX   AutoWidthChar.__init__$  s    }}FFJJ 

)MH!Jc)DzzU"	 * #& #u%$ ZZ
rI   r  )
rt  r   r;   r:   r  r  r  r   r  z
type[Char])	rB   rC   rD   rE   rF   rC  rX   rH   r  r  s   @r5   r  r    s$     QV*. '   rI   r  c           	        ^^^^^^	^
^ Uu  p#SmSmUmX0R                   -   m	[        U 5      m
SS jmSUUUUUU	U
U4S jjmSUUUUUU	U
U4S jjm[        U [        5      (       d   eT" U 5        T
$ )a  
Ship out *box* at offset *xy*, converting it to an `Output`.

Since boxes can be inside of boxes inside of boxes, the main work of `ship`
is done by two mutually recursive routines, `hlist_out` and `vlist_out`,
which traverse the `Hlist` nodes and `Vlist` nodes inside of horizontal
and vertical boxes.  The global variables used in TeX to store state as it
processes have become local variables here.
r   c                &    U S:  a  S$ U S:  a  S$ U $ )Ng    eg    eAr@   )values    r5   clampship.<locals>.clampI  s    t|tHH5HrI   c                |  > SnSnU R                   nU R                  nTnTnU R                   GH  n[        U[        5      (       a*  UR                  TTT-   TT-   5        TUR                  -  mMC  [        U[        5      (       a  TUR                  -  mMi  [        U[        5      (       a  [        UR                  5      S:X  a  TUR                  -  mM  TnXWR                  -   m[        U[        5      (       a	  T" U5        O%[        U[        5      (       a	  T" U5        O S5       eXR                  -   mUmGM  [        U[        5      (       a  UR                  n	UR                  n
UR                  n[         R"                  " U	5      (       a  U R                  n	[         R"                  " U
5      (       a  U R                  n
U	S:  a&  US:  a   XZ-   mUR                  TTT-   TT-   X5        UmTU-  mGM  [        U[$        5      (       d  GM  UR&                  nUR                  U-
  nUS:w  a  US:X  a=  UR(                  U:X  a,  X,R*                  -  n[-        T" U R.                  U-  5      5      nO<UR0                  U:X  a,  X,R2                  -  n[-        T" U R.                  U-  5      5      nX-  nTU-  mGM     g )Nr   r   unreachable coder   )rh  rg  re  r  rC  r&  r;   r  rb  r/  rd  r  r  r   r<   r=   r\   r  r  r  r  r  roundrf  r  r"  )rV   cur_gcur_gluerh  rg  	base_line	left_edgerf  edgerule_height
rule_depth
rule_widthr  r  cur_hcur_v	hlist_outoff_hoff_vr   	vlist_outs                r5   r  ship.<locals>.hlist_outL  sP    ^^
MM			A!T""> At$$ At$$qzz?a'QWW$E D%6E!!U++!!#Au--!!8&88u 77NE%EAs##hhWW
WW
88K(("%**K88J''!$J?zA~%2EHHV"U]EEM'6 &E#At$$KK	&__u4
> A~$22j@$(9(99H$)%x0G*H$IE"//:= $4$44 %eCLL8,C&D E#
#g rI   c                n  > SnSnU R                   nU R                  nTnTU R                  -  mTnU R                   GHt  n[	        U[
        5      (       a  TUR                  -  mM*  [	        U[        5      (       a  [        UR                  5      S:X  a  TUR                  UR                  -   -  mMv  TUR                  -  mXWR                  -   mTnU R                  Ul        [	        U[        5      (       a	  T" U5        O%[	        U[        5      (       a	  T" U5        O S5       eXR                  -   mUmM  [	        U[        5      (       a  UR                  n	UR                  n
UR                  n[        R                  " U5      (       a  U R                  nX-  n	U	S:  a+  U
S:  a"  TU	-  mUR!                  TTT-   TT-   X5        GM  GM  GM  [	        U["        5      (       a  UR$                  nUR                  U-
  n	US:w  a  US:X  a=  UR&                  U:X  a,  X,R(                  -  n[+        T" U R,                  U-  5      5      nO<UR.                  U:X  a,  X,R0                  -  n[+        T" U R,                  U-  5      5      nX-  n	TU	-  mGMT  [	        U[2        5      (       d  GMl  [5        S5      e   g )Nr   r   r  r   z1Internal mathtext error: Char node found in vlist)rh  rg  r<   re  r  r  r;   rb  r/  r=   rd  r  r  r   r\   r  r&  r  r  r  r  r  rf  r  r"  rC  r  )rV   r  r  rh  rg  r  top_edgerf  save_vr  r  r  r  r  r  r  r  r  r  r   r  s                r5   r  ship.<locals>.vlist_out  sW    ^^
MM		A!T"" At$$qzz?a'QXX//EQXX%E%6E"F!iiAG!!U++!!#Au--!!8&88u"WW,E%EAs##hhWW
WW
88J''!$J)?zA~[(EHHV"U]EEM'6 (6?
 At$$KK	'oo5> A~$22j@$(9(99H$)%x0G*H$IE"//:= $4$44 %eCLL8,C&D E$$At$$"GI I[ rI   )r  r:   r   r:   )rV   r  r   r   )rV   r  r   r   )r<   rQ   r  r  )rV   xyrM   rN   r  r  r  r  r  r  r   r  s       @@@@@@@@r5   ry   ry   8  sn     FBEEEOEC[FI=$ =$~9I 9Iv c5!!!!cNMrI   c                F   ^  SU 4S jjn[        5       R                  U5      $ )z$Helper class to raise parser errors.c                   > [        XT5      erT   r   )ri  loctoksmsgs      r5   raise_errorError.<locals>.raise_error  s    !!#..rI   ri  r   r	  rx   r
  r   r   T.Any)r   setParseAction)r  r  s   ` r5   Errorr    s    / 7!!+..rI   c                  v    \ rS rSrSr  S
S jrSS jr\SS j5       r\R                  SS j5       rSS jr
Srg	)r  i  z
Parser state.

States are pushed and popped from a stack as necessary, and the "current"
state is always at the top of the stack.

Upon entering and leaving a group { } or math/non-math, the stack is pushed
and popped accordingly.
c                @    Xl         X l        X0l        X@l        XPl        g rT   )r  _fontr   r_   r   )rW   r  r^   r   r_   r   s         r5   rX   ParserState.__init__  s    
$ rI   c                .    [         R                   " U 5      $ rT   )r  r  s    r5   r  ParserState.copy  s    yyrI   c                    U R                   $ rT   )r  r  s    r5   r^   ParserState.font  s    zzrI   c                (    US;   a  Xl         Xl        g )N)r  r   r!  r  )r   r  )rW   r  s     r5   r^   r    s    --"O
rI   c                x    U R                   R                  U R                  U R                  U R                  5      $ )z.Return the underline thickness for this state.)r  r   r^   r_   r   r  s    r5   r  +ParserState.get_current_underline_thickness  s,    ||33IIt}}dhh0 	0rI   )r  r   r   r  r_   N)
r  r   r^   r   r   r   r_   r:   r   r:   r   r  r)  )r  r   r   r   )r   r:   )rB   rC   rD   rE   rF   rX   r  propertyr^   setterr  rH   r@   rI   r5   r  r    sJ       
[[ 
0rI   c                   ^ SU4S jjmU R                  SS5      S   nX:X  a!  USR                  S T" U5       5       5      -   OU nX![        SU 35      -  -
  $ )	a  
Helper to define TeX commands.

``cmd("\cmd", args)`` is equivalent to
``"\cmd" - (args | Error("Expected \cmd{arg}{...}"))`` where the names in
the error message are taken from element names in *args*.  If *expr*
already includes arguments (e.g. "\cmd{arg}{...}"), then they are stripped
when constructing the parse element, but kept (and *expr* is used as is) in
the error message.
c              3     >#    [        U [        5      (       a$  U R                   H  nT" U5       S h  vN   M     g U R                  (       a  U R                  v   g g  N*7frT   )r  r   exprsresultsName)eltexprnamess     r5   r&  cmd.<locals>.names	  sI     c?++		 ;&& "__//!  's   0A A+A r<  r   r    c              3  ,   #    U  H
  nS U-  v   M     g7f)z{%s}Nr@   )r   r  s     r5   r   cmd.<locals>.<genexpr>  s     BkdFTMks   z	Expected )r$  r   r   zT.Generator[str, None, None])r  rn  r  )r%  argscsnamer4   r&  s       @r5   cmdr-    sc    " ZZQ"Fn BGGBeDkBBB"& EIcU"34455rI   c                  @  ^ \ rS rSrSr " S S\R                  5      r\" SR                  5       5      r
\" SR                  5       5      r\" SR                  5       5      r\
\-  \-  r\" SR                  5       5      r\" S	R                  5       5      r\" S
R                  5       5      r\" SR                  5       5      r\" SR                  5       5      r\" SR                  5       5      r\" SR                  5       5      r\" SR                  5       5      r\" SR                  5       5      r\\-  \-  r\" \" \" S5      \" S5      S-   5       V VVVs/ s HA  n[4        R6                  " [9        U5      5      R                  5       S   R;                  5       PMC     snnnn 5      r\" \R@                  5      r!ShS jr"SiS jr#SjS jr$ShS jr%ShS jr&SkS jr'SlS jr(SmS jr)SmS jr*\+" \,RZ                  5      r.SmS jr/SnS jr0S S S S!S!S"S#S#S$SS%S&S'.r1SmS( jr2SmS) jr3    SoS* jr4SpS+ jr50 S,S-_S.S/_S0S1_S2S3_S4S5_S6S7_S8S9_S:S;_S<S=_S>S?_S@SA_SBS;_SCS3_SDS5_SES7_SFS9_SGS-_SHSISJSK.Er6\" SLR                  5       5      r7SmSM jr8SpSN jr9SpSO jr:SmSP jr;SmSQ jr<SmSR jr=\=r>SqSS jr?SpST jr@SmSU jrASrSV jrBSrSW jrCSrSX jrDSpU4SY jjrE      SsSZ jrFSmS[ jrGSmS\ jrHSmS] jrISmS^ jrJSmS_ jrKSpS` jrL\L=rMrNSmSa jrOSmSb jrP      StSc jrQSmSd jrRSmSe jrSSmSf jrTSgrUU=rV$ s  snnnn f )uParseri  z
A pyparsing-based parser for strings containing math expressions.

Raw text may also appear outside of pairs of ``$``.

The grammar is based directly on that in TeX, though it cuts a few corners.
c                  $    \ rS rSrSrSrSrSrSrg)Parser._MathStylei  r   r   rp   r'   r@   N)	rB   rC   rD   rE   DISPLAYSTYLE	TEXTSTYLESCRIPTSTYLESCRIPTSCRIPTSTYLErH   r@   rI   r5   
_MathStyler1    s    	rI   r6  u  + * - −
      \pm             \sqcap                   \rhd
      \mp             \sqcup                   \unlhd
      \times          \vee                     \unrhd
      \div            \wedge                   \oplus
      \ast            \setminus                \ominus
      \star           \wr                      \otimes
      \circ           \diamond                 \oslash
      \bullet         \bigtriangleup           \odot
      \cdot           \bigtriangledown         \bigcirc
      \cap            \triangleleft            \dagger
      \cup            \triangleright           \ddagger
      \uplus          \lhd                     \amalg
      \dotplus        \dotminus                \Cap
      \Cup            \barwedge                \boxdot
      \boxminus       \boxplus                 \boxtimes
      \curlyvee       \curlywedge              \divideontimes
      \doublebarwedge \leftthreetimes          \rightthreetimes
      \slash          \veebar                  \barvee
      \cupdot         \intercal                \amalg
      \circledcirc    \circleddash             \circledast
      \boxbar         \obar                    \merge
      \minuscolon     \dotsminusdots
      aF  
      = < > :
      \leq          \geq          \equiv       \models
      \prec         \succ         \sim         \perp
      \preceq       \succeq       \simeq       \mid
      \ll           \gg           \asymp       \parallel
      \subset       \supset       \approx      \bowtie
      \subseteq     \supseteq     \cong        \Join
      \sqsubset     \sqsupset     \neq         \smile
      \sqsubseteq   \sqsupseteq   \doteq       \frown
      \in           \ni           \propto      \vdash
      \dashv        \dots         \doteqdot    \leqq
      \geqq         \lneqq        \gneqq       \lessgtr
      \leqslant     \geqslant     \eqgtr       \eqless
      \eqslantless  \eqslantgtr   \lesseqgtr   \backsim
      \backsimeq    \lesssim      \gtrsim      \precsim
      \precnsim     \gnsim        \lnsim       \succsim
      \succnsim     \nsim         \lesseqqgtr  \gtreqqless
      \gtreqless    \subseteqq    \supseteqq   \subsetneqq
      \supsetneqq   \lessapprox   \approxeq    \gtrapprox
      \precapprox   \succapprox   \precnapprox \succnapprox
      \npreccurlyeq \nsucccurlyeq \nsqsubseteq \nsqsupseteq
      \sqsubsetneq  \sqsupsetneq  \nlesssim    \ngtrsim
      \nlessgtr     \ngtrless     \lnapprox    \gnapprox
      \napprox      \approxeq     \approxident \lll
      \ggg          \nparallel    \Vdash       \Vvdash
      \nVdash       \nvdash       \vDash       \nvDash
      \nVDash       \oequal       \simneqq     \triangle
      \triangleq         \triangleeq         \triangleleft
      \triangleright     \ntriangleleft      \ntriangleright
      \trianglelefteq    \ntrianglelefteq    \trianglerighteq
      \ntrianglerighteq  \blacktriangleleft  \blacktriangleright
      \equalparallel     \measuredrightangle \varlrtriangle
      \Doteq        \Bumpeq       \Subset      \Supset
      \backepsilon  \because      \therefore   \bot
      \top          \bumpeq       \circeq      \coloneq
      \curlyeqprec  \curlyeqsucc  \eqcirc      \eqcolon
      \eqsim        \fallingdotseq \gtrdot     \gtrless
      \ltimes       \rtimes       \lessdot     \ne
      \ncong        \nequiv       \ngeq        \ngtr
      \nleq         \nless        \nmid        \notin
      \nprec        \nsubset      \nsubseteq   \nsucc
      \nsupset      \nsupseteq    \pitchfork   \preccurlyeq
      \risingdotseq \subsetneq    \succcurlyeq \supsetneq
      \varpropto    \vartriangleleft \scurel
      \vartriangleright \rightangle \equal     \backcong
      \eqdef        \wedgeq       \questeq     \between
      \veeeq        \disin        \varisins    \isins
      \isindot      \varisinobar  \isinobar    \isinvb
      \isinE        \nisd         \varnis      \nis
      \varniobar    \niobar       \bagmember   \ratio
      \Equiv        \stareq       \measeq      \arceq
      \rightassert  \rightModels  \smallin     \smallowns
      \notsmallowns \nsimeqa  
     \leftarrow \longleftarrow \uparrow \Leftarrow \Longleftarrow
     \Uparrow \rightarrow \longrightarrow \downarrow \Rightarrow
     \Longrightarrow \Downarrow \leftrightarrow \updownarrow
     \longleftrightarrow \updownarrow \Leftrightarrow
     \Longleftrightarrow \Updownarrow \mapsto \longmapsto \nearrow
     \hookleftarrow \hookrightarrow \searrow \leftharpoonup
     \rightharpoonup \swarrow \leftharpoondown \rightharpoondown
     \nwarrow \rightleftharpoons \leadsto \dashrightarrow
     \dashleftarrow \leftleftarrows \leftrightarrows \Lleftarrow
     \Rrightarrow \twoheadleftarrow \leftarrowtail \looparrowleft
     \leftrightharpoons \curvearrowleft \circlearrowleft \Lsh
     \upuparrows \upharpoonleft \downharpoonleft \multimap
     \leftrightsquigarrow \rightrightarrows \rightleftarrows
     \rightrightarrows \rightleftarrows \twoheadrightarrow
     \rightarrowtail \looparrowright \rightleftharpoons
     \curvearrowright \circlearrowright \Rsh \downdownarrows
     \upharpoonright \downharpoonright \rightsquigarrow \nleftarrow
     \nrightarrow \nLeftarrow \nRightarrow \nleftrightarrow
     \nLeftrightarrow \to \Swarrow \Searrow \Nwarrow \Nearrow
     \leftsquigarrow \overleftarrow \overleftrightarrow \cwopencirclearrow
     \downzigzagarrow \cupleftarrow \rightzigzagarrow \twoheaddownarrow
     \updownarrowbar \twoheaduparrow \rightarrowbar \updownarrows
     \barleftarrow \mapsfrom \mapsdown \mapsup \Ldsh \Rdsh
     z, ; . ! \ldotp \cdotpz}
       \sum \prod \coprod \bigcap \bigcup \bigsqcup \bigvee
       \bigwedge \bigodot \bigotimes \bigoplus \biguplus
       zlim liminf limsup sup max minz.\int \oint \iint \oiint \iiint \oiiint \iiiintz3rm cal it tt sf bf bfit default bb frak scr regularz
      arccos csc ker min arcsin deg lg Pr arctan det lim sec arg dim
      liminf sin cos exp limsup sinh cosh gcd ln sup cot hom log tan
      coth inf max tanhzn
      | \| / \backslash \uparrow \downarrow \updownarrow \Uparrow
      \Downarrow \Updownarrow . \vert \Vertz[
      ( [ \{ < \lfloor \langle \lceil \lbrace \leftbrace \lbrack \leftparen \lgroup
      z]
      ) ] \} > \rfloor \rangle \rceil \rbrace \rightbrace \rbrack \rightparen \rgroup
      u   αu   ωr   r  c                6  ^ ^ [         R                  " 5       mSCUU 4S jjnSDS jn[        S5      Tl        [	        T R
                  5      " S5      Tl        [	        T R                   Vs/ s H  n[        UR                  5      PM     sn5      " S5      Tl
        [        SSR                  S	R                  [        [        R                  [         5      5      5      -   5      " S
5      R#                  5       Tl        [        S5      " S5      Tl        U" ST R(                  5      Tl        [-        S[	        T R(                  5      " S5      -   5      S-   Tl        [1        S5      Tl        [	        T R4                  5      Tl        [9        5       Tl        [9        5       Tl        [9        5       Tl        [9        5       Tl         [9        5       Tl!        [9        5       Tl"        T=R>                  TR<                  -  sl        U" 5         T=RB                  S[G        TRD                  5      " S5      -   S-   -  sl!        T=R@                  S[I        TRD                  5      " S5      -   S-   -  sl         [K        SSTR                  S5      -   S-   5      Tl&        U" S/ T RN                  QT RP                  Q5      TR?                  S
5      -
  Tl)        U" ST RT                  5      Tl+        TR.                  [G        TRD                  5      " S5      -   TR2                  -   Tl,        TR.                  [G        TRD                  5      " S5      -   [[        5       -   Tl.        [K        STRA                  S5      TRA                  S5      -   5      Tl/        [K        STRA                  S5      TRA                  S5      -   5      Tl0        [K        STRA                  S5      TRA                  S5      -   5      Tl1        [K        SS[-        TR6                  5      " S5      -   S-   S-   [-        TR6                  5      " S5      -   S-   S-   TR                  S5      -   S-   S-   [-        TR                  5      " S5      -   S-   TRA                  S5      -   TRA                  S5      -   5      Tl2        [K        S[-        S[I        [g        S5      TRD                  -   5      " S 5      -   S-   5      TRA                  S!5      -   5      Tl4        [K        S"TRA                  S#5      5      Tl5        [K        S$TRC                  S%5      TRC                  S#5      -   5      Tl6        [K        S&TRC                  S%5      TRC                  S#5      -   5      Tl7        [K        S'[q        SS(SS)95      Tl9        [K        S*[u        SS[w        [I        TRD                  5      5      [G        [1        S+5      Ry                  5       5      -   S,9" S-5      5      Tl=        [-        TR<                  5      " S.5      [I        [	        S/S0/5      TR<                  -
  5      " S15      -   [        S25      " S35      -   [        S45      " S35      -  TR?                  S.5      [        S25      " S35      -   -  Tl>        TR                  TRL                  -  TR*                  -  TR|                  -  Tl?        T=RD                  TR~                  TR:                  -  TR\                  -  TR&                  -  -  sl"        [K        S5S[G        TR~                  5      " S5      -   S-   5      Tl@        [K        S6S[G        TR~                  5      " S!5      -   S-   5      TlA        T=R<                  TRR                  TR$                  -  TRV                  -  TR                  -  TRX                  -  TR^                  -  TR`                  -  TRb                  -  TRd                  -  TRl                  -  TRn                  -  TRh                  -  TRj                  -  TRr                  -  TR                  -  TRz                  -  -  sl        S7TR7                  S85      [        S95      -  -
  nT=R:                  S:TR7                  S;5      [        S95      -  -
  [G        TR~                  TR:                  -  U-  5      " S<5      -   S=-   TR7                  S>5      [        S95      -  -
  -  sl        [I        TRD                  5      TlC        [q        S?S(S@SA9TlD        [        SB5      R#                  5       TlE        TR                  [G        TR                  TR                  -   5      -   [[        5       -   TlF        U" 5         TR                  T lG        TR                  T lH        S@T lI        g s  snf )ENc                   > [        T5      R                  5        Hb  u  pU R                  S5      (       a  M  U S;  a  UR                  U 5        [	        TU 5      (       d  MG  UR                  [        TU 5      5        Md     g )N_)token	placeable
auto_delim)varsr(  r  setNamehasattrr  r  )r)  r   rf  rW   s     r5   set_names_and_parse_actions4Parser.__init__.<locals>.set_names_and_parse_actions  sa     GMMO~~c** "FFC(tS))**74+=> ,rI   groupc                x   / n/ nU H?  nUS   R                  5       (       a  UR                  U5        M.  UR                  U5        MA     [        SR                  U SR	                  [        [        R                  U5      5      U(       a  SOSSR	                  [        [        R                  U5      5      S95      $ )Nr  z<\\(?P<{group}>(?:{alpha})(?![A-Za-z]){additional}{nonalpha})|r(  )rB  alphar  nonalpha)isalphar   r   rm  rn  r[   reescape)rB  r&  ends_with_alphaends_with_nonalphar  s        r5   csnames Parser.__init__.<locals>.csnames  s     O!#8##%%#**40&--d3	 
 OVV((3ryy/#BC&8sb XXc"))5G&HI	 W  rI   z[-+]?([0-9]+\.?[0-9]*|\.[0-9]+)spacestyle_literalzI[a-zA-Z0-9 +\-*/<>=:,.;!\?&'@()\[\]|\U00000080-\U0001ffff]|\\[%${}\[\]_|]z|\\(?:{})(?![A-Za-z])rD  r   z\\[A-Za-z]+r  r^   z\mathr<  r@  z\hspaceaccentz\fracr`   denz\dfracz\binomz\genfracldelimrdelimrulesizestylez\sqrt{value}rD  rG  rootr  z	\overlinebodyz\overset
annotationz	\undersetz\textr-   )endQuoteCharz	\substackz\\)openerclosercontentpartsnucleusr9  rr  subsuperz'*apostrophesz'+z\operatornamez\boldsymbol\middlemdelimzExpected a delimiterz\leftleftr  z\rightrightrN  F)unquoteResultsz(?:(?:\\[$])|[^$])*r(  )rB  r   r&  zIterable[str]r   r   )JtypesSimpleNamespacer   float_literalr	   _space_widthsrN  r6  r   r  rO  rm  rn  r[   rH  rI  r   leaveWhitespacer3   unknown_symbol
_fontnamesr^   r   start_groupr   	end_group_delimsdelimr   r<  r;  named_placeablerequired_groupoptional_groupr:  r   r
   r-  customspace_accent_map_wide_accentsrP  _function_namesfunctionrB  r   unclosed_groupfracdfracbinomgenfracr   sqrtoverlineoversetundersetr   textr)   r   suppresssubstackr_  simpleoperatorname
boldsymbolr  mathmath_stringnon_mathmain_expression_math_expression_in_subscript_or_superscript)rW   r@  rL  rv  rb  rf  s   `    @r5   rX   Parser.__init__  s`   !!#
	? 
	?	" !!CD !3!34W= #'??3?aS\?355DF !&--RYY0133

 
 !" 	
 !08"64??;#HuT__/Ef/M$MNQTT"3< . %Y$Y$Y$Y$Y$Y 	
akk)#%	S:agg#6w#??#EE	S9QWW#5g#>>DDJaoog.F(F(LM HF 0 0F43E3EFG&' 	
 VT%9%9:
--*QWW"5g">>LMMJqww,?,HH9;Vh 0 0 7!:J:J5:Q QRi!1!1%!81;K;KE;R!RSi!1!1%!81;K;KE;R!RS(177#H--3QWW%h/0256OOJ/0256  Q__-g67 :== u%	&
 u%&'	 S9VC[177%:;FCCcIJw'()
 q'7'7'?@
\*Q-=-=f-EEG	 \*Q-=-=f-EEG
 X|CCHI&c#/4Yqww5G/H'1'&/2J2J2L'M0NOOVXY
 akk"9-Sz*Q[[89*EFT{=)* Dk-()   +eDk-.HH	J 	

 77Q]]*QVV3ajj@	HHll 	
 -sZ5I&5Q/QTW/WXC*QXX"6w"??#EG 	
HHhh jj nn	
 gg ff gg gg ii	 ii
 jj ff jj ff ll  jj!	
( qwwx059O3PPQ	%0F*GGHALL069:5AB777+e4J.KKM	
 $AGG,&sDG 67GGI
JJAMMAJJ$>??)+M 	
 	$%66 ! -2)a 4s   )fc                l   [        USSX45      /U l        0 U l         U R                  R	                  U5      n/ U l        SU l	        0 U l        [        R                  " 5         [        R                  " [        US   5      $ ! [
         a)  n[        S[        R                  " US5      -   5      SeSnAff = f)z
Parse expression *s* using the given *fonts_object* for
output, at the given *fontsize* and *dpi*.

Returns the parse tree of `Node` instances.
r   r  
r   NF)r  _state_stack_em_width_cacher  parseStringr   r2   r   explainr  r   
resetCacher   r   r  )rW   ri  fonts_objectr_   r   resultr4   s          r5   r%   Parser.parseo  s     ixEGFH	N%%11!4F ,1)!  "vveVAY'' " 	NTN$:$:3$BBCM	Ns   B   
B3
$B..B3c                     U R                   S   $ )z&Get the current `State` of the parser.r  )r  r  s    r5   	get_stateParser.get_state  s      $$rI   c                8    U R                   R                  5         g)zPop a `State` off of the stack.N)r  popr  s    r5   	pop_stateParser.pop_state  s    rI   c                r    U R                   R                  U R                  5       R                  5       5        g)z=Push a new `State` onto the stack, copying the current state.N)r  r   r  r  r  s    r5   
push_stateParser.push_state  s&      !1!6!6!89rI   c                6    [        UR                  5       5      /$ rT   )r  asListrW   r
  s     r5   r  Parser.main  s    dkkm$%%rI   c                B    U R                   R                  US   SS SS9$ )Nr   r   r  T)parseAll)r  r  r  s     r5   r  Parser.math_string  s(    $$00a20NNrI   c                Z    [        UR                  5       5      nU R                  5         U/$ rT   )r  r  r  )rW   r
  hlists      r5   r  Parser.math  s#    dkkm$wrI   c                   US   R                  SS5      nU Vs/ s H  n[        X0R                  5       5      PM     nn[        U5      nU R	                  5         [
        R                  S   U R                  5       l        U/$ s  snf )Nr   z\$rN  r  )replacerC  r  r  r  r  r  r^   )rW   r
  ri  rt  symbolsr  s         r5   r  Parser.non_math  sn    GOOE3'678a4>>+,a8g #-? @w 9s   #Bc           	         U R                  5         U R                  5       nSUl        [        US    Vs/ s H  n[	        X25      PM     sn5      nU R                  5         U/$ s  snf )Nr  r   )r  r  r^   r  rC  r  )rW   r
  r  rt  r  s        r5   r  Parser.text  sV     
tAw7w!tA~w78w 8s   A#c                z   U R                  5       nUR                  UR                  UR                  4nU R                  R                  U5      nUc^  UR                  R                  S[        R                  S   SUR                  UR                  5      nUR                  nX@R                  U'   [        XA-  5      $ )Nr   r  rX  )r  r^   r_   r   r  r   r  r   r  r  r   r  )rW   
percentager  r)  r;   rr   s         r5   _make_spaceParser._make_space  s      zz5>>5995$$((-=mm//cll#56		+G OOE(-  %E&''rI   gKqU?g0Bxq?g%?g1ZGU?r  rp   gKqUſ)\,z
\thinspacez\/z\>z\:z\;z\ ru  z\enspacez\quadz\qquadz\!c                N    U R                   US      nU R                  U5      nU/$ NrN  )ri  r  )rW   r
  r`   rV   s       r5   rN  Parser.space  s-      g/s#urI   c                ,    U R                  US   5      /$ r  )r  r  s     r5   rt  Parser.customspace  s      g/00rI   c                X   US   nUS:X  a  Sn [        X@R                  5       5      nX@R                  ;   a  [        S US U S S S2    5       S5      nU R                  (       dN  X@R                  ;   aB  [        US U R                  5       5      S:X  d  US	1U R                  kU R                  k;   a  U/$ [        U R                  S
5      UU R                  S
5      /SS9/$ X@R                  ;   a  [        S US U S S S2    5       S5      n[        S XS-   S   5       S5      nUS:X  a  US	:X  a	  US:X  a  U/$ US:X  a-  UR                  5       (       a  UR                  5       (       a  U/$ [        XPR                  S
5      /SS9/$ U/$ ! [         a  n[        XSU-  5      UeS nAff = f)Nr   rm  u   −zUnknown symbol: %sc              3  4   #    U  H  oS :w  d  M
  Uv   M     g7frK  Nr@   r   rt  s     r5   r    Parser.symbol.<locals>.<genexpr>       CAs(aa   		r  r(  r   r<  r  Tr  c              3  4   #    U  H  oS :w  d  M
  Uv   M     g7fr  r@   r  s     r5   r   r    r  r  c              3  4   #    U  H  oS :w  d  M
  Uv   M     g7fr  r@   r  s     r5   r   r    s     AASaar  r   rq  r@  ro  )rC  r  r2   r   _spaced_symbolsr  r  _binary_operatorsr/  r  _left_delims_relation_symbolsr  r  _punctuation_symbolsisdigit)	rW   ri  r	  r
  rt  r  r4   	prev_char	next_chars	            r5   r3   Parser.symbol  s   K8 !A	I>>+,D
 $$$ C4C2CRHI 11///$3(A-?J"//?J262H2H?J 2Jvt//4##//46 '+, - - +++C4C2CRHIA78A2FI Cx#	S(8 6M CxI--//I4E4E4G4Gvt%5%5c%:;TJKKvE  	I%a&:Q&>@EHI	Is   F
 

F)F$$F)c                &    [        XSUS    35      e)NzUnknown symbol: r  r  rW   ri  r	  r
  s       r5   rk  Parser.unknown_symbol	  s    !!,<T&\N*KLLrI   hatz\circumflexaccentbrevez\combiningbrevebarz\combiningoverlinegravez\combininggraveaccentacutez\combiningacuteaccenttildez\combiningtildedotz\combiningdotaboveddotz\combiningdiaeresisdddotz\combiningthreedotsaboveddddotz\combiningfourdotsabovevecz\combiningrightarrowaboverF  `rZ  ru  ro  rr  z\rightarrowz
\leftarrowz\circ)overrightarrowoverleftarrowmathringzwidehat widetilde widebarc                   U R                  5       nUR                  5       nUS   nUS   nX@R                  ;   a  [        SU-   UR                  U[
        S9nO[        U R                  U   U5      nUS:X  a   UR                  5         UR                  5         [        [        UR                  S-  5      U/5      nUR                  UR                  S5        [        U[        SUS	-  5      [        U/5      /5      $ )
NrP  r   r-   )r  r  g      @exactlyr          @)r  r  rv  r  r;   rZ  ru  r"  r  r=  r  r  r7  r  )rW   r
  r  r  rP  r   
accent_boxcentereds           r5   rP  Parser.accent#	  s     99;	h5k'''&vsyy%FDJ   0 0 8%@JZd399s?3Z@Asyy),RS)se  	rI   c                >    U R                  XU5      nUS   Ul        U$ )Nr  )r  function_name)rW   ri  r	  r
  r  s        r5   rx  Parser.function9	  s%    !!!$/"6lrI   c                   U R                  5         U R                  5       nSUl        / nUS   nU H  n[        U[        5      (       a*  SUl        UR                  5         UR                  U5        MB  [        U[        5      (       a  UR                  [	        Xt5      5        Ms  UR                  U5        M     U[        U5      -   S-   n[        U[        5      (       a  U[        S5      -  n[        S XS   5       S5      n	U R                  SS1-  n
X;  a0  X`R                  ;  a!  XPR                  U R                  S	   5      /-  nU R                  5         U	S
;   a  SU l        OSU l        [#        U5      $ )Nr  r  r   zoperatorname{}c              3  4   #    U  H  oS :w  d  M
  Uv   M     g7fr  r@   r  s     r5   r   &Parser.operatorname.<locals>.<genexpr>Q	  s     C%6s(!!%6r  r(  rr  r9  r  >   rr  r9  TF)r  r  r^   r  rC  rE  r   r   r/  r   r  ro  _overunder_functionsr  ri  r  r  r  )rW   ri  r	  r
  r  
hlist_listr  rt  next_char_locr  
delimiterss              r5   r  Parser.operatorname>	  sN    
!#
F|A!T""!!#!!!$As##!!$q.1!!!$  c$i!+dL))S!122MCQ~%6CRH	\\S#J.
'555++D,>,>u,EFGGJ 
"04D-05D-Z  rI   c                    U R                  5         UR                  S5      (       a$  UR                  S5      U R                  5       l        / $ Nr^   )r  r   r  r^   r  s     r5   rm  Parser.start_groupa	  s8    88F$(HHV$4DNN!	rI   c                >    [        UR                  S/ 5      5      nU/$ NrB  r  r   )rW   r
  grps      r5   rB  Parser.grouph	  s    DHHWb)*urI   c                8    [        UR                  S/ 5      5      $ r  r  r  s     r5   rr  Parser.required_groupl	  s    TXXgr*++rI   c                &    U R                  5         / $ rT   )r  r  s    r5   rn  Parser.end_groupq	  s    	rI   c                .    [        U[        U5      S5      e)NzExpected '}')r   r/  r  s       r5   ry  Parser.unclosed_groupu	  s    !!SV^<<rI   c                6    US   U R                  5       l        / $ r  )r  r^   r  s     r5   r^   Parser.fontx	  s     $V	rI   c                    [        U[        5      (       a  UR                  U R                  ;   $ [        U[        5      (       a*  [        US5      (       a  UR                  U R                  ;   $ g)Nr  F)r  rC  rt  _overunder_symbolsr  r?  r  r  rW   r^  s     r5   is_overunderParser.is_overunder|	  sW    gt$$99 7 777''GG_,M,M((D,E,EEErI   c                `    [        U[        5      (       a  UR                  U R                  ;   $ gNF)r  rC  rt  _dropsub_symbolsr  s     r5   
is_dropsubParser.is_dropsub	  s'    gt$$99 5 555rI   c                N    [        U[        5      (       a  UR                  5       $ gr	  )r  rC  rP  r  s     r5   rP  Parser.is_slanted	  s!    gt$$%%''rI   c           	       > UR                  S[        S5      5      nUR                  S/ 5      n[        UR                  S/ 5      5      nU(       d	  U(       d  U$ S =pxU(       a4  UtpnU	S:X  a  Ub  [        S5      eU
nOUb  [        S5      eU
nU(       a  M4  U R	                  5       nUR
                  R                  UR                  UR                  UR                  5      nUR
                  R                  UR                  UR                  UR                  5      nU(       am  Uc  [        / 5      n[        U5       H0  nUR                  R                  U R                  XSS	05      5        M2     UR!                  5         UR#                  5         U R%                  U5      (       GaO  / nS
nUR&                  nUb&  UR)                  5         [+        UUR&                  5      nUb&  UR)                  5         [+        UUR&                  5      nUS-  nUb;  [-        U/5      nUR#                  US5        UR                  U[/        SU5      /5        [-        U/5      nUR#                  US5        UR1                  U5        UbW  [-        U/5      nUR#                  US5        UR                  [/        SU5      U/5        UR2                  U-   UR4                  -   n[7        U5      nUUl        [        U/5      nU/$ Un[;        U[        5      (       a  UR                  n[        U5      (       ab  [;        US   [<        5      (       a  [?        US   S5      (       a  US S nUS   n[?        US5      (       a  UR@                  RB                  Ul        [        USS9nO<[;        U[D        5      (       a  UR@                  RB                  Ul        [        U/5      n[G        U5      nUR2                  nSnU RI                  U5      (       a  UR4                  nURJ                  U-  nURJ                  U-  nU RM                  U5      (       a  UURJ                  U-  -  nUURN                  UUS-  S-  -
  -  -  nU RI                  U5      (       a?  SURJ                  -  URP                  -
  U-  nSURJ                  -  URP                  -   U-  nOSnUc  [        [=        U5      [R        RT                  " [V        U5      /5      nUR)                  5         U RI                  U5      (       a  UURX                  U-  -   nOURZ                  U-  nUUl        GO3[        [=        U5      U/5      nUR)                  5         U RI                  U5      (       a  UURX                  U-  -
  nOUR\                  U-  nUc	  U* Ul        O[        [=        U5      U/5      n U R)                  5         U RI                  U5      (       a  UURX                  U-  -   nOUR^                  U-  nSU-  UUR4                  -
  U R2                  U-
  -
  -
  n!U!S
:  a  UU!-  n[7        U[=        UUR4                  -
  U R2                  U-
  -
  5      U /5      nUUl        U RI                  U5      (       d"  U=R&                  UR`                  U-  -  sl        UU/n"U Rb                  (       a)  U"U Re                  U Rf                  S   5      /-  n"SU l1        [        U"5      nU/$ )Nr^  r   r_  r`  r9  zDouble subscriptzDouble superscriptr   r  r         @r  r  rL  Fr  r  r'   r  )4r   r=  r/  r   r  r  r   r^   r_   r   r   r  r  re  extendr3   rS  r  r  r;   r"  ru   r  r7  r   r<   r=   r  rd  r  r  r?  rL  r   rC  r  r  r  rP  r  r  r   r   r  r  r  r  r  r  r  r  ri  )$rW   ri  r	  r
  r^  r_  napostrophessubr   opargr  rule_thicknessr  rI  vlistr  r;   vgapr  vltr  	last_charr  r  	lc_heightlc_baseline	superkernsubkernr  
shift_downshift_upr   clrspaced_nucleusr   s$                                      r5   r_  Parser.subsuper	  s>   ((9d1g.88J+488M267N!)BhSy?-.@AA$-.BCC h  >>JJ		3--++JJ		3 }b	<(%%dkk!5):L&MN ) JJLKKM W%%EEMME E5;;/

E399-!C'D !5'*E9-eT!T]34wi(EKKy)LL!3%(E9-d1dmU34t+gmm;,C$CC5\F8O 	gu%%"++L<  |B/66R 0*==#/#4L(,	9j11&/&8&8&@&@IOL%8G'4(("+"4"4"<"<	WI&G +51	&&	??9%%#//K OOg-	//G+??9%%722I)11$w|b'88: ;Iy))y.$3347@A0&5569BC	  =
 tG}affT3&789AHHJy))(9+<+<w+FF
&^^g5
'ANtI./AHHJy))$y'8'87'BB$>>G3{"*4=#./
??9--!,y/@/@7/J!JJ!*'!9J^+!AGG+:0EFH8OH(QWW,J1FGH  ",y))GGy--77G "1,,t//0B0B50IJKKN05D-~&xrI   c           
        U R                  5       nUR                  5       n[        UR                  5       H#  n	UR	                  5         UR	                  5         M%     [        U/5      n
[        U/5      n[        UR                  UR                  5      nU
R                  US5        UR                  US5        [        U
[        SUS-  5      [        Xs5      [        SUS-  5      U/5      nUR                  R                  UR                  [        R                   S   SUR"                  UR$                  5      nUR&                  UR(                  UR*                  -   S-  US-  -
  -
  nXl        [/        U[1        US-  5      /5      /nU(       d  U(       aQ  US:X  a  S	nUS:X  a  S	nU R3                  U[4        R6                  " [8        [:        [<        -  [>        -     U5      U5      $ U$ )
Nr  r   r  r  =rp   r  r(  ro  ) r  r  r  r  r"  r  ru   r;   r  r  r7  r  r  r   r^   r  r  r_   r   r<   rt   rw   rd  r  r=  _auto_sized_delimiterr   r   r  r   rC  r   )rW   rR  rS  rulerU  r`   rQ  r  r  r9  cnumcdenr;   r  rr   r  r  s                    r5   _genfracParser._genfrac3
  s    99;	u{{#AJJLJJL $ ##CIIsyy)

5)$

5)$tAy3/U)Ay3/	  --++JJ%78, <<',,.!3c/"# #Y^ 4567V||--f./ffT#*s:J5K5;/=.46 6 rI   c                <    U R                  [        US   5      5      $ )NrO  )r6  rx   r  s     r5   rO  Parser.style_literal]
  s    s4#89::rI   c           	         U R                  UR                  SS5      UR                  SS5      US   UR                  SU R                  R                  5      US   US   5      $ )NrR  r(  rS  rT  rU  r`   rQ  )r+  r   r6  r3  r  s     r5   r}  Parser.genfrac`
  sZ    }}HHXr"DHHXr$:dhhw0I0IJKe& 	&rI   c           	         U R                  SSU R                  5       R                  5       U R                  R                  US   US   5      $ Nr(  r`   rQ  )r+  r  r  r6  r3  r  s     r5   rz  Parser.fracf
  sE    }}DNN$DDFOO%%tE{DKA 	ArI   c           	         U R                  SSU R                  5       R                  5       U R                  R                  US   US   5      $ r2  )r+  r  r  r6  r2  r  s     r5   r{  Parser.dfrack
  sE    }}DNN$DDFOO(($u+tE{D 	DrI   c           	     b    U R                  SSSU R                  R                  US   US   5      $ )Nr2  r7  r   r`   rQ  )r+  r6  r3  r  s     r5   r|  Parser.binomp
  s5    }}aOO%%tE{DKA 	ArI   c                   US   nUS   nU R                  5       R                  5       nUR                  5         [        U/5      n[        U/5      n[	        UR
                  UR
                  5      n	UR                  U	S5        UR                  U	S5        US-  n
XS-      S:X  a;  [        U[        SU
5      U/5      nUR                  UR                  -   U
-   Ul        U$ [        U[        SU
5      U/5      nU$ )NrX  rW  r  r'   r   ur   )r  r  r"  r  ru   r;   r  r  r7  r=   r<   rd  )rW   ri  r	  r
  rX  rW  r  centered_annotationcentered_bodyr;   r  r  s               r5   _gensetParser._gensetu
  s   ,'
F|NN$DDF	'5!4&)'--}/B/BC!!%3E9-1}1W:Q# E "/!4!47J7Q7Q!QTX!XE  #Q E rI   c                r   UR                  S5      nUS   nU R                  5       nUR                  5       nUR                  UR                  -
  US-  -   nUR
                  UR                  -   n[        SXgUSS9nUR                  UR                  -
  nUR
                  UR                  -   n[        [        SU-  5      U[        SU-  5      /5      n	[        [        U5      [        S5      U	/5      n
U
R                  XdR                  UR                  -  S	-  -   S
U5        U(       d  [        UR                   S-  SS5      nO+[        U5      nUR#                  5         UR#                  5         [        [        U/5      /5      nU* S-  Ul        [        U[%        UR                   * S-  5      UU
/5      nU/$ )NrV  r  g      @re  T)r  rp   r       @r  r  r   r  )r   r  r  r<   rd  r=   r  r  r=  r  r  r  r  r_   r   r   r;   r"  r  )rW   r
  rV  rW  r  r  r<   r=   checkpadded_body	rightside
root_vlistr  s                r5   r~  Parser.sqrt
  s   xxG} 99;	 t0009s?B

T...|VE$O 2 22e000 T!i-0$Q]8KLM5<f{CD	..599"<!NN!5	*
 u{{S("b1D;DKKMKKME4&M?+
#)'C-
zU[[L3./ 	" #
 wrI   c                   US   nU R                  5       nUR                  5       nUR                  UR                  -
  US-  -   nUR                  UR                  -   n[        [        U5      [        S5      [        U/5      /5      nUR                  XSR                  UR                  -  S-  -   SU5        [        U/5      nU/$ )NrW  r  r  r?  r  )r  r  r<   rd  r=   r  r  r  r  r  r_   r   )	rW   r
  rW  r  r  r<   r=   rB  r  s	            r5   r  Parser.overline
  s    F| 99;	t0009s?B

T... 5<fudV}EF	 	..599"<!NN!5	* yk"wrI   c           
     @   U R                  5       n[        U5      (       Ga  [        U Vs/ s H&  n[        U[        5      (       a  M  UR
                  PM(     sn5      n[        U Vs/ s H&  n[        U[        5      (       a  M  UR                  PM(     sn5      nS n[        U5       HW  u  pU
S:X  d  M  [        R                  " [        X)S-      5      nUS:w  a  [        XXtUS9X)S-   '   OUR                  U5        X)	 MY     [        R                  " [        [        [        -     U5      nOSnSnSn/ n/ nUS:w  a  UR                  [        XXtUS95        UR!                  U5        US:w  a  UR                  [        X6XtUS95        [#        U5      nU$ s  snf s  snf )Nra  r   ro  )r  r   r  )r  r/  ru   r  r   r<   r=   	enumerater   r   r  remover  r   rC  r   r  r  )rW   frontmiddlebackr  r  r<   r=   r  idxelrt  middle_partr]  r  s                  r5   r'  Parser._auto_sized_delimiter
  sf     v;;FMFq*Q:L(!((FMNF&K&Q
1c8J&KLEF$V,#sF7O4ACx*8 !5+HQw a( - &&cDj!16:KFEFKC<LLue6JL[!3;LLtU&IKe? NKs   FF(FFc                f    U R                  US   SU;   a  US   R                  5       O/ US   5      $ )Nrc  r  rd  )r'  r  r  s     r5   r<  Parser.auto_delim
  s;    ))L$)TMDK rM	 	rI   c                   U R                  5         U R                  5       n/ nUS   nU GH  n[        U[        5      (       aN  UR                  S   n[        U[
        5      (       a  SUl        UR                  5         UR                  U5        Mg  [        U[
        5      (       ax  SUl        UR                  U R                  ;   d  UR                  SS  U R                  ;   a  SUl        UR                  5         UR                  5         UR                  U5        M  UR                  U5        GM     U R                  5         [        U5      $ )Nr  r   r!  r  )r  r  r  r  re  rC  r^   rE  r   rt  _latin_alphabets_small_greekr  )rW   r
  r  r  r  rt  rP  s          r5   r  Parser.boldsymbol
  s     G}A!U##JJqMa&&!AF%%'QAt$$CC400033qr7d///#AF%%'!!#QQ! " 	U|rI   c                   US   nU R                  5       nUR                  5       nUS    Vs/ s H  n[        U5      PM     nn[        [	        S U5      5      n/ nU H2  n	[        U	/5      n
U
R                  US5        UR                  U
5        M4     [        U[        SUS-  5      /[        U5      -  5       VVs/ s H  nU  H  nUPM     M     nnnUS	 [        U5      n[        U/5      /nU$ s  snf s  snnf )Nr]  r   c                    U R                   $ rT   r  rH  s    r5   <lambda>!Parser.substack.<locals>.<lambda>  s    aggrI   r  rp   r  )r  r  r  ru   r[   r  r  r   zipr7  r/  r  )rW   r
  r]  r  r  rP  r  	max_widthr  r  cppairr   stackr  r  s                   r5   r  Parser.substack  s   W 99;	#(8,8aq8,-u56	CC5!BHHY	*LL  !aQ)?(@3u:(MN"NT S   N 	 " "IEl, -"s   C3=C8)r  r  r  r  r  r(  )
ri  r   r  r   r_   r:   r   r:   r   r  r  )r
  r   r   zlist[Hlist])r
  r   r   r   )r
  r   r   r  )r  r:   r   r  )ri  r   r	  rx   r
  zParseResults | dict[str, str]r   r  r  )r   r  )r^  r  r   r   )rR  r   rS  r   r(  r  rU  r6  r`   r  rQ  r  r   r  )rJ  r   rK  zlist[Box | Char | str]rL  r   r   r  )WrB   rC   rD   rE   rF   enumEnumr6  r  r  r  r  _arrow_symbolsr  r  r  r  r
  rl  rw  _ambi_delimsr  _right_delimsro  r  r.   r  r  r  r   rU  stringascii_lettersrT  rX   r%   r  r  r  r  r  r  r  staticmethodr   convertToFloatrh  r  r  ri  rN  rt  r3   rk  ru  rv  rP  rx  r  rm  rB  rr  rs  rn  ry  r^   r  r  rP  r_  r+  rO  r}  rz  r{  r|  r<  r  r  r~  r  r'  r<  r  r  rH   r  )r   rI  r  r  r   s   0000@r5   r/  r/    sf   TYY  
0 %'36  5j  %uwk5(n  	0 
1N4 (*;;nLO7==?@  57
 >DDFGLRRTU 33857<J   !57$O
  //4uw8L  

%'L  

%'M ]*\9GS!?@ !?@1DFGF JK((Q0668<BBDFG HL 6//0w2r(,% :&O
 !!1!@!@AM($ M
1.2.7<.`M/- 	0 	3	
 	3 	- 	0 	1 	6 	5 	7 	1 	3 	3 	-  	0!" 	/#$ *(#)K. 4::<=M,
!!F, $N=

dL(("'(,1(T;&A
D
A
@ ! Gh&P&$&<$$'$,1$L4 QGs   ALr/  )r3   r   r   rx   )r  r  r   ztype[FontConstantsBase]))r   r   )rV   r   r  ztuple[float, float]r   rQ   )r  r   r   r   )r%  r   r+  r   r   r   )|rF   
__future__r   abcr  ra  r   loggingr   rH  rf  r  rf  typingr   r   numpyr\   	pyparsingr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   
matplotlibr  r(  r   _mathtext_datar   r   r   r   font_managerr   r   r    ft2fontr!   r"   r#   r$   packaging.versionr%   parse_versionr&   pyparsing_versionmajorr(   r)   TYPE_CHECKINGcollections.abcr*   r+   enablePackrat	getLoggerr  r6   r8   rC   rK   rQ   r   r   ABCr   ABCMetar   r  r  r  r  r  r%  r  r1  r0  r  r  r   r  r  r
  r  r  r  r   r7  r=  rC  rZ  rb  r  r  r  r  r  r  r  r  r  r  r  r  r  ry   r  r  r-  r/  r@   rI   r5   <module>r~     s   # 
     	 	             D D < < : : 4 6"#))A-3%??(    ./,3* 3& / * ( / 85 85v* @z i!CGG i!XfIES[[ fIRgC- gCTA!= A!H&A,#++ &AR{ $k $p pfI B  !, !,H"3 ) - 	0 		/ 	
*/ , (	
 ) ) ( ) ) ) $ ' ( ( )  '!" '#& 3-) 0   .$ *,3 ,(3 (D+4 D+NIT I.)/3 )/Xc<D c<LO<D O<dD3 D(7D 7;D ;
  RQA.RQA.RQA.RQA.RQA.RQA.RQA.RQQ/		 G4 G8M M> >(4 (6%"U %"P E  :Pn/#0 #0L62W WrI   