
    
3j                       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rSSKrSSKrSSKJr  SSKrSSKJr  SSKJrJrJrJrJrJrJrJrJ r J!r!J"r"J#r#J$r$J%r%J&r&J'r'J(r(J)r)J*r*  SSK+r,SSK-J.r.  SS	K/J0r0J1r1J2r2J3r3  SS
K4J5r5J6r6J7r7  SSK8J9r9J:r:J;r;  \Rx                  (       a  SSK=J>r>  SSK8J?r?J@r@JArA  \"R                  " 5         \R                  " S5      rDSnS jrE " S S\5      rFS\FlG         " S S\5      rHS\HlG         " S S5      rI " S S\5      rJ " S S\5      rK " S S\R                  5      rM " S S\M\R                  S9rO " S S \O5      rP " S! S"\O5      rQ " S# S$\Q\R                  S9rR " S% S&\R5      rS " S' S(\R5      rT " S) S*\Q5      rU " S+ S,\U5      rVS-rWS.rX " S/ S05      rY " S1 S2\Y5      rZ " S3 S4\Y5      r[ " S5 S6\[5      r\ " S7 S8\Y5      r] " S9 S:\Y5      r^ " S; S<5      r_ " S= S>\_5      r` " S? S@\`5      ra " SA SB\`5      rb " SC SD\_5      rc " SE SF\c5      rd " SG SH\`5      re " SI SJ\e5      rf " SK SL\e5      rg " SM SN\`5      rh " SO SP\h5      ri " SQ SR\h5      rj " SS ST\5      rk\k" SUSVSSUS5      \k" SUSVSWSUS5      \k" SUSVSXSUS5      \k" SUSUSSVS5      \k" SUSUSSVSW5      \k" SUSUSSVSX5      \k" SUSUSSUS5      \k" SUSVSSYS5      SZ.\kll         " S[ S\\_5      rm " S] S^\f5      rn " S_ S`\g5      ro " Sa Sb\_5      rp " Sc Sd\f5      rq " Se Sf\f5      rrSoSpSg jjrsSqSh jrt " Si Sj5      ruSrSk jrv " Sl Sm5      rwg)sz.
Implementation details for :mod:`.mathtext`.
    )annotationsN)
NamedTuple)NDArray)EmptyForwardLiteralGroupNotAny	OneOrMoreOptionalParseBaseException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Kerning	LoadFlags)Iterable)CharacterCodeTypeGlyphGlyphIndexTypez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     N/home/wildlama/miniconda3/lib/python3.13/site-packages/matplotlib/_mathtext.pyget_unicode_indexr3   4   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)VectorParseJ   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depthzLlist[tuple[FT2Font, float, CharacterCodeType, GlyphIndexType, float, float]]glyphsz'list[tuple[float, float, float, float]]rects N__name__
__module____qualname____firstlineno____doc____annotations____static_attributes__r=       r2   r5   r5   J   s$     LMLXX22rF   r5   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 : 2D array of uint8
    A raster image.
r7   oxoyr8   r9   r:   zNDArray[np.uint8]imager=   Nr>   r=   rF   r2   rH   rH   `   s(     	IILMLrF   rH   c                  6    \ rS rSrSrSS jrS	S jrS
S jrSrg)Outputw   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<   )selfrS   s     r2   __init__Output.__init__   s    ;=>@
rF   c                   [        [        R                  U R                  R                  U R                  R
                  U R                  R                  /5      u  pnU R                   VVVs/ s HE  u  pEnUR                  UR                  UR                  UR                  XBU-
  UR                  -   4PMG     nnnnU R                   VV	V
Vs/ s H  u  ppXX-   -
  X4PM     nn
n	nn[        XU-   X7U5      $ s  snnnf s  snn
n	nf rQ   )mapnpceilrS   r8   r9   r:   r;   fontfontsizenumglyph_indexoffsetr<   r5   )rT   whdrJ   rK   infogsbxbybwbhrss                r2   	to_vectorOutput.to_vector   s    GGdhhnndhhootxx~~FHa #'++/"-,"$ yy$--43C3Cr6DKK')"- 	 / %)JJ0$.."" =")$. 	 0 1!eQB///0s   -AC9D 
c                  [        / 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  pVpxXW-   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  pVpxXh-   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                  " [        R                  " U[        US5      -   5      [        R                  " U5      4[        R                   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  pVnn[        [)        U5      S-
  S5      nUS:X  a  UUS-  -   n[)        UUS-   S-  -
  5      nO[)        U5      n[        R.                  " U5      n[        R                  " UU-   5      nSXUU-   S-   2UUS-   24'   M     [1        SSXxU-   X5      $ 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yminrS   r:   r9   rY   zerosmathrZ   uint8shipr[   draw_glyph_to_bitmapinticebergglyphfloorrH   )rT   rm   rJ   rK   rc   xyr`   ra   rr   rv   ru   rs   rb   rL   shiftedrg   rh   r9   centerx1x2s                         r2   	to_rasterOutput.to_raster   sL     :M4<<,,,M :*.**5*JA!a*5:78: ;=>? :M4<<,,,M :*.**5*JA!a*5:78: ;=>? >M4<<,,,M >.2jj9j
