
    9Цit                      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%J&r&  SSK'r(SSK)J*r*  SSK+J,r,J-r-J.r.J/r/  SS	K0J1r1J2r2J3r3  SS
K4J5r5J6r6J7r7J8r8  \Rr                  (       a  SSK:J;r;  SSK4J<r<  \Rz                  " 5         \R|                  " S5      r?SS jr@ " S S\5      rAS\AlB         " S S\5      rCS\ClB         " S S5      rD " S S\5      rE " S S\5      rF " S S\R                  5      rH " S S\H\R                  S9rJ " S S\J5      rK " S  S!\J5      rL " S" S#\L\R                  S9rM " S$ S%\M5      rN " S& S'\M5      rO " S( S)\L5      rP " S* S+\P5      rQS,rRS-rS " S. S/5      rT " S0 S1\T5      rU " S2 S3\T5      rV " S4 S5\T5      rW " S6 S7\T5      rX " S8 S9\T5      rY0 S:\Y_S;\Y_S<\X_S=\U_S>\U_S?\U_S@\U_SA\U_SB\U_SC\U_SD\V_SE\V_SF\V_SG\V_SH\V_SI\V_SJ\V_\Y\YSK.ErZSSM jr[ " SN SO5      r\ " SP SQ\\5      r] " SR SS\]5      r^ " ST SU\]5      r_ " SV SW\\5      r` " SX SY\`5      ra " SZ S[\]5      rb " S\ S]\b5      rc " S^ S_\b5      rd " S` Sa\]5      re " Sb Sc\e5      rf " Sd Se\e5      rg " Sf Sg\5      rh\h" ShSiSShS5      \h" ShSiSjShS5      \h" ShSiSkShS5      \h" ShShSSiS5      \h" ShShSSiSj5      \h" ShShSSiSk5      \h" ShShSShS5      \h" ShSiSSlS5      Sm.\hli         " Sn So\\5      rj " Sp Sq\c5      rk " Sr Ss\d5      rl " St Su\\5      rm " Sv Sw\c5      rn " Sx Sy\c5      roSSSz jjrpSS{ jrq " S| SL5      rrSS} jrs " S~ S5      rtg)z.
Implementation details for :mod:`.mathtext`.
    )annotationsN)
NamedTuple)EmptyForwardLiteralGroupNotAny	OneOrMoreOptionalParseBaseExceptionParseExceptionParseExpressionParseFatalExceptionParserElementParseResultsQuotedStringRegex	StringEnd
ZeroOrMorepyparsing_commonnested_exprone_of   )cbook)latex_to_bakomastix_glyph_fixesstix_virtual_fontstex2uni)FontPropertiesfindfontget_font)FT2FontFT2ImageKerning	LoadFlags)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     S/var/www/html/ai-image-ml/venv/lib/python3.13/site-packages/matplotlib/_mathtext.pyget_unicode_indexr2   /   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)VectorParseE   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<       r1   r4   r4   E   s$     LML::22rE   r4   c                  V    \ rS rSr% SrS\S'   S\S'   S\S'   S\S'   S\S'   S	\S
'   Srg)RasterParse[   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.
r6   oxoyr7   r8   r9   r#   imager<   Nr=   r<   rE   r1   rG   rG   [   s'     	IILMLOrE   rG   c                  6    \ rS rSrSrSS jrS	S jrS
S jrSrg)Outputr   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;   )selfrR   s     r1   __init__Output.__init__z   s    ;=>@
rE   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 rP   )mapnpceilrR   r7   r8   r9   r:   fontfontsizenumoffsetr;   r4   )rS   whdrI   rJ   infogsx1y1x2y2rss                r1   	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yminrR   r9   r8   r#   intrX   rY   shiprZ   draw_glyph_to_bitmapicebergglyphdraw_rect_filledrG   )rS   rk   rI   rJ   ra   rc   rd   re   rf   ro   rs   rr   rp   r^   r_   r`   rK   shiftedr8   centerys                        r1   	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-rQ   N)rR   Box)returnr4   )rk   boolr   rG   )	r>   r?   r@   rA   rB   rT   rh   r}   rD   r<   rE   r1   rM   rM   r   s    A
0"5rE   rM   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).
r6   advancer8   r7   ro   rr   rs   rp   rw   r   slantedr<   Nr=   r<   rE   r1   r   r      s6    ( NML
K
K
K
KNMrE   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"   rZ   r6   r[   strpostscript_namer   rn   rt   r\   r'   rx   r]   r<   Nr>   r?   r@   rA   rC   rD   r<   rE   r1   r   r      s'    
MO	HLMrE   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)rS   r   r   s      r1   rT   Fonts.__init__   s     "3 0rE   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<   )
rS   font1
fontclass1sym1	fontsize1font2
fontclass2sym2	fontsize2dpis
             r1   get_kernFonts.get_kern   s     rE   c                    [         erP   NotImplementedError)rS   rZ   s     r1   	_get_fontFonts._get_font   s    !!rE   c                    [         erP   r   )rS   rZ   
font_classsymr[   r   s         r1   	_get_infoFonts._get_info       !!rE   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   rn   )rS   rZ   r   r   r[   r   ra   s          r1   get_metricsFonts.get_metrics   s     2 ~~dsC||rE   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)
rS   outputrI   rJ   rZ   r   r   r[   r   ra   s
             r1   render_glyphFonts.render_glyph  s,     ~~dsCbd^,rE   c                >    UR                   R                  X#XE45        g)z<
Draw a filled rectangle from (*x1*, *y1*) to (*x2*, *y2*).
N)r;   r   rS   r   rc   rd   re   rf   s         r1   render_rect_filledFonts.render_rect_filled$  s    
 	RR,-rE   c                    [        5       e)z6
