
    \cgC                   @   d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlmZ ddlZddlmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% ddl&Z'ddl(m)Z) ddl*m+Z+m,Z,m-Z-m.Z. dd	l/m0Z0m1Z1m2Z2 dd
l3m4Z4m5Z5m6Z6m7Z7 ddl8m9Z: ddlm;Z<  e:e<      jz                  dk  rddlm>Z? nddlm?Z? ej                  rddlAmBZB ddl3mCZC  ej                           ej                  d      ZFddZG G d de      ZHdeH_I         G d de      ZJdeJ_I         G d d      ZK G d de      ZL G d de      ZM G d dej                        ZO G d  d!eOej                  "      ZQ G d# d$eQ      ZR G d% d&eQ      ZS G d' d(eSej                  "      ZT G d) d*eT      ZU G d+ d,eT      ZV G d- d.eS      ZW G d/ d0eW      ZXd1ZYd2ZZ G d3 d4      Z[ G d5 d6e[      Z\ G d7 d8e[      Z] G d9 d:e[      Z^ G d; d<e[      Z_ G d= d>e[      Z`i d?e`d@e`dAe_dBe\dCe\dDe\dEe\dFe\dGe\dHe\dIe]dJe]dKe]dLe]dMe]dNe]dOe]e`e`dPZaddRZb G dS dT      Zc G dU dVec      Zd G dW dXed      Ze G dY dZed      Zf G d[ d\ec      Zg G d] d^eg      Zh G d_ d`ed      Zi G da dbei      Zj G dc ddei      Zk G de dfed      Zl G dg dhel      Zm G di djel      Zn G dk dle      Zo eodmdnddmd       eodmdndodmd       eodmdnddmd       eodmdmddnd       eodmdmddndo       eodmdmddnd       eodmdmddmd       eodmdnddpd      dqeo_p         G dr dsec      Zq G dt duej      Zr G dv dwek      Zs G dx dyec      Zt G dz d{ej      Zu G d| d}ej      Zvddd~ZwddZx G d dQ      ZyddZz G d d      Z{y)z.
Implementation details for :mod:`.mathtext`.
    )annotationsN)
NamedTuple)EmptyForwardLiteralNotAnyoneOf	OneOrMoreOptionalParseBaseExceptionParseExceptionParseExpressionParseFatalExceptionParserElementParseResultsQuotedStringRegex	StringEnd
ZeroOrMorepyparsing_commonGroup   )cbook)latex_to_bakomastix_glyph_fixesstix_virtual_fontstex2uni)FontPropertiesfindfontget_font)FT2FontFT2ImageKerning	LoadFlags)parse)__version__   )
nestedExpr)nested_expr)Iterable)Glyphzmatplotlib.mathtextc                    	 t        |       S # t        $ r Y nw xY w	 t        | j                  d         S # t        $ r}t        | d      |d}~ww xY w)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     O/var/www/html/bid-api/venv/lib/python3.12/site-packages/matplotlib/_mathtext.pyget_unicode_indexr6   5   sg    6{ v||D)** jMN	s    
 	5 	AAAc                  D    e Zd ZU dZded<   ded<   ded<   ded<   ded	<   y
)VectorParsea  
    The namedtuple type returned by ``MathTextParser("path").parse(...)``.

    Attributes
    ----------
    width, height, depth : float
        The global metrics.
    glyphs : list
        The glyphs including their positions.
    rect : list
        The list of rectangles.
    floatwidthheightdepthz.list[tuple[FT2Font, float, int, float, float]]glyphsz'list[tuple[float, float, float, float]]rectsN__name__
__module____qualname____doc____annotations__     r5   r8   r8   K   s$     LML::22rF   r8   c                  N    e Zd ZU dZded<   ded<   ded<   ded<   ded<   ded	<   y
)RasterParsea  
    The namedtuple type returned by ``MathTextParser("agg").parse(...)``.

    Attributes
    ----------
    ox, oy : float
        The offsets are always zero.
    width, height, depth : float
        The global metrics.
    image : FT2Image
        A raster image.
    r9   oxoyr:   r;   r<   r"   imageNr?   rE   rF   r5   rH   rH   a   s'     	IILMLOrF   rH   c                  (    e Zd ZdZddZddZddZy)	Outputz
    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                .    || _         g | _        g | _        y N)boxr=   r>   )selfrP   s     r5   __init__zOutput.__init__   s    ;=>@
rF   c                   t        t        j                  | j                  j                  | j                  j
                  | j                  j                  g      \  }}}| j                  D cg c];  \  }}}|j                  |j                  |j                  |||z
  |j                  z   f= }}}}| j                  D 	
cg c]  \  }}	}
}|||z
  |
|z
  ||	z
  f }}
}	}}t        |||z   |||      S c c}}}w c c}}
}	}w rO   )mapnpceilrP   r:   r;   r<   r=   fontfontsizenumoffsetr>   r8   )rQ   whdrI   rJ   infogsx1y1x2y2rss                r5   	to_vectorzOutput.to_vector   s    GGdhhnndhhootxx~~FH1a #'++/"-,"b$ yy$--2q2v7KL"- 	 / %)JJ0$.."b"b 1r627BG,$. 	 01a!eQB//	/0s   .A C5C<
c               d   t        g | j                  D cg c]  \  }}}||j                  j                  z   ! c}}}| j                  D cg c]	  \  }}}}| c}}}}d      dz
  }	t        g | j                  D cg c]  \  }}}||j                  j
                  z
  ! c}}}| j                  D cg c]	  \  }}}}| c}}}}d      dz
  }
t        g | j                  D cg c]  \  }}}||j                  j                  z   ! c}}}| j                  D cg c]	  \  }}}}| c}}}}d      dz   }t        g | j                  D cg c]  \  }}}||j                  j                  z
  ! c}}}| j                  D cg c]	  \  }}}}| c}}}}d      dz   }||	z
  }||
z
  | j                  j                  z
  }||
z
  | j                  j                  z
  }t        t        t        j                  |            t        t        j                  |t        |d      z                     }t!        | j                  |	 |
 f      }|j                  D ]Y  \  }}}|j"                  j%                  |t        |      t        ||j                  j&                  z
        |j(                  |       [ |j                  D ]  \  }}}}t        t        ||z
        dz
  d      }|dk(  r||z   dz  }t        ||dz   dz  z
        }nt        |      }|j+                  t        |      |t        t        j                  |            ||z           t-        dd|||z   ||      S c c}}}w c c}}}}w c c}}}w c c}}}}w c c}}}w c c}}}}w c c}}}w c c}}}}w )Nr   r   )antialiased   )minr=   metricsxminr>   ymaxmaxxmaxyminrP   r<   r;   r"   intrU   rV   shiprW   draw_glyph_to_bitmapicebergglyphdraw_rect_filledrH   )rQ   rg   rI   rJ   r^   r`   ra   rb   rc   rk   ro   rn   rl   r[   r\   r]   rK   shiftedr;   centerys                        r5   	to_rasterzOutput.to_raster   sg     ?MRb4<<,,,M ?/3zz:z^RRbz:?<=? @BCD ?MRb4<<,,,M ?/3zz:z^RRbz:?<=? @BCD ?MRb4<<,,,M ?/3zz:z^RRbz:?<=? @BCD ?MRb4<<,,,M ?/3zz:z^RRbz:?<=? @BCD4K4K$((..(4K$((//)RWWQZ#bgga#a)m.D*EF txx4%$0#NNLBDII**s2wB)=)=$= >

' + ) + &mmNBBR"W)1-F{r'Q&1*!112G""3r7As2772;/?VL , 1aAE1e44? N:M:M:M:s/   $M6M=$N?N3$N-N!$N#N*N)rP   Box)returnr8   )rg   boolr{   rH   )r@   rA   rB   rC   rR   re   ry   rE   rF   r5   rM   rM   x   s    A
0"5rF   rM   c                  l    e Zd ZU dZded<   ded<   ded<   ded<   ded<   ded<   ded	<   ded
<   ded<   y)FontMetricsaa  
    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).
    r9   advancer;   r:   rk   rn   ro   rl   rs   r|   slantedNr?   rE   rF   r5   r~   r~      s6    ( NML
K
K
K
KNMrF   r~   c                  T    e Zd ZU ded<   ded<   ded<   ded<   d	ed
<   ded<   ded<   y)FontInfor!   rW   r9   rX   strpostscript_namer~   rj   rp   rY   r+   rt   rZ   Nr@   rA   rB   rD   rE   rF   r5   r   r      s'    
MO	HLMrF   r   c                      e Zd ZdZddZ	 	 	 	 	 	 	 	 	 	 	 	 ddZddZ	 	 	 	 ddZ	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 ddZ		 	 	 	 	 	 	 	 	 	 ddZ
dd	Zdd
Z	 	 	 	 ddZy)Fontsz
    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                     || _         || _        y)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)rQ   r   r   s      r5   rR   zFonts.__init__   s     "3 0rF   c
                     y)z
        Get the kerning distance for font between *sym1* and *sym2*.

        See `~.Fonts.get_metrics` for a detailed description of the parameters.
                rE   )
rQ   font1
fontclass1sym1	fontsize1font2
fontclass2sym2	fontsize2dpis
             r5   get_kernzFonts.get_kern   s     rF   c                    t         rO   NotImplementedError)rQ   rW   s     r5   	_get_fontzFonts._get_font   s    !!rF   c                    t         rO   r   )rQ   rW   
font_classsymrX   r   s         r5   	_get_infozFonts._get_info      !!rF   c                D    | j                  |||||      }|j                  S )a#  
        Parameters
        ----------
        font : str
            One of the TeX font names: "tt", "it", "rm", "cal", "sf", "bf",
            "default", "regular", "bb", "frak", "scr".  "default" and "regular"
            are synonyms and use the non-math font.
        font_class : str
            One of the TeX font names (as for *font*), but **not** "bb",
            "frak", or "scr".  This is used to combine two font classes.  The
            only supported combination currently is ``get_metrics("frak", "bf",
            ...)``.
        sym : str
            A symbol in raw TeX form, e.g., "1", "x", or "\sigma".
        fontsize : float
            Font size in points.
        dpi : float
            Rendering dots-per-inch.

        Returns
        -------
        FontMetrics
        )r   rj   )rQ   rW   r   r   rX   r   r^   s          r5   get_metricszFonts.get_metrics  s$    2 ~~dJXsC||rF   c	                j    | j                  |||||      }	|j                  j                  |||	f       y)z
        At position (*ox*, *oy*), draw the glyph specified by the remaining
        parameters (see `get_metrics` for their detailed description).
        N)r   r=   append)