aaej9>;<> ?ABC >M4<<,,,M >.2jj9j
aaej9>;<> ?ABCKK$((..(K$((//)$))AAq	M2DIIaLA288L txx4%$0#NNLBDII**s2wB)=)=$= >

' + ) + $MMLA"bR1a(F{R!V&1*!112FAB1r6"B+/EAfHQJ,2a4'( * 1aE144C N5M5M9M9s/   %N
N%NN 7%N(2N/)%N7$N>rR   N)rS   Box)returnr5   )rm   boolr   rH   )	r?   r@   rA   rB   rC   rU   rj   r   rE   r=   rF   r2   rN   rN   w   s    A
	0$5rF   rN   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).
r7   advancer9   r8   rr   ru   rv   rs   r}   r   slantedr=   Nr>   r=   rF   r2   r   r      s6    ( NML
K
K
K
KNMrF   r   c                  f    \ rS rSr% S\S'   S\S'   S\S'   S\S	'   S
\S'   S\S'   S\S'   S\S'   Srg)FontInfo   r"   r[   r7   r\   strpostscript_namer   rq   r&   r]   r(   r^   r'   r~   r_   r=   Nr?   r@   rA   rB   rD   rE   r=   rF   r2   r   r      s.    
MO	LMrF   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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)rT   r   r   s      r2   rU   Fonts.__init__   s     "3 0rF   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=   )
rT   font1
fontclass1sym1	fontsize1font2
fontclass2sym2	fontsize2dpis
             r2   get_kernFonts.get_kern   s     rF   c                    [         erQ   NotImplementedError)rT   r[   s     r2   	_get_fontFonts._get_font  s    !!rF   c                    [         erQ   r   )rT   r[   
font_classsymr\   r   s         r2   	_get_infoFonts._get_info      !!rF   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", "normal", "bb", "frak", "scr".  "default"
    and "regular" are synonyms and use the non-math font.
    "normal" denotes the normal 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   rq   )rT   r[   r   r   r\   r   rc   s          r2   get_metricsFonts.get_metrics	  s     4 ~~dsC||rF   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)
rT   outputrJ   rK   r[   r   r   r\   r   rc   s
             r2   render_glyphFonts.render_glyph&  s,     ~~dsCbd^,rF   c                >    UR                   R                  X#XE45        g)z=
Draw a filled rectangle at (*x*, *y*) with size (*w*, *h*).
N)r<   r   rT   r   r   r   r`   ra   s         r2   render_rect_filledFonts.render_rect_filled/  s    
 	Q1L)rF   c                    [        5       e)z:
Get the axis height for the given *font* and *fontsize*.
r   rT   r[   r\   r   s       r2   get_axis_heightFonts.get_axis_height6       "##rF   c                    [        5       e)z=
Get the size of a quad for the given *font* and *fontsize*.
r   r   s       r2   get_quadFonts.get_quad<  r   rF   c                    [        5       e)z6
Get the xheight for the given *font* and *fontsize*.
r   r   s       r2   get_xheightFonts.get_xheightB  r   rF   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       r2   get_underline_thicknessFonts.get_underline_thicknessH  s    
 "##rF   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=   rT   fontnamer   s      r2   !get_sized_alternatives_for_symbol'Fonts.get_sized_alternatives_for_symbolO  s       rF   c                    [         $ rQ   )FontConstantsBaserT   s    r2   get_font_constantsFonts.get_font_constantsY  s      rF   r   Nr   r   r   r$   r   r   r   r   r   r   r   r7   r   r   r   r   r   r   r   r7   r   r7   r   r7   r[   r   r   r"   )r[   r   r   r   r   r   r\   r7   r   r7   r   r   )r[   r   r   r   r   r   r\   r7   r   r7   r   r   )r   rN   rJ   r7   rK   r7   r[   r   r   r   r   r   r\   r7   r   r7   r   Noner   rN   r   r7   r   r7   r`   r7   ra   r7   r   r   r[   r   r\   r7   r   r7   r   r7   r   r   r   r   r   zlist[tuple[str, str]]r   ztype[FontConstantsBase])r?   r@   rA   rB   rC   rU   r   r   r   r   r   r   r   r   r   r   r   r   rE   r=   rF   r2   r   r      s    1),47DI %"""!)"#.:-!$-+.-:?-FK-PT-*#*(-*27*<A*FJ*$$$$!/2!7L!!rF   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S
 jrSS jr            SU 4S jjrSrU =r$ )TruetypeFontsi]  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)
superrU   	functoolscacher   _fontsfontmapr    r   r!   )rT   r   r   filenamedefault_font	__class__s        r2   rU   TruetypeFonts.__init__c  se    *="8')D223)!-I!-IrF   c                   U R                   R                  X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      $ rQ   )r   getr   ospathexistsr!   r   lowerTcastr"   )rT   r[   basenamecached_fonts       r2   r   TruetypeFonts._get_fonto  s    <<##D/kkooh/277>>(#;#;"8,K$/KK!7BKK334?JKK3399;<vvg{++rF   c                `    UR                   S:X  a  UR                  S-  S-  US-  U-  S-  -   $ g)NCmex10@   rn      H   r   )r   r9   )rT   r[   r~   r\   r   s        r2   _get_offsetTruetypeFonts._get_offsety  s:    8+LL2%)hqj3.>r.ABBrF   c                    [         erQ   r   )rT   r   r   r   s       r2   
_get_glyphTruetypeFonts._get_glyph  r   rF   c                   U R                  XU5      u  pgnUR                  XE5        UR                  U5      n	UR                  XR                  S9n
S U
R
                   5       u  ppU R                  XjXE5      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
US9$ )N)flagsc              3  *   #    U  H	  oS -  v   M     g7f)r   Nr=   ).0vals     r2   	<genexpr>*TruetypeFonts._get_info.<locals>.<genexpr>  s     !Ajs(js      r   )	r   r9   r8   rr   ru   rv   rs   r}   r   )r[   r\   r   rq   r]   r^   r~   r_   )r  set_sizeget_char_index
load_glyphr   bboxr   r   linearHoriAdvancer9   r8   horiBearingYr   r   )rT   r   r   r   r\   r   r[   r]   r   r^   r~   rr   rv   ru   rs   r_   rq   s                    r2   r   TruetypeFonts._get_info  s    !__X3G7h$))#.3H3HI!Aejj!AD!!$x=++e3<<"$++"&&+f4
  00#	
 		
rF   c                    U R                  5       nUR                  b  UR                  U-  U-  S-  $ U R                  U[        R                  S   SX#5      nUR
                  UR                  -   S-  $ )Nr   mathtext.default   −rn   )r   axis_heightr   mplrcParamsrs   rv   rT   r   r\   r   constsrq   s         r2   r   TruetypeFonts.get_axis_height  su    ((*)%%036;; &&#,,'9:HhUGLL7<</144rF   c                    U R                  5       nUR                  b  UR                  U-  U-  S-  $ U R                  U[        R                  S   SX#5      nUR
                  $ )Nr   r  m)r   quadr   r  r  r   r  s         r2   r   TruetypeFonts.get_quad  sc    ((*;;";;)C/"44 &&#,,'9:CPG??"rF   c                    U R                  5       nUR                  b  UR                  U-  U-  S-  $ U R                  U[        R                  S   SX#5      nUR
                  $ )Nr   r  r   )r   x_heightr   r  r  r}   r  s         r2   r   TruetypeFonts.get_xheight  sc    ((*??&??X-3b88 &&#,,'9:CPG??"rF   c                    SU-  U-  S-  $ )Ng      ?r   r=   r   s       r2   r   %TruetypeFonts.get_underline_thickness  s     h&,22rF   c
                  > X:X  ao  XH:X  aj  U R                  XX4U	5      n
U R                  XVXxU	5      nU
R                  nUR                  U
R                  UR                  [        R
                  5      S-  $ [        TU ]  XX4XVXxU	5	      $ )Nr   )r   r[   get_kerningr^   r#   DEFAULTr   r   )rT   r   r   r   r   r   r   r   r   r   info1info2r[   r   s                r2   r   TruetypeFonts.get_kern  s     >i4NN5dsKENN5dsKE::D##E$5$5u7H7H$+OO579: :w4 %4CI 	IrF   )r   r   r   r   r   )
r[   r"   r~   r'   r\   r7   r   r7   r   r7   r   r   r   r   r   r   r   z'tuple[FT2Font, CharacterCodeType, bool])r   r   r   r   r   r   r\   r7   r   r7   r   r   )r   r   r\   r7   r   r7   r   r7   r   r   )r?   r@   rA   rB   rC   rU   r   r   r  r   r   r   r   r   r   rE   __classcell__r   s   @r2   r   r   ]  s    

.,#("" G"


!)
B	5#	#3
I
I),
I47
IDI
I
I %
I 
IrF   r   )	metaclassc                  
  ^ \ rS rSrSrSSSSSSS	S
S.rS?U4S jjr\" SR                  5       5      r	    S@S jr
Sr0 SS/\ V Vs/ s H  nSSU S34PM     snn Q_SS/\ V Vs/ s H  nSSU S34PM     snn Q_S\ V Vs/ s H  nSSU S34PM     snn _S\ V Vs/ s H  nSSU S34PM     snn _SS/\ V Vs/ s H  nSSU S34PM     snn Q_SS /\ V Vs/ s H  nSS!U S34PM     snn Q_S"S#/\ V Vs/ s H  nSS$U S34PM     snn Q_S%S&/\ V Vs/ s H  nSS'U S34PM     snn Q_S(\ V Vs/ s H  nSS)U S34PM     snn _S*\ V Vs/ s H  nSS+U S34PM     snn _S,\ V Vs/ s H  nSS-U S34PM     snn _S.\ V Vs/ s H  nSS/U S34PM     snn _S0\ V Vs/ s H  nSS1U S34PM     snn _S2\ V Vs/ s H  nSS3U S34PM     snn _S4S5/\ V Vs/ s H  nSS6U S34PM     snn Q_S7/ S8Q_S9/ S:Q_rS; H  u  rr\\   \\'   M         SAS< jrSBS= jrS>rU=r$ s  snn f s  snn f s  snn f s  snn f s  snn f s  snn f s  snn f s  snn f s  snn f s  snn f s  snn f s  snn f s  snn f s  snn f s  snn f )C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.
cmmi10cmsy10cmr10cmtt10cmti10cmb10cmss10cmex10)normal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 rQ   )	StixFonts_stix_fallbackr   rU   _fontmapitemsr    r   )rT   r   r   keyr	  fullpathr   s         r2   rU   BakomaFonts.__init__  sY    '(9L*=++-HC}H (LL (LL .rF   
\int \ointc                   S nXR                   ;   aA  U[        ;   a7  [        U   u  pVUS;   =(       d    X0R                  ;   nU R                  U5      nOR[	        U5      S:X  aC  US;   nUS:X  a  UR                  5       (       a  SnS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      $ )N)r2  r6  r   )r>  r:  r:  r<  Fr   )
r   r   _slanted_symbolsr   lenisdigitr+   r  rD  r  )rT   r   r   r   r[   r   r]   r   s           r2   r  BakomaFonts._get_glyph  s    ||#(>+C0MH#77XCCXCX<XG>>(+DX]#33G8#  >>(+D#h 3 3C 8A =g%%&&11(LLrF   )bigBigbiggBigg()r<  rT  rA  z\__parenleft__))r<  rV  z\__parenright{z\__braceleft}z\__braceright[)r<  rY  z\__bracketleft])r<  rZ  z\__bracketright<)r;  z\__angbracketleft__z\__angbracketleft>)r;  z\__angbracketright__z\__angbracketrightz\lfloorz\__floorleftz\rfloorz\__floorrightz\lceilz\__ceilingleftz\rceilz\__ceilingright	\__sqrt__z
\__radicalz
\backslashz\__backslash/)r<  r^  z\__slashz\widehat))r<  ^)rA  z\__hatwide__)rA  z\__hatwider__)rA  z\__hatwidest__z
\widetilde))r<  ~)rA  z\__tildewide__)rA  z\__tildewider__)rA  z\__tildewidest__))z
\leftparenrT  )z\rightparenrV  )z
\leftbracerW  )z\rightbracerX  )z\leftbracketrY  )z\rightbracketrZ  )z\langler[  )z\rangler\  )\{rW  )\}rX  )\[rY  )\]rZ  c                >    U R                   R                  X!U4/5      $ rQ   )_size_alternativesr   r   s      r2   r   -BakomaFonts.get_sized_alternatives_for_symbol0  s     &&**3C0ABBrF   c                    [         $ rQ   )ComputerModernFontConstantsr   s    r2   r   BakomaFonts.get_font_constants4  s    **rF   )rD  r   r,  r   r   )r?   r@   rA   rB   rC   rE  rU   setsplitrL  r  _latex_sizesrf  aliastargetr   r   rE   r-  )r  sr   s   00@r2   r1  r1    s    	H) =..01MM GM4 2LkRLQLqd|A3b$9:LQRkS\R\d}QCr$:;\RS 	\B\tQCr*+\B 	lCltaS+,lC	
 	kTlSld~aS$;<lST 	kU|T|!dqc$<=|TU 	- K<HILq+A3b12LIK 	. L=IJ\,QCr23\JL 	LILqd|A3b12LI 	\J\d}QCr23\J 	\J\TnQCr23\J 	lKlToaS34lK 	LILqA3b12LI  	|L|!,qc45|L!" 	{ONAt2%67NO#$ 	 1%( 	 Q)06v %7v$>5!6C/2C7LC+ +G RRBCSTIJIJJKILNsZ   H+&H1H7
H=
=II	;II7I
I!
/I'
I-
'I3
I9
!I?r1  c                     ^  \ rS rSr% SrSSS.rS\S'   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$ )UnicodeFontsi8  aD  
An abstract base class for handling Unicode fonts.

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

This class will "fallback" on the Bakoma fonts when a required
symbol cannot be found in the font.
      )   i"  z*dict[CharacterCodeType, CharacterCodeType]_cmr10_substitutionsc                ^  > [         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.r9  rA  STIXGeneralSTIXSizeOneSymSTIXSizeTwoSymSTIXSizeThreeSymSTIXSizeFourSymSTIXSizeFiveSym)012345)r  r  rC  StixSansFontsr1  r   _fallback_fontr   rU   rl  r    r   r   
isinstancerF  )rT   r   r   fallback_rcfont_clstexfontpropr[   stixsizedaltfontssizenamerH  r   s               r2   rU   UnicodeFonts.__init__L  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 6rF   rJ  c                    X4$ rQ   r=   )rT   r   r   uniindexs       r2   _map_virtual_fontUnicodeFonts._map_virtual_fontr  s    !!rF   c                    [        U5      nSnU R                  XU5      u  pUnU(       a  US:X  a]  US:  aW  [        U5      n[        R                  " U5      S   S:w  d*  [        R                  " U5      R                  S	5      (       a  S
nO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(       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[.        R0                  R3                  5       ;   a  Sn[        R5                  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NJf = f)NT?Fz!No TeX to Unicode mapping for %a.r:  r  r   LzGREEK CAPITALr<  r>  r4  zfonts/ttf/cmsy10.ttf)r>  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.   )r3   r/   r+   _logwarningr  chrunicodedatacategoryr  
startswithrL  r   rv  family_namer!   r   _get_data_pathr  r  r  rC  r  r1  rE  valuesrc   )rT   r   r   r   r  found_symbolnew_fontnamecharr   r[   
glyphindexgfamilys                r2   r  UnicodeFonts._get_glyphv  s;   	C(-HL "33H(S 8#7(:8}((.q1S8&++D1<<_MM#'L#'L#t+L7L7L0LG L>>,/D 9 99 ,,7#,,-CDFD#88BH!00:
?#'L"" ;;&t':':IFF#H''228M1))[1188::.F		:CH  ;;&tY77??4AA A): ~~d+Xw&&u  	C3xH LLL<cB	Cs   H) )-IIc                b    U R                   (       a  U R                   R                  X5      $ X4/$ rQ   )r  r   r   s      r2   r   .UnicodeFonts.get_sized_alternatives_for_symbol  s-    &&HHWW  rF   )r  r   r   r   r   r   r  r&   r   ztuple[str, CharacterCodeType]r,  r   )r?   r@   rA   rB   rC   rv  rD   rU   rk  rl  rL  r  r  r   rE   r-  r.  s   @r2   rr  rr  8  s    	 HD 
".H =..01"$5":W"?'?' G?'B!/2!7L! !rF   rr  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  zdict[str, str]rE  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  r  r  r  r  )r  DejaVuSerifFontsrC  r  r  r1  bakomar   rU   rE  updaterF  r    r   rT   r   r   rG  r  rH  s         r2   rU   DejaVuFonts.__init__  s    d,--"+,="PD"/0A"TD!"3Ft8HI!!#""
 	 ,,.IC~H (LL!)LL /rF   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\primerA  r   )r  r  r3   r   r  r   )rT   r   r   r   r  r[   r  r   s          r2   r  DejaVuFonts._get_glyph  s     );;))(DD )-H>>$'D!00:
? 7-dJDD7%hC@@rF   )r  r  r   r,  )
r?   r@   rA   rB   rE  rD   rU   r  rE   r-  r.  s   @r2   r  r    s0    !Hn!**AA GA ArF   r  c            	      8    \ rS rSrSrSSSSSSS	SS
.rSS j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
z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=  rA  r  c                    [         $ rQ   )DejaVuSerifFontConstantsr   s    r2   r   #DejaVuSerifFonts.get_font_constants  s    ''rF   r=   Nr   r?   r@   rA   rB   rC   rE  r   rE   r=   rF   r2   r  r    s-     #(* $	H(rF   r  c            	      8    \ rS rSrSrSSSSSSSSS	.rSS
 j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  c                    [         $ rQ   )DejaVuSansFontConstantsr   s    r2   r   "DejaVuSansFonts.get_font_constants  s    &&rF   r=   Nr   r  r=   rF   r2   r  r    s-     "') #	H'rF   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rSrSS jr    SS jr	\
R                      SS j5       rSS jrSrg)rC  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  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 rQ   )r   rU   rE  rF  r    r   r  s         r2   rU   StixFonts.__init__/  sM    t8HI,,.IC~H (LL!)LL /rF   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   rn   r   r   r  )r<  r>  r:  )r>  r<  r?  r  i   i  nonuni)r   r   _sansr  dictr.   listrM  r  r  r   )rT   r   r   r  font_mappingdoing_sans_conversionmappinglohimidranges              r2   r  StixFonts._map_virtual_font6  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                V   SSSSSSS.nUR                  X"5      n [        U5      n[        S5       Vs/ s HH  nU R	                  [        U5      5      R                  U5      S	:w  d  M2  [        U5      [        U5      4PMJ     nnUS
:X  a  US S nU$ ! [         a    X4/s $ f = fs  snf )NrW  rX  rY  rZ  u   ⟨u   ⟩)ra  rb  rc  rd  r[  r\     r   r]  )r   r3   r/   r  r   r   r  r  )rT   r   r   fixesr  ialternativess          r2   r   +StixFonts.get_sized_alternatives_for_symboll  s     s3s67

 ii!	%(-H :?q QA>>#a&1@@JaO 0QX/ Q ,',L  	%O$$	%Qs   B 1B&)B&B#"B#c                <    U R                   (       a  [        $ [        $ rQ   )r  STIXSansFontConstantsSTIXFontConstantsr   s    r2   r   StixFonts.get_font_constants  s    ::(($$rF   r=   r   r  r   r   )r?   r@   rA   rB   rC   rE  r  r  rU   r  r   r   r   r   rE   r=   rF   r2   rC  rC    s    
 "')$+0H NE*4"$54":W4"l __/27L (%rF   rC  c                      \ rS rSrSrSrSrg)r  i  zX
A font handling class for the STIX fonts (that uses sans-serif
characters by default).
Tr=   N)r?   r@   rA   rB   rC   r  rE   r=   rF   r2   r  r    s     ErF   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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S\S"'   S#rg)$r   i  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?supdropsubdropr  sup1333333?sub1      ?sub2g?delta皙?delta_slanted皙?delta_integralgffffff?num1g      ?num2g?num3denom1g?denom2NzT.ClassVar[float | None]r  r  r"  r=   )r?   r@   rA   rB   rC   r  rD   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r"  rE   r=   rF   r2   r   r     s     '+L#* "%G$ "%G$ "D
! "D
! "D
!  %E$
 (+M$* ),N%+ "D
! "D
! "D
! !$F# !$F# -1K)0 &*D
") *.H&-rF   r   c                      \ rS rSrSrSrSrSrSrS\-  r	S\-  r
S\-  rS\-  rS	\-  rS
\-  rS\-  rS\-  rS\-  rS\-  rSrSr\S-  rSrg)ri  i  g?r  i i- i  i5 iff i i
 iL i i
 ix       ?g     ?i   r=   N)r?   r@   rA   rB   r  r  r  r  	_x_heightr  r  r  r  r  r  r  r  r  r  r  r  r"  rE   r=   rF   r2   ri  ri    s     "LEMNI y GiGIDIDIDIDIDIDiFiF !KD5 HrF   ri  c                      \ rS rSrSrSrSrSrSr\S-  r	S\-  r
S\-  rS	\-  rS
\-  rS\-  rS\-  rS\-  rS\-  rS\-  rS\-  rSrSrSrg)r  i  r  r  r  i  i  i  gǺ I@i     i5  i  i  i  i  iw  r        ?r=   N)r?   r@   rA   rB   r  r  r  r  r  r"  r  r  r  r  r  r  r  r  r  r  r  r  rE   r=   rF   r2   r  r    s    LEMNI4H IoG	!G?D?D?D?D?D?D9_F9_F KDrF   r  c                       \ rS rSrSrSrSrSrg)r  i+  r  333333?r  r=   N)r?   r@   rA   rB   r  r  r  rE   r=   rF   r2   r  r  +  s    LMNrF   r  c                      \ rS rSrSr\S-  rS\-  rS\-  rS\-  rS\-  r	S\-  r
S	\-  rS
\-  rS\-  rS\-  rS\-  rSrSrg)r  i1  i'     K7@皙Y@;On@w/3s@-ƃ@=
ףp@A`"@tV@\(1@   r  r=   Nr?   r@   rA   rB   r  r"  r  r  r  r  r  r  r  r  r  r  r  rE   r=   rF   r2   r  r  1  }    I4H 	!GiGYDYDYDYDYDYDy F9_F KrF   r  c                      \ rS rSrSr\S-  rS\-  rS\-  rS\-  rS\-  r	S\-  r
S	\-  rS
\-  rS\-  rS\-  rS\-  rSrSrg)r  iF  i`  r  r  r  r  r  r	  r
  r  r  r  r  r  r=   Nr  r=   rF   r2   r  r  F  r  rF   r  c                  T    \ 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	rg
)Nodei[  zA node in the TeX box model.c                    SU l         g Nr   r  r   s    r2   rU   Node.__init__^  s	    	rF   c                ,    [        U 5      R                  $ rQ   )typer?   r   s    r2   __repr__Node.__repr__a  s    Dz"""rF   c                    gNr   r=   )rT   nexts     r2   r'  Node.get_kerningd  s    rF   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    r2   shrinkNode.shrinkg  s    
 			Q	rF   c                    g)zRender this node.Nr=   rT   r   r   r   s       r2   renderNode.rendern  s    rF   c                    g)NTr=   r   s    r2   is_char_nodeNode.is_char_nodeq  s     rF   r  Nr   r   r   r   r  zNode | Noner   r7   r   rN   r   r7   r   r7   r   r   r   r   )r?   r@   rA   rB   rC   rU   r  r'  r!  r%  r(  rE   r=   rF   r2   r  r  [  s#    &# rF   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 rQ   )r   rU   r8   r9   r:   )rT   r8   r9   r:   r   s       r2   rU   Box.__init__~  s    