Get the xheight for the given *font* and *fontsize*.
r   rS   rZ   r[   r   s       r1   get_xheightFonts.get_xheight+  s     "##rE   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       r1   get_underline_thicknessFonts.get_underline_thickness1  s    
 "##rE   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<   rS   fontnamer   s      r1   !get_sized_alternatives_for_symbol'Fonts.get_sized_alternatives_for_symbol8  s       rE   r   Nr   r   r   r%   r   r   r   r   r   r   r   r6   r   r   r   r   r   r   r   r6   r   r6   r   r6   )rZ   r   r   r"   )rZ   r   r   r   r   r   r[   r6   r   r6   r   r   )rZ   r   r   r   r   r   r[   r6   r   r6   r   r   )r   rM   rI   r6   rJ   r6   rZ   r   r   r   r   r   r[   r6   r   r6   r   Noner   rM   rc   r6   rd   r6   re   r6   rf   r6   r   r   rZ   r   r[   r6   r   r6   r   r6   r   r   r   r   r   zlist[tuple[str, str]])r>   r?   r@   rA   rB   rT   r   r   r   r   r   r   r   r   r   rD   r<   rE   r1   r   r      s    1),47DI %"""!)"#.8-!$-+.-:?-FK-PT-.$.*/.5:.@E.JN.$$!/2!7L!rE   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$ )TruetypeFontsiC  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)
superrT   	functoolscacher   _fontsfontmapr    r   r!   )rS   r   r   filenamedefault_font	__class__s        r1   rT   TruetypeFonts.__init__I  se    *="8-/D223)!-I!-IrE   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      $ rP   )r   Tcastr   r   getospathexistsr!   r   lowerr"   )rS   rZ   basenamecached_fonts       r1   r   TruetypeFonts._get_fontU  s    <<||D)H vvc4(Hkkooh/277>>(#;#;"8,K$/KK!7BKK334?JKK3399;<vvg{++rE   c                `    UR                   S:X  a  UR                  S-  S-  US-  U-  S-  -   $ g)NCmex10@   rl      H   r   )r   r8   )rS   rZ   rx   r[   r   s        r1   _get_offsetTruetypeFonts._get_offsetd  s:    8+LL2%)hqj3.>r.ABBrE   c                    [         erP   r   )rS   r   r   r   s       r1   
_get_glyphTruetypeFonts._get_glyphj  r   rE   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     r1   	<genexpr>*TruetypeFonts._get_info.<locals>.<genexpr>u  s     !Ajs(js      r   )	r   r8   r7   ro   rr   rs   rp   rw   r   )rZ   r[   r   rn   r\   rx   r]   )r   set_size	load_charr   bboxr   r   linearHoriAdvancer8   r7   horiBearingYr   r   )rS   r   r   r   r[   r   rZ   r\   r   rx   ro   rs   rr   rp   r]   rn   s                   r1   r   TruetypeFonts._get_infoo  s    !__X3G7h$s*?*?@!Aejj!AD!!$x=++e3<<"$++"&&+f4
  00
 	
rE   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rcParamsrw   )rS   r   r[   r   rZ   r   rn   r   s           r1   r   TruetypeFonts.get_xheight  s    ~~h'h$""6*<&&#,,'9:CPG??"	?T)ho>#+NrE   c                    SU-  U-  S-  $ )Ng      ?g      R@r<   r   s       r1   r   %TruetypeFonts.get_underline_thickness  s     (3.$66rE   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   rZ   get_kerningr\   r$   DEFAULTr   r   )rS   r   r   r   r   r   r   r   r   r   info1info2rZ   r   s                r1   r   TruetypeFonts.get_kern  s     >i4NN5dsKENN5dsKE::D##EIIuyy'//JROOw4 %4CI 	IrE   )r   r   r   r   )rZ   z	str | intr   r"   )
rZ   r"   rx   r'   r[   r6   r   r6   r   r6   r   r   r   r   r   r   r   ztuple[FT2Font, int, bool])r   r   r   r   r   r   r[   r6   r   r6   r   r   )r   r   r[   r6   r   r6   r   r6   r   r   )r>   r?   r@   rA   rB   rT   r   r   r   r   r   r   r   rD   __classcell__r   s   @r1   r   r   C  s    

.,#("" 9"


!)
>
7	I	I),	I47	IDI	I	I %	I 	IrE   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 rP   )	StixFonts_stix_fallbackr   rT   _fontmapitemsr    r   )rS   r   r   keyr   fullpathr   s         r1   rT   BakomaFonts.__init__  sY    '(9L*=++-HC}H (LL (LL .rE   
\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   )rS   r   r   r   rZ   r   r\   r   s           r1   r   BakomaFonts._get_glyph  s    ||#(>+C0MH8+L7L7L0LG>>(+DX]4'G>>(+D#h 3 3C 8A =g%%&&11(LLrE   ())r  r/  )r      ¡)r      ³)r      µ)r      Ã)))r  r4  )r      ¢)r      ´)r      ¶)r   !{))r  r9  )r      ©)r   n)r      ½)r   r/  }))r  r=  )r      ª)r   o)r      ¾)r   r4  [))r  rA  )r      £)r   r_   )r   "]))r  rD  )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   -rh  ))r  rh  )r      ±)r   .)r      Ë)r   ,z\widehat))r  ^)r   b)r   c)r   r`   z
\widetilde))r  ~)r   e)r   f)r   g)r  r_   rY  )r  rF  r^  )<>)
)z
\leftparenr/  )z\rightparenr4  )z
\leftbracer9  )z\rightbracer=  )z\leftbracketrA  )z\rightbracketrD  )\{r9  )\}r=  )\[rA  )\]rD  c                >    U R                   R                  X!U4/5      $ rP   )_size_alternativesr   r   s      r1   r   -BakomaFonts.get_sized_alternatives_for_symbol  s     &&**3C0ABBrE   )r#  r   r  r   )r>   r?   r@   rA   rB   r$  rT   setsplitr+  r   r}  aliastargetr   rD   r  r  s   @r1   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rE   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.
      )r   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   rl   r         )r  r  r"  StixSansFontsr  r   _fallback_fontr   rT   r  r    r   r   
isinstancer%  )rS   r   r   fallback_rcfont_clstexfontproprZ   stixsizedaltfontssizenamer'  r   s               r1   rT   UnicodeFonts.__init__*  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 6rE   r)  c                    X4$ rP   r<   )rS   r   r   uniindexs       r1   _map_virtual_fontUnicodeFonts._map_virtual_fontO  s    !!rE   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.   )r2   r.   r*   _logwarningr  chrunicodedatacategoryr  
startswithr+  r   _cmr10_substitutionsfamily_namer!   r   _get_data_pathr-  r  r  r"  r   listr  r$  valuesra   )rS   r   r   r   r  found_symbolnew_fontnamecharr   rZ   
glyphindexru  familys                r1   r   UnicodeFonts._get_glyphS  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/$ rP   )r  r   r   s      r1   r   .UnicodeFonts.get_sized_alternatives_for_symbol  s2    &&HH   rE   )r  r   r   r   r   r   r  rt   r   ztuple[str, int]r  r   )r>   r?   r@   rA   rB   r  rT   r  r  r+  r  r   r   rD   r  r  s   @r1   r  r    sy    	 
!.F =..01"$'",;"='=' 9='~!/2!7L! !rE   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   rl   r   r  r  )r  DejaVuSerifFontsr"  r  r  r  bakomar   rT   r$  updater%  r    r   rS   r   r   r&  r  r'  s         r1   rT   DejaVuFonts.__init__  s    d,--"+,="PD"/0A"TD!"3Ft8HI!  
 	 ,,.IC~H (LL!)LL /rE   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   r2   r   r-  r   )rS   r   r   r   r  rZ   r  r   s          r1   r   DejaVuFonts._get_glyph  s     );;))(DD )-H>>$'D!00:
? 7-dJDD7%hC@@rE   )r  r  r   r  )
r>   r?   r@   rA   r$  rC   rT   r   rD   r  r  s   @r1   r  r    s1    %'H"'**AA 9A ArE   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r>   r?   r@   rA   rB   r$  rD   r<   rE   r1   r  r    s(     #(* $	HrE   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<   rE   r1   r  r    s(     "') #	HrE   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   rl   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 rP   )r   rT   r$  r%  r    r   r  s         r1   rT   StixFonts.__init__  sM    t8HI,,.IC~H (LL!)LL /rE   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   rl   r   r   r   )r  r  )r  r  r  r  i   i  nonuni)r   r   _sansr  dictr-   r  r,  r  r  r   )rS   r   r   r  font_mappingdoing_sans_conversionmappinglohimidranges              r1   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 )Nr9  r=  rA  rD  u   ⟨u   ⟩)rx  ry  rz  r{  rv  rw     r   rb  )r   r2   r.   r  r   r-  r  )rS   r   r   fixesr  rF  alternativess          r1   r   +StixFonts.get_sized_alternatives_for_symbolB  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]])r>   r?   r@   rA   rB   r$  rC   r  r  rT   r  r   r   r   rD   r<   rE   r1   r"  r"    s    
 "')$+0&H"  NE*4"$'4",;4"l __  G rE   r"  c                      \ rS rSrSrSrSrg)r  iZ  zX
A font handling class for the STIX fonts (that uses sans-serif
characters by default).
Tr<   N)r>   r?   r@   rA   rB   r  rD   r<   rE   r1   r  r  Z  s     ErE   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)r>   r?   r@   rA   rB   r  rC   r  r  r  r  r  r  r  rD   r<   rE   r1   r  r    so     '+L#* "%G$ "D
! "D
! "D
!  %E$
 (+M$* ),N%+rE   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)r>   r?   r@   rA   r  r  r  r  r  r  r  r  rD   r<   rE   r1   r  r    s*    LGDDDEMNrE   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)r>   r?   r@   rA   r  r  r  r  r  r  rD   r<   rE   r1   r  r    s     LDDEMNrE   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)	r>   r?   r@   rA   r  r  r  r  rD   r<   rE   r1   r   r     s    LDMNrE   r   c                      \ rS rSrSrg)DejaVuSerifFontConstantsi  r<   Nr>   r?   r@   rA   rD   r<   rE   r1   r  r        rE   r  c                      \ rS rSrSrg)DejaVuSansFontConstantsi  r<   Nr  r<   rE   r1   r  r    r  rE   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$ rP   )_font_constant_mappingr   fontsetr   rZ   r  r  r  r  r  r   )state	constantss     r1   _get_font_constant_setr    sZ    &**

+779JLI 	&&u}}m44$$rE   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  rS   s    r1   rT   Node.__init__  s	    	rE   c                ,    [        U 5      R                  $ rP   )typer>   r  s    r1   __repr__Node.__repr__  s    Dz"""rE   c                    gNr   r<   )rS   nexts     r1   r  Node.get_kerning  s    rE   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    r1   shrinkNode.shrink  s    
 			Q	rE   c                    g)zRender this node.Nr<   rS   r   r   r|   s       r1   renderNode.render  s    rE   r  Nr   r   r   r   r  zNode | Noner   r6   r   rM   r   r6   r|   r6   r   r   )r>   r?   r@   rA   rB   rT   r  r  r  r"  rD   r<   rE   r1   r  r    s    &# rE   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 rP   )r   rT   r7   r8   r9   )rS   r7   r8   r9   r   s       r1   rT   Box.__init__  s    