rQ   outputrI   rJ   rW   r   r   rX   r   r^   s
             r5   render_glyphzFonts.render_glyph!  s2     ~~dJXsCb"d^,rF   c                B    |j                   j                  ||||f       y)zL
        Draw a filled rectangle from (*x1*, *y1*) to (*x2*, *y2*).
        N)r>   r   rQ   r   r`   ra   rb   rc   s         r5   render_rect_filledzFonts.render_rect_filled*  s    
 	RR,-rF   c                    t               )zF
        Get the xheight for the given *font* and *fontsize*.
        r   rQ   rW   rX   r   s       r5   get_xheightzFonts.get_xheight1  s     "##rF   c                    t               )z
        Get the line thickness that matches the given font.  Used as a
        base unit for drawing lines such as in a fraction or radical.
        r   r   s       r5   get_underline_thicknesszFonts.get_underline_thickness7  s    
 "##rF   c                    ||fgS )a  
        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.
        rE   rQ   fontnamer   s      r5   !get_sized_alternatives_for_symbolz'Fonts.get_sized_alternatives_for_symbol>  s     3  rF   Nr   r   r   r$   r   r   r   r   r   r   r   r9   r   r   r   r   r   r   r   r9   r   r9   r{   r9   )rW   r   r{   r!   )rW   r   r   r   r   r   rX   r9   r   r9   r{   r   )rW   r   r   r   r   r   rX   r9   r   r9   r{   r~   )r   rM   rI   r9   rJ   r9   rW   r   r   r   r   r   rX   r9   r   r9   r{   Noner   rM   r`   r9   ra   r9   rb   r9   rc   r9   r{   r   rW   r   rX   r9   r   r9   r{   r9   r   r   r   r   r{   zlist[tuple[str, str]])r@   rA   rB   rC   rR   r   r   r   r   r   r   r   r   r   rE   rF   r5   r   r      s    1),47DI %"""!)"#.8-!$-+.-:?-FK-PT-.$.*/.5:.@E.JN.$$!/2!7L!rF   r   c                       e Zd ZdZd
 fdZddZ	 	 	 	 ddZ	 	 	 	 ddZ	 	 	 	 ddZddZ	ddZ
	 	 	 	 	 	 	 	 	 	 	 	 d fd	Z xZS )TruetypeFontsza
    A generic base class for all font setups that use Truetype fonts
    (through FT2Font).
    c                   t         |   ||       t        j                  | j                        | _        i | _        i | _        t        | j                        }t        |      }|| j
                  d<   || j
                  d<   y )Ndefaultregular)
superrR   	functoolscacher   _fontsfontmapr   r   r    )rQ   r   r   filenamedefault_font	__class__s        r5   rR   zTruetypeFonts.__init__O  sl    *,<="8-/D223)!-I!-IrF   c                   || j                   v r| j                   |   }nt        j                  t        |      }| j                  j                  |      }|yt        j                  j                  |      rZt        |      }|| j                  |<   || j                  |j                  <   || j                  |j                  j                         <   t        j                  t        |      S rO   )r   Tcastr   r   getospathexistsr    r   lowerr!   )rQ   rW   basenamecached_fonts       r5   r   zTruetypeFonts._get_font[  s    4<<||D)H vvc4(Hkkooh/277>>(#;"8,K$/DKK!7BDKK334?JDKK3399;<vvg{++rF   c                ^    |j                   dk(  r|j                  dz  dz  |dz  |z  dz  z   S y)NCmex10@   rh   r'   H   r   )r   r;   )rQ   rW   rt   rX   r   s        r5   _get_offsetzTruetypeFonts._get_offsetj  s:    8+LL2%)hqj3.>r.ABBrF   c                    t         rO   r   )rQ   r   r   r   s       r5   
_get_glyphzTruetypeFonts._get_glyphp  r   rF   c                   | j                  |||      \  }}}|j                  ||       |j                  || j                        }	d |	j                  D        \  }
}}}| j                  ||	||      }t        |	j                  dz  |	j                  dz  |	j                  dz  |
|||z   ||z   |	j                  dz  |z   |	      }t        |||j                  |||	|      S )N)flagsc              3  &   K   | ]	  }|d z    yw)r   NrE   ).0vals     r5   	<genexpr>z*TruetypeFonts._get_info.<locals>.<genexpr>{  s     !Ajs#(j      r   )	r   r;   r:   rk   rn   ro   rl   rs   r   )rW   rX   r   rj   rY   rt   rZ   )r   set_size	load_charr   bboxr   r~   linearHoriAdvancer;   r:   horiBearingYr   r   )rQ   r   r   r   rX   r   rW   rY   r   rt   rk   ro   rn   rl   rZ   rj   s                   r5   r   zTruetypeFonts._get_infou  s    !__Xz3Gc7h$s$*?*?@!Aejj!AdD$!!$x=++e3<<"$++"&&+f4
  00
 	
rF   c                    | j                  |      }|j                  ||       |j                  d      }|2| j                  |t        j
                  d   d||      }|j                  S |d   dz  |dz  z  |dz  z  }|S )Npcltmathtext.defaultxxHeightg      P@g      (@g      Y@)r   r   get_sfnt_tabler   mplrcParamsrs   )rQ   r   rX   r   rW   r   rj   r   s           r5   r   zTruetypeFonts.get_xheight  s    ~~h'h$""6*<&&#,,'9:C3PG??"	?T)ho>#+NrF   c                    d|z  |z  dz  S )Ng      ?g      R@rE   r   s       r5   r   z%TruetypeFonts.get_underline_thickness  s     (3.$66rF   c
                "   ||k(  rs||k(  rn| j                  |||||	      }
| j                  |||||	      }|
j                  }|j                  |
j                  |j                  t        j
                        dz  S t        |   |||||||||		      S )Nr   )r   rW   get_kerningrY   r#   DEFAULTr   r   )rQ   r   r   r   r   r   r   r   r   r   info1info2rW   r   s                r5   r   zTruetypeFonts.get_kern  s     E>i94NN5*dIsKENN5*dIsKE::D##EIIuyy'//JROOwz4 %z4CI 	IrF   r   )rW   z	str | intr{   r!   )
rW   r!   rt   r+   rX   r9   r   r9   r{   r9   r   r   r   r   r   r   r{   ztuple[FT2Font, int, bool])r   r   r   r   r   r   rX   r9   r   r9   r{   r   )r   r   rX   r9   r   r9   r{   r9   r   r   )r@   rA   rB   rC   rR   r   r   r   r   r   r   r   __classcell__r   s   @r5   r   r   I  s    

.,#("" 9"


!)
>
7	I	I),	I47	IDI	I	I %	I 	IrF   r   )	metaclassc                  h    e Zd ZdZdddddddd	Zd6 fd
Z edj                               Z	 	 	 	 d7dZ	i dg ddg ddg ddg ddg ddg ddg ddg ddg ddg d d!g d"d#g d$d%g d&d'g d(d)g d*d+g d,d-g d.d/d0gd1d2gd3Z
d4D ]  \  ZZe
e   e
e<    	 	 	 	 d8d5Z xZS )9BakomaFontsz
    Use the Bakoma TrueType fonts for rendering.

    Symbols are strewn about a number of font files, each of which has
    its own proprietary 8-bit encoding.
    cmsy10cmr10cmtt10cmmi10cmb10cmss10cmex10)calrmttitbfsfexc                    t        ||      | _        t        |   ||       | j                  j                         D ].  \  }}t        |      }|| j                  |<   || j                  |<   0 y rO   )	StixFonts_stix_fallbackr   rR   _fontmapitemsr   r   )rQ   r   r   keyr   fullpathr   s         r5   rR   zBakomaFonts.__init__  se    '(9;KL*,<=++-HC}H (DLL (DLL .rF   
\int \ointc                j   d }|| j                   v r;|t        v r3t        |   \  }}|dk(  xs || j                  v }| j                  |      }n1t	        |      dk(  r#|dk(  }| j                  |      }|t        |      }||j                        dk7  r||fS | j                  j                  |||      S )Nr   r   r  r   )	r   r   _slanted_symbolsr   lenr.   get_char_indexr  r   )rQ   r   r   r   rW   r   rY   r   s           r5   r   zBakomaFonts._get_glyph  s    t||#(>+C0MHc8+Lt7L7L0LG>>(+DX]4'G>>(+D#h 3 3C 8A =g%%&&11(JLLrF   ())r   r  )r     ¡)r     ³)r     µ)r     Ã)))r   r  )r     ¢)r     ´)r     ¶)r  !{))r   r  )r     ©)r  n)r     ½)r  r  }))r   r  )r     ª)r  o)r     ¾)r  r  [))r   r#  )r     £)r  r\   )r  "]))r   r&  )r     ¤)r  i)r  #z\lfloor))r     ¥)r  j)r     ¹)r  $z\rfloor))r     ¦)r  k)r     º)r  %z\lceil))r     §)r  l)r     »)r  &z\rceil))r     ¨)r  m)r     ¼)r  'z\langle))r     ­r  D)r     ¿)r  *z\rangle))r     ®r  E)r     À)r  +	\__sqrt__))r  p)r  q)r  r)r  sz
\backslash))r     ²)r  /)r     Â)r  -rJ  ))r   rJ  )r     ±)r  .)r     Ë)r  ,z\widehat))r   ^)r  b)r  c)r  r]   z
\widetilde))r   ~)r  e)r  f)r  g)r   r\   r;  )r   r(  r@  )<>)
)z
\leftparenr  )z\rightparentr  )z
\leftbracer  )z\rightbracer  )z\leftbracketr#  )z\rightbracketr&  )\{r  )\}r  )\[r#  )\]r&  c                @    | j                   j                  |||fg      S rO   )_size_alternativesr   r   s      r5   r   z-BakomaFonts.get_sized_alternatives_for_symbol  s"    &&**3(C0ABBrF   r   r   r   )r@   rA   rB   rC   r  rR   setsplitr  r   r_  aliastargetr   r   r   s   @r5   r   r     s    H) =..01MM 9M('
 8'
 	 8'

 	 8'
 	 8'
 	 ('
 	 ('
 	 8'
" 	 8#'
& 	 8''
* 	 8+'
. 	 8/'
2 	 83'
6 	 87'
: 	 8;'
> 	 8?'
B 	 (C'
F 	 (G'
J %k2$k2M'
R	(v %7v$>5!	(C/2C7LCrF   r   c                       e Zd ZdZdddZd
 fdZ edj                               Z	 	 	 	 ddZ		 	 	 	 ddZ
	 	 	 	 dd	Z xZS )UnicodeFontsa`  
    An abstract base class for handling Unicode fonts.

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

    This class will "fallback" on the Bakoma fonts when a required
    symbol cannot be found in the font.
          )   i"  c                P   t         j                  d   }t        t        t        dj                  |      }|r	 |||      nd | _        t        | !  ||       dj                         D ]2  }t         j                  d|z      }t        |      }|| j                  |<   4 t        d      }t        |      }|| j                  d<   t        | j                  t              rKddd	d
ddd}|j                         D ].  \  }	}
t        |
      }|| j                  |	<   || j                  |
<   0 y y )Nzmathtext.fallback)stixstixsanscmzcal rm tt it bf sf bfitz	mathtext.r   r  STIXGeneralSTIXSizeOneSymSTIXSizeTwoSymSTIXSizeThreeSymSTIXSizeFourSymSTIXSizeFiveSym)r   r   rh   r'         )r   r   r  StixSansFontsr   r   _fallback_fontr   rR   ra  r   r   r   
isinstancer	  )rQ   r   r   fallback_rcfont_clstexfontproprW   stixsizedaltfontssizenamer  r   s               r5   rR   zUnicodeFonts.__init__0  s1   ll#67%0
 #k
	 	 #+  ((9;KL04 	 	*,<=0668G<<g 56DD>D$(DLL! 9 h'~!T d))95!$$&%%!' 0557
d#D>%-T"%-T" 8 6rF   r  c                
    ||fS rO   rE   )rQ   r   r   uniindexs       r5   _map_virtual_fontzUnicodeFonts._map_virtual_fontU  s    !!rF   c                j   	 t        |      }d}| j                  |||      \  }}|}|r|dk(  rQ|dk  rLt        |      }t        j                  |      d   dk7  s$t        j                  |      j                  d	      rd
}|dk(  xs || j                  v }d}| j                  |      }	|	b|| j                  v r<|	j                  dk(  r-t        t!        j"                  d            }	| j                  |   }|	j%                  |      }
|
dk7  rd}|s| j&                  r|dv rt)        | j&                  t*              rd
}| j&                  j-                  |||      }|d   j                  }|t/        t0        j2                  j5                               v rd}t        j7                  d||       |S |dv r#t)        | t*              r| j-                  d
||      S t        j	                  d|||       | j                  d
      }	d}d}	|fS # t        $ r' t        d      }d}t        j	                  d|       Y "w xY w)NT?Fz!No TeX to Unicode mapping for %a.r  r   r   LzGREEK CAPITALr   r   zfonts/ttf/cmsy10.ttf)r  r   zComputer ModernzSubstituting symbol %s from %szNFont %r does not have a glyph for %a [U+%x], substituting with a dummy symbol.   )r6   r2   r.   _logwarningr  chrunicodedatacategoryr~  
startswithr  r   _cmr10_substitutionsfamily_namer    r   _get_data_pathr  rv  rw  r  r   listr   r  valuesr^   )rQ   r   r   r   r  found_symbolnew_fontnamecharr   rW   
glyphindexrW  familys                r5   r   zUnicodeFonts._get_glyphY  sG   	C(-HL "33j(,(   4Hw$68}((.q1S8&++D1<<_M#'L#t+Lt7L7L0LG L>>,/D 9 99 ,,7#,,-CDFD#88BH!00:
?#'L"" 11&t':':IF#H''228ZM1))T+"6"6"="="?@@.F		:CH  11&tY7??4SAA A)3: ~~d+Xw&&q  	C3xH LLL<cB	Cs   H ,H21H2c                \    | j                   r| j                   j                  ||      S ||fgS rO   )rv  r   r   s      r5   r   z.UnicodeFonts.get_sized_alternatives_for_symbol  s6    &&HH# 3  rF   r   r   r   r   r   r  rp   r{   ztuple[str, int]r   r   )r@   rA   rB   rC   r  rR   r`  ra  r  r  r   r   r   r   s   @r5   re  re    st    	 
!.F =..01"$'",;"='=' 9='~!/2!7L!rF   re  c                  @     e Zd ZU i Zded<   ddZ	 	 	 	 d fdZ xZS )DejaVuFontsdict[str | int, str]r  c                   t        | t              rt        ||      | _        nt	        ||      | _        t        ||      | _        t        j                  | ||       | j                  j                  dddddd       | j                  j                         D ].  \  }}t        |      }|| j                  |<   || j                  |<   0 y )Nrn  ro  rp  rq  rr  )r   rh   r'   rs  rt  )rw  DejaVuSerifFontsr  rv  ru  r   bakomar   rR   r  updater	  r   r   rQ   r   r   r
  r~  r  s         r5   rR   zDejaVuFonts.__init__  s    d,-"+,=?O"PD"/0ACS"TD!"35EFt%68HI!  
 	 ,,.IC~H (DLL!)DLL /rF   c                    |dk(  r| j                   j                  |||      S t        |      }| j                  d      }|'|j	                  |      }|dk7  rt
        |   d||      S t
        |   |||      S )N\primer  r   )r  r   r6   r   r  r   )rQ   r   r   r   r  rW   r  r   s          r5   r   zDejaVuFonts._get_glyph  s     );;))(JDD )-H>>$'D!00:
? 7-dJDD7%h
C@@rF   r   r   )r@   rA   rB   r  rD   rR   r   r   r   s   @r5   r  r    s1    %'H"'**AA 9A ArF   r  c            	      &    e Zd ZdZddddddddd	Zy
)r  zv
    A font handling class for the DejaVu Serif fonts

    If a glyph is not found it will fallback to Stix Serif
    DejaVu SerifzDejaVu Serif:italiczDejaVu Serif:weight=boldzDejaVu Serif:italic:boldDejaVu SansDejaVu Sans MonozDejaVu Serif Displayr   r  r  bfitr  r   r  r   Nr@   rA   rB   rC   r  rE   rF   r5   r  r    s(     #(* $	HrF   r  c            	      &    e Zd ZdZdddddddddZy	)
DejaVuSansFontszt
    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  Nr  rE   rF   r5   r  r    s(     "') #	HrF   r  c                      e Zd ZU dZddddddddd	d
ddddZded<   dZdZddZ	 	 	 	 ddZ	e
j                  	 	 	 	 	 	 dd       Zy)r  aa  
    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.
    rm  zSTIXGeneral:italiczSTIXGeneral:weight=boldzSTIXGeneral:italic:boldSTIXNonUnicodezSTIXNonUnicode:italiczSTIXNonUnicode:weight=boldrn  ro  rp  rq  rr  )r   r  r  r  nonunirmnonuniitnonunibfr   r   rh   r'   rs  rt  r  r  NFc                    t         j                  | ||       | j                  j                         D ].  \  }}t	        |      }|| j
                  |<   || j
                  |<   0 y rO   )r   rR   r  r	  r   r   r  s         r5   rR   zStixFonts.__init__  sV    t%68HI,,.IC~H (DLL!)DLL /rF   c                Z   t        j                  |      }| j                  r||dvrt         d   }d}nd}t        |t              r	 ||   }nt        |t              r|}nd }|}d}t        |      }||k  r,||z   dz  }	||	   }
||
d   k  r|	}n||
d   k  rn|	dz   }||k  r,
d   |cxk  r|
d   k  rn n||
d   z
  |
d	   z   }|
d   }n|sd}t        j                  d
   }|dv rt        j                  ||      }|dv rd|cxk  rdk  rn ||fS d|z   }||fS # t
        $ r |d   }Y w xY w)N)r   r   r  TFr   r   rh   r   r'   r   )r   r  )r  r   r  r  i   i  nonuni)r   r   _sansrw  dictr1   r  r  r   r   r   )rQ   r   r   r  font_mappingdoing_sans_conversionmappinglohimidranges              r5   r  zStixFonts._map_virtual_font  s    *--h7JJ</$::-d3L$(!$)!lD)-&z2 d+"GGBWBr'"uqjeAh&Bq)qB r' Qx8/uQx/#eAh.q9 8*<<(:; |#'++Hh?H 11f6RF6R !!  (*H!!K  -&t,-s   D D*)D*c                &   ddddddd}|j                  ||      }	 t        |      }t        d      D cg c]2  }| j	                  |      j                  |      d	k7  r|t        |      f4 }}|d
k(  r|d d }|S # t        $ r ||fgcY S w xY wc c}w )Nr  r  r#  r&  u   ⟨u   ⟩)rZ  r[  r\  r]  rX  rY     r   rD  )r   r6   r2   r  r   r  r  )rQ   r   r   fixesr  r(  alternativess          r5   r   z+StixFonts.get_sized_alternatives_for_symbolH  s     s3s67

 iiS!	%(-H 5:!H LHq>>!,;;HEJ CM*H L ,',L  	%sO$$	%Ls   A: 7B:B
Br   r  )r   r   r   r   r{   z-list[tuple[str, str]] | list[tuple[int, str]])r@   rA   rB   rC   r  rD   rv  r  rR   r  r   r   r   rE   rF   r5   r  r    s    
 "')$+0&H"  NE*4"$'4",;4"l __  G rF   r  c                      e Zd ZdZdZy)ru  zd
    A font handling class for the STIX fonts (that uses sans-serif
    characters by default).
    TN)r@   rA   rB   rC   r  rE   rF   r5   ru  ru  `  s     ErF   ru  ffffff?r  c                      e Zd ZU dZdZded<   dZded<   dZded<   d	Zded
<   dZ	ded<   dZ
ded<   dZded<   dZded<   y)FontConstantsBasez
    A set of constants that controls how certain things, such as sub-
    and superscripts are laid out.  These are all metrics that can't
    be reliably retrieved from the font metrics in the font itself.
    皙?zT.ClassVar[float]script_spaceg?subdropr  sup1333333?sub1      ?sub2g?delta皙?delta_slanted皙?delta_integralN)r@   rA   rB   rC   r  rD   r  r  r  r  r  r  r  rE   rF   r5   r  r    so     '+L#* "%G$ "D
! "D
! "D
!  %E$
 (+M$* ),N%+rF   r  c                  ,    e Zd ZdZdZdZdZdZdZdZ	dZ
y)ComputerModernFontConstantsg333333?r  g?r  N)r@   rA   rB   r  r  r  r  r  r  r  r  rE   rF   r5   r  r    s*    LGDDDEMNrF   r  c                  $    e Zd ZdZdZdZdZdZdZy)STIXFontConstantsr  皙?333333?r  r  N)	r@   rA   rB   r  r  r  r  r  r  rE   rF   r5   r  r    s     LDDEMNrF   r  c                      e Zd ZdZdZdZdZy)STIXSansFontConstantsr  r  r  r  N)r@   rA   rB   r  r  r  r  rE   rF   r5   r  r    s    LDMNrF   r  c                      e Zd Zy)DejaVuSerifFontConstantsNr@   rA   rB   rE   rF   r5   r  r        rF   r  c                      e Zd Zy)DejaVuSansFontConstantsNr  rE   rF   r5   r  r    r  rF   r  r  r  r  r   r   r   r   r   r   r   rm  r  rr  rq  rp  ro  rn  )zBitstream Vera SanszBitstream VeraParserStatec                    t         j                  | j                  j                  | j                        j
                  t              }|t        u r t        | j                  t              rt        S |S rO   )_font_constant_mappingr   fontsetr   rW   r  r  r  rw  ru  r  )state	constantss     r5   _get_font_constant_setr    sW    &**

+779JLI 	&&u}}m4$$rF   c                  8    e Zd ZdZddZd	dZd
dZddZddZy)NodezA node in the TeX box model.c                    d| _         y Nr   r}  rQ   s    r5   rR   zNode.__init__  s	    	rF   c                ,    t        |       j                  S rO   )typer@   r  s    r5   __repr__zNode.__repr__  s    Dz"""rF   c                     yNr   rE   )rQ   nexts     r5   r   zNode.get_kerning  s    rF   c                .    | xj                   dz  c_         y)z
        Shrinks one level smaller.  There are only three levels of
        sizes, after which things will no longer get smaller.
        r   Nr  r  s    r5   shrinkzNode.shrink  s    
 			Q	rF   c                     y)zRender this node.NrE   rQ   r   r   rx   s       r5   renderzNode.render  s    rF   Nr{   r   r{   r   r  zNode | Noner{   r9   r   rM   r   r9   rx   r9   r{   r   )	r@   rA   rB   rC   rR   r  r   r  r  rE   rF   r5   r  r    s    &# rF   r  c                  L     e Zd ZdZd fdZd fdZ	 	 	 	 	 	 	 	 	 	 ddZ xZS )rz   z A node with a physical location.c                L    t         |           || _        || _        || _        y rO   )r   rR   r:   r;   r<   )rQ   r:   r;   r<   r   s       r5   rR   zBox.__init__  s#    

rF   c                    t         |           | j                  t        k  rL| xj                  t
        z  c_        | xj                  t
        z  c_        | xj                  t
        z  c_        y y rO   )r   r  r}  NUM_SIZE_LEVELSr:   SHRINK_FACTORr;   r<   rQ   r   s    r5   r  z
Box.shrink  sH    99&JJ=(JKK=(KJJ=(J 'rF   c                     y rO   rE   r   s         r5   r  z
Box.render  s    rF   )r:   r9   r;   r9   r<   r9   r{   r   r  r   )r@   rA   rB   rC   rR   r  r  r   r   s   @r5   rz   rz   	  s=    *)#).49>BrF   rz   c                  $     e Zd ZdZd fdZ xZS )Vboxz$A box with only height (zero width).c                (    t         |   d||       y r  r   rR   )rQ   r;   r<   r   s      r5   rR   zVbox.__init__!  s    VU+rF   )r;   r9   r<   r9   r@   rA   rB   rC   rR   r   r   s   @r5   r  r    s    ., ,rF   r  c                  $     e Zd ZdZd fdZ xZS )Hboxz.A box with only width (zero height and depth).c                (    t         |   |dd       y r  r  rQ   r:   r   s     r5   rR   zHbox.__init__(  s    B'rF   r:   r9   r  r   s   @r5   r	  r	  %  s    8( (rF   r	  c                  X     e Zd ZdZd	 fdZd
dZddZddZddZddZ	d fdZ
 xZS )Chara  
    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         |           || _        |j                  | _        |j                  | _        |j
                  | _        |j                  | _        |j                  | _        | j                          y rO   )	r   rR   rS  r  rW   r   rX   r   _update_metrics)rQ   rS  r  r   s      r5   rR   zChar.__init__9  s\    }}JJ	**99 	rF   c                     d| j                   z  S )Nz`%s`rS  r  s    r5   r  zChar.__repr__E  s    rF   c                x   | j                   j                  | j                  | j                  | j                  | j
                  | j                        x}| _        | j                  dk(  r|j                  | _	        n|j                  | _	        |j                  | _        |j                  |j                  z
   | _        y )N )r  r   rW   r   rS  rX   r   _metricsr   r:   rs   r;   r<   rQ   rj   s     r5   r  zChar._update_metricsH  s    "&,,":":IIttxx#I 	I$-66S= DJ DJoo78