rF   c                   > [         TU ]  5         U R                  [        :  aL  U =R                  [
        -  sl        U =R                  [
        -  sl        U =R                  [
        -  sl        g g rQ   )r   r!  r  NUM_SIZE_LEVELSr8   SHRINK_FACTORr9   r:   rT   r   s    r2   r!  
Box.shrink  sH    99&JJ=(JKK=(KJJ=(J 'rF   c                    g rQ   r=   )rT   r   r   y1r   y2s         r2   r%  
Box.render  s    rF   )r:   r9   r8   )r8   r7   r9   r7   r:   r7   r   r   r*  )r   rN   r   r7   r8  r7   r   r7   r9  r7   r   r   )
r?   r@   rA   rB   rC   rU   r!  r%  rE   r-  r.  s   @r2   r   r   {  sB    *)#).49>B rF   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   rU   )rT   r9   r:   r   s      r2   rU   Vbox.__init__  s    V+rF   r=   )r9   r7   r:   r7   r?   r@   rA   rB   rC   rU   rE   r-  r.  s   @r2   r<  r<    s    ., ,rF   r<  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  r>  rT   r8   r   s     r2   rU   Hbox.__init__  s    B'rF   r=   r8   r7   r@  r.  s   @r2   rB  rB    s    8( (rF   rB  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 rQ   )	r   rU   cfontsetr[   r   r\   r   _update_metrics)rT   rJ  stater   s      r2   rU   Char.__init__  sZ    }}JJ	**99 	rF   c                     SU R                   -  $ )Nz`%s`rJ  r   s    r2   r  Char.__repr__  s    rF   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 )rK  r   r[   r   rJ  r\   r   _metricsr   r8   r}   r9   r:   rT   rq   s     r2   rL  Char._update_metrics  s    "&,,":":IIttxx#I 	I-66S= DJ DJoo78
rF   c                .    U R                   R                  $ rQ   )rT  r   r   s    r2   
is_slantedChar.is_slanted  s    }}$$$rF   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   )rT  r   r8   r  rH  rK  r   r[   r   rJ  r\   r   )rT   r  r   kerns       r2   r'  Char.get_kerning  s     --''$**4dD!!<<((		4??DFFDMM		4??DFFDMMD ~rF   c           
         U R                   R                  XUU R                  U R                  U R                  U R
                  U R                  5        g rQ   )rK  r   r[   r   rJ  r\   r   r$  s       r2   r%  Char.render  s9    !!qIIttxx	IrF   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 rQ   )	r   r!  r  r3  r\   r4  r8   r9   r:   r5  s    r2   r!  Char.shrink  sV    99&MM]*MJJ]*JKK]*KJJ]*J	 'rF   )