rE   c                   > [         TU ]  5         U R                  [        :  aL  U =R                  [
        -  sl        U =R                  [
        -  sl        U =R                  [
        -  sl        g g rP   )r   r  r  NUM_SIZE_LEVELSr7   SHRINK_FACTORr8   r9   rS   r   s    r1   r  
Box.shrink  sH    99&JJ=(JKK=(KJJ=(J 'rE   c                    g rP   r<   r   s         r1   r"  
Box.render  s    rE   )r9   r8   r7   )r7   r6   r8   r6   r9   r6   r   r   r$  r   )
r>   r?   r@   rA   rB   rT   r  r"  rD   r  r  s   @r1   r   r     sB    *)#).49>B rE   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   rT   )rS   r8   r9   r   s      r1   rT   Vbox.__init__  s    V+rE   r<   )r8   r6   r9   r6   r>   r?   r@   rA   rB   rT   rD   r  r  s   @r1   r3  r3    s    ., ,rE   r3  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  r5  rS   r7   r   s     r1   rT   Hbox.__init__"  s    B'rE   r<   r7   r6   r7  r  s   @r1   r9  r9    s    8( (rE   r9  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 rP   )	r   rT   rq  r
  rZ   r   r[   r   _update_metrics)rS   rq  r  r   s      r1   rT   Char.__init__3  sZ    }}JJ	**99 	rE   c                     SU R                   -  $ )Nz`%s`rq  r  s    r1   r  Char.__repr__?  s    rE   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   rZ   r   rq  r[   r   _metricsr   r7   rw   r8   r9   rS   rn   s     r1   rA  Char._update_metricsB  s    "&,,":":IIttxx#I 	I-66S= DJ DJoo78
rE   c                .    U R                   R                  $ rP   )rH  r   r  s    r1   
is_slantedChar.is_slantedL  s    }}$$$rE   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   )rH  r   r7   r  r?  r
  r   rZ   r   rq  r[   r   )rS   r  r   kerns       r1   r  Char.get_kerningO  s     --''$**4dD!!<<((		4??DFFDMM		4??DFFDMMD ~rE   c           
         U R                   R                  XUU R                  U R                  U R                  U R
                  U R                  5        g rP   )r
  r   rZ   r   rq  r[   r   r!  s       r1   r"  Char.render_  s9    !!qIIttxx	IrE   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 rP   )	r   r  r  r,  r[   r-  r7   r8   r9   r.  s    r1   r  Char.shrinkd  sV    99&MM]*MJJ]*JKK]*KJJ]*J	 'rE   )
rH  rq  r9   r   rZ   r   r
  r[   r8   r7   )rq  r   r  r  r%  r$  )r   r   r&  r'  )r>   r?   r@   rA   rB   rT   r  rA  rL  r  r"  r  rD   r  r  s   @r1   r?  r?  &  s1    

9% I
+ +rE   r?  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	$ )	Accentim  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   rZ   r   rq  r[   r   rH  rr   ro   r7   rp   rs   r8   r9   rI  s     r1   rA  Accent._update_metricss  sm    "&,,":":IIttxx#I 	I-\\GLL0
llW\\1
rE   c                B   > [         TU ]  5         U R                  5         g rP   )r   r  rA  r.  s    r1   r  Accent.shrinkz  s    rE   c           
        U R                   R                  XU R                  R                  -
  X0R                  R                  -   U R
                  U R                  U R                  U R                  U R                  5        g rP   )