rF   c                .    | j                   j                  S rO   )r  r   r  s    r5   
is_slantedzChar.is_slantedR  s    }}$$$rF   c                p   | j                   j                  | j                  z
  }d}t        |t              r}| j
                  j                  | j                  | j                  | j                  | j                  |j                  |j                  |j                  |j                  | j                  	      }||z   S )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   )r  r   r:   rw  r  r  r   rW   r   rS  rX   r   )rQ   r  r   kerns       r5   r   zChar.get_kerningU  s     --''$**4dD!<<((		4??DFFDMM		4??DFFDMMD ~rF   c           
         | j                   j                  |||| j                  | j                  | j                  | j
                  | j                         y rO   )r  r   rW   r   rS  rX   r   r  s       r5   r  zChar.rendere  s;    !!AqIIttxx	IrF   c                   t         |           | j                  t        k  re| xj                  t
        z  c_        | xj                  t
        z  c_        | xj                  t
        z  c_        | xj                  t
        z  c_        y y rO   )	r   r  r}  r  rX   r   r:   r;   r<   r  s    r5   r  zChar.shrinkj  sV    99&MM]*MJJ]*JKK]*KJJ]*J	 'rF   )rS  r   r  r  r  r  )r{   r|   r  r  )r@   rA   rB   rC   rR   r  r  r  r   r  r  r   r   s   @r5   r  r  ,  s1    