rT  rJ  r:   r   r[   r   rK  r\   r9   r8   )rJ  r   rM  ParserStater+  r*  r.  r,  r-  )r?   r@   rA   rB   rC   rU   r  rL  rX  r'  r%  r!  rE   r-  r.  s   @r2   rH  rH    s1    

9% I
+ +rF   rH  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	$ )	Accenti  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  )rK  r   r[   r   rJ  r\   r   rT  ru   rr   r8   rs   rv   r9   r:   rU  s     r2   rL  Accent._update_metrics  sm    "&,,":":IIttxx#I 	I-\\GLL0
llW\\1
rF   c                B   > [         TU ]  5         U R                  5         g rQ   )r   r!  rL  r5  s    r2   r!  Accent.shrink  s    rF   c           
        U R                   R                  XU R                  R                  -
  X0R                  R                  -   U R
                  U R                  U R                  U R                  U R                  5        g rQ   )
rK  r   rT  rr   rv   r[   r   rJ  r\   r   r$  s       r2   r%  Accent.render  sU    !!***A0B0B,BIIttxx	IrF   )rT  r:   r9   r8   r*  r-  )
r?   r@   rA   rB   rC   rL  r!  r%  rE   r-  r.  s   @r2   rc  rc    s    
I IrF   rc  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   rU   shift_amountchildrenglue_set	glue_sign
glue_orderrT   elementsr   s     r2   rU   List.__init__  s<    R$#(rF   c                V  > SR                  [        TU ]	  5       U R                  U R                  U R
                  U R                  U R                  (       aN  S[        R                  " SR                  [        SR                   U R                  5      5      S5      -   S-   5      $ S5      $ )Nz/{}<w={:.02f} h={:.02f} d={:.02f} s={:.02f}>[{}]
z{!r},z   )formatr   r  r8   r9   r:   rm  rn  textwrapindentjoinrX   r5  s    r2   r  List.__repr__  s    @GGGJJJJ)) }} 8??		#gnndmm<= 	
 	
 #%
 	
rF   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  r  totalss     r2   r
  !List._set_glue.<locals>.<genexpr>  s     C01F1INQQ0s   	r  r   r   z	%s %s: %r)r  r  rM  rq  rp  ro  
glue_ratiorn  r  r  r  r?   )rT   r   signr  
error_typeos      `  r2   	_set_glueList._set_glue  s    "Cc&k*4R40CQH 	H! !9?q	MDMDN DO64==!!['d)<)<dD " rF   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 rQ   )rn  r!  r   r  r3  rm  r4  ro  )rT   childr   s     r2   r!  List.shrink#  sT    ]]ELLN #99&.MM.M 'rF   )rn  rq  r  ro  rp  rm  )rs  T.Sequence[Node]r+  )
r   r7   r  r|   r  zlist[float]r  r   r   r   r*  )r?   r@   rA   rB   rC   rU   r  r  r!  rE   r-  r.  s   @r2   rk  rk    s2    :	
D!D&*D / /rF   rk  c                  l   ^  \ rS rSrSr   S   S	U 4S jjjrS
S jrSS jr  S   SS jjrSr	U =r
$ )Hlisti,  zA horizontal list of boxes.c                ~   > [         TU ]  U5        U(       a  U R                  5         U R                  X#S9  SU l        g )N)r`   r  F)r   rU   r[  hpack
is_phantom)rT   rs  r`   r  do_kernr   s        r2   rU   Hlist.__init__/  s3     	"IIK

Q
rF   c                B    [        [        S U R                  5      5      $ )Nc                "    U R                  5       $ rQ   )r(  )nodes    r2   <lambda>$Hlist.is_char_node.<locals>.<lambda>:  s    D$5$5$7rF   )allrX   rn  r   s    r2   r(  Hlist.is_char_node8  s    37GHHrF   c                   / n[         R                  " U R                  U R                  SS 5       HK  u  p#UR                  U5        UR	                  U5      nUS:w  d  M/  [        U5      nUR                  U5        MM     Xl        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   )	itertoolszip_longestrn  r   r'  Kern)rT   new_childrenelem0elem1kerning_distancer[  s         r2   r[  
Hlist.kern<  sy     %11$--qrARSLE&$0072%,-##D) T %rF   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      rm  
additionalr   Nr   Overfulr  Underful)rn  r  rH  r8   rt   r9   r:   r   rY   isinfgetattrGlue	glue_specstretch_orderstretchshrink_orderr!  r  rp  rq  r  r  )rT   r`   r  ra   rb   r   total_stretchtotal_shrinkprp  r  s              r2   r  Hlist.hpackM  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,
;rF   )rn  r:   rq  r  rp  r9   r  r8   )r   r  T)rs  r  r`   r7   r  "T.Literal['additional', 'exactly']r  r   r.  r*  r   r  )r`   r7   r  r  r   r   )r?   r@   rA   rB   rC   rU   r(  r[  r  rE   r-  r.  s   @r2   r  r  ,  sV    %>A9E!% 6    I%"  #6B?<3?<GK?< ?<rF   r  c                  v   ^  \ rS rSrSr  S	 S
U 4S jjjrSS 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)ra   r  )r   rU   vpack)rT   rs  ra   r  r   s       r2   rU   Vlist.__init__  s    "