r
  r   rH  ro   rs   rZ   r   rq  r[   r   r!  s       r1   r"  Accent.render~  sU    !!***A0B0B,BIIttxx	IrE   )rH  r9   r8   r7   r$  r'  )
r>   r?   r@   rA   rB   rA  r  r"  rD   r  r  s   @r1   rV  rV  m  s    
I IrE   rV  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   rT   shift_amountchildrenglue_set	glue_sign
glue_orderrS   elementsr   s     r1   rT   List.__init__  s<    R$#(rE   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  r7   r8   r9   r`  joinra  repr)rS   r   r   s     r1   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   rF  totalss     r1   r   !List._set_glue.<locals>.<genexpr>  s     C01F1INQQ0s   	r  r   r   z	%s %s: %r)r  r  r,  rd  rc  rb  
glue_ratiora  r  r  r  r>   )rS   r   signro  
error_typer?  s      `  r1   	_set_glueList._set_glue  s    "Cc&k*4R40CQH 	H! !9?q	MDMDN DO64==!!['d)<)<dD " rE   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 rP   )ra  r  r   r  r,  r`  r-  rb  )rS   childr   s     r1   r  List.shrink  sT    ]]ELLN #99&.MM.M 'rE   )ra  rd  rq  rb  rc  r`  )rf  T.Sequence[Node]r%  )
r   r6   rr  rt   ro  zlist[float]rs  r   r   r   r$  )r>   r?   r@   rA   rB   rT   r  rt  r  rD   r  r  s   @r1   r^  r^    s2    :9D!D&*D / /rE   r^  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)r^   rU  )r   rT   rO  hpack)rS   rf  r^   rU  do_kernr   s        r1   rT   Hlist.__init__  s,     	"IIK