9% I
+ +rF   r  c                  4     e Zd ZdZddZd fdZddZ xZS )Accentz
    The font metrics need to be dealt with differently for accents,
    since they are already offset correctly from the baseline in
    TrueType fonts.
    c                :   | j                   j                  | j                  | j                  | j                  | j
                  | j                        x}| _        |j                  |j                  z
  | _
        |j                  |j                  z
  | _        d| _        y r  )r  r   rW   r   rS  rX   r   r  rn   rk   r:   rl   ro   r;   r<   r  s     r5   r  zAccent._update_metricsy  so    "&,,":":IIttxx#I 	I$-\\GLL0
llW\\1
rF   c                B    t         |           | j                          y rO   )r   r  r  r  s    r5   r  zAccent.shrink  s    rF   c           
        | j                   j                  ||| j                  j                  z
  || j                  j                  z   | j
                  | j                  | j                  | j                  | j                         y rO   )
r  r   r  rk   ro   rW   r   rS  rX   r   r  s       r5   r  zAccent.render  sY    !!A***A0B0B,BIIttxx	IrF   r  r  )r@   rA   rB   rC   r  r  r  r   r   s   @r5   r  r  s  s    
IrF   r  c                  L     e Zd ZdZd fdZd fdZ	 	 	 	 ddZd	 fdZ xZS )
Listz0A list of nodes (either horizontal or vertical).c                r    t         |   ddd       d| _        g || _        d| _        d| _        d| _        y )Nr   r   )r   rR   shift_amountchildrenglue_set	glue_sign
glue_orderrQ   elementsr   s     r5   rR   zList.__init__  s<    R$#(rF   c                   dj                  t        | 	         | j                  | j                  | j
                  | j                  dj                  | j                  D cg c]  }t        |       c}            S c c}w )Nz/{}<w={:.02f} h={:.02f} d={:.02f} s={:.02f}>[{}]z, )
formatr   r  r:   r;   r<   r%  joinr&  repr)rQ   r   r   s     r5   r  zList.__repr__  se    @GGGJJJJ))II61tAw67	9 	9 7s   A<c                R   t        fdt        t                    d d d   D        d      x| _        }|| _        |   dk7  r||   z  | _        nd| _        d| _        |dk(  rBt        | j                        r,t        j                  d|t        |       j                  |        y y y )Nc              3  4   K   | ]  }|   d k7  s|  yw)r   NrE   )r   r(  totalss     r5   r   z!List._set_glue.<locals>.<genexpr>  s     C01F1INQ0s   r  r   r   z	%s %s: %r)r  r  r  r)  r(  r'  
glue_ratior&  r  r  r  r@   )rQ   r   signr2  
error_typer!  s      `  r5   	_set_gluezList._set_glue  s    "Cc&k*4R40CQH 	H! !9?q	MDMDN DO64==!['d)<)<dD " rF   c                    | j                   D ]  }|j                           t        |           | j                  t        k  r3| xj
                  t        z  c_        | xj                  t        z  c_        y y rO   )r&  r  r   r}  r  r%  r   r'  )rQ   childr   s     r5   r  zList.shrink  sT    ]]ELLN #99&.MM.M 'rF   )r+  T.Sequence[Node]r  )
r   r9   r4  rp   r2  zlist[float]r5  r   r{   r   r  )	r@   rA   rB   rC   rR   r  r6  r  r   r   s   @r5   r#  r#    s2    :9D!D&*D / /rF   r#  c                  N     e Zd ZdZ	 	 	 d	 	 	 d fdZddZ	 	 d	 	 	 d	dZ xZS )
HlistzA horizontal list of boxes.c                n    t         |   |       |r| j                          | j                  ||       y )N)r[   r7  )r   rR   r  hpack)rQ   r+  r[   r7  do_kernr   s        r5   rR   zHlist.__init__  s.     	"IIK

Q!
rF   c                F   g }t        | j                        }|rt        |      D ]r  }| j                  |   }||dz
  k  r| j                  |dz      }nd}|j                  |       |j	                  |      }|dk7  sWt        |      }|j                  |       t || _        yy)z
        Insert `Kern` nodes between `Char` nodes to set kerning.

        The `Char` nodes themselves determine the amount of kerning they need
        (in `~Char.get_kerning`), and this function just creates the correct
        linked list.
        r   Nr   )r  r&  r  r   r   Kern)rQ   new_childrennum_childrenr(  elemr  kerning_distancer  s           r5   r  z
Hlist.kern  s     4==)<(}}Q'|a''==Q/DD##D)#'#3#3D#9 #r) 01D ''- ) )DM rF   c                   d}d}d}dgdz  }dgdz  }| j                   D ]~  }t        |t              r<||j                  z  }t	        ||j
                        }t	        ||j                        }Pt        |t              r||j                  z  }t        j                  |j
                        rt        j                  |j                        rt        |dd      }	t	        ||j
                  |	z
        }t	        ||j                  |	z         }t        |t              r_|j                  }
||
j                  z  }||
j                  xx   |
j                  z  cc<   ||
j                  xx   |
j                   z  cc<   ^t        |t"              sp||j                  z  } || _        || _        |dk(  r||z  }|| _        ||z
  }|dk(  rd| _        d| _        d| _        y|dkD  r| j+                  |d|d       y| j+                  |d	|d
       y)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   rs  r%  
additionalr   Nr   Overfulr  Underful)r&  rw  r  r:   rm   r;   r<   rz   rU   isinfgetattrGlue	glue_specstretch_orderstretchshrink_orderr  r@  r(  r)  r3  r6  )rQ   r[   r7  r\   r]   r   total_stretchtotal_shrinkrE  rH  rL  s              r5   r=  zHlist.hpack  s   0 qtaxA!T"QWW188$177OAs#QWWxx)"((1772C>26AAqxx!|,AAqww{+AAt$KK	Y__$i556):K:KK6Y334	8H8HH4At$QWW# $ 
FA
E7DNDO DOr6NN1a	:NN1b,
;rF   )r   rF  T)r+  r9  r[   r9   r7  "T.Literal['additional', 'exactly']r>  r|   r  r   rF  )r[   r9   r7  rR  r{   r   )r@   rA   rB   rC   rR   r  r=  r   r   s   @r5   r;  r;    sF    %>A9E!%6)2  #6B?<3?<GK?<rF   r;  c                  Z     e Zd ZdZ	 	 d	 d fdZddej                  f	 	 	 	 	 ddZ xZS )	VlistzA vertical list of boxes.r   rF  c                J    t         |   |       | j                  ||       y )N)r\   r7  )r   rR   vpack)rQ   r+  r\   r7  r   s       r5   rR   zVlist.__init__  s     "

Q!
rF   c                   d}d}d}dgdz  }dgdz  }| j                   D ].  }	t        |	t              re|||	j                  z   z  }|	j                  }t        j                  |	j                        rRt        |	dd      }
t        ||	j                  |
z         }yt        |	t              re||z  }d}|	j                  }||j                  z  }||j                  xx   |j                  z  cc<   ||j                  xx   |j                  z  cc<   t        |	t               r|||	j                  z   z  }d}t        |	t"              s&t%        d       || _        ||kD  r|||z
  z  }|| _        n|| _        |dk(  r||z  }|| _        ||z
  }|dk(  rd| _        d| _        d| _        y|dkD  r| j-                  |d|d	       y| j-                  |d
|d       y)ak  
        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   rs  r%  z1Internal mathtext error: Char node found in VlistrF  r   Nr   rG  r  rH  )r&  rw  rz   r;   r<   rU   rI  r:   rJ  rm   rK  rL  rM  rN  rO  r  r@  r  RuntimeErrorr(  r)  r3  r6  )rQ   r\   r7  r3  r[   r]   r   rP  rQ  rE  rH  rL  s               r5   rW  zVlist.vpack$  s   0 qtaxA!S!Q\!GGxx(>26AAqww{+AAt$QKK	Y__$i556):K:KK6Y334	8H8HH4At$Q[ At$"GI I% * 
q5QJADJDJFAE6DNDO DOr6NN1a	:NN1b,
;rF   rS  )r+  r9  r\   r9   r7  rR  )r\   r9   r7  rR  r3  r9   r{   r   )	r@   rA   rB   rC   rR   rU   infrW  r   r   s   @r5   rU  rU    sI    #>A9E6
  #6BG<3G<G<$(G<rF   rU  c                  @     e Zd ZdZd fdZ	 	 	 	 	 	 	 	 	 	 ddZ xZS )Rulea  
    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                J    t         |   |||       |j                  | _        y rO   )r   rR   r  )rQ   r:   r;   r<   r  r   s        r5   rR   zRule.__init__y  s    .}}rF   c                N    | j                   j                  |||||z   ||z          y rO   )r  r   )rQ   r   r   rx   r[   r\   s         r5   r  zRule.render}  s$    ''1a!eQUCrF   )r:   r9   r;   r9   r<   r9   r  r  )r   rM   r   r9   rx   r9   r[   r9   r\   r9   r{   r   )r@   rA   rB   rC   rR   r  r   r   s   @r5   r\  r\  n  s@    %DD!D&+D05D:>DrF   r\  c                  &     e Zd ZdZdd fdZ xZS )Hrulez.Convenience class to create a horizontal rule.c                x    ||j                         }|dz  x}}t        | 	  t        j                  |||       y )Nr  get_current_underline_thicknessr   rR   rU   rZ  )rQ   r  	thicknessr;   r<   r   s        r5   rR   zHrule.__init__  s<    ==?I"S(6rF   rO   )r  r  rd  float | Noner  r   s   @r5   r`  r`    s    87 7rF   r`  c                  $     e Zd ZdZd fdZ xZS )Vrulez,Convenience class to create a vertical rule.c                    |j                         }t        | 	  |t        j                  t        j                  |       y rO   rb  )rQ   r  rd  r   s      r5   rR   zVrule.__init__  s,    99;	BFFBFFE:rF   )r  r  r  r   s   @r5   rg  rg    s    6; ;rF   rg  c                  @    e Zd ZU ded<   ded<   ded<   ded<   ded<   y)		_GlueSpecr9   r:   rN  rp   rM  r  rO  Nr   rE   rF   r5   rj  rj    s    LNMrF   rj  r         ?rh   g      )filfillfilllneg_filneg_fill	neg_filllemptyssc                  4     e Zd ZdZ	 	 d fdZd fdZ xZS )rK  a  
    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         |           t        |t              rt        j
                  |   }|| _        y t        |t              r