Q
rF   c                    gNFr=   r   s    r2   r(  Vlist.is_char_node  s    rF   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  rm  z1Internal mathtext error: Char node found in Vlistr  r   Nr   r  r  r  )rn  r  r   r9   r:   rY   r  r8   r  rt   r  r  r  r  r  r!  r  rH  RuntimeErrorrp  rq  r  r  )rT   ra   r  lr`   rb   r   r  r  r  rp  r  s               r2   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,
;rF   )r:   rq  r  rp  r9   r8   r  )rs  r  ra   r7   r  r  r.  )ra   r7   r  r  r  r7   r   r   )r?   r@   rA   rB   rC   rU   r(  rY   infr  rE   r-  r.  s   @r2   r  r    sY    #>A9E6 
  #6BG<3G<G<$(G< G<rF   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$ )Rulei  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 rQ   )r   rU   rK  )rT   r8   r9   r:   rM  r   s        r2   rU   Rule.__init__  s    .}}rF   c                B    U R                   R                  XX5-
  XE5        g rQ   )rK  r   r   s         r2   r%  Rule.render  s    ''15!?rF   )rK  )r8   r7   r9   r7   r:   r7   rM  ra  r   )	r?   r@   rA   rB   rC   rU   r%  rE   r-  r.  s   @r2   r  r    sF    %@@!@&+@05@:>@ @rF   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   rU   rY   r  )rT   rM  	thicknessr9   r:   r   s        r2   rU   Hrule.__init__  s8    ==?I"S(6rF   r=   rQ   )rM  ra  r  float | Noner@  r.  s   @r2   r  r    s    87 7rF   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 rQ   r  )rT   rM  r  r   s      r2   rU   Vrule.__init__  s,    99;	BFFBFFE:rF   r=   )rM  ra  r@  r.  s   @r2   r  r    s    6; ;rF   r  c                  H    \ rS rSr% S\S'   S\S'   S\S'   S\S'   S\S'   S	rg
)	_GlueSpeci  r7   r8   r  r|   r  r!  r  r=   Nr   r=   rF   r2   r  r    s    LNMrF   r  r   r   rn   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   rU   r  r   r  _namedr/   r  )rT   	glue_typer  r   s      r2   rU   Glue.__init__'  sP     	i%%!((3I	9--!IMNN"rF   c                   > [         TU ]  5         U R                  [        :  a2  U R                  nUR                  UR                  [        -  S9U l        g g )Nr8   )r   r!  r  r3  r  _replacer8   r4  )rT   r  r   s     r2   r!  Glue.shrink4  sB    99&AZZagg.EZFDN 'rF   )r  )r  z`_GlueSpec | T.Literal['fil', 'fill', 'filll', 'neg_fil', 'neg_fill', 'neg_filll', 'empty', 'ss']r*  )	r?   r@   rA   rB   rC   rU   r!  rE   r-  r.  s   @r2   r  r    s$    #A#G GrF   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   rU   r  rr  s     r2   rU   HCentered.__init__A  s*    $t*<x<d<eLrF   r=   rs  z
list[Node]r@  r.  s   @r2   r  r  ;  s    
M MrF   r  c                  0   ^  \ rS rSrSrSU 4S jjrSrU =r$ )	VCenterediE  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  rr  s     r2   rU   VCentered.__init__K  s%    $t*<x<d<=rF   r=   r  r@  r.  s   @r2   r  r  E  s    
> >rF   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  iO  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 rQ   )r   rU   r8   rD  s     r2   rU   Kern.__init__]  s    
rF   c                     SU R                   -  $ )Nzk%.02fr  r   s    r2   r  Kern.__repr__a  s    $**$$rF   c                ~   > [         TU ]  5         U R                  [        :  a  U =R                  [
        -  sl        g g rQ   )r   r!  r  r3  r8   r4  r5  s    r2   r!  Kern.shrinkd  s,    99&JJ-'J 'rF   r  rF  r+  r*  )r?   r@   rA   rB   rC   r9   r:   rU   r  r!  rE   r-  r.  s   @r2   r  r  O  s(     FE%( (rF   r  c                  8   ^  \ rS rSrSr S SU 4S jjjrSrU =r$ )AutoHeightCharij  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   )rK  r   r[   r   r\   r   copyrH  r9   r:   rM  r   rU   rm  )rT   rJ  r9   r:   rM  factorr  r"  target_totalr   r   r  shiftr   s                r2   rU   AutoHeightChar.__init__s  s   }}FFuzzSTU==,,UZZS

~)MH!J#D {{TZZ'<#.+HH * ::L 1Q 6~%tzz)ABNNf$NU#DZZ'E$ !rF   )rm  rQ   )
rJ  r   r9   r7   r:   r7   rM  ra  r  r  r@  r.  s   @r2   r  r  j  s     )-"%" "rF   r  c                  8   ^  \ rS rSrSr\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.
c                d  > UR                   R                  UR                  U5      nUR                  5       nU H%  u  pgXcl        U" Xs5      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 rQ   )rK  r   r[   r  r8   r\   r   rU   )rT   rJ  r8   rM  
char_classr  r   r   r  r  r   s             r2   rU   AutoWidthChar.__init__  s    }}FFuzzSTU

)MH!Jc)DzzU"	 * #& #u%$ ZZ
rF   r  )rJ  r   r8   r7   rM  ra  r  z
type[Char])	r?   r@   rA   rB   rC   rH  rU   rE   r-  r.  s   @r2   r  r    s     +/ '   rF   r  c                   ^^^^^^	^
^^^ Uu  p#SmSmUmX0R                   -   m	[        U 5      m
/ mU4S jmSS jmSUUUUUU	U
UUU4
S jjmSU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                F   > [        T5      (       d  U R                  " U6   g g rQ   )anyr%  )r  argsphantoms     r2   r%  ship.<locals>.render  s    7||KK rF   c                &    U S:  a  S$ U S:  a  S$ U $ )Ng    eg    eAr=   )values    r2   clampship.<locals>.clamp  s    t|tHH5HrF   c           	       >
 SnSnU R                   nU R                  nTnTnTR                  U R                  5        U R                   GHz  n[        U[        5      (       a"  T" UTTT-   TT-   5        TUR                  -  mM;  [        U[        5      (       a  TUR                  -  mMa  [        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T" U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 R0                  U-  5      5      nO<UR2                  U:X  a,  X,R4                  -  n[/        T" U R0                  U-  5      5      nX-  nTU-  mGM}     TR7                  5         g )Nr   r   unreachable coder   )rq  rp  r   r  rn  r  rH  r8   r  rk  rM  rm  r  r  r   r9   r:   rY   r  r  r  r  r  roundro  r  r!  pop)rS   cur_gcur_gluerq  rp  	base_line	left_edger  edgerule_height
rule_depth
rule_widthr  r  cur_hcur_v	hlist_outoff_hoff_vr   r	  r%  	vlist_outs                r2   r  ship.<locals>.hlist_out  sh    ^^
MM			s~~&A!T""q&%%-? 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1f 5=%%-%4 &E#At$$KK	&__u4
> A~$22j@$(9(99H$)%x0G*H$IE"//:= $4$44 %eCLL8,C&D E#
#g j 	rF   c           	     ^  >	 SnSnU R                   nU R                  nTnTU R                  -  mTnU R                   GHl  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T" U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,R.                  -  n[)        T" U R*                  U-  5      5      nX-  n	TU	-  mGML  [	        U[0        5      (       d  GMd  [3        S5      e   g )Nr   r   r  r   z1Internal mathtext error: Char node found in vlist)rq  rp  r9   rn  r  r  r8   rk  rM  r:   rm  r  r  r   rY   r  r  r  r  r  r  ro  r  r!  rH  r  )rS   r  r  rq  rp  r  top_edger  save_vr  r  r  r  r  r  r  r  r  r  r   r%  r   s                r2   r   ship.<locals>.vlist_out  sU    ^^
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1f 5=%%-%4 (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[ rF   )r  r7   r   r7   )rS   r  r   r   )rS   r  r   r   )r9   rN   r  r  )rS   xyrJ   rK   r  r  r  r  r  r  r   r	  r%  r   s       @@@@@@@@@@r2   rz   rz     s     FBEEEOEC[FGIA A AF9I 9Iv c5!!!!cNMrF   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rQ   r   )rp  loctoksmsgs      r2   raise_errorError.<locals>.raise_errorN  s    !!#..rF   rp  r   r*  r|   r+  r   r   T.Any)r   set_parse_action)r,  r-  s   ` r2   Errorr2  L  s    / 7##K00rF   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	)ra  iT  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 rQ   )rK  _fontr   r\   r   )rT   rK  r[   r   r\   r   s         r2   rU   ParserState.__init___  s    
$ rF   c                .    [         R                   " U 5      $ rQ   )r  r   s    r2   r  ParserState.copyg  s    yyrF   c                    U R                   $ rQ   )r5  r   s    r2   r[   ParserState.fontj  s    zzrF   c                (    US;   a  Xl         Xl        g )N)r:  r<  r>  r?  r  )r   r5  )rT   r  s     r2   r[   r:  n  s    77"O
rF   c                x    U R                   R                  U R                  U R                  U R                  5      $ )z.Return the underline thickness for this state.)rK  r   r[   r\   r   r   s    r2   r  +ParserState.get_current_underline_thicknesst  s,    ||33IIt}}dhh0 	0rF   )r5  r   r   rK  r\   N)
rK  r   r[   r   r   r   r\   r7   r   r7   r   ra  r+  )r  r   r   r   )r   r7   )r?   r@   rA   rB   rC   rU   r  propertyr[   setterr  rE   r=   rF   r2   ra  ra  T  sJ       
[[ 
0rF   ra  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rQ   )r  r   exprsresultsName)eltexprnamess     r2   rG  cmd.<locals>.names  sI     c?++		 ;&& "__//!  's   0A A+A rW  r   r   rw  c              3  ,   #    U  H
  nS U-  v   M     g7f)z{%s}Nr=   )r  r  s     r2   r
  cmd.<locals>.<genexpr>  s     BkdFTMks   z	Expected )rE  r   r   zT.Generator[str, None, None])rl  r{  r2  )rF  r  csnamer1   rG  s       @r2   cmdrL  z  sc    " ZZQ"Fn BGGBeDkBBB"& EIcU"34455rF   c                  h  ^ \ 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!SlS jr"SmS jr#SnS jr$SlS jr%SlS jr&SoS jr'SpS jr(SqS jr)SqS jr*\+" \,RZ                  5      r.SqS jr/SrS jr0S S S S!S!S"S#S#S$SS%S&S'.r1SqS( jr2SqS) jr3    SsS* jr4StS+ jr5SqS, jr6SqS- jr7SqS. jr80 S/S0_S1S2_S3S4_S5S6_S7S8_S9S:_S;S<_S=S>_S?S@_SASB_SCSD_SES>_SFS6_SGS8_SHS:_SIS<_SJS0_SKSLSMSN.Er9\" SOR                  5       5      r:SqSP jr;StSQ jr<StSR jr=SqSS jr>SqST jr?SqSU jr@\@rASuSV jrBStSW jrCSqSX jrDSvSY jrESvSZ jrFSvS[ jrGStU4S\ jjrH      SwS] jrISqS^ jrJSqS_ jrKSqS` jrLSqSa jrMSqSb jrNStSc jrO\O=rPrQSqSd jrRSqSe jrSSqSf jrT      SxSg jrUSqSh jrVSqSi jrWSqSj jrXSkrYU=rZ$ s  snnnn f )y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   rn   r   r=   N)	r?   r@   rA   rB   DISPLAYSTYLE	TEXTSTYLESCRIPTSTYLESCRIPTSCRIPTSTYLErE   r=   rF   r2   