Q
rE   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,  ra  r  r   r  Kern)rS   new_childrennum_childrenrF  elemr  kerning_distancerO  s           r1   rO  
Hlist.kern  s     4==)<(}}Q'a''==Q/DD##D)#'#3#3D#9 #r) 01D ''- ) )M rE   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  r`  
additionalr   Nr   Overfulr  Underful)ra  r  r?  r7   rq   r8   r9   r   rX   isinfgetattrGlue	glue_specstretch_orderstretchshrink_orderr  r  rc  rd  rq  rt  )rS   r^   rU  r_   r`   r   total_stretchtotal_shrinkrc  rf  r  s              r1   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,
;rE   )ra  r9   rd  rq  rc  r8   r7   )r   r  T)rf  ry  r^   r6   rU  "T.Literal['additional', 'exactly']r~  r   r$  r   r  )r^   r6   rU  r  r   r   )
r>   r?   r@   rA   rB   rT   rO  r}  rD   r  r  s   @r1   r{  r{    sP    %>A9E!%6 )2  #6B?<3?<GK?< ?<rE   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)r_   rU  )r   rT   vpack)rS   rf  r_   rU  r   s       r1   rT   Vlist.__init__  s    "

Q
rE   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  r`  z1Internal mathtext error: Char node found in Vlistr  r   Nr   r  r  r  )ra  r  r   r8   r9   rX   r  r7   r  rq   r  r  r  r  r  r  r  r?  RuntimeErrorrc  rd  rq  rt  )rS   r_   rU  rQ  r^   r`   r   r  r  rc  rf  r  s               r1   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,
;rE   )r9   rd  rq  rc  r8   r7   r  )rf  ry  r_   r6   rU  r  )r_   r6   rU  r  rQ  r6   r   r   )r>   r?   r@   rA   rB   rT   rX   infr  rD   r  r  s   @r1   r  r    sT    #>A9E6 
  #6BG<3G<G<$(G< G<rE   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$ )Ruleih  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 rP   )r   rT   r
  )rS   r7   r8   r9   r  r   s        r1   rT   Rule.__init__s  s    .}}rE   c                H    U R                   R                  XX2U-   X5-   5        g rP   )r
  r   )rS   r   r   r|   r^   r_   s         r1   r"  Rule.renderw  s    ''1!eQUCrE   )r
  )r7   r6   r8   r6   r9   r6   r  r  )r   rM   r   r6   r|   r6   r^   r6   r_   r6   r   r   )	r>   r?   r@   rA   rB   rT   r"  rD   r  r  s   @r1   r  r  h  sF    %DD!D&+D05D:>D DrE   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   rT   rX   r  )rS   r  	thicknessr8   r9   r   s        r1   rT   Hrule.__init__  s8    ==?I"S(6rE   r<   rP   )r  r  r  float | Noner7  r  s   @r1   r  r  |  s    87 7rE   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 rP   r  )rS   r  r  r   s      r1   rT   Vrule.__init__  s,    99;	BFFBFFE:rE   r<   )r  r  r7  r  s   @r1   r  r    s    6; ;rE   r  c                  H    \ rS rSr% S\S'   S\S'   S\S'   S\S'   S\S'   S	rg
)	_GlueSpeci  r6   r7   r  rt   r  r  r  r<   Nr   r<   rE   r1   r  r    s    LNMrE   r  r         ?rl   r   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   rT   r  r   r  _namedr.   r  )rS   	glue_typer  r   s      r1   rT   Glue.__init__  sP     	i%%!((3I	9--!IMNN"rE   c                   > [         TU ]  5         U R                  [        :  a2  U R                  nUR                  UR                  [        -  S9U l        g g )Nr7   )r   r  r  r,  r  _replacer7   r-  )rS   ru  r   s     r1   r  Glue.shrink  sB    99&AZZagg.EZFDN 'rE   )r  )r  z`_GlueSpec | T.Literal['fil', 'fill', 'filll', 'neg_fil', 'neg_fill', 'neg_filll', 'empty', 'ss']r$  )	r>   r?   r@   rA   rB   rT   r  rD   r  r  s   @r1   r  r    s$    #A#G GrE   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   rT   r  re  s     r1   rT   HCentered.__init__  s*    $t*<x<d<eLrE   r<   rf  z
list[Node]r7  r  s   @r1   r  r    s    
M MrE   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  re  s     r1   rT   VCentered.__init__  s%    $t*<x<d<=rE   r<   r  r7  r  s   @r1   r  r    s    
> >rE   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 rP   )r   rT   r7   r;  s     r1   rT   Kern.__init__  s    
rE   c                     SU R                   -  $ )Nzk%.02fr  r  s    r1   r  Kern.__repr__  s    $**$$rE   c                ~   > [         TU ]  5         U R                  [        :  a  U =R                  [
        -  sl        g g rP   )r   r  r  r,  r7   r-  r.  s    r1   r  Kern.shrink  s,    99&JJ-'J 'rE   r  r=  r%  r$  )r>   r?   r@   rA   rB   r8   r9   rT   r  r  rD   r  r  s   @r1   r  r    s(     FE%( (rE   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   rZ   r   r[   r   copyr?  r8   r9   r,  r   rT   r`  )rS   rq  r8   r9   r  alwaysfactorr  r   target_totalr   r   r  shiftr   s                 r1   rT   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$ !rE   )r`  )FN)rq  r   r8   r6   r9   r6   r  r  r  r   r  r  r7  r  s   @r1   r  r    s(     ?C""/;" "rE   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 rP   )r
  r   rZ   r  r7   r[   r   rT   )rS   rq  r7   r  r  
char_classr  r   r   r  r  r   s              r1   rT   AutoWidthChar.__init__  s    }}FFJJ 

)MH!Jc)DzzU"	 * #& #u%$ ZZ
rE   r  )
rq  r   r7   r6   r  r  r  r   r  z
type[Char])	r>   r?   r@   rA   rB   r?  rT   rD   r  r  s   @r1   r  r    s$     QV*. '   rE   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    r1   clampship.<locals>.clampC  s    t|tHH5HrE   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   )rd  rc  ra  r  r?  r"  r7   r  r^  r,  r`  r{  r  r   r8   r9   rX   r  r  r  r  r  roundrb  r  r  )rR   cur_gcur_gluerd  rc  	base_line	left_edgerc  edgerule_height
rule_depth
rule_widthr  r  cur_hcur_v	hlist_outoff_hoff_vr   	vlist_outs                r1   r  ship.<locals>.hlist_outF  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 rE   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)rd  rc  r8   ra  r  r  r7   r^  r,  r9   r`  r{  r  r   rX   r  r"  r  r  r  r  r  rb  r  r  r?  r  )rR   r  r  rd  rc  r  top_edgerc  save_vr  r  r  r  r  r  r  r  r  r  r   r  s                r1   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[ rE   )r  r6   r   r6   )rR   r{  r   r   )rR   r  r   r   )r8   rM   r  r{  )rR   xyrI   rJ   r  r  r  r  r  r  r   r  s       @@@@@@@@r1   ru   ru   2  sn     FBEEEOEC[FI=$ =$~9I 9Iv c5!!!!cNMrE   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rP   r   )rf  loctoksmsgs      r1   raise_errorError.<locals>.raise_error  s    !!#..rE   rf  r   r  rt   r  r   r   T.Any)r   set_parse_action)r  r  s   ` r1   Errorr    s    / 7##K00rE   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 rP   )r
  _fontr   r[   r   )rS   r
  rZ   r   r[   r   s         r1   rT   ParserState.__init__  s    
$ rE   c                .    [         R                   " U 5      $ rP   )r  r  s    r1   r  ParserState.copy  s    yyrE   c                    U R                   $ rP   )r  r  s    r1   rZ   ParserState.font  s    zzrE   c                (    US;   a  Xl         Xl        g )N)r  r  r  r  )r   r  )rS   r  s     r1   rZ   r    s    --"O
rE   c                x    U R                   R                  U R                  U R                  U R                  5      $ )z.Return the underline thickness for this state.)r
  r   rZ   r[   r   r  s    r1   r  +ParserState.get_current_underline_thickness  s,    ||33IIt}}dhh0 	0rE   )r  r   r   r
  r[   N)