|}|| _        y t        d      )Nz.glue_type must be a glue spec name or instance)r   rR   rw  r   rj  _namedr2   rL  )rQ   	glue_typerL  r   s      r5   rR   zGlue.__init__  s[     	i%!((3I
 #	 	9-!I # MNNrF   c                    t         |           | j                  t        k  r5| j                  }|j                  |j                  t        z        | _        y y )Nr:   )r   r  r}  r  rL  _replacer:   r   )rQ   rW  r   s     r5   r  zGlue.shrink  sB    99&AZZagg.EZFDN 'rF   )rw  z`_GlueSpec | T.Literal['fil', 'fill', 'filll', 'neg_fil', 'neg_fill', 'neg_filll', 'empty', 'ss']r  )r@   rA   rB   rC   rR   r  r   r   s   @r5   rK  rK    s$    #A#G GrF   rK  c                  $     e Zd ZdZd fdZ xZS )	HCenteredzl
    A convenience class to create an `Hlist` whose contents are
    centered within its enclosing box.
    c                V    t         |   t        d      g|t        d      d       y )Nrs  Fr>  r   rR   rK  r*  s     r5   rR   zHCentered.__init__  s*    $t*<x<d<eLrF   r+  z
list[Node]r  r   s   @r5   r|  r|    s    
M MrF   r|  c                  $     e Zd ZdZd fdZ xZS )	VCenteredzk
    A convenience class to create a `Vlist` whose contents are
    centered within its enclosing box.
    c                R    t         |   t        d      g|t        d             y )Nrs  r  r*  s     r5   rR   zVCentered.__init__  s%    $t*<x<d<=rF   r  r  r   s   @r5   r  r    s    
> >rF   r  c                  @     e Zd ZdZdZdZd fdZddZd fdZ xZ	S )	r@  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                0    t         |           || _        y rO   )r   rR   r:   r  s     r5   rR   zKern.__init__  s    
rF   c                     d| j                   z  S )Nzk%.02fry  r  s    r5   r  zKern.__repr__  s    $**$$rF   c                |    t         |           | j                  t        k  r| xj                  t
        z  c_        y y rO   )r   r  r}  r  r:   r   r  s    r5   r  zKern.shrink  s,    99&JJ-'J 'rF   r  r  r  )
r@   rA   rB   rC   r;   r<   rR   r  r  r   r   s   @r5   r@  r@    s(     FE%( (rF   r@  c                  .     e Zd ZdZ	 d	 	 	 d fdZ xZS )AutoHeightChara  
    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                |   |j                   j                  |j                  |      }|j                   j                  |j                  |j                  |j
                        }|j                         }||z   }	|D ]<  \  }
}|
|_        t        ||      }|j                  |j                  z   |	d|z  z
  k\  s< n d}|j                  dk7  st        |      dk(  rN||	j                  |j                  z   z  }|xj                  |z  c_        t        |      }||j                  z
  }t        | 1  g       || _        y )Nr  r   r   r   )r  r   rW   r   rX   r   copyr  r;   r<   r  r   rR   r%  )rQ   rS  r;   r<   r  alwaysfactorr  r   target_totalr   r   r  shiftr   s                 r5   rR   zAutoHeightChar.__init__  s   }}FFJJ --++JJ		3 

~)MHc!EJU#D {{TZZ'<#-+GG * ::?c,/14~%tzz)ABNNf$NU#DTZZ'E$ !rF   )FN)rS  r   r;   r9   r<   r9   r  r  r  r|   r  re  r  r   s   @r5   r  r    s(     ?C""/;" "rF   r  c                  ,     e Zd ZdZdef	 d fdZ xZS )AutoWidthChara  
    A character as close to the given width as possible.

    When using a font with multiple width versions of some characters (such as
    the BaKoMa fonts), the correct glyph will be selected, otherwise this will
    always just return a scaled version of the glyph.
    Fc                d   |j                   j                  |j                  |      }|j                         }|D ]&  \  }}||_         |||      }	|	j                  |k\  s& n |	j                  z  }
|xj
                  |
z  c_         ||      }	t        |   |	g       |	j                  | _        y rO   )r  r   rW   r  r:   rX   r   rR   )rQ   rS  r:   r  r  
char_classr  r   r   r  r  r   s              r5   rR   zAutoWidthChar.__init__$  s    }}FFJJ 

)MHc!EJc5)DzzU"	 * #& #u%$ ZZ
rF   )
rS  r   r:   r9   r  r  r  r|   r  z
type[Char])r@   rA   rB   rC   r  rR   r   r   s   @r5   r  r    s$     QV*. '   rF   r  c           	        	
 |\  }}dd||| j                   z   	t        |       
ddd	
fdd	
fdt        | t              sJ  |        
S )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                "    | dk  rdS | dkD  rdS | S )Ng    eg    eArE   )values    r5   clampzship.<locals>.clampI  s    t|tHH5HrF   c                   d}d}| j                   }| j                  }}}| j                  D ]S  }t        |t              r)|j                  z   z          |j                  z  =t        |t              r|j                  z  ]t        |t              rt        |j                        dk(  r|j                  z  }||j                  z   t        |t              r	 |       n t        |t              r	 |       nJ d       ||j                  z   |t        |t              r|j                  }	|j                  }
|j                  }t!        j"                  |	      r| j                  }	t!        j"                  |
      r| j                  }
|	dkD  r'|dkD  r"||
z   |j                  z   z   ||	       ||z  t        |t$              s|j&                  }|j                  |z
  }|dk7  r~|dk(  r=|j(                  |k(  rj||j*                  z  }t-         | j.                  |z              }n<|j0                  |k(  r-||j2                  z  }t-         | j.                  |z              }||z  }|z  V y )Nr   r   unreachable coder   )r)  r(  r&  rw  r  r  r:   r@  r#  r  r%  r;  rU  rz   r;   r<   rU   rI  rK  rL  rM  rN  roundr'  rO  r  )rP   cur_gcur_gluer)  r(  	base_line	left_edgerE  edgerule_height
rule_depth
rule_widthrL  r  cur_hcur_v	hlist_outoff_hoff_vr   	vlist_outs                r5   r  zship.<locals>.hlist_outL  sB    ^^
MM			A!T"> At$ At$qzz?a'QWW$E D%6E!!U+!!#Au-!!8&88u 177NE%EAs#hhWW
WW
88K("%**K88J'!$J?zA~%
2EHHV"U]EEM'6 &E#At$KK	&__u4
> A~$22j@$	(9(99H$)%x0G*H$IE"//:= I$4$44 %eCLL8,C&D Ee#
#g rF   c                
   d}d}| j                   }| j                  }}| j                  z  }| j                  D ]C  }t	        |t
              r|j                  z  $t	        |t              rt        |j                        dk(  r|j                  |j                  z   z  i|j                  z  ||j                  z   }| j                  |_        t	        |t              r	 |       n t	        |t              r	 |       nJ d       ||j                  z   |t	        |t              rz|j                  }	|j                  }
|j                  }t        j                  |      r| j                  }|	|
z  }	|	dkD  sF|
dkD  sM|	z  |j!                  z   z   ||	       ot	        |t"              r|j$                  }|j                  |z
  }	|dk7  r~|dk(  r=|j&                  |k(  rj||j(                  z  }t+         | j,                  |z              }n<|j.                  |k(  r-||j0                  z  }t+         | j,                  |z              }|	|z  }	|	z  )t	        |t2              s;t5        d       y )Nr   r   r  r   z1Internal mathtext error: Char node found in vlist)r)  r(  r;   r&  rw  r@  r:   r#  r  r<   r%  r;  rU  rz   rU   rI  r  rK  rL  rM  rN  r  r'  rO  r  r  rY  )rP   r  r  r)  r(  r  top_edgerE  save_vr  r  r  rL  r  r  r  r  r  r  r   r  s                r5   r  zship.<locals>.vlist_out  sE    ^^
MM		A!T" At$qzz?a'QXX//EQXX%E%6E"F!iiAG!!U+!!#Au-!!8&88u"QWW,E%EAs#hhWW
WW
88J'!$Jz)?zA~[(EHHV"U]EEM'6 At$KK	'oo5> A~$22j@$	(9(99H$)%x0G*H$IE"//:= I$4$44 %eCLL8,C&D Eu$$At$"GI I[ rF   )r  r9   r{   r9   )rP   r;  r{   r   )rP   rU  r{   r   )r;   rM   rw  r;  )rP   xyrI   rJ   r  r  r  r  r  r  r   r  s       @@@@@@@@r5   rq   rq   8  so     FBEEEOEC[FI=$ =$~9I 9Iv c5!!!cNMrF   c                B     d fd}t               j                  |      S )z$Helper class to raise parser errors.c                    t        | |      rO   r   )rH  loctoksmsgs      r5   raise_errorzError.<locals>.raise_error  s    !!S#..rF   rH  r   r  rp   r  r   r{   T.Any)r   setParseAction)r  r  s   ` r5   Errorr    s    / 7!!+..rF   c                  d    e Zd ZdZ	 	 ddZd	dZed
d       Zej                  dd       ZddZ	y)r  a   
    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                J    || _         || _        || _        || _        || _        y rO   )r  _fontr   rX   r   )rQ   r  rW   r   rX   r   s         r5   rR   zParserState.__init__  s%    
$ rF   c                ,    t        j                   |       S rO   )r  r  s    r5   r  zParserState.copy  s    yyrF   c                    | j                   S rO   )r  r  s    r5   rW   zParserState.font  s    zzrF   c                (    |dv r|| _         || _        y )N)r   r  r  r  )r   r  )rQ   r~  s     r5   rW   zParserState.font  s    --"DO
rF   c                x    | j                   j                  | j                  | j                  | j                        S )z.Return the underline thickness for this state.)r  r   rW   rX   r   r  s    r5   rc  z+ParserState.get_current_underline_thickness  s,    ||33IIt}}dhh0 	0rF   N)
r  r   rW   r   r   r   rX   r9   r   r9   r{   r  r  )r~  r   r{   r   )r{   r9   )
r@   rA   rB   rC   rR   r  propertyrW   setterrc  rE   rF   r5   r  r    sJ       
[[ 
0rF   c                    dfd| j                  dd      d   }| |k(  r!|dj                  d  |      D              z   n| }||t        d|       z  z
  S )	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     K   t        | t              r"| j                  D ]  } |      E d {     y | j                  r| j                   y y 7 #wrO   )rw  r   exprsresultsName)eltexprnamess     r5   r  zcmd.<locals>.names	  sG     c?+		 ;&& "__//!  's   +AA$Ar  r   r    c              3  &   K   | ]	  }d |z    yw)z{%s}NrE   )r   r~  s     r5   r   zcmd.<locals>.<genexpr>  s     BkdFTMkr   z	Expected )r  r   r{   zT.Generator[str, None, None])ra  r.  r  )r  argscsnamer4   r  s       @r5   cmdr    sg    " ZZQ"Ffn BGGBeDkBBB"& TEIcU"34455rF   c                     e Zd ZdZ G d dej
                        Z edj                               Z	 edj                               Z
 edj                               Ze	e
z  ez  Z edj                               Z edj                               Z ed	j                               Z ed
j                               Z edj                               Z edj                               Z edj                               Z edj                               Z edj                               Zeez  ez  Z e e ed       ed      dz         D  cg c]?  }t3        j4                  t7        |            j                         d   j9                         A c}}}}       Z eej>                        Z dfdZ!dgdZ"dhdZ#dfdZ$dfdZ%didZ&djdZ'dkdZ(dkdZ) e*e+jX                        Z-dkdZ.dldZ/dddd d d!d"d"d#dd$d%d&Z0dkd'Z1dkd(Z2	 	 	 	 dmd)Z3dnd*Z4i d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAd:dBd2dCd4dDd6dEd8dFd,dGdHdIdJZ5 edKj                               Z6dkdLZ7dndMZ8dndNZ9dkdOZ:dkdPZ;dkdQZ<e<Z=dodRZ>dndSZ?dkdTZ@dpdUZAdpdVZBdpdWZCdnfdXZD	 	 	 	 	 	 dqdYZEdkdZZFdkd[ZGdkd\ZHdkd]ZIdkd^ZJdnd_ZKeKxZLZMdkd`ZNdkdaZO	 	 	 	 	 	 drdbZPdkdcZQdkddZRdkdeZSxZTS c c}}}} w )sParserz
    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                      e Zd ZdZdZdZdZy)Parser._MathStyler   r   rh   r'   N)r@   rA   rB   DISPLAYSTYLE	TEXTSTYLESCRIPTSTYLESCRIPTSCRIPTSTYLErE   rF   r5   