_MathStylerP    s    	rF   rU  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 \iiiintz:rm cal it tt sf bf bfit default bb frak scr regular normalz
      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                  ^ ^ [         R                  " 5       mSGUU 4S jjnSHS 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&        [K        STRC                  S5      5      Tl'        [K        STRC                  S5      5      Tl(        [K        STRC                  S5      5      Tl)        U" S/ T RT                  QT RV                  Q5      TR?                  S
5      -
  Tl,        U" ST RZ                  5      Tl.        TR.                  [G        TRD                  5      " S5      -   TR2                  -   Tl/        TR.                  [G        TRD                  5      " S5      -   [a        5       -   Tl1        [K        STRA                  S5      TRA                  S5      -   5      Tl2        [K        STRA                  S5      TRA                  S5      -   5      Tl3        [K        STRA                  S5      TRA                  S5      -   5      Tl4        [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l5        [K        S![-        S"[I        [m        S#5      TRD                  -   5      " S$5      -   S#-   5      TRA                  S5      -   5      Tl7        [K        S%TRA                  S&5      5      Tl8        [K        S'TRA                  S&5      5      Tl9        [K        S(TRC                  S)5      TRC                  S&5      -   5      Tl:        [K        S*TRC                  S)5      TRC                  S&5      -   5      Tl;        [K        S+[y        SS,SS-95      Tl=        [K        S.[}        SS[        [I        TRD                  5      5      [G        [1        S/5      R                  5       5      -   S09" S15      5      TlA        [-        TR<                  5      " S25      [I        [	        S3S4/5      TR<                  -
  5      " S55      -   [        S65      " S75      -   [        S85      " S75      -  TR?                  S25      [        S65      " S75      -   -  TlB        TR                  TRL                  -  TR*                  -  TR                  -  TlC        T=RD                  TR                  TR:                  -  TRb                  -  TR&                  -  -  sl"        [K        S9S[G        TR                  5      " S5      -   S-   5      TlD        [K        S:S[G        TR                  5      " S5      -   S-   5      TlE        T=R<                  TRN                  TRP                  -  TRR                  -  TRX                  -  TR$                  -  TR\                  -  TR                  -  TR^                  -  TRd                  -  TRf                  -  TRh                  -  TRj                  -  TRt                  -  TRv                  -  TRn                  -  TRp                  -  TRr                  -  TRz                  -  TR                  -  TR                  -  TR:                  -  -  sl        S;TR7                  S<5      [        S=5      -  -
  nT=R:                  S>TR7                  S?5      [        S=5      -  -
  [G        TR                  TR:                  -  U-  5      " S@5      -   SA-   TR7                  SB5      [        S=5      -  -
  -  sl        [I        TRD                  5      TlG        [y        SCS,SDSE9TlH        [        SF5      R#                  5       TlI        TR                  [G        TR                  TR                  -   5      -   [a        5       -   TlJ        U" 5         TR                  T lK        TR                  T lL        SDT lM        g s  snf )INc                   > [        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)varsrF  r  set_namehasattrr1  r  )rG  r	  r  rT   s     r2   set_names_and_parse_actions4Parser.__init__.<locals>.set_names_and_parse_actions6  sa     GMMO~~c** "FFS)tS)),,WT3-?@ ,rF   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})|rw  )ra  alphar  nonalpha)isalphar   r   rx  r{  rX   reescape)ra  rG  ends_with_alphaends_with_nonalphar  s        r2   csnames Parser.__init__.<locals>.csnamesE  s     O!#8##%%#**40&--d3	 
 OVV((3ryy/#BC&8sb XXc"))5G&HI	 W  rF   z[-+]?([0-9]+\.?[0-9]*|\.[0-9]+)spacestyle_literalzI[a-zA-Z0-9 +\-*/<>=:,.;!\?&'@()\[\]|\U00000080-\U0001ffff]|\\[%${}\[\]_|]z|\\(?:{})(?![A-Za-z])rc  r   z\\[A-Za-z]+r  r[   z\mathrW  rX  z\hspacez\phantomr  z\llapz\rlapaccentz\fracr]   denz\dfracz\binomz\genfracldelimrdelimrulesizestylez\sqrt{value}rY  rZ  rootz	\overlinebodyz
\underlinez\overset
annotationz	\undersetz\textr*   )end_quote_charz	\substackz\\)openerclosercontentpartsnucleusrX  r_  subsuperz'*apostrophesz'+z\operatornamez\boldsymbol\middlemdelimzExpected a delimiterz\leftleftr  z\rightright$F)unquote_resultsz(?:(?:\\[$])|[^$])*r*  )ra  r   rG  zIterable[str]r   r   )NtypesSimpleNamespacer   float_literalr   _space_widthsrm  rU  r   r  rn  rx  r{  rX   rg  rh  r   leave_whitespacer0   unknown_symbol
_fontnamesr[   r   start_groupr   	end_group_delimsdelimr   r[  rZ  named_placeablerequired_groupoptional_grouprY  r   r   rL  customspacer	  llaprlap_accent_map_wide_accentsro  _function_namesfunctionra  r   unclosed_groupfracdfracbinomgenfracr
   sqrtoverline	underlineoversetundersetr   textr   r	   suppresssubstackr~  simpleoperatorname
boldsymbolr2  rx   math_stringnon_mathmain_expression_math_expression_needs_space_after_subsuper)rT   r_  rk  er  r  s   `    @r2   rU   Parser.__init__3  s	   !!#
	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Q%5%5g%>?	Xq//89Xq//89 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'?@
-)9)9&)AB\*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 	
II'hhhh jj	
 nn gg ff gg gg	 ii
 ii jj ff jj kk  ff!" ll#$ jj%& ll'	
. 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 ! ,1(s 4s   )ic                `   [        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UR                  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<  rv  r   NF)ra  _state_stack_em_width_cacher  parse_stringr   r/   explainr  r   reset_cacher   r   r  )rT   rp  fonts_objectr\   r   resultr1   s          r2   parseParser.parse  s     ixEGFH	>%%2215F +0(!!!#vveVAY'' " 	>TCKKN23=	>s   B   
B-
B((B-c                     U R                   S   $ )z&Get the current `State` of the parser.r  )r  r   s    r2   	get_stateParser.get_state
	  s      $$rF   c                8    U R                   R                  5         g)zPop a `State` off of the stack.N)r  r  r   s    r2   	pop_stateParser.pop_state	  s    rF   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    r2   
push_stateParser.push_state	  s&      !1!6!6!89rF   c                6    [        UR                  5       5      /$ rQ   )r  as_listrT   r+  s     r2   r  Parser.main	  s    dlln%&&rF   c                B    U R                   R                  US   SS SS9$ )Nr   r   r  T)	parse_all)r  r  r  s     r2   r  Parser.math_string	  s(    $$11$q'!B-41PPrF   c                Z    [        UR                  5       5      nU R                  5         U/$ rQ   )r  r  r  )rT   r+  hlists      r2   rx   Parser.math	  s#    dlln%wrF   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\$r  r  )replacerH  r  r  r  r  r  r[   )rT   r+  rp  rJ  symbolsr  s         r2   r  Parser.non_math!	  sn    GOOE3'678a4>>+,a8g #-? @w 9s   #Bc           	         U R                  5         U R                  5       nSUl        [        US    Vs/ s H  n[	        X25      PM     sn5      nU R                  5         U/$ s  snf )Nr<  r   )r  r  r[   r  rH  r  )rT   r+  rM  rJ  r  s        r2   r  Parser.text,	  sV     
tAw7w!tA~w78w 8s   A#c                <   U R                  5       nUR                  UR                  UR                  4nU R                  R                  U5      nUc?  UR                  R                  SUR                  UR                  5      nX@R                  U'   [        XA-  5      $ )Nr:  )	r  r[   r\   r   r  r   rK  r   r  )rT   
percentagerM  rG  r8   s        r2   _make_spaceParser._make_space4	  s      zz5>>5995$$((-=MM**8U^^UYYOE(-  %E&''rF   gKqU?g0Bxq?g%?g1ZGU?r  rn   gKqUſ)\,z
\thinspacez\/z\>z\:z\;z\ r`  z\enspacez\quadz\qquadz\!c                N    U R                   US      nU R                  U5      nU/$ Nrm  )r  r  )rT   r+  r]   rS   s       r2   rm  Parser.spaceR	  s-      g/s#urF   c                ,    U R                  US   5      /$ r  )r  r  s     r2   r  Parser.customspaceW	  s      g/00rF   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   -r  zUnknown symbol: %sc              3  4   #    U  H  oS :w  d  M
  Uv   M     g7frS  Nr=   r  rJ  s     r2   r
   Parser.symbol.<locals>.<genexpr>m	       CAs(aa   		r  rw  r   rW  r  Tr  c              3  4   #    U  H  oS :w  d  M
  Uv   M     g7fr  r=   r  s     r2   r
  r  {	  r  r  c              3  4   #    U  H  oS :w  d  M
  Uv   M     g7fr  r=   r  s     r2   r
  r  |	  s     AASaar  r   ,rX  .)rH  r  r/   r   _spaced_symbolsr  r  _binary_operatorsrM  rl  _left_delims_relation_symbolsr  r  _punctuation_symbolsrN  )	rT   rp  r*  r+  rJ  r  r1   	prev_char	next_chars	            r2   r0   Parser.symbolZ	  s   K8 !A	I>>+,D
 $$$ C4C2CRHI 00///$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)  rT   rp  r*  r+  s       r2   r  Parser.unknown_symbol	  s    !!,<T&\N*KLLrF   c                     SUS   l         US   $ )NTr  )r  r  s     r2   r	  Parser.phantom	  s    #'W G}rF   c                R    [        [        US   R                  * 5      US   /5      /$ Nr  r  r  r8   r  s     r2   r  Parser.llap	  s+    tT']00014=ABCCrF   c                R    [        US   [        US   R                  * 5      /5      /$ r  r  r  s     r2   r  Parser.rlap	  s+    tG}dDM,?,?+?&@ABCCrF   hatz\circumflexaccentbrevez\combiningbrevebarz\combiningoverlinegravez\combininggraveaccentacutez\combiningacuteaccenttildez\combiningtildedotz\combiningdotaboveddotz\combiningdiaeresisdddotz\combiningthreedotsaboveddddotz\combiningfourdotsabovevecz\combiningrightarrowabove"`'r`  r  r_  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[        U/5      nOb[        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      $ )
Nro  r   r*   )r  r  g      @exactlyr   g       @)r  r  r  r  r8   rc  r  r  r!  rB  r  r  r<  r  )rT   r+  rM  r  ro  r   
accent_boxcentereds           r2   ro  Parser.accent	  s     99;	h5k'''&vsyy%FDJ *.H 0 0 8%@J#!!#!!# $syy3"7!DEHsyy),RS)se  	rF   c                >    U R                  XU5      nUS   Ul        U$ )Nr  )r  function_name)rT   rp  r*  r+  r  s        r2   r  Parser.function	  s%    !!!$/"6lrF   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;  a!  XPR                  U R                  S	   5      /-  nU R                  5         U	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     r2   r
  &Parser.operatorname.<locals>.<genexpr>	  s     C%6s(!!%6r  rw  r_  rX  r  >   r_  rX  )r  r  r[   r  rH  rL  r   r   rM  r   r  r  r  r  r  r  r  )rT   rp  r*  r+  rM  
hlist_listr  rJ  next_char_locr  
delimiterss              r2   r  Parser.operatorname	  s7    
!#
F|A!T""!!#!!!$As##!!$q.1!!!$  c$i!+dL))S!122MCQ~%6CRH	\\S#J.
&++D,>,>u,EFGGJ ,5
+B(Z  rF   c                    U R                  5         UR                  S5      (       a$  UR                  S5      U R                  5       l        / $ Nr[   )r  r   r  r[   r  s     r2   r  Parser.start_group	  s8    88F$(HHV$4DNN!	rF   c                >    [        UR                  S/ 5      5      nU/$ Nra  r  r   )rT   r+  grps      r2   ra  Parser.group	  s    DHHWb)*urF   c                8    [        UR                  S/ 5      5      $ r#  r$  r  s     r2   r  Parser.required_group	  s    TXXgr*++rF   c                &    U R                  5         / $ rQ   )r  r   s    r2   r  Parser.end_group	  s    	rF   c                .    [        U[        U5      S5      e)NzExpected '}')r   rM  r  s       r2   r  Parser.unclosed_group	  s    !!SV^<<rF   c                6    US   U R                  5       l        / $ r   )r  r[   r  s     r2   r[   Parser.font
  s     $V	rF   c                    [        U[        5      (       a  UR                  U R                  ;   $ [        U[        5      (       a*  [        US5      (       a  UR                  U R                  ;   $ g)Nr  F)r  rH  rJ  _overunder_symbolsr  r^  r  _overunder_functionsrT   r}  s     r2   is_overunderParser.is_overunder
  sW    gt$$99 7 777''GG_,M,M((D,E,EEErF   c                `    [        U[        5      (       a  UR                  U R                  ;   $ gr  )r  rH  rJ  _dropsub_symbolsr2  s     r2   
is_dropsubParser.is_dropsub
  s'    gt$$99 5 555rF   c                N    [        U[        5      (       a  UR                  5       $ gr  )r  rH  rX  r2  s     r2   rX  Parser.is_slanted
  s!    gt$$%%''rF   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a  / 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 R:                  (       a  U R=                  U R>                  S   5      /O/ nSU l        [        U/UQ5      nU/$ Un[A        U[        5      (       a  UR                  n[        U5      (       aj  [A        US   [B        5      (       a  [A        US   [D        5      (       a  US S nUS   n[A        U[D        5      (       a  URF                  RH                  Ul        [        USS9nO<[A        U[D        5      (       a  URF                  RH                  Ul        [        U/5      nUR
                  RK                  5       nUR2                  nS
nU RM                  U5      (       a  UR4                  nURN                  U-  nURN                  U-  nU RQ                  U5      (       a  UURN                  U-  -  nUURR                  UUS-  S-  -
  -  -  nU RM                  U5      (       a?  SURN                  -  URT                  -
  U-  nSURN                  -  URT                  -   U-  nOSnURW                  5       (       a  S
nS
nOzUR
                  R                  UR                  UR                  [X        -  UR                  5      n UR2                  URZ                  U -  -
  nUR4                  UR\                  U -  -   nUc  [        [C        U5      [^        R`                  " [b        U5      /5      n!U!R)                  5         U RM                  U5      (       a  UUR\                  U-  -   nO-[+        UURd                  U-  U!R2                  US-  S-  -
  5      nUU!l        GO[        [C        U5      U/5      n!U!R)                  5         U RM                  U5      (       a  UUR\                  U-  -
  nO*[+        UURf                  U-  U!R4                  US-  -   5      nUc	  U* U!l        O[        [C        U5      U/5      n"U"R)                  5         U RM                  U5      (       a  UUR\                  U-  -   nO[+        UURh                  U-  5      nSU-  UU!R4                  -
  U"R2                  U-
  -
  -
  n#U#S
:  a-  UU#-  nUS-  S-  U-
  U!R4                  -   n#U#S:  a
  UU#-  nUU#-  n[7        U![C        UU!R4                  -
  U"R2                  U-
  -
  5      U"/5      n!UU!l        U RM                  U5      (       d"  U!=R&                  URj                  U-  -  sl        U R:                  (       a  U R=                  U R>                  S   5      /O/ nSU l        [        UU!/UQ5      nU/$ )Nr}  r   r~  r  rX  zDouble subscriptzDouble superscriptr   r  r   g      @r  r  Fr  r  rn   r   r     )6r   rB  rM  r   r  rK  r   r[   r\   r   r   r  r  rn  extendr0   r[  r  r3  r8   r!  rt   r  r<  r   r9   r:   r  rm  r  r  r  r  r  rH  rT  r   r   r7  r  rX  r  r  r(  r4  r  r  r   r   r  r  r  r  r  )%rT   rp  r*  r+  r}  r~  napostrophessubr   opargrM  rule_thicknessr"  r  vlistr  r8   vgapr  vltoptional_spacingr  	last_charr  r  	lc_heightlc_baseline	superkernsubkernshift_up
shift_downshrunk_x_heightr   r   clrr   s%                                       r2   r~  Parser.subsuper
  sY   ((9d1g.88J+488M267N!)BhSy?-.@AA$-.BCC h  >>JJ		3==,,UZZS}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#'#C#C "&!1!1$2D2DU2K!L MIK /4D,C3"234F8O 	gu%%"++L<  |B/66"<#3T::#/#4L(,	i..&/&8&8&@&@IOL%8G'4(("+"4"4"<"<	WI&G 113&&	??9%%#//K LL8+	,,)??9%%00I--X\A=M1MNNIy))v||+f.C.CCyP-0E0EER	 !!HJ#mm77

ENN]:EIIGO~~(HHH /)IIJ =
 tG}affT3&789AHHJy))(6>>H+DD
 V[[8-C!"HqL1,<!<>
'AN tI./AHHJy))$v~~'@@xx)?8VW<AWX{"* 4=#./
??9--!,v~~/H!HJ!$Zx1G!HJ >)!AGG+:0EFH8#%J"Q,*X5?CQw C"c)
(QWW,J1FGH  ",y))GGv**X55G
  $?? "--d.@.@.GHIEG 	+0(6%567xrF   c           	        U R                  5       nUR                  5       nUR                  R                  UR                  UR
                  UR                  5      n	UR                  R                  5       n
UR                  R                  UR                  UR
                  UR                  5      n[        UR                  5       H,  nU[        -  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(       a  X@R"                  R$                  L a$  U
R&                  U-  nU
R(                  U-  nSU-  nO U
R*                  U-  nU
R,                  U-  nUnUS-  n[        UUR.                  -
  U	U-   -
  U5      n[        U	U-
  UR0                  U-
  -
  U5      n[3        U[5        SU5      [7        Xs5      [5        SU5      U/5      nUR0                  U-   U-   U	-
  Ul        OX@R"                  R$                  L a$  U
R&                  U-  nU
R(                  U-  nSU-  nO#U
R:                  U-  nU
R,                  U-  nSU-  nUUR.                  -
  UR0                  U-
  -
  n[        UU5      n[3        U[5        SU5      U/5      nUUl        UU:  a  U=R8                  UU-
  S-  -  sl        [=        [?        U5      U[?        U5      /5      /nU(       d  U(       a%  U RA                  U=(       d    SUU=(       d    S5      $ U$ )Nr  r   rn   r      r  )!r  r  rK  r   r[   r\   r   r   r   r  r  r4  r!  r  rt   r8   r  rU  rQ  r  r  r  r  r:   r9   r  r<  r  rm  r  r  rB  _auto_sized_delimiter)rT   rq  rr  rulert  r]   rp  rM  r  r  r  r"  rX  cnumcdenr8   num_shift_upden_shift_downrP  r  num_clrden_clrrD  min_clrdef_clrr  s                             r2   _genfracParser._genfrac
  s    99;	mm33JJ		3113==,,UZZSu{{#A%HJJLJJL $ ##CIIsyy)

5)$

5)$ 444%{{X5!'!9$h%{{X5!'!91HE<$**4u9LMsSG;.4;;3OPRUVG47+ -7+	 E "&w!6!>!LE 444%{{X5!'!9i-%{{X5!'!9i-#djj0T[[>5QRGgw'C43< E "0E ""w'8A&=="*/OO1
 + *
 V--fmVV]sSSrF   c                <    U R                  [        US   5      5      $ )Nrn  )rU  r|   r  s     r2   rn  Parser.style_literal  s    s4#89::rF   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      $ )Nrq  rw  rr  rs  rt  r]   rp  )r^  r   rU  rR  r  s     r2   r  Parser.genfrac  sZ    }}HHXr"DHHXr$:dhhw0I0IJKe& 	&rF   c           	         U R                  SSU R                  5       R                  5       U R                  R                  US   US   5      $ Nrw  r]   rp  )r^  r  r  rU  rR  r  s     r2   r  Parser.frac  sE    }}DNN$DDFOO%%tE{DKA 	ArF   c           	         U R                  SSU R                  5       R                  5       U R                  R                  US   US   5      $ re  )r^  r  r  rU  rQ  r  s     r2   r  Parser.dfrac  sE    }}DNN$DDFOO(($u+tE{D 	DrF   c           	     b    U R                  SSSU R                  R                  US   US   5      $ )NrT  rV  r   r]   rp  )r^  rU  rR  r  s     r2   r  Parser.binom$  s5    }}aOO%%tE{DKA 	ArF   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$ )Nrw  rv  r  r   r   ur   )r  r  r!  r  rt   r8   r  r  r<  r:   r9   rm  )rT   rp  r*  r+  rw  rv  r  centered_annotationcentered_bodyr8   rE  rD  s               r2   _gensetParser._genset)  s   ,'
F|NN$DDF	'5!4&)'--}/B/BC!!%3E9-1}1W:Q# E "/!4!47J7Q7Q!QTX!XE  #Q E rF   c                r   UR                  S5      nUS   nU R                  5       nUR                  5       nUR                  UR                  -
  SU-  -   nUR
                  UR                  -   n[        SXgU5      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  [        S	UR                   -  S
S
5      nO+[        U5      nUR#                  5         UR#                  5         [        [        U/5      /5      nU* S-  Ul        [        U[%        SUR                   -  5      UU
/5      nU/$ )Nru  r  r=  r]  rn   r    r  r  r   r  g      )r   r  r  r9   rm  r:   r  r  rB  r  r  r  r  r\   r   r   r8   r!  r  )rT   r+  ru  rv  rM  r  r9   r:   checkpadded_body	rightside
root_vlistr  s                r2   r  Parser.sqrtK  s   xxG} 99;	 t0001y=@

T...|VEB 2 22e000 T!i-0$Q]8KLM5<f{CD	..599"<!JJ!5	*
 sU[[("b1D;DKKMKKME4&M?+
#)'C-
#$	
  wrF   c                   US   nU R                  5       nUR                  5       nUR                  UR                  -
  SU-  -   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/$ )Nrv  r   r  rr  r  )r  r  r9   rm  r:   r  r  r  r  r  r\   r   )	rT   r+  rv  rM  r  r9   r:   ru  r  s	            r2   r  Parser.overlinet  s    F| 99;	t0001y=@

T... 5<fudV}EF	 	..599"<!JJ!5	* yk"wrF   c                @   US   nU R                  5       nUR                  5       n[        [        U/5      [	        SU-  5      [        X45      /5      nUR                  UR                  -   U-   nUR                  Ul        XeR                  -
  Ul        [        U/5      /$ )Nrv  r   )r  r  r  r  r  r  r9   r:   )rT   r+  rv  rM  r  rD  r  s          r2   r  Parser.underline  s    F| 99;	4&MY%#
 
 u{{*Y6{{ll*ugrF   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   r  )r  r   r   )r  rM  rt   r  r   r9   r:   	enumerater   r   r  remover  r   rH  r   r>  r  )rT   frontmiddlebackrM  r   r9   r:   r  idxelrJ  middle_partr|  r  s                  r2   rT  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                V    U R                  US   US   R                  5       US   5      $ )Nr  r  r  )rT  r  r  s     r2   r[  Parser.auto_delim  s3    ))L$u+--/g@ 	@rF   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  rn  rH  r[   rL  r   rJ  _latin_alphabets_small_greekr  )rT   r+  rM  r  r  rJ  ks          r2   r  Parser.boldsymbol  s     G}A!U##JJqMa&&!AF%%'QAt$$CC400033qr7d///#AF%%'!!#QQ! " 	U|rF   c                   US   nU R                  5       nUR                  5       nUS    Vs/ s H  n[        U5      PM     nn[        [	        S U5      5      n/ nU H2  n	[        U	/5      n
U
R                  US5        UR                  U
5        M4     [        U[        SUS-  5      /[        U5      -  5       VVs/ s H  nU  H  nUPM     M     nnnUS	 [        U5      n[        U/5      /nU$ s  snf s  snnf )Nr|  r   c                    U R                   $ rQ   r  rP  s    r2   r  !Parser.substack.<locals>.<lambda>  s    aggrF   r  rn   r  )r  r  r  rt   rX   r  r  r   zipr<  rM  r  )rT   r+  r|  rM  r  r  r  	max_widthrD  r@  cppairr	  stackrF  r  s                   r2   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*  )
rp  r   r  r   r\   r7   r   r7   r   r  r>  )r+  r   r   zlist[Hlist])r+  r   r   r   )r+  r   r   r0  )r  r7   r   r  )rp  r   r*  r|   r+  zParseResults | dict[str, str]r   r0  r/  )r   r0  )r}  r  r   r   )rq  r   rr  r   rU  r  rt  rU  r]   r  rp  r  r   r0  )r  r   r  zlist[Box | Char | str]r  r   r   r0  )[r?   r@   rA   rB   rC   enumEnumrU  rk  rl  r  r  _arrow_symbolsr  r  r0  r1  r6  r  r  _ambi_delimsr  _right_delimsr  r  r+   r  r  r  r   r  stringascii_lettersr  rU   r  r  r  r  r  r  rx   r  staticmethodr   convert_to_floatr  r  r  r  rm  r  r0   r  r	  r  r  r  r  ro  r  r  r  ra  r  r  r  r  r[   r3  r7  rX  r~  r^  rn  r  r  r  r  ro  r  r  r  r  r  rT  r[  r  r  rE   r-  )r  r  r  r  r   s   0000@r2   rN  rN    s   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 ::?%'C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@1D(*% :'Q
 !!1!B!BCM(  M
1.2.7<.`MDD/- 	0 	3	
 	3 	- 	0 	1 	6 	5 	7 	1 	3 	3 	-  	0!" 	/#$ *(#)K. 4::<=M.
!<, $N=

sjDD"'D,1DL;&A
D
A
@ ! Gh'R& $&<$$'$,1$L@4 YGs   AL,rN  )r0   r   r   r&   ))r   r   )rS   r   r&  ztuple[float, float]r   rN   )r,  r   r   r   )rF  r   r  r   r   r   )xrC   
__future__r   abcr  r  r   r  loggingrx   r   rg  r  r  r  ry  typingr   r   numpyrY   numpy.typingr   	pyparsingr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   
matplotlibr  rw  r   _mathtext_datar   r   r   r   font_managerr   r    r!   ft2fontr"   r#   r$   TYPE_CHECKINGcollections.abcr%   r&   r'   r(   enable_packrat	getLoggerr  r3   r5   r@   rH   rN   r   r   ABCr   ABCMetar   r1  rr  r  r  r  rC  r  r4  r3  r   ri  r  r  r  r  r  r   r<  rB  rH  rc  rk  r  r  r  r  r  r  r  r  r  r  r  r  r  rz   r2  ra  rL  rN  r=   rF   r2   <module>r     s   # 
       	 	         + + + + + +  D D < < 0 0 ??(AA    ./,3* 3& / * ( / <5 <5~* @z y!CGG y!xxIES[[ xIv]+- ]+@C!= C!L&A,#++ &AR({ (*'k '*t% t%nI B  A. A.H!"3 !<) 4- 0 */ * @$ *,3 ,(3 (D+4 D+NIT I.-/3 -/``<D `<FS<D S<l@3 @(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 #"L E  8Y@1#0 #0L62[ [rF   