r
  r   rZ   r   r   r   r[   r6   r   r6   r   r  r%  )r  r   r   r   )r   r6   )r>   r?   r@   rA   rB   rT   r  propertyrZ   setterr  rD   r<   rE   r1   r  r    sJ       
[[ 
0rE   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rP   )r  r   exprsresultsName)eltexprnamess     r1   r"  cmd.<locals>.names  sI     c?++		 ;&& "__//!  's   0A A+A r9  r   r    c              3  ,   #    U  H
  nS U-  v   M     g7f)z{%s}Nr<   )r   r  s     r1   r   cmd.<locals>.<genexpr>  s     BkdFTMks   z	Expected )r   r   r   zT.Generator[str, None, None])r  rj  r  )r!  argscsnamer0   r"  s       @r1   cmdr)    sc    " ZZQ"Fn BGGBeDkBBB"& EIcU"34455rE   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   rl   r   r<   N)	r>   r?   r@   rA   DISPLAYSTYLE	TEXTSTYLESCRIPTSTYLESCRIPTSCRIPTSTYLErD   r<   rE   r1   
_MathStyler-    s    	rE   r2  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  set_namehasattrr  r  )r&  r   rc  rS   s     r1   set_names_and_parse_actions4Parser.__init__.<locals>.set_names_and_parse_actions  sa     GMMO~~c** "FFS)tS)),,WT3-?@ ,rE   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$  )r>  alphar  nonalpha)isalphar   r   ri  rj  rW   reescape)r>  r"  ends_with_alphaends_with_nonalphar  s        r1   csnames Parser.__init__.<locals>.csnames  s     O!#8##%%#**40&--d3	 
 OVV((3ryy/#BC&8sb XXc"))5G&HI	 W  rE   z[-+]?([0-9]+\.?[0-9]*|\.[0-9]+)spacestyle_literalzI[a-zA-Z0-9 +\-*/<>=:,.;!\?&'@()\[\]|\U00000080-\U0001ffff]|\\[%${}\[\]_|]z|\\(?:{})(?![A-Za-z])r@  r   z\\[A-Za-z]+r  rZ   z\mathr9  r=  z\hspaceaccentz\fracr\   denz\dfracz\binomz\genfracldelimrdelimrulesizestylez\sqrt{value}rA  rD  rootr  z	\overlinebodyz\overset
annotationz	\undersetz\textr)   )end_quote_charz	\substackz\\)openerclosercontentpartsnucleusr5  ro  subsuperz'*apostrophesz'+z\operatornamez\boldsymbol\middlemdelimzExpected a delimiterz\leftleftr  z\rightrightrK  F)unquote_resultsz(?:(?:\\[$])|[^$])*r$  )r>  r   r"  zIterable[str]r   r   )JtypesSimpleNamespacer   float_literalr   _space_widthsrJ  r2  r   r  rK  ri  rj  rW   rD  rE  r   leave_whitespacer/   unknown_symbol
_fontnamesrZ   r   start_groupr   	end_group_delimsdelimr   r8  r7  named_placeablerequired_groupoptional_groupr6  r   r
   r)  customspace_accent_map_wide_accentsrL  _function_namesfunctionr>  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)rS   r<  rH  rs  r^  rc  s   `    @r1   rT   Parser.__init__  sc   !!#
	A 
	A	" !!CD!$"4"45g>!#'??3?aS\?355DF !&--RYY0133

 
 "!# 	
 !08"64??;#Hvdoo/Fv/N$NORUU"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JK&c#/4Yqww5G/H'1'&/2J2J2L'M0NOOVXY
 akk"9-c
+akk9::FG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%H 67HHJ
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  parse_stringr   r.   r   explainr  r   reset_cacher   r   r{  )rS   rf  fonts_objectr[   r   resultr0   s          r1   parseParser.parsei  s     ixEGFH	N%%2215F ,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    r1   	get_stateParser.get_state  s      $$rE   c                8    U R                   R                  5         g)zPop a `State` off of the stack.N)r  popr  s    r1   	pop_stateParser.pop_state  s    rE   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    r1   
push_stateParser.push_state  s&      !1!6!6!89rE   c                6    [        UR                  5       5      /$ rP   )r{  as_listrS   r  s     r1   r  Parser.main  s    dlln%&&rE   c                B    U R                   R                  US   SS SS9$ )Nr   r   r  T)	parse_all)r  r  r  s     r1   r  Parser.math_string  s(    $$11$q'!B-41PPrE   c                Z    [        UR                  5       5      nU R                  5         U/$ rP   )r{  r  r  )rS   r  hlists      r1   r  Parser.math  s#    dlln%wrE   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\$rK  r   )replacer?  r  r{  r  r  r  rZ   )rS   r  rf  rq  symbolsr  s         r1   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  rZ   r{  r?  r  )rS   r  r  rq  r  s        r1   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   rU  )r  rZ   r[   r   r  r   r
  r   r  r  r   r  )rS   
percentager  r&  r7   rn   s         r1   _make_spaceParser._make_space  s      zz5>>5995$$((-=mm//cll#56		+G OOE(-  %E&''rE   gKqU?g0Bxq?g%?g1ZGU?r  rl   gKqUſ)\,z
\thinspacez\/z\>z\:z\;z\ rr  z\enspacez\quadz\qquadz\!c                N    U R                   US      nU R                  U5      nU/$ NrJ  )re  r  )rS   r  r\   rR   s       r1   rJ  Parser.space  s-      g/s#urE   c                ,    U R                  US   5      /$ r  )r  r  s     r1   rp  Parser.customspace  s      g/00rE   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   rj  u   −zUnknown symbol: %sc              3  4   #    U  H  oS :w  d  M
  Uv   M     g7frG  Nr<   r   rq  s     r1   r    Parser.symbol.<locals>.<genexpr>       CAs(aa   		r  r$  r   r9  r  Tr  c              3  4   #    U  H  oS :w  d  M
  Uv   M     g7fr  r<   r  s     r1   r   r    r  r  c              3  4   #    U  H  oS :w  d  M
  Uv   M     g7fr  r<   r  s     r1   r   r    s     AASaar  r   rn  r=  rl  )r?  r  r.   r   _spaced_symbolsr  r  _binary_operatorsr,  r  _left_delims_relation_symbolsr{  r  _punctuation_symbolsisdigit)	rS   rf  r  r  rq  r  r0   	prev_char	next_chars	            r1   r/   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  rS   rf  r  r  s       r1   rg  Parser.unknown_symbol	  s    !!,<T&\N*KLLrE   hatz\circumflexaccentbrevez\combiningbrevebarz\combiningoverlinegravez\combininggraveaccentacutez\combiningacuteaccenttildez\combiningtildedotz\combiningdotaboveddotz\combiningdiaeresisdddotz\combiningthreedotsaboveddddotz\combiningfourdotsabovevecz\combiningrightarrowaboverC  `rW  rr  rl  ro  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      $ )