_MathStyler    s    	rF   r  u  + * - −
      \pm             \sqcap                   \rhd
      \mp             \sqcup                   \unlhd
      \times          \vee                     \unrhd
      \div            \wedge                   \oplus
      \ast            \setminus                \ominus
      \star           \wr                      \otimes
      \circ           \diamond                 \oslash
      \bullet         \bigtriangleup           \odot
      \cdot           \bigtriangledown         \bigcirc
      \cap            \triangleleft            \dagger
      \cup            \triangleright           \ddagger
      \uplus          \lhd                     \amalg
      \dotplus        \dotminus                \Cap
      \Cup            \barwedge                \boxdot
      \boxminus       \boxplus                 \boxtimes
      \curlyvee       \curlywedge              \divideontimes
      \doublebarwedge \leftthreetimes          \rightthreetimes
      \slash          \veebar                  \barvee
      \cupdot         \intercal                \amalg
      \circledcirc    \circleddash             \circledast
      \boxbar         \obar                    \merge
      \minuscolon     \dotsminusdots
      aF  
      = < > :
      \leq          \geq          \equiv       \models
      \prec         \succ         \sim         \perp
      \preceq       \succeq       \simeq       \mid
      \ll           \gg           \asymp       \parallel
      \subset       \supset       \approx      \bowtie
      \subseteq     \supseteq     \cong        \Join
      \sqsubset     \sqsupset     \neq         \smile
      \sqsubseteq   \sqsupseteq   \doteq       \frown
      \in           \ni           \propto      \vdash
      \dashv        \dots         \doteqdot    \leqq
      \geqq         \lneqq        \gneqq       \lessgtr
      \leqslant     \geqslant     \eqgtr       \eqless
      \eqslantless  \eqslantgtr   \lesseqgtr   \backsim
      \backsimeq    \lesssim      \gtrsim      \precsim
      \precnsim     \gnsim        \lnsim       \succsim
      \succnsim     \nsim         \lesseqqgtr  \gtreqqless
      \gtreqless    \subseteqq    \supseteqq   \subsetneqq
      \supsetneqq   \lessapprox   \approxeq    \gtrapprox
      \precapprox   \succapprox   \precnapprox \succnapprox
      \npreccurlyeq \nsucccurlyeq \nsqsubseteq \nsqsupseteq
      \sqsubsetneq  \sqsupsetneq  \nlesssim    \ngtrsim
      \nlessgtr     \ngtrless     \lnapprox    \gnapprox
      \napprox      \approxeq     \approxident \lll
      \ggg          \nparallel    \Vdash       \Vvdash
      \nVdash       \nvdash       \vDash       \nvDash
      \nVDash       \oequal       \simneqq     \triangle
      \triangleq         \triangleeq         \triangleleft
      \triangleright     \ntriangleleft      \ntriangleright
      \trianglelefteq    \ntrianglelefteq    \trianglerighteq
      \ntrianglerighteq  \blacktriangleleft  \blacktriangleright
      \equalparallel     \measuredrightangle \varlrtriangle
      \Doteq        \Bumpeq       \Subset      \Supset
      \backepsilon  \because      \therefore   \bot
      \top          \bumpeq       \circeq      \coloneq
      \curlyeqprec  \curlyeqsucc  \eqcirc      \eqcolon
      \eqsim        \fallingdotseq \gtrdot     \gtrless
      \ltimes       \rtimes       \lessdot     \ne
      \ncong        \nequiv       \ngeq        \ngtr
      \nleq         \nless        \nmid        \notin
      \nprec        \nsubset      \nsubseteq   \nsucc
      \nsupset      \nsupseteq    \pitchfork   \preccurlyeq
      \risingdotseq \subsetneq    \succcurlyeq \supsetneq
      \varpropto    \vartriangleleft \scurel
      \vartriangleright \rightangle \equal     \backcong
      \eqdef        \wedgeq       \questeq     \between
      \veeeq        \disin        \varisins    \isins
      \isindot      \varisinobar  \isinobar    \isinvb
      \isinE        \nisd         \varnis      \nis
      \varniobar    \niobar       \bagmember   \ratio
      \Equiv        \stareq       \measeq      \arceq
      \rightassert  \rightModels  \smallin     \smallowns
      \notsmallowns \nsimeqa  
     \leftarrow \longleftarrow \uparrow \Leftarrow \Longleftarrow
     \Uparrow \rightarrow \longrightarrow \downarrow \Rightarrow
     \Longrightarrow \Downarrow \leftrightarrow \updownarrow
     \longleftrightarrow \updownarrow \Leftrightarrow
     \Longleftrightarrow \Updownarrow \mapsto \longmapsto \nearrow
     \hookleftarrow \hookrightarrow \searrow \leftharpoonup
     \rightharpoonup \swarrow \leftharpoondown \rightharpoondown
     \nwarrow \rightleftharpoons \leadsto \dashrightarrow
     \dashleftarrow \leftleftarrows \leftrightarrows \Lleftarrow
     \Rrightarrow \twoheadleftarrow \leftarrowtail \looparrowleft
     \leftrightharpoons \curvearrowleft \circlearrowleft \Lsh
     \upuparrows \upharpoonleft \downharpoonleft \multimap
     \leftrightsquigarrow \rightrightarrows \rightleftarrows
     \rightrightarrows \rightleftarrows \twoheadrightarrow
     \rightarrowtail \looparrowright \rightleftharpoons
     \curvearrowright \circlearrowright \Rsh \downdownarrows
     \upharpoonright \downharpoonright \rightsquigarrow \nleftarrow
     \nrightarrow \nLeftarrow \nRightarrow \nleftrightarrow
     \nLeftrightarrow \to \Swarrow \Searrow \Nwarrow \Nearrow
     \leftsquigarrow \overleftarrow \overleftrightarrow \cwopencirclearrow
     \downzigzagarrow \cupleftarrow \rightzigzagarrow \twoheaddownarrow
     \updownarrowbar \twoheaduparrow \rightarrowbar \updownarrows
     \barleftarrow \mapsfrom \mapsdown \mapsup \Ldsh \Rdsh
     z, ; . ! \ldotp \cdotpz}
       \sum \prod \coprod \bigcap \bigcup \bigsqcup \bigvee
       \bigwedge \bigodot \bigotimes \bigoplus \biguplus
       zlim liminf limsup sup max minz.\int \oint \iint \oiint \iiint \oiiint \iiiintz3rm cal it tt sf bf bfit default bb frak scr regularz
      arccos csc ker min arcsin deg lg Pr arctan det lim sec arg dim
      liminf sin cos exp limsup sinh cosh gcd ln sup cot hom log tan
      coth inf max tanhzn
      | \| / \backslash \uparrow \downarrow \updownarrow \Uparrow
      \Downarrow \Updownarrow . \vert \Vertz[
      ( [ \{ < \lfloor \langle \lceil \lbrace \leftbrace \lbrack \leftparen \lgroup
      z]
      ) ] \} > \rfloor \rangle \rceil \rbrace \rightbrace \rbrack \rightparen \rgroup
      u   αu   ωr   r  c                :    t        j                         dC fd}dDd}t        d      _         t	         j
                        d      _         t	         j                  D cg c]  }t        |j                         c}      d      _
         t        ddj                  d	j                  t        t        j                  t                           z         d
      j#                         _         t        d      d      _         |d j(                        _        t-        d t	         j(                        d      z         dz   _        t1        d      _        t	         j4                        _        t9               _        t9               _        t9               _        t9               _         t9               _!        t9               _"        xj>                  j<                  z  c_         |        xjB                  d tG        jD                        d      z   dz   z  c_!        xj@                  d tI        jD                        d      z   dz   z  c_         tK        ddj                  d      z   dz         _&         |dg  jN                   jP                        j?                  d
      z
  _)         |d jT                        _+        j.                   tG        jD                        d      z   j2                  z   _,        j.                   tG        jD                        d      z   t[               z   _.        tK        djA                  d      jA                  d      z         _/        tK        djA                  d      jA                  d      z         _0        tK        djA                  d      jA                  d      z         _1        tK        dd t-        j6                        d      z   dz   dz    t-        j6                        d      z   dz   dz   j                  d      z   dz   dz    t-        j                        d      z   dz   jA                  d      z   jA                  d      z         _2        tK        dt-        d tI        tg        d      jD                  z         d       z   dz         jA                  d!      z         _4        tK        d"jA                  d#            _5        tK        d$jC                  d%      jC                  d#      z         _6        tK        d&jC                  d%      jC                  d#      z         _7        tK        d'tq        dd(d)            _9        tK        d* tu        ddtw        tI        jD                              tG        t1        d+      jy                               z   ,      d-            _=         t-        j<                        d.       tI        t	        d/d0g      j<                  z
        d1      z    t        d2      d3      z    t        d4      d3      z  j?                  d.       t        d2      d3      z   z  _>        j                  jL                  z  j*                  z  j|                  z  _?        xjD                  j~                  j:                  z  j\                  z  j&                  z  z  c_"        tK        d5d tG        j~                        d      z   dz         _@        tK        d6d tG        j~                        d!      z   dz         _A        xj<                  jR                  j$                  z  jV                  z  j                  z  jX                  z  j^                  z  j`                  z  jb                  z  jd                  z  jl                  z  jn                  z  jh                  z  jj                  z  jr                  z  j                  z  jz                  z  z  c_        d7j7                  d8      t        d9      z  z
  }xj:                  d:j7                  d;      t        d9      z  z
   tG        j~                  j:                  z  |z        d<      z   d=z   j7                  d>      t        d9      z  z
  z  c_        tI        jD                        _C        tq        d?d(d@A      _D        t        dB      j#                         _E        j                  tG        j                  j                  z         z   t[               z   _F         |        j                   _G        j                   _H        d@ _I        y c c}w )ENc                     t              j                         D ]T  \  } }| j                  d      r| dvr|j                  |        t	        |       s:|j                  t        |              V y )N_)token	placeable
auto_delim)varsr	  r  setNamehasattrr  rJ  )r
  r   rE  rQ   s     r5   set_names_and_parse_actionsz4Parser.__init__.<locals>.set_names_and_parse_actions  s]     GMMOS~~c* "FFC(tS)**74+=> ,rF   groupc                d   g }g }|D ]8  }|d   j                         r|j                  |       (|j                  |       : t        dj                  | dj	                  t        t        j                  |            |rdnddj	                  t        t        j                  |                        S )Nr  z<\\(?P<{group}>(?:{alpha})(?![A-Za-z]){additional}{nonalpha})|r  )r  alpharF  nonalpha)isalphar   r   r-  r.  rT   reescape)r  r  ends_with_alphaends_with_nonalphar~  s        r5   csnamesz Parser.__init__.<locals>.csnames  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])r  r   z\\[A-Za-z]+r~  rW   z\mathr  r  z\hspaceaccentz\fracrY   denz\dfracz\binomz\genfracldelimrdelimrulesizestylez\sqrt{value}r#  r&  rootr  z	\overlinebodyz\overset
annotationz	\undersetz\textr-   )endQuoteCharz	\substackz\\)openerclosercontentpartsnucleusr  rQ  subsuperz'*apostrophesz'+z\operatornamez\boldsymbol\middlemdelimzExpected a delimiterz\leftleftr  z\rightrightr-  F)unquoteResultsz(?:(?:\\[$])|[^$])*r  )r  r   r  zIterable[str]r{   r   )JtypesSimpleNamespacer   float_literalr	   _space_widthsr  r  r   r  r  r-  r.  rT   r  r  r   leaveWhitespacer3   unknown_symbol
_fontnamesrW   r   start_groupr   	end_group_delimsdelimr   r  r  named_placeablerequired_groupoptional_groupr  r   r
   r  customspace_accent_map_wide_accentsr  _function_namesfunctionr  r   unclosed_groupfracdfracbinomgenfracr   sqrtoverlineoversetundersetr   textr)   r   suppresssubstackr  simpleoperatorname
boldsymbolr  mathmath_stringnon_mathmain_expression_math_expression_in_subscript_or_superscript)rQ   r  r  rU  r   rE  s   `    @r5   rR   zParser.__init__  s   !!#
	?	" !!CD45!3!34W=55#'??3?aS\?355DF
5&--RYY0133

 
 !" 	
 1508"64??;#H/EuT__/Ef/M$MNQTT"3< . %Y$Y$Y$Y$Y$Y 	
akk)#%	S#6:agg#6w#??#EE	S#59QWW#5g#>>DDJaoog.F(F(LM HF 0 0F43E3EFG&' 	
 VT%9%9:
--"5*QWW"5g">>LMM,?Jqww,?,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%HQWW%h/0256OOJ/0256  .HQ__-g67 :== u%	&
 u%&'	 S;9VC[177%:;FCCcIJw'()
 q'7'7'?@
\*Q-=-=f-EEG	 \*Q-=-=f-EEG
 X|CCHIO;c#/4Yqww5G/H'1'&/2J2J2L'M0NOOVXY
 #Xakk"9-9ySz*Q[[89*EFuT{=)* eDk-()   +keDk-.HH	J 	

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

        Returns the parse tree of `Node` instances.
        r   r   
r   NF)r  _state_stack_em_width_cacher*  parseStringr   r2   r   explainr,  r   
resetCacher   r   r;  )rQ   rH  fonts_objectrX   r   resultr4   s          r5   r%   zParser.parseo  s     ixEGFH	N%%11!4F ,1)!  "vveVAY'' " 	NTN$:$:3$BBCM	Ns   A? ?	B0#B++B0c                     | j                   d   S )z&Get the current `State` of the parser.r  )r/  r  s    r5   	get_statezParser.get_state  s      $$rF   c                8    | j                   j                          y)zPop a `State` off of the stack.N)r/  popr  s    r5   	pop_statezParser.pop_state  s    rF   c                r    | j                   j                  | j                         j                                y)z=Push a new `State` onto the stack, copying the current state.N)r/  r   r7  r  r  s    r5   
push_statezParser.push_state  s&      !1!6!6!89rF   c                6    t        |j                               gS rO   )r;  asListrQ   r  s     r5   r)  zParser.main  s    dkkm$%%rF   c                H    | j                   j                  |d   dd d      S )Nr   r   r  T)parseAll)r+  r1  r?  s     r5   r'  zParser.math_string  s(    $$00a20NNrF   c                Z    t        |j                               }| j                          |gS rO   )r;  r>  r:  )rQ   r  hlists      r5   r&  zParser.math  s#    dkkm$wrF   c                   |d   j                  dd      }|D cg c]  }t        || j                                }}t        |      }| j	                          t
        j                  d   | j                         _        |gS c c}w )Nr   z\$r-  r   )replacer  r7  r;  r<  r   r   rW   )rQ   r  rH  rS  symbolsrC  s         r5   r(  zParser.non_math  sp    GOOE3'678a44>>+,a8g #-? @w 9s   !Bc           	         | j                          | j                         }d|_        t        |d   D cg c]  }t	        ||       c}      }| j                          |gS c c}w )Nr   r   )r<  r7  rW   r;  r  r:  )rQ   r  r  rS  rC  s        r5   r   zParser.text  sX     
tAw7w!tAu~w78w 8s   A!c                |   | j                         }|j                  |j                  |j                  f}| j                  j                  |      }|_|j                  j                  dt        j                  d   d|j                  |j                        }|j                  }|| j                  |<   t        ||z        S )Nr  r   r7  )r7  rW   rX   r   r0  r   r  r   r   r   r   r@  )rQ   
percentager  r
  r:   rj   s         r5   _make_spacezParser._make_space  s      zz5>>5995$$((-=mm//cll#56		+G OOE(-D  %EJ&''rF   gKqU?g0Bxq?g%?g1ZGU?r  rh   gKqUſ)\,z
\thinspacez\/z\>z\:z\;z\ rT  z\enspacez\quadz\qquadz\!c                N    | j                   |d      }| j                  |      }|gS Nr  )r  rJ  )rQ   r  rY   rP   s       r5   r  zParser.space  s-      g/s#urF   c                ,    | j                  |d         gS rM  )rJ  r?  s     r5   r  zParser.customspace  s      g/00rF   c                6   |d   }|dk(  rd}	 t        || j                               }|| j                  v rt        d |d | d d d   D        d      }| j                  sJ|| j                  v r?t        |d | j                               dk(  s|d	h| j                  | j                  v r|gS t        | j                  d
      || j                  d
      gd      gS || j                  v rt        d |d | d d d   D        d      }t        d ||dz   d  D        d      }|dk(  r|d	k(  r|dk(  r|gS |dk(  r#|j                         r|j                         r|gS t        || j                  d
      gd      gS |gS # t        $ r}t        ||d|z        |d }~ww xY w)Nr   rL  u   −zUnknown symbol: %sc              3  ,   K   | ]  }|d k7  s	|  ywr  NrE   r   rS  s     r5   r   z Parser.symbol.<locals>.<genexpr>       CA!s(a   
r  r  r   r  r  Tr~  c              3  ,   K   | ]  }|d k7  s	|  ywrQ  rE   rR  s     r5   r   z Parser.symbol.<locals>.<genexpr>  rS  rT  c              3  ,   K   | ]  }|d k7  s	|  ywrQ  rE   rR  s     r5   r   z Parser.symbol.<locals>.<genexpr>  s     AASarT  r   rP  r  rN  )r  r7  r2   r   _spaced_symbolsr  r,  _binary_operatorsr  ra  _left_delims_relation_symbolsr;  rJ  _punctuation_symbolsisdigit)	rQ   rH  r  r  rS  r  r4   	prev_char	next_chars	            r5   r3   zParser.symbol  s   K8 !A	I4>>+,D
 $$$ C4C2CRHI 11///$3(A-?J"//?J262H2H?J 2Jvt//4##//46 '+, - - $+++C4C2CRHIA378A2FI Cx#	S(8 6M CxI--/I4E4E4GvtT%5%5c%:;TJKKvE  	I%a&:Q&>@EHI	Is   E9 9	FFFc                (    t        ||d|d          )NzUnknown symbol: r~  r  rQ   rH  r  r  s       r5   r	  zParser.unknown_symbol	  s    !!S,<T&\N*KLLrF   hatz\circumflexaccentbrevez\combiningbrevebarz\combiningoverlinegravez\combininggraveaccentacutez\combiningacuteaccenttildez\combiningtildedotz\combiningdotaboveddotz\combiningdiaeresisdddotz\combiningthreedotsaboveddddotz\combiningfourdotsabovevecz\combiningrightarrowabover%  `r9  rT  rN  rQ  z\rightarrowz
\leftarrowz\circ)overrightarrowoverleftarrowmathringzwidehat widetilde widebarc                   | j                         }|j                         }|d   }|d   }|| j                  v r!t        d|z   |j                  |t
              }nt        | j                  |   |      }|dk(  r |j                          |j                          t        t        |j                  dz        |g      }|j                  |j                  d       t        |t        d|d	z        t        |g      g      S )
Nr  r   r-   )r  ro  g      @exactlyr          @)r7  rc  r  r  r:   r  r  r  r|  r	  r=  rU  r  r;  )rQ   r  r  rd  r  r   
accent_boxcentereds           r5   r  zParser.accent#	  s     99;	h5kT'''&vsyy%FDJ   0 0 8%@JZd399s?3Z@Asyy),RS)se  	rF   c                @    | j                  |||      }|d   |_        |S )Nr~  )r$  function_name)rQ   rH  r  r  rC  s        r5   r  zParser.function9	  s'    !!!S$/"6lrF   c                   | j                          | j                         }d|_        g }|d   }|D ]x  }t        |t              r)d|_        |j                          |j                  |       <t        |t              r|j                  t	        ||             h|j                  |       z |t        |      z   dz   }t        |t              r|t        d      z  }t        d ||d  D        d      }	| j                  ddhz  }
|	|
vr0|| j                  vr"|| j                  | j                  d	         gz  }| j                          |	d
v rd| _        t#        |      S d| _        t#        |      S )Nr   r~  r   zoperatorname{}c              3  ,   K   | ]  }|d k7  s	|  ywrQ  rE   rR  s     r5   r   z&Parser.operatorname.<locals>.<genexpr>Q	  s     C%6!s(!%6rT  r  rQ  r  rK  >   rQ  r  TF)r<  r7  rW   rw  r  r  r   r   r  r   r  r  _overunder_functionsrJ  r  r:  r,  r;  )rQ   rH  r  r  r  
hlist_listr~  rS  next_char_locr^  
delimiterss              r5   r$  zParser.operatorname>	  s^    
!#
F|A!T"!!#!!!$As#!!$q%.1!!!$  c$i!+dL)S!122MCQ}~%6CRH	\\S#J.
Z'D5554++D,>,>u,EFGGJ 
"04D- Z   16D-Z  rF   c                    | j                          |j                  d      r$|j                  d      | j                         _        g S NrW   )r<  r   r7  rW   r?  s     r5   r  zParser.start_groupa	  s5    88F$(HHV$4DNN!	rF   c                >    t        |j                  dg             }|gS Nr  r;  r   )rQ   r  grps      r5   r  zParser.grouph	  s    DHHWb)*urF   c                8    t        |j                  dg             S r  r  r?  s     r5   r  zParser.required_groupl	  s    TXXgr*++rF   c                &    | j                          g S rO   )r:  r  s    r5   r  zParser.end_groupq	  s    	rF   c                .    t        |t        |      d      )NzExpected '}')r   r  r`  s       r5   r  zParser.unclosed_groupu	  s    !!SV^<<rF   c                6    |d   | j                         _        g S r~  )r7  rW   r?  s     r5   rW   zParser.fontx	  s     $V	rF   c                    t        |t              r|j                  | j                  v S t        |t              r$t        |d      r|j                  | j                  v S y)Nrv  F)rw  r  rS  _overunder_symbolsr;  r  rv  ry  rQ   r  s     r5   is_overunderzParser.is_overunder|	  sN    gt$99 7 777'GG_,M((D,E,EEErF   c                T    t        |t              r|j                  | j                  v S yNF)rw  r  rS  _dropsub_symbolsr  s     r5   
is_dropsubzParser.is_dropsub	  s$    gt$99 5 555rF   c                D    t        |t              r|j                         S yr  )rw  r  r  r  s     r5   r  zParser.is_slanted	  s    gt$%%''rF   c           	     (   |j                  dt        d            }|j                  dg       }t        |j                  dg             }|s|s|S d x}}|r,|^}	}
}|	dk(  r|t        d      |
}n|t        d      |
}|r,| j	                         }|j
                  j                  |j                  |j                  |j                        }|j
                  j                  |j                  |j                  |j                        }|rk|t        g       }t        |      D ]0  }|j                  j                  | j                  ||dd	i             2 |j!                          |j#                          | j%                  |      rKg }d
}|j&                  }|&|j)                          t+        ||j&                        }|&|j)                          t+        ||j&                        }|dz  }|;t-        |g      }|j#                  |d       |j                  |t/        d|      g       t-        |g      }|j#                  |d       |j1                  |       |Wt-        |g      }|j#                  |d       |j                  t/        d|      |g       |j2                  |z   |j4                  z   }t7        |      }||_        t        |g      }|gS |}t;        |t              rx|j                  }t        |      rSt;        |d   t<              rt?        |d   d      r|d d }|d   }t?        |d      r|j@                  jB                  |_        t        |d      }n7t;        |tD              r|j@                  jB                  |_        t        |g      }tG        |      }|j2                  }d}| jI                  |      r|j4                  }|jJ                  |z  }|jJ                  |z  }| jM                  |      r||jJ                  |z  z  }||jN                  ||dz  dz  z
  z  z  }| jI                  |      r?d|jJ                  z  |jP                  z
  |z  }d|jJ                  z  |jP                  z   |z  }nd}|zt        t=        |      tS        jT                  tV        |      g      }|j)                          | jI                  |      r||jX                  |z  z   }n|jZ                  |z  }||_        n't        t=        |      |g      }|j)                          | jI                  |      r||jX                  |z  z
  }n|j\                  |z  }|	| |_        nt        t=        |      |g      } | j)                          | jI                  |      r||jX                  |z  z   }n|j^                  |z  }d|z  ||j4                  z
  | j2                  |z
  z
  z
  }!|!d