NrL  r   r)   )r  r  g      @exactlyr          @)r  r  rr  r  r7   rV  rq  r  r  r9  r}  r  r3  r{  )rS   r  r  r  rL  r   
accent_boxcentereds           r1   rL  Parser.accent	  s     99;	h5k'''&vsyy%FDJ   0 0 8%@JZd399s?3Z@Asyy),RS)se  	rE   c                >    U R                  XU5      nUS   Ul        U$ )Nr  )r  function_name)rS   rf  r  r  r  s        r1   rt  Parser.function3	  s%    !!!$/"6lrE   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     r1   r   &Parser.operatorname.<locals>.<genexpr>K	  s     C%6s(!!%6r  r$  ro  r5  r  >   ro  r5  TF)r  r  rZ   r  r?  rA  r   r   r,  r   r  rk  _overunder_functionsr  re  r  r  r{  )rS   rf  r  r  r  
hlist_listr  rq  next_char_locr  
delimiterss              r1   r  Parser.operatorname8	  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  rE   c                    U R                  5         UR                  S5      (       a$  UR                  S5      U R                  5       l        / $ NrZ   )r  r   r  rZ   r  s     r1   ri  Parser.start_group[	  s8    88F$(HHV$4DNN!	rE   c                >    [        UR                  S/ 5      5      nU/$ Nr>  r{  r   )rS   r  grps      r1   r>  Parser.groupb	  s    DHHWb)*urE   c                8    [        UR                  S/ 5      5      $ r  r  r  s     r1   rn  Parser.required_groupf	  s    TXXgr*++rE   c                &    U R                  5         / $ rP   )r  r  s    r1   rj  Parser.end_groupk	  s    	rE   c                .    [        U[        U5      S5      e)NzExpected '}')r   r,  r  s       r1   ru  Parser.unclosed_groupo	  s    !!SV^<<rE   c                6    US   U R                  5       l        / $ r  )r  rZ   r  s     r1   rZ   Parser.fontr	  s     $V	rE   c                    [        U[        5      (       a  UR                  U R                  ;   $ [        U[        5      (       a*  [        US5      (       a  UR                  U R                  ;   $ g)Nr  F)r  r?  rq  _overunder_symbolsr{  r;  r  r  rS   rZ  s     r1   is_overunderParser.is_overunderv	  sW    gt$$99 7 777''GG_,M,M((D,E,EEErE   c                `    [        U[        5      (       a  UR                  U R                  ;   $ gNF)r  r?  rq  _dropsub_symbolsr  s     r1   
is_dropsubParser.is_dropsub}	  s'    gt$$99 5 555rE   c                N    [        U[        5      (       a  UR                  5       $ gr  )r  r?  rL  r  s     r1   rL  Parser.is_slanted	  s!    gt$$%%''rE   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      (       aj  [;        US   [<        5      (       a  [;        US   [>        5      (       a  US S nUS   n[;        U[>        5      (       a  UR@                  RB                  Ul        [        USS9nO<[;        U[>        5      (       a  UR@                  RB                  Ul        [        U/5      n[E        U5      nUR2                  nSnU RG                  U5      (       a  UR4                  nURH                  U-  nURH                  U-  nU RK                  U5      (       a  UURH                  U-  -  nUURL                  UUS-  S-  -
  -  -  nU RG                  U5      (       a?  SURH                  -  URN                  -
  U-  nSURH                  -  URN                  -   U-  nOSnUc  [        [=        U5      [P        RR                  " [T        U5      /5      nUR)                  5         U RG                  U5      (       a  UURV                  U-  -   nOURX                  U-  nUUl        GO3[        [=        U5      U/5      nUR)                  5         U RG                  U5      (       a  UURV                  U-  -
  nOURZ                  U-  nUc	  U* Ul        O[        [=        U5      U/5      n U R)                  5         U RG                  U5      (       a  UURV                  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 RG                  U5      (       d"  U=R&                  UR^                  U-  -  sl        UU/n"U R`                  (       a)  U"U Rc                  U Rd                  S   5      /-  n"SU l0        [        U"5      nU/$ )NrZ  r   r[  r\  r5  zDouble subscriptzDouble superscriptr   r  r         @r  r  Fr  r  r   r  )3r   r9  r,  r   r  r
  r   rZ   r[   r   r   r{  r  ra  extendr/   rO  r}  r  r7   r  rq   r  r3  r   r8   r9   r  r`  r  r  r?  rH  r   r  r  r  rL  r  r  r   r   r  r  r  r  r  r  r  r  re  )$rS   rf  r  r  rZ  r[  napostrophessubr   opargr  rule_thicknessr   rF  vlistr  r7   vgapr  vltr  	last_charr  r  	lc_heightlc_baseline	superkernsubkernr   
shift_downshift_upr|   clrspaced_nucleusr   s$                                      r1   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"<#3T::#/#4L(,	i..&/&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 '.q\,,t//0B0B50IJKKN05D-~&xrE   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   =rl   r  r$  rl  ) r  r  r  r  r  r  rq   r7   r}  r  r3  r  r
  r   rZ   r  r  r[   r   r8   rp   rs   r`  r{  r9  _auto_sized_delimiterr   r   r  r   r?  r   )rS   rN  rO  rulerQ  r\   rM  r  r  r5  cnumcdenr7   r  rn   r  r  s                    r1   _genfracParser._genfrac-
  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 rE   c                <    U R                  [        US   5      5      $ )NrK  )r2  rt   r  s     r1   rK  Parser.style_literalW
  s    s4#89::rE   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      $ )NrN  r$  rO  rP  rQ  r\   rM  )r(  r   r2  r/  r  s     r1   ry  Parser.genfracZ
  sZ    }}HHXr"DHHXr$:dhhw0I0IJKe& 	&rE   c           	         U R                  SSU R                  5       R                  5       U R                  R                  US   US   5      $ Nr$  r\   rM  )r(  r  r  r2  r/  r  s     r1   rv  Parser.frac`
  sE    }}DNN$DDFOO%%tE{DKA 	ArE   c           	         U R                  SSU R                  5       R                  5       U R                  R                  US   US   5      $ r/  )r(  r  r  r2  r.  r  s     r1   rw  Parser.dfrace
  sE    }}DNN$DDFOO(($u+tE{D 	DrE   c           	     b    U R                  SSSU R                  R                  US   US   5      $ )Nr/  r4  r   r\   rM  )r(  r2  r/  r  s     r1   rx  Parser.binomj
  s5    }}aOO%%tE{DKA 	ArE   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$ )NrT  rS  r  r   r   ur   )r  r  r  r  rq   r7   r}  r  r3  r9   r8   r`  )rS   rf  r  r  rT  rS  r  centered_annotationcentered_bodyr7   r  r  s               r1   _gensetParser._genseto
  s   ,'
F|NN$DDF	'5!4&)'--}/B/BC!!%3E9-1}1W:Q# E "/!4!47J7Q7Q!QTX!XE  #Q E rE   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/$ )NrR  r  g      @rb  T)r  rl   r       @r  r  r   r  )r   r  r  r8   r`  r9   r  r{  r9  r  r  r  r  r[   r   r   r7   r  r  )rS   r  rR  rS  r  r  r8   r9   checkpadded_body	rightside
root_vlistr  s                r1   rz  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rE   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/$ )NrS  r  r  r<  r  )r  r  r8   r`  r9   r  r  r  r{  r  r[   r   )	rS   r  rS  r  r  r8   r9   r?  r  s	            r1   r{  Parser.overline
  s    F| 99;	t0009s?B

T... 5<fudV}EF	 	..599"<!NN!5	* yk"wrE   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 )Nr]  r   rl  )r  r   r  )r  r,  rq   r  r   r8   r9   	enumerater   r   r  remover  r   r?  r   r  r{  )rS   frontmiddlebackr  r   r8   r9   r  idxelrq  middle_partrY  r  s                  r1   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      $ )Nr_  r  r`  )r$  r  r  s     r1   r8  Parser.auto_delim
  s;    ))L%*d]DK!M	 	rE   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{  ra  r?  rZ   rA  r   rq  _latin_alphabets_small_greekr  )rS   r  r  r  r  rq  rM  s          r1   r  Parser.boldsymbol
  s     G}A!U##JJqMa&&!AF%%'QAt$$CC400033qr7d///#AF%%'!!#QQ! " 	U|rE   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 )NrY  r   c                    U R                   $ rP   r  rD  s    r1   <lambda>!Parser.substack.<locals>.<lambda>  s    aggrE   r  rl   r  )r  r  r{  rq   rW   r  r}  r   zipr3  r,  r  )rS   r  rY  r  r  rM  r  	max_widthr  r  cppairr   stackr  r  s                   r1   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$  )
rf  r   r  r   r[   r6   r   r6   r   r{  r  )r  r   r   zlist[Hlist])r  r   r   r   )r  r   r   r  )r  r6   r   r  )rf  r   r  rt   r  zParseResults | dict[str, str]r   r  r
  )r   r  )rZ  r  r   r   )rN  r   rO  r   r%  r  rQ  r2  r\   r{  rM  r{  r   r  )rG  r   rH  zlist[Box | Char | str]rI  r   r   r  )Wr>   r?   r@   rA   rB   enumEnumr2  r  r  r  r  _arrow_symbolsr  r  r  r  r  rh  rs  _ambi_delimsr  _right_delimsrk  r  r*   r  r  r  r   rR  stringascii_lettersrQ  rT   r  r  r  r  r  r  r  r  staticmethodr   convert_to_floatrd  r~  r  re  rJ  rp  r/   rg  rq  rr  rL  rt  r  ri  r>  rn  ro  rj  ru  rZ   r  r  rL  r[  r(  rK  ry  rv  rw  rx  r9  r|  r}  rz  r{  r$  r8  r  r  rD   r  )r   rF  r  r  r   s   0000@r1   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(,% :'Q
 !!1!B!BCM($ 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+  )r/   r   r   rt   )r  r  r   ztype[FontConstantsBase]))r   r   )rR   r   r  ztuple[float, float]r   rM   )r  r   r   r   )r!  r   r'  r   r   r   )urB   
__future__r   abcr  r^  r   loggingr   rD  rb  r  rc  typingr   r   numpyrX   	pyparsingr   r   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%   TYPE_CHECKINGcollections.abcr&   r'   enable_packrat	getLoggerr  r2   r4   r?   rG   rM   r   r   ABCr   ABCMetar   r  r  r  r  r  r"  r  r-  r,  r  r  r  r   r  r  r	  r  r  r   r3  r9  r?  rV  r^  r{  r  r  r  r  r  r  r  r  r  r  r  r  ru   r  r  r)  r+  r<   rE   r1   <module>rw     s~   # 
     	 	      + + + + + +  D D < < : : ??(    ./,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1#0 #0L62W WrE   