kD  r||!z  }t7        |t=        ||j4                  z
  | j2                  |z
  z
        | g      }||_        | jI                  |      s"|xj&                  |j`                  |z  z  c_        ||g}"| jb                  r)|"| je                  | jf                  d         gz  }"d| _1        t        |"      }|gS )Nr  r   r  r  r  zDouble subscriptzDouble superscriptr   r  r         @rq  r  r  Fr~  rr  r'   rK  )4r   r	  r  r   r7  r  r   rW   rX   r   r   r;  r  r&  extendr3   r  r=  r  r:   r  rm   r|  r  r   r;   r<   rU  r%  rw  r@  r  r  r   r  r  r  r  r  r  r  r   r   r  r  r  r  r  r  r,  rJ  r  )$rQ   rH  r  r  r  r  napostrophessubr   opargr  rule_thicknessr   r(  vlistr  r:   vgaprC  vltr5  	last_charrA  r  	lc_heightlc_baseline	superkernsubkernr   
shift_downshift_uprx   clrspaced_nucleusr   s$                                      r5   r  zParser.subsuper	  s   ((9d1g.88J+488M267Ne!)BhSy?-.@AA$-.BCC   >>JJ		3--++JJ		3 }b	<(%%dkk!S5):L&MN ) JJLKKM W%EEMME E5;;/

E399-!C'D !5'*E9-eT!T]34wi(EKKy)LL!3%(E9-d1dmU34t+gmm;,C$CC5\F8O 	gu%"++L< |B/6R 0*=#/#4L(,	9j1&/&8&8&@&@IOL%8G'4("+"4"4"<"<	WI&G +51	&&	??9%#//K OOg-	//G+??9%722I)11$w|b'88: ;Iy)y.$3347@A0&5569BC	  =
 tG}affT3&789AHHJy)(9+<+<w+FF
&^^g5
'ANtI./AHHJy)$y'8'87'BB$>>G3{"*4=#./
??9-!,y/@/@7/J!JJ!*'!9J^+!AGG+:0EFH8OH(QWW,J1FGH  ",y)GGy--77G "1,,t//0B0B50IJKKN05D-~&xrF   c           
        | j                         }|j                         }t        |j                        D ]"  }	|j	                          |j	                          $ t        |g      }
t        |g      }t        |j                  |j                        }|
j                  |d       |j                  |d       t        |
t        d|dz        t        ||      t        d|dz        |g      }|j                  j                  |j                  t        j                   d   d|j"                  |j$                        }|j&                  |j(                  |j*                  z   dz  |dz  z
  z
  }||_        t/        |t1        |dz        g      g}|s|rN|dk(  rd	}|dk(  rd	}| j3                  |t5        j6                  t8        t:        t<        z  t>        z     |      |      S |S )
Nrq  r   rr  r   =rh   r  r  rN  ) r7  rc  r  r  r  r|  rm   r:   r=  rU  r  r`  r  r   rW   r   r   rX   r   r;   rl   ro   r%  r;  r	  _auto_sized_delimiterr   r   r  rz   r  r   )rQ   r  r  ruler  rY   r  r  rd  r  cnumcdenr:   r  rj   r  r5  s                    r5   _genfraczParser._genfrac3
  s    99;	u{{#AJJLJJL $ ##CIIsyy)

5)$

5)$tAy3/UD)Ay3/	  --++JJ%78, <<',,.!3c/"# #Y^ 4567V||--f./ffT#*s:J5K5;/=.46 6 rF   c                <    | j                  t        |d               S )Nr  )r  rp   r?  s     r5   r  zParser.style_literal]
  s    s4#89::rF   c           	         | j                  |j                  dd      |j                  dd      |d   |j                  d| j                  j                        |d   |d         S )Nr  r  r  r  r  rY   r  )r  r   r  r  r?  s     r5   r  zParser.genfrac`
  sZ    }}HHXr"DHHXr$:dhhw0I0IJKe& 	&rF   c           	         | j                  dd| j                         j                         | j                  j                  |d   |d         S Nr  rY   r  )r  r7  rc  r  r  r?  s     r5   r  zParser.fracf
  sE    }}DNN$DDFOO%%tE{DKA 	ArF   c           	         | j                  dd| j                         j                         | j                  j                  |d   |d         S r  )r  r7  rc  r  r  r?  s     r5   r  zParser.dfrack
  sE    }}DNN$DDFOO(($u+tE{D 	DrF   c           	     b    | j                  ddd| j                  j                  |d   |d         S )Nr  r  r   rY   r  )r  r  r  r?  s     r5   r  zParser.binomp
  s5    }}aOO%%tE{DKA 	ArF   c                   |d   }|d   }| j                         j                         }|j                          t        |g      }t        |g      }t	        |j
                  |j
                        }	|j                  |	d       |j                  |	d       |dz  }
||dz      dk(  r;t        |t        d|
      |g      }|j                  |j                  z   |
z   |_        |S t        |t        d|
      |g      }|S )Nr  r  rq  r'   r   ur   )r7  rc  r  r|  rm   r:   r=  rU  r  r<   r;   r%  )rQ   rH  r  r  r  r  rd  centered_annotationcentered_bodyr:   r  r  s               r5   _gensetzParser._gensetu
  s   ,'
F|NN$DDF	'5!4&)'--}/B/BC!!%3E9-1}S1W:Q# E "/!4!47J7Q7Q!QTX!XE  #Q E rF   c                r   |j                  d      }|d   }| j                         }|j                         }|j                  |j                  z
  |dz  z   }|j
                  |j                  z   }t        d|||d      }|j                  |j                  z
  }|j
                  |j                  z   }t        t        d|z        |t        d|z        g      }	t        t        |      t        d      |	g      }
|
j                  ||j                  |j                  z  d	z  z   d
|       |st        |j                   dz  dd      }n+t        |      }|j#                          |j#                          t        t        |g      g      }| dz  |_        t        |t%        |j                    dz        ||
g      }|gS )Nr  r  g      @rD  T)r  rh   rm       @rq  r  r   r  )r   r7  rc  r;   r%  r<   r  r;  r	  rU  r`  rK  rW  rX   r   rz   r:   r  r@  )rQ   r  r  r  r  rd  r;   r<   checkpadded_body	rightside
root_vlistrC  s                r5   r  zParser.sqrt
  s   xxG} 99;	 t0009s?B

T...|VUE$O 2 22e000 T!i-0$Q]8KLM5<f{CD	%..599"<!NN!5	*
 u{{S("b1D;DKKMKKME4&M?+
#)'C-
zU[[L3./ 	" #
 wrF   c                   |d   }| j                         }|j                         }|j                  |j                  z
  |dz  z   }|j                  |j                  z   }t        t        |      t        d      t        |g      g      }|j                  ||j                  |j                  z  dz  z   d|       t        |g      }|gS )Nr  r  rm  r  rq  )r7  rc  r;   r%  r<   rU  r`  rK  r;  rW  rX   r   )	rQ   r  r  r  rd  r;   r<   r  rC  s	            r5   r  zParser.overline
  s    F| 99;	t0009s?B

T... 5<fudV}EF	 	%..599"<!NN!5	* yk"wrF   c           	     $   | j                         }t        |      rt        |D cg c]  }t        |t              r|j
                  ! c}      }t        |D cg c]  }t        |t              r|j                  ! c}      }d }t        |      D ][  \  }	}
|
dk(  st        j                  t        ||	dz            }|dk7  rt        |||||      ||	dz   <   n|j                  |       ||	= ] t        j                  t        t        t        z     |      }nd}d}d}g }g }|dk7  r|j                  t        |||||             |j!                  |       |dk7  r|j                  t        |||||             t#        |      }|S c c}w c c}w )Nr  r   rN  )r  r   rk  )r7  r  rm   rw  r   r;   r<   	enumerater   r   r  remover  rz   r  r   r  r;  )rQ   frontmiddlebackr  r   r;   r<   r  idxelrS  middle_partr  rC  s                  r5   r  zParser._auto_sized_delimiter
  st     v;FMFq*Q:L!((FMNF&K&Q
1c8J&KLEF$V,R#sF37O4ACx*8 !65%+HsQw a(s - &&cDj!16:KFEFKC<LLufeU6JL[!3;LLtVUE&IKe? NKs   FFF/Fc                b    | j                  |d   d|v r|d   j                         ng |d         S )Nr  r  r  )r  r>  r?  s     r5   r  zParser.auto_delim
  s;    ))L$)TMDK rM	 	rF   c                l   | j                          | j                         }g }|d   }|D ]  }t        |t              rH|j                  d   }t        |t
              rd|_        |j                          |j                  |       [t        |t
              rsd|_        |j                  | j                  v s|j                  dd  | j                  v rd|_        |j                          |j                          |j                  |       |j                  |        | j                          t        |      S )Nr  r   r  r  )r<  r7  rw  r;  r&  r  rW   r  r   rS  _latin_alphabets_small_greekr:  )rQ   r  r  rC  r~  rS  r/  s          r5   r%  zParser.boldsymbol
  s     G}A!U#JJqMa&!AF%%'QAt$CC400033qr7d///#AF%%'!!#QQ! " 	U|rF   c                   |d   }| j                         }|j                         }|d   D cg c]  }t        |       }}t        t	        d |            }g }|D ]1  }	t        |	g      }
|
j                  |d       |j                  |
       3 t        |t        d|dz        gt        |      z        D cg c]  }|D ]  }|  }}}|d= t        |      }t        |g      g}|S c c}w c c}}w )Nr  r   c                    | j                   S rO   ry  r  s    r5   <lambda>z!Parser.substack.<locals>.<lambda>  s    aggrF   rq  rh   r  )r7  rc  r;  rm   rT   r|  r=  r   zipr  r  rU  )rQ   r  r  r  rd  r/  rC  	max_widthr  r  cppairr   stackr  r5  s                   r5   r"  z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   C(8C-r  )
rH  r   r4  r   rX   r9   r   r9   r{   r;  r  )r  r   r{   zlist[Hlist])r  r   r{   r   )r  r   r{   r  )rI  r9   r{   r@  )rH  r   r  rp   r  zParseResults | dict[str, str]r{   r  r  )r{   r  )r  r  r{   r|   )r  r   r  r   r  re  r  r  rY   r;  r  r;  r{   r  )r  r   r  zlist[Box | Char | str]r  r   r{   r  )Ur@   rA   rB   rC   enumEnumr  r`  ra  rX  rZ  _arrow_symbolsrW  r[  r  ry  r  r
  r  _ambi_delimsrY  _right_delimsr  r  r.   r  r~  r  r   r  stringascii_lettersr  rR   r%   r7  r:  r<  r)  r'  r&  r(  staticmethodr   convertToFloatr  r   rJ  r  r  r  r3   r	  r  r  r  r  r$  r  r  r  r  r  r  rW   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r%  r"  r   )r   r(  r  r  r   s   0000@r5   r  r    sa   TYY  
0 %'36  5j  %uwk5(n  	0 
1N4 (*;;nLO7==?@  57
 >DDFGLRRTU 33857<J   !57$O
  //4uw8L  

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

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