
    P/PhC                   6   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<          j=        dk     rddlm>Z? nddlm?Z? ej@        rddlAmBZB ddl3mCZC  ejD                      ejE        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jN                  ZO G d$ d%eOejP        &          ZQ G d' d(eQ          ZR G d) d*eQ          ZS G d+ d,eSejP        &          ZT G d- d.eT          ZU G d/ d0eT          ZV G d1 d2eS          ZW G d3 d4eW          ZXd5ZYd6ZZ G d7 d8          Z[ G d9 d:e[          Z\ G d; d<e[          Z] G d= d>e[          Z^ G d? d@e[          Z_ G dA dBe[          Z`i dCe`dDe`dEe_dFe\dGe\dHe\dIe\dJe\dKe\dLe\dMe]dNe]dOe]dPe]dQe]dRe]dSe]e`e`dTZaddXZb G dY dZ          Zc G d[ d\ec          Zd G d] d^ed          Ze G d_ d`ed          Zf G da dbec          Zg G dc ddeg          Zh G de dfed          Zi G dg dhei          Zj G di djei          Zk G dk dled          Zl G dm dnel          Zm G do dpel          Zn G dq dre          Zo eodsdtddsd           eodsdtdudsd           eodsdtddsd           eodsdsddtd           eodsdsddtdu           eodsdsddtd           eodsdsddsd           eodsdtddvd          dweo_p         G dx dyec          Zq G dz d{ej          Zr G d| d}ek          Zs G d~ dec          Zt G d dej          Zu G d dej          ZvdddZwddZx G d dV          ZyddZz G d d          Z{dS )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.mathtextsymbolstrreturnintc                    	 t          |           S # t          $ r Y nw xY w	 t          |                     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)r,   errs     T/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/matplotlib/_mathtext.pyget_unicode_indexr9   5   s    6{{   v||D))**   NNN 	s#    
A 
A$AA$c                  F    e Zd ZU dZded<   ded<   ded<   ded<   ded	<   d
S )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__     r8   r;   r;   K   sQ           LLLMMMLLL::::222222rI   r;   c                  P    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
S )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.
    r<   oxoyr=   r>   r?   r"   imageNrB   rH   rI   r8   rK   rK   a   sR           IIIIIILLLMMMLLLOOOOOrI   rK   c                  *    e Zd ZdZddZddZddZdS )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`.
    boxBoxc                0    || _         g | _        g | _        d S N)rQ   r@   rA   )selfrQ   s     r8   __init__zOutput.__init__   s    ;=>@


rI   r.   r;   c                    t          t          j        | j        j        | j        j        | j        j        g          \  }}fd| j        D             }fd| j        D             }t          ||z   |||          S )Nc                Z    g | ]'\  }}}|j         |j        |j        ||z
  |j        z   f(S rH   )fontfontsizenumoffset).0rL   rM   infohs       r8   
<listcomp>z$Output.to_vector.<locals>.<listcomp>   sK     / / /"b$ y$-2q2v7KL / / /rI   c                8    g | ]\  }}}}||z
  ||z
  ||z
  fS rH   rH   )r]   x1y1x2y2r_   s        r8   r`   z$Output.to_vector.<locals>.<listcomp>   sF     0 0 0 "b"b 1r627BG, 0 0 0rI   )
mapnpceilrQ   r=   r>   r?   r@   rA   r;   )rU   wdgsrsr_   s        @r8   	to_vectorzOutput.to_vector   s    Gdhndhotx~FH H1a/ / / /"&+/ / /0 0 0 0$(J0 0 01a!eQB///rI   antialiasedboolrK   c               2   t          g d | j        D             d | j        D             d          dz
  }t          g d | j        D             d | j        D             d          dz
  }t          g d | j        D             d | j        D             d          dz   }t          g d	 | j        D             d
 | j        D             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 ]Q\  }}}|j                            |	t          |          t          ||j        j        z
            |j        |           R|
j        D ]\  }}}}t          t          ||z
            dz
  d          }|dk    r!||z   dz  }t          ||dz   dz  z
            }nt          |          }|	                    t          |          |t          t          j
        |                    ||z              t%          dd|||z   ||	          S )Nc                4    g | ]\  }}}||j         j        z   S rH   )metricsxminr]   rL   rM   r^   s       r8   r`   z$Output.to_raster.<locals>.<listcomp>   (    MMMRb4<,,MMMrI   c                    g | ]	\  }}}}|
S rH   rH   r]   rb   rc   rd   re   s        r8   r`   z$Output.to_raster.<locals>.<listcomp>        :::^RRb:::rI   r   r   c                4    g | ]\  }}}||j         j        z
  S rH   )rr   ymaxrt   s       r8   r`   z$Output.to_raster.<locals>.<listcomp>   ru   rI   c                    g | ]	\  }}}}|
S rH   rH   rw   s        r8   r`   z$Output.to_raster.<locals>.<listcomp>   rx   rI   c                4    g | ]\  }}}||j         j        z   S rH   )rr   xmaxrt   s       r8   r`   z$Output.to_raster.<locals>.<listcomp>   ru   rI   c                    g | ]	\  }}}}|
S rH   rH   rw   s        r8   r`   z$Output.to_raster.<locals>.<listcomp>   rx   rI   c                4    g | ]\  }}}||j         j        z
  S rH   )rr   yminrt   s       r8   r`   z$Output.to_raster.<locals>.<listcomp>   ru   rI   c                    g | ]	\  }}}}|
S rH   rH   rw   s        r8   r`   z$Output.to_raster.<locals>.<listcomp>   rx   rI   )rn      )minr@   rA   maxrQ   r?   r>   r"   r/   rg   rh   shiprY   draw_glyph_to_bitmaprr   icebergglyphdraw_rect_filledrK   )rU   rn   rs   r   r}   rz   ri   r_   rj   rN   shiftedrL   rM   r^   rb   rc   rd   re   r>   centerys                        r8   	to_rasterzOutput.to_raster   s     ?MMMMM ?::tz:::?<=? @ @BCD ?MMMMM ?::tz:::?<=? @ @BCD ?MMMMM ?::tz:::?<=? @ @BCD ?MMMMM ?::tz:::?<=? @ @BCD4K4K$(.(4K$(/)RWQZZ#bga#a))m.D.D*E*EFF tx4%$00#N 	) 	)LBDI**s2wwB)=$= > >
' + ) ) ) ) &m 	M 	MNBBR"W)1--F{{r'Q&1*!1122GG""3r77As272;;/?/?VLLLL1aAE1e444rI   N)rQ   rR   )r.   r;   )rn   ro   r.   rK   )rC   rD   rE   rF   rV   rm   r   rH   rI   r8   rP   rP   x   s^         A A A A
0 0 0 0"5 "5 "5 "5 "5 "5rI   rP   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<   ded	<   ded
<   ded<   dS )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).
    r<   advancer>   r=   rs   r}   r   rz   r   ro   slantedNrB   rH   rI   r8   r   r      sm          ( NNNMMMLLLKKKKKKKKKKKKNNNMMMMMrI   r   c                  V    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<   dS )FontInfor!   rY   r<   rZ   r-   postscript_namer   rr   r/   r[   r+   r   r\   NrC   rD   rE   rG   rH   rI   r8   r   r      sU         MMMOOOHHHLLLMMMMMrI   r   c                  b    e Zd ZdZd/dZd0dZd1dZd2dZd3dZd4d#Z	d5d(Z
d6d)Zd6d*Zd7d-Zd.S )8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.
    default_font_propr   load_glyph_flagsr$   c                "    || _         || _        dS )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)r   r   )rU   r   r   s      r8   rV   zFonts.__init__   s     "3 0rI   font1r-   
fontclass1sym1	fontsize1r<   font2
fontclass2sym2	fontsize2dpir.   c
                    dS )z
        Get the kerning distance for font between *sym1* and *sym2*.

        See `~.Fonts.get_metrics` for a detailed description of the parameters.
                rH   )
rU   r   r   r   r   r   r   r   r   r   s
             r8   get_kernzFonts.get_kern   s	     rrI   rY   r!   c                    t           rT   NotImplementedError)rU   rY   s     r8   	_get_fontzFonts._get_font   s    !!rI   
font_classsymrZ   r   c                    t           rT   r   )rU   rY   r   r   rZ   r   s         r8   	_get_infozFonts._get_info      !!rI   r   c                B    |                      |||||          }|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   rr   )rU   rY   r   r   rZ   r   r^   s          r8   get_metricszFonts.get_metrics  s%    2 ~~dJXsCC|rI   outputrP   rL   rM   Nonec	                r    |                      |||||          }	|j                            |||	f           dS )z
        At position (*ox*, *oy*), draw the glyph specified by the remaining
        parameters (see `get_metrics` for their detailed description).
        N)r   r@   append)
rU   r   rL   rM   rY   r   r   rZ   r   r^   s
             r8   render_glyphzFonts.render_glyph!  s?     ~~dJXsCCb"d^,,,,,rI   rb   rc   rd   re   c                B    |j                             ||||f           dS )zL
        Draw a filled rectangle from (*x1*, *y1*) to (*x2*, *y2*).
        N)rA   r   rU   r   rb   rc   rd   re   s         r8   render_rect_filledzFonts.render_rect_filled*  s)    
 	RR,-----rI   c                    t                      )zF
        Get the xheight for the given *font* and *fontsize*.
        r   rU   rY   rZ   r   s       r8   get_xheightzFonts.get_xheight1  s     "###rI   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       r8   get_underline_thicknesszFonts.get_underline_thickness7  s    
 "###rI   fontnamelist[tuple[str, str]]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.
        rH   rU   r   r   s      r8   !get_sized_alternatives_for_symbolz'Fonts.get_sized_alternatives_for_symbol>  s     3  rI   Nr   r   r   r$   r   r-   r   r-   r   r-   r   r<   r   r-   r   r-   r   r-   r   r<   r   r<   r.   r<   )rY   r-   r.   r!   )rY   r-   r   r-   r   r-   rZ   r<   r   r<   r.   r   )rY   r-   r   r-   r   r-   rZ   r<   r   r<   r.   r   )r   rP   rL   r<   rM   r<   rY   r-   r   r-   r   r-   rZ   r<   r   r<   r.   r   r   rP   rb   r<   rc   r<   rd   r<   re   r<   r.   r   rY   r-   rZ   r<   r   r<   r.   r<   r   r-   r   r-   r.   r   )rC   rD   rE   rF   rV   r   r   r   r   r   r   r   r   r   rH   rI   r8   r   r      s         1 1 1 1   " " " "" " " "   8- - - -. . . .$ $ $ $$ $ $ $! ! ! ! ! !rI   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).
    r   r   r   r$   c                   t                                          ||           t          j        | j                  | _        i | _        i | _        t          | j                  }t          |          }|| j        d<   || j        d<   d S )Ndefaultregular)
superrV   	functoolscacher   _fontsfontmapr   r   r    )rU   r   r   filenamedefault_font	__class__s        r8   rV   zTruetypeFonts.__init__O  s{    *,<==="88-/D233))!-I!-IrI   rY   	str | intr.   r!   c                   || j         v r| j         |         }nt          j        t          |          }| j                            |          }|ht          j                            |          rIt          |          }|| j        |<   || j        |j
        <   || j        |j
                                        <   t          j        t          |          S rT   )r   Tcastr-   r   getospathexistsr    r   lowerr!   )rU   rY   basenamecached_fonts       r8   r   zTruetypeFonts._get_font[  s    4<|D)HH vc4((Hkooh//27>>(#;#;"8,,K$/DK!7BDK34?JDK399;;<vg{+++rI   r   r+   rZ   r<   r   c                N    |j         dk    r|j        dz  dz  |dz  |z  dz  z   S dS )NCmex10@   r   r'   H   r   )r   r>   )rU   rY   r   rZ   r   s        r8   _get_offsetzTruetypeFonts._get_offsetj  s:    8++L2%)hqj3.>r.ABBrrI   r   r-   r   r   tuple[FT2Font, int, bool]c                    t           rT   r   )rU   r   r   r   s       r8   
_get_glyphzTruetypeFonts._get_glyphp  r   rI   r   c                   |                      |||          \  }}}|                    ||           |                    || j                  }	d |	j        D             \  }
}}}|                     ||	||          }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  V  
dS )r   NrH   )r]   vals     r8   	<genexpr>z*TruetypeFonts._get_info.<locals>.<genexpr>{  s&      !A!As#(!A!A!A!A!A!ArI      r   )	r   r>   r=   rs   r}   r   rz   r   r   )rY   rZ   r   rr   r[   r   r\   )r   set_size	load_charr   bboxr   r   linearHoriAdvancer>   r=   horiBearingYr   r   )rU   r   r   r   rZ   r   rY   r[   r   r   rs   r   r}   rz   r\   rr   s                   r8   r   zTruetypeFonts._get_infou  s   !__Xz3GGc7h$$$s$*?@@!A!Aej!A!A!AdD$!!$x==+e3<"$+"&+f4
 
 
  0
 
 
 	
rI   c                   |                      |          }|                    ||           |                    d          }|0|                     |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rcParamsr   )rU   r   rZ   r   rY   r   rr   r   s           r8   r   zTruetypeFonts.get_xheight  s    ~~h''h$$$""6**<&&#,'9:C3P PG?"	?T)ho>#+NrI   c                    d|z  |z  dz  S )Ng      ?g      R@rH   r   s       r8   r   z%TruetypeFonts.get_underline_thickness  s     (3.$66rI   r   r   r   r   r   r   r   r   c
                <   ||k    rm||k    rg|                      |||||	          }
|                      |||||	          }|
j        }|                    |
j        |j        t          j                  dz  S t                                          |||||||||		  	        S )Nr   )r   rY   get_kerningr[   r#   DEFAULTr   r   )rU   r   r   r   r   r   r   r   r   r   info1info2rY   r   s                r8   r   zTruetypeFonts.get_kern  s     E>>i944NN5*dIsKKENN5*dIsKKE:D##EIuy'/JJROOwwz4 %z4CI I 	IrI   r   )rY   r   r.   r!   )
rY   r!   r   r+   rZ   r<   r   r<   r.   r<   r   r-   r   r-   r   r-   r.   r   )r   r-   r   r-   r   r-   rZ   r<   r   r<   r.   r   )r   r-   rZ   r<   r   r<   r.   r<   r   r   )rC   rD   rE   rF   rV   r   r   r   r   r   r   r   __classcell__r   s   @r8   r   r   I  s         

. 
. 
. 
. 
. 
., , , ,   " " " "

 
 
 
>
 
 
 
7 7 7 7	I 	I 	I 	I 	I 	I 	I 	I 	I 	IrI   r   )	metaclassc                  h    e Zd ZdZdddddddd	ZdA fdZ ed                                          ZdBd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 d0d1g d2d3g d4d5g d6d7g d8d9d:gd;d<gd=Z
d>D ]\  ZZe
e         e
e<   dCd@Z xZS )D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exr   r   r   r$   c                    t          ||          | _        t                                          ||           | j                                        D ](\  }}t          |          }|| j        |<   || j        |<   )d S rT   )	StixFonts_stix_fallbackr   rV   _fontmapitemsr   r   )rU   r   r   keyr   fullpathr   s         r8   rV   zBakomaFonts.__init__  s    '(9;KLL*,<===++-- 	) 	)HC}}H (DL (DL	) 	)rI   
\int \ointr   r-   r   r   r.   r   c                   d }|| j         v r>|t          v r5t          |         \  }}|dk    p|| j        v }|                     |          }n?t	          |          dk    r,|dk    }|                     |          }|t          |          }||                    |          dk    r|||fS | j                            |||          S )Nr  r   r  r   )	r   r   _slanted_symbolsr   lenr2   get_char_indexr  r   )rU   r   r   r   rY   r   r[   r   s           r8   r   zBakomaFonts._get_glyph  s    t|##(>(>+C0MHc8+Lt7L0LG>>(++DDXX]]4'G>>(++D#hh 3 3C 8 8A = =g%%&11(JLLLrI   ())r  r"  )r     ¡)r     ³)r     µ)r     Ã)))r  r'  )r     ¢)r     ´)r     ¶)r  !{))r  r,  )r     ©)r  n)r     ½)r  r"  }))r  r0  )r     ª)r  o)r     ¾)r  r'  [))r  r4  )r     £)r  r_   )r  "]))r  r7  )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  -r[  ))r  r[  )r     ±)r  .)r     Ë)r  ,z\widehat))r  ^)r  b)r  c)r  rj   z
\widetilde))r  ~)r  e)r  f)r  g)r  r_   rL  )r  r9  rQ  )<>)
)z
\leftparenr"  )z\rightparentr'  )z
\leftbracer,  )z\rightbracer0  )z\leftbracketr4  )z\rightbracketr7  )\{r,  )\}r0  )\[r4  )\]r7  r   c                >    | j                             |||fg          S rT   )_size_alternativesr   r   s      r8   r   z-BakomaFonts.get_sized_alternatives_for_symbol  s"    &**3(C0ABBBrI   r   r  r   )rC   rD   rE   rF   r  rV   setsplitr  r   rp  aliastargetr   r  r  s   @r8   r  r    s          H) ) ) ) ) ) s=..0011M M M M('
 8 8 8'
 	 8 8 8'

 	 8 8 8'
 	 8 8 8'
 	 ( ( ('
 	 ( ( ('
 	 8 8 8'
" 	 8 8 8#'
& 	 8 8 8''
* 	 8 8 8+'
. 	 8 8 8/'
2 	 8 8 83'
6 	 8 8 87'
: 	 8 8 8;'
> 	 8 8 8?'
B 	 ( ( (C'
F 	 ( ( (G'
J %k2$k2M'
 '
 '
R	( 
? 
?v %7v$>5!!C C C C C C C CrI   r  c                       e Zd ZdZdddZd fd	Z ed
                                          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"  r   r   r   r$   c                   t           j        d         }t          t          t          d                    |          }|r |||          nd | _        t                                          ||           d	                                D ]0}t           j        d|z            }t          |          }|| j        |<   1t          d          }t          |          }|| j        d<   t          | j        t                    rFddd	d
ddd}|                                D ]*\  }	}
t          |
          }|| j        |	<   || j        |
<   )d S d S )Nzmathtext.fallback)stixstixsanscmzcal rm tt it bf sf bfitz	mathtext.r  r  STIXGeneralSTIXSizeOneSymSTIXSizeTwoSymSTIXSizeThreeSymSTIXSizeFourSymSTIXSizeFiveSym)r   r   r   r'         )r   r   r  StixSansFontsr  r   _fallback_fontr   rV   rr  r   r   r   
isinstancer  )rU   r   r   fallback_rcfont_clstexfontproprY   stixsizedaltfontssizenamer  r   s               r8   rV   zUnicodeFonts.__init__0  sx   l#67%0
 0
 #k

	 	 #+ 5xx(9;KLLL04 	 	*,<===06688 	) 	)G<g 56DD>>D$(DL!!h''~~!T d)955 	.!$$&%%!' !' 05577 . .
d#D>>%-T"%-T""	. 	.. .rI   r  r   r-   r   uniindexr/   r.   tuple[str, int]c                
    ||fS rT   rH   )rU   r   r   r  s       r8   _map_virtual_fontzUnicodeFonts._map_virtual_fontU  s    !!rI   r   r   c                   	 t          |          }d}n<# t          $ r/ t          d          }d}t                              d|           Y nw xY w|                     |||          \  }}|}|r|dk    r\|dk     rVt          |          }t          j        |          d         dk    s't          j	        |          
                    d	          rd
}|dk    p|| j        v }d}|                     |          }	|	_|| j        v r9|	j        dk    r.t          t!          j        d                    }	| j        |         }|	                    |          }
|
dk    rd}|s| j        r|dv rt)          | j        t*                    rd
}| j                            |||          }|d         j        }|t/          t0          j                                                  v rd}t                              d||           |S |dv r,t)          | t*                    r|                     d
||          S t                              d|||           |                     d
          }	d}d}|	||fS )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.   )r9   r6   r2   _logwarningr  chrunicodedatacategoryr  
startswithr  r   _cmr10_substitutionsfamily_namer    r   _get_data_pathr!  r  r  r  r   listr  r  valuesr^   )rU   r   r   r   r  found_symbolnew_fontnamecharr   rY   
glyphindexrh  familys                r8   r   zUnicodeFonts._get_glyphY  s   	C(--HLL 	C 	C 	C3xxH LLL<cBBBBB	C
 "33j(, ,(    	(4Hw$6$68}}(..q1S88&+D11<<_MM 9#'L#t+Lt7L0LG L>>,//D 999 ,77#,-CDDF FD#8BH!00::
??#'L 	 "   111&t':IFF 2#H'228ZMM1)T+"6"="="?"?@@@@.F		:CHHH  111&tY77 2??4SAAA A)3: : : ~~d++Xw&&s    6AAr   c                P    | j         r| j                             ||          S ||fgS rT   )r  r   r   s      r8   r   z.UnicodeFonts.get_sized_alternatives_for_symbol  s:     	&HH#  3  rI   r   r   r-   r   r-   r  r/   r.   r  r  r   )rC   rD   rE   rF   r  rV   rq  rr  r  r  r   r   r  r  s   @r8   rv  rv    s        	 	  
!. !. !. !. !. !.F s=..0011" " " "=' =' =' ='~! ! ! ! ! ! ! !rI   rv  c                  8     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  r   r   r   r$   c                   t          | t                    rt          ||          | _        nt	          ||          | _        t          ||          | _        t                              | ||           | j	        
                    dddddd           | j	                                        D ](\  }}t          |          }|| j        |<   || j        |<   )d S )Nr  r  r  r  r  )r   r   r'   r  r  )r  DejaVuSerifFontsr  r  r  r  bakomar   rV   r  updater  r   r   rU   r   r   r  r  r  s         r8   rV   zDejaVuFonts.__init__  s    d,-- 	U"+,=?O"P"PD"/0ACS"T"TD!"35EFFt%68HIII!  
 
 	 	 	 ,,.. 	* 	*IC~~H (DL!)DL	* 	*rI   r   r-   r   r   r.   r   c                V   |dk    r| j                             |||          S t          |          }|                     d          }|>|                    |          }|dk    r#t                                          d||          S t                                          |||          S )N\primer  r   )r  r   r9   r   r!  r   )rU   r   r   r   r  rY   r  r   s          r8   r   zDejaVuFonts._get_glyph  s     );))(JDDD )--H>>$''D!00::
?? 77--dJDDD77%%h
C@@@rI   r   r  )rC   rD   rE   r  rG   rV   r   r  r  s   @r8   r  r    sn         %'H''''* * * **A A A A A A A A A ArI   r  c            	      (    e Zd ZdZddddddddd	Zd
S )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rC   rD   rE   rF   r  rH   rI   r8   r  r    s>          #(* $	 	HHHrI   r  c            	      (    e Zd ZdZdddddddddZd	S )
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  rH   rI   r8   r  r    s>          "') #	 	HHHrI   r  c                  x    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dS )&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.
    r~  zSTIXGeneral:italiczSTIXGeneral:weight=boldzSTIXGeneral:italic:boldSTIXNonUnicodezSTIXNonUnicode:italiczSTIXNonUnicode:weight=boldr  r  r  r  r  )r  r  r  r  nonunirmnonuniitnonunibfr   r   r   r'   r  r  r  r  NFr   r   r   r$   c                    t                               | ||           | j                                        D ](\  }}t	          |          }|| j        |<   || j        |<   )d S rT   )r   rV   r  r  r   r   r  s         r8   rV   zStixFonts.__init__  sm    t%68HIII,,.. 	* 	*IC~~H (DL!)DL	* 	*rI   r   r-   r   r  r/   r.   r  c                   t          j        |          }| j        r||dvrt           d         }d}nd}t          |t                    r"	 ||         }n2# t
          $ r |d         }Y nw xY wt          |t                    r|}nd }|d}t          |          }||k     r7||z   dz  }	||	         }
||
d         k     r|	}n||
d         k    rn|	dz   }||k     7|
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 nd|z   }||fS )N)r   r   r  TFr  r   r   r   r'   r   )r  r  )r  r  r  r  i   i  nonuni)r   r   _sansr  dictr5   r  r   r   r   r   )rU   r   r   r  font_mappingdoing_sans_conversionmappinglohimidranges              r8   r  zStixFonts._map_virtual_font  s    *-h77J 	*</$:::-d3L$(!!$)!lD)) 	-&z2 - - -&t,-d++ 	"GGGBWBr''"uqjeAh&&BBq))qB r'' Qx8////uQx/////#eAh.q9 8* <<(:; |##'+Hh??H 111f6R6R6R6RF6R6R6R6R6R(*H!!s   
A A('A(r   -list[tuple[str, str]] | list[tuple[int, str]]c                     ddddddd}|                     ||          }	 t          |          n# t          $ r ||fgcY S w xY w fdt          d	          D             }|d
k    r
|d d         }|S )Nr,  r0  r4  r7  u   ⟨u   ⟩)rk  rl  rm  rn  ri  rj  c                    g | ]?}                     |                                        d k    .|t                    f@S )r   )r   r!  r  )r]   r9  rU   r  s     r8   r`   z?StixFonts.get_sized_alternatives_for_symbol.<locals>.<listcomp>W  sU     L L Lq>>!,,;;HEEJJ CMM*JJJrI      rU  )r   r9   r6   r  )rU   r   r   fixesalternativesr  s   `    @r8   r   z+StixFonts.get_sized_alternatives_for_symbolH  s     s3s67
 

 iiS!!	%(--HH 	% 	% 	%sO$$$$	%L L L L LE!HH L L L ,',Ls   3 AAr   r  )r   r-   r   r-   r.   r  )rC   rD   rE   rF   r  rG   r  r  rV   r  r   r   r   rH   rI   r8   r  r    s         
 
 "')$+0& &H     NE* * * *4" 4" 4" 4"l _   _  rI   r  c                      e Zd ZdZdZdS )r  zd
    A font handling class for the STIX fonts (that uses sans-serif
    characters by default).
    TN)rC   rD   rE   rF   r  rH   rI   r8   r  r  `  s          EEErI   r  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<   dS )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)rC   rD   rE   rF   r  rG   r  r  r  r  r  r  r  rH   rI   r8   r  r    s           '+L**** "%G$$$$ "D!!!! "D!!!! "D!!!!  %E$$$$
 (+M**** ),N++++++rI   r  c                  .    e Zd ZdZdZdZdZdZdZdZ	dZ
dS )ComputerModernFontConstantsg333333?r  g?r  N)rC   rD   rE   r  r  r  r  r  r  r  r  rH   rI   r8   r  r    s6        LGDDDEMNNNrI   r  c                  &    e Zd ZdZdZdZdZdZdZdS )STIXFontConstantsr  皙?333333?r  r  N)	rC   rD   rE   r  r  r  r  r  r  rH   rI   r8   r  r    s,        LDDEMNNNrI   r  c                      e Zd ZdZdZdZdZdS )STIXSansFontConstantsr  r  r  r  N)rC   rD   rE   r  r  r  r  rH   rI   r8   r  r    s"        LDMNNNrI   r  c                      e Zd ZdS )DejaVuSerifFontConstantsNrC   rD   rE   rH   rI   r8   r  r            DrI   r  c                      e Zd ZdS )DejaVuSansFontConstantsNr  rH   rI   r8   r  r    r  rI   r  r  r  r  r  r  r  r	  r  r  r
  r~  r  r  r  r  r  r  )zBitstream Vera SanszBitstream VerastateParserStatetype[FontConstantsBase]c                    t                               | j                            | j                  j        t                    }|t          u r!t          | j        t                    rt          S |S rT   )_font_constant_mappingr   fontsetr   rY   r  r  r  r  r  r  )r  	constantss     r8   _get_font_constant_setr    sb    &**
++79JL LI 	&&&u}m44 	'$$rI   c                  :    e Zd ZdZddZddZdd
ZddZddZdS )NodezA node in the TeX box model.r.   r   c                    d| _         d S Nr   r  rU   s    r8   rV   zNode.__init__  s    			rI   r-   c                *    t          |           j        S rT   )typerC   r  s    r8   __repr__zNode.__repr__  s    Dzz""rI   nextNode | Noner<   c                    dS Nr   rH   )rU   r  s     r8   r   zNode.get_kerning  s    srI   c                &    | xj         dz  c_         dS )z
        Shrinks one level smaller.  There are only three levels of
        sizes, after which things will no longer get smaller.
        r   Nr   r  s    r8   shrinkzNode.shrink  s    
 			Q				rI   r   rP   r   r   c                    dS )zRender this node.NrH   rU   r   r   r   s       r8   renderzNode.render  s      rI   Nr.   r   r.   r-   r  r  r.   r<   r   rP   r   r<   r   r<   r.   r   )	rC   rD   rE   rF   rV   r  r   r
  r  rH   rI   r8   r  r    s~        &&   # # # #                 rI   r  c                  8     e Zd ZdZd fdZd fd	ZddZ xZS )rR   z A node with a physical location.r=   r<   r>   r?   r.   r   c                r    t                                                       || _        || _        || _        d S rT   )r   rV   r=   r>   r?   )rU   r=   r>   r?   r   s       r8   rV   zBox.__init__  s2    



rI   c                    t                                                       | j        t          k     rA| xj        t
          z  c_        | xj        t
          z  c_        | xj        t
          z  c_        d S d S rT   )r   r
  r  NUM_SIZE_LEVELSr=   SHRINK_FACTORr>   r?   rU   r   s    r8   r
  z
Box.shrink  s`    9&&JJ=(JJKK=(KKJJ=(JJJJ '&rI   r   rP   rb   rc   rd   re   c                    d S rT   rH   r   s         r8   r  z
Box.render  s    rI   )r=   r<   r>   r<   r?   r<   r.   r   r  r   )rC   rD   rE   rF   rV   r
  r  r  r  s   @r8   rR   rR   	  su        **     ) ) ) ) ) )       rI   rR   c                  $     e Zd ZdZd fdZ xZS )Vboxz$A box with only height (zero width).r>   r<   r?   c                N    t                                          d||           d S r  r   rV   )rU   r>   r?   r   s      r8   rV   zVbox.__init__!  s%    VU+++++rI   )r>   r<   r?   r<   rC   rD   rE   rF   rV   r  r  s   @r8   r  r    sC        .., , , , , , , , , ,rI   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).r=   r<   c                N    t                                          |dd           d S r  r  rU   r=   r   s     r8   rV   zHbox.__init__(  s%    B'''''rI   r=   r<   r  r  s   @r8   r  r  %  sC        88( ( ( ( ( ( ( ( ( (rI   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`.
    rd  r-   r  r  c                    t                                                       || _        |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        |                                  d S rT   )	r   rV   rd  r  rY   r   rZ   r   _update_metrics)rU   rd  r  r   s      r8   rV   zChar.__init__9  sh    }J	*9 	rI   r.   c                    d| j         z  S )Nz`%s`rd  r  s    r8   r  zChar.__repr__E  s    rI   r   c                   | j                             | j        | j        | j        | j        | j                  x}| _        | j        dk    r|j        | _	        n|j	        | _	        |j
        | _        |j
        |j        z
   | _        d S )N )r  r   rY   r   rd  rZ   r   _metricsr   r=   r   r>   r?   rU   rr   s     r8   r&  zChar._update_metricsH  sy    "&,":":Ittx#I #I 	I$-6S== DJJ DJo78


rI   ro   c                    | j         j        S rT   )r+  r   r  s    r8   
is_slantedzChar.is_slantedR  s    }$$rI   r  r  r<   c                    | j         j        | j        z
  }d}t          |t                    rO| 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=   r  r$  r  r   rY   r   rd  rZ   r   )rU   r  r   kerns       r8   r   zChar.get_kerningU  sv     -'$*4dD!! 	<((	4?DFDM	4?DFDM D ~rI   r   rP   r   r   c           
     z    | j                             |||| j        | j        | j        | j        | j                   d S rT   )r  r   rY   r   rd  rZ   r   r  s       r8   r  zChar.rendere  sG    !!AqIttx	I 	I 	I 	I 	IrI   c                   t                                                       | j        t          k     rV| xj        t
          z  c_        | xj        t
          z  c_        | xj        t
          z  c_        | xj        t
          z  c_        d S d S rT   )	r   r
  r  r  rZ   r  r=   r>   r?   r  s    r8   r
  zChar.shrinkj  sp    9&&MM]*MMJJ]*JJKK]*KKJJ]*JJJJ	 '&rI   )rd  r-   r  r  r  r  )r.   ro   r  r  )rC   rD   rE   rF   rV   r  r&  r.  r   r  r
  r  r  s   @r8   r$  r$  ,  s        
 

 
 
 
 
 
   9 9 9 9% % % %    I I I I
+ + + + + + + + + +rI   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.
    r.   r   c                    | j                             | j        | j        | j        | j        | j                  x}| _        |j        |j	        z
  | _
        |j        |j        z
  | _        d| _        d S r  )r  r   rY   r   rd  rZ   r   r+  r}   rs   r=   rz   r   r>   r?   r,  s     r8   r&  zAccent._update_metricsy  se    "&,":":Ittx#I #I 	I$-\GL0
lW\1


rI   c                p    t                                                       |                                  d S rT   )r   r
  r&  r  s    r8   r
  zAccent.shrink  s/    rI   r   rP   r   r<   r   c           
         | j                             ||| j        j        z
  || j        j        z   | j        | j        | j        | j        | j	                   d S rT   )
r  r   r+  rs   r   rY   r   rd  rZ   r   r  s       r8   r  zAccent.render  s[    !!A**A0B,BIttx	I 	I 	I 	I 	IrI   r  r  )rC   rD   rE   rF   r&  r
  r  r  r  s   @r8   r4  r4  s  sw         
        I I I I I I I IrI   r4  c                  D     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).elementsT.Sequence[Node]c                    t                                          ddd           d| _        g || _        d| _        d| _        d| _        d S )Nr   r   )r   rV   shift_amountchildrenglue_set	glue_sign
glue_orderrU   r:  r   s     r8   rV   zList.__init__  sK    R$$$#(rI   r.   r-   c                    d                     t                                                      | j        | j        | j        | j        d                    d | j        D                                 S )Nz/{}<w={:.02f} h={:.02f} d={:.02f} s={:.02f}>[{}]z, c                ,    g | ]}t          |          S rH   )reprr]   r   s     r8   r`   z!List.__repr__.<locals>.<listcomp>  s    6661tAww666rI   )	formatr   r  r=   r>   r?   r=  joinr>  r  s    r8   r  zList.__repr__  sa    @GGGGJJ)II6666677	9 9 	9rI   r   r<   signr/   totalslist[float]
error_typer   c                   t          fdt          t                              d d d         D             d          x| _        }|| _        |         dk    r||         z  | _        nd| _        d| _        |dk    rEt          | j                  r3t          	                    d|t          |           j        |            d S d S d S )Nc              3  4   K   | ]}|         d k    |V  dS )r   NrH   )r]   r9  rJ  s     r8   r   z!List._set_glue.<locals>.<genexpr>  s+      CC1F1INNQNNNNCCrI   r  r   r   z	%s %s: %r)r  r  r   rA  r@  r?  
glue_ratior>  r  r  r  rC   )rU   r   rI  rJ  rL  r2  s      `  r8   	_set_gluezList._set_glue  s    "CCCCc&kk**44R40CCCQH H 	H! !9??q	MDMMDN DO664=!! D['d)<dD D D D D 6D DrI   c                    | j         D ]}|                                 t                                                       | j        t          k     r,| xj        t          z  c_        | xj        t          z  c_        d S d S rT   )r>  r
  r   r  r  r=  r  r?  )rU   childr   s     r8   r
  zList.shrink  st    ] 	 	ELLNNNN9&&.MM.MMMM '&rI   )r:  r;  r  )
r   r<   rI  r/   rJ  rK  rL  r-   r.   r   r  )	rC   rD   rE   rF   rV   r  rP  r
  r  r  s   @r8   r9  r9    s        ::     9 9 9 9 9 9D D D D / / / / / / / / / /rI   r9  c                  B     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.r   
additionalTr:  r;  ri   r<   rH  "T.Literal['additional', 'exactly']do_kernro   c                    t                                          |           |r|                                  |                     ||           d S )N)ri   rH  )r   rV   r0  hpack)rU   r:  ri   rH  rW  r   s        r8   rV   zHlist.__init__  sN     	""" 	IIKKK

Q!
rI   r.   r   c                f   g }t          | j                  }|rt          |          D ]}| j        |         }||dz
  k     r| j        |dz            }nd}|                    |           |                    |          }|dk    r$t          |          }|                    |           || _        dS dS )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)rU   new_childrennum_childrenr9  elemr  kerning_distancer0  s           r8   r0  z
Hlist.kern  s     4=)) 	)<(( . .}Q'|a'''=Q/DDD##D)))#'#3#3D#9#9 #r)) 011D ''---(DMMM	) 	)rI   c                   d}d}d}dgdz  }dgdz  }| j         D ][}t          |t                    r5||j        z  }t	          ||j                  }t	          ||j                  }Mt          |t                    r~||j        z  }t          j	        |j                  sZt          j	        |j                  sAt          |dd          }	t	          ||j        |	z
            }t	          ||j        |	z             }t          |t                    rG|j        }
||
j        z  }||
j        xx         |
j        z  cc<   ||
j        xx         |
j        z  cc<   <t          |t"                    r
||j        z  }]|| _        || _        |dk    r||z  }|| _        ||z
  }|dk    rd| _        d| _        d| _        dS |dk    r|                     |d|d           dS |                     |d	|d
           dS )a  
        Compute the dimensions of the resulting boxes, and adjust the glue if
        one of those dimensions is pre-specified.  The computed sizes normally
        enclose all of the material inside the new box; but some items may
        stick out if negative glue is used, if the box is overfull, or if a
        ``\vbox`` includes other boxes that have been shifted left.

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

        Notes
        -----
        The defaults produce a box with the natural width of the contents.
        r   r  r=  rU  r   Nr   Overfulr  Underful)r>  r  r$  r=   r   r>   r?   rR   rg   isinfgetattrGlue	glue_specstretch_orderstretchshrink_orderr
  r[  r@  rA  rO  rP  )rU   ri   rH  r_   rj   r   total_stretchtotal_shrinkrV  rY  rf  s              r8   rY  zHlist.hpack  s   0 qtax 	 	A!T"" QW18$$17OOAs## QWx)) ,"(172C2C ,>266AAqx!|,,AAqw{++AAt$$ K	Y_$i5666):KK666Y3444	8HH4444At$$ QW
FA
E77DNDO DOFr66NN1a	:::::NN1b,
;;;;;rI   )r   rU  T)r:  r;  ri   r<   rH  rV  rW  ro   r  r   rU  )ri   r<   rH  rV  r.   r   )rC   rD   rE   rF   rV   r0  rY  r  r  s   @r8   rT  rT    s        %%>A9E!%      ) ) ) )2  #6B?< ?< ?< ?< ?< ?< ?< ?< ?<rI   rT  c                  D     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   rU  r:  r;  r_   r<   rH  rV  c                x    t                                          |           |                     ||           d S )N)r_   rH  )r   rV   vpack)rU   r:  r_   rH  r   s       r8   rV   zVlist.__init__  s7    """

Q!
rI   rD  r.   r   c                   d}d}d}dgdz  }dgdz  }| j         D ]}	t          |	t                    rW|||	j        z   z  }|	j        }t          j        |	j                  s)t          |	dd          }
t          ||	j        |
z             }ot          |	t                    rM||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"                    rt%          d          || _        ||k    r|||z
  z  }|| _        n|| _        |dk    r||z  }|| _        ||z
  }|dk    rd| _        d| _        d| _        dS |dk    r|                     |d|d	           dS |                     |d
|d           dS )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   r  r=  z1Internal mathtext error: Char node found in VlistrU  r   Nr   ra  r  rb  )r>  r  rR   r>   r?   rg   rc  r=   rd  r   re  rf  rg  rh  ri  r
  r[  r$  RuntimeErrorr@  rA  rO  rP  )rU   r_   rH  rD  ri   rj   r   rj  rk  rV  rY  rf  s               r8   rp  zVlist.vpack$  s2   0 qtax 	I 	IA!S!! IQ\!Gx(( ,>266AAqw{++AAt$$ IQK	Y_$i5666):KK666Y3444	8HH4444At$$ IQ[ At$$ I"GI I II 
q55QJADJJDJFAE66DNDO DOFr66NN1a	:::::NN1b,
;;;;;rI   rl  )r:  r;  r_   r<   rH  rV  )r_   r<   rH  rV  rD  r<   r.   r   )	rC   rD   rE   rF   rV   rg   infrp  r  r  s   @r8   rn  rn    s}        ##>A9E      
  #6BG< G< G< G< G< G< G< G< G<rI   rn  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`.
    r=   r<   r>   r?   r  r  c                f    t                                          |||           |j        | _        d S rT   )r   rV   r  )rU   r=   r>   r?   r  r   s        r8   rV   zRule.__init__y  s,    ...}rI   r   rP   r   r   ri   r_   r.   r   c                N    | j                             |||||z   ||z              d S rT   )r  r   )rU   r   r   r   ri   r_   s         r8   r  zRule.render}  s.    ''1a!eQUCCCCCrI   )r=   r<   r>   r<   r?   r<   r  r  )r   rP   r   r<   r   r<   ri   r<   r_   r<   r.   r   )rC   rD   rE   rF   rV   r  r  r  s   @r8   ru  ru  n  sc         % % % % % %D D D D D D D DrI   ru  c                  &     e Zd ZdZdd	 fdZ xZS )
Hrulez.Convenience class to create a horizontal rule.Nr  r  	thicknessfloat | Nonec                    ||                                 }|dz  x}}t                                          t          j        |||           d S )Nr  get_current_underline_thicknessr   rV   rg   rs  )rU   r  rz  r>   r?   r   s        r8   rV   zHrule.__init__  sN    ==??I"S(66666rI   rT   )r  r  rz  r{  r  r  s   @r8   ry  ry    sH        887 7 7 7 7 7 7 7 7 7 7rI   ry  c                  $     e Zd ZdZd fdZ xZS )Vrulez,Convenience class to create a vertical rule.r  r  c                    |                                 }t                                          |t          j        t          j        |           d S rT   r}  )rU   r  rz  r   s      r8   rV   zVrule.__init__  s<    99;;	BFBFE:::::rI   )r  r  r  r  s   @r8   r  r    sC        66; ; ; ; ; ; ; ; ; ;rI   r  c                  B    e Zd ZU ded<   ded<   ded<   ded<   ded<   dS )		_GlueSpecr<   r=   rh  r/   rg  r
  ri  Nr   rH   rI   r8   r  r    sE         LLLNNNMMMrI   r  r         ?r   g      )filfillfilllneg_filneg_fill	neg_filllemptyssc                  0     e Zd ZdZd fdZd	 fdZ xZS )
re  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.)
    	glue_type`_GlueSpec | T.Literal['fil', 'fill', 'filll', 'neg_fil', 'neg_fill', 'neg_filll', 'empty', 'ss']c                    t                                                       t          |t                    rt          j        |         }n't          |t                    r|}nt          d          || _        d S )Nz.glue_type must be a glue spec name or instance)r   rV   r  r-   r  _namedr6   rf  )rU   r  rf  r   s      r8   rV   zGlue.__init__  sq     	i%% 	O!(3II	9-- 	O!IIMNNN"rI   r.   r   c                    t                                                       | j        t          k     r1| j        }|                    |j        t          z            | _        d S d S )Nr=   )r   r
  r  r  rf  _replacer=   r  )rU   rh  r   s     r8   r
  zGlue.shrink  sS    9&&AZZag.EZFFDNNN '&rI   )r  r  r  )rC   rD   rE   rF   rV   r
  r  r  s   @r8   re  re    so         # # # # # #G G G G G G G G G GrI   re  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.
    r:  
list[Node]c                    t                                          t          d          g|t          d          d           d S )Nr  FrW  r   rV   re  rB  s     r8   rV   zHCentered.__init__  s?    $t**<x<d<eLLLLLrI   r:  r  r  r  s   @r8   r  r    sQ         
M M M M M M M M M MrI   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.
    r:  r  c                    t                                          t          d          g|t          d                     d S )Nr  r  rB  s     r8   rV   zVCentered.__init__  s:    $t**<x<d<=====rI   r  r  r  s   @r8   r  r    sG         
> > > > > > > > > >rI   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   r=   r<   c                V    t                                                       || _        d S rT   )r   rV   r=   r!  s     r8   rV   zKern.__init__  s$    


rI   r.   r-   c                    d| j         z  S )Nzk%.02fr  r  s    r8   r  zKern.__repr__  s    $*$$rI   r   c                    t                                                       | j        t          k     r| xj        t
          z  c_        d S d S rT   )r   r
  r  r  r=   r  r  s    r8   r
  zKern.shrink  s@    9&&JJ-'JJJJ '&rI   r"  r  r  )
rC   rD   rE   rF   r>   r?   rV   r  r
  r  r  s   @r8   r[  r[    s          FE     % % % %( ( ( ( ( ( ( ( ( (rI   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.
    FNrd  r-   r>   r<   r?   r  r  alwaysro   factorr{  c                R   |j                             |j        |          }|j                             |j        |j        |j                  }|                                }||z   }	|D ]7\  }
}|
|_        t          ||          }|j        |j	        z   |	d|z  z
  k    r n8d}|j        dk    st          |          dk    r>||	|j        |j	        z   z  }|xj        |z  c_        t          ||          }||j	        z
  }t                                          |g           || _        d S )Nr  r   r   r   )r  r   rY   r   rZ   r   copyr$  r>   r?   r   r   rV   r=  )rU   rd  r>   r?   r  r  r  r  r   target_totalr   r   r  shiftr   s                 r8   rV   zAutoHeightChar.__init__  sA   }FFJ  -++J	3 3 

~) 	 	MHc!EJU##D {TZ'<#-+GGG H :??c,//144~%tz)ABNNf$NNU##DTZ'E$   !rI   )FN)rd  r-   r>   r<   r?   r<   r  r  r  ro   r  r{  r  r  s   @r8   r  r    sR          ?C" " " " " " " " " " "rI   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.
    Frd  r-   r=   r<   r  r  r  ro   
char_class
type[Char]c                h   |j                             |j        |          }|                                }|D ]%\  }}||_         |||          }	|	j        |k    r n&||	j        z  }
|xj        |
z  c_         |||          }	t                                          |	g           |	j        | _        d S rT   )r  r   rY   r  r=   rZ   r   rV   )rU   rd  r=   r  r  r  r  r   r   r  r  r   s              r8   rV   zAutoWidthChar.__init__$  s    }FFJ  

) 	 	MHc!EJ:c5))DzU"" # #& z#u%%$   Z


rI   )
rd  r-   r=   r<   r  r  r  ro   r  r  )rC   rD   rE   rF   r$  rV   r  r  s   @r8   r  r    sV          QV*.                     rI   r  r   r   rQ   xytuple[float, float]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   valuer<   r.   c                &    | dk     rdn	| dk    rdn| S )Ng    eg    eArH   )r  s    r8   clampzship.<locals>.clampI  s     t||tt5HrI   rQ   rT  r   c                   d}d}| j         }| j        }}}| j        D ]=}t          |t                    r(|                    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k    r,|dk    r&||
z   |                    z   z   ||	           ||z  t          |t$                    r|j        }|j        |z
  }|dk    rq|dk    r6|j        |k    r*||j        z  }t-           | j        |z                      }n5|j        |k    r*||j        z  }t-           | j        |z                      }||z  }|z  ?d S )Nr   r   Funreachable coder   )rA  r@  r>  r  r$  r  r=   r[  r9  r   r=  rT  rn  rR   r>   r?   rg   rc  re  rf  rg  rh  roundr?  ri  r
  )rQ   cur_gcur_gluerA  r@  	base_line	left_edgerV  edgerule_height
rule_depth
rule_widthrf  r  cur_hcur_v	hlist_outoff_hoff_vr   	vlist_outs                r8   r  zship.<locals>.hlist_outL  s    ^
M			 3	$ 3	$A!T"" 2$>>> At$$ /$ At$$ -$qz??a''QW$EE D%6E!!U++ 9!	!#Au-- 9!	!8&8888 17NE%EEAs## $hW
W
8K(( -"%*K8J'' +!$J??zA~~%
2EHHV"U]EEM'6 6 6 &E#At$$ $K	&_u4
>> A~~$2j@@$	(99H$)%%x0G*H*H$I$IE"/:== I$44 %eeCL8,C&D&D E Ee#
#g3	$ 3	$rI   rn  c                   d}d}| j         }| j        }}| j        z  }| j        D ]'}t	          |t
                    r|j        z  #t	          |t                    rt          |j                  dk    r|j        |j	        z   z  c|j        z  ||j
        z   }| j        |_        t	          |t                    r |           n+t	          |t                    r |           n
J d            ||j	        z   |t	          |t                    rg|j        }	|j	        }
|j        }t          j        |          r| j        }|	|
z  }	|	dk    r*|
dk    r$|	z  |                    z   z   ||	           Zt	          |t"                    r|j        }|j        |z
  }	|dk    rq|dk    r6|j        |k    r*||j        z  }t+           | j        |z                      }n5|j        |k    r*||j        z  }t+           | j        |z                      }|	|z  }	|	z  t	          |t2                    rt5          d          )d S )Nr   r   Fr  r   z1Internal mathtext error: Char node found in vlist)rA  r@  r>   r>  r  r[  r=   r9  r   r?   r=  rT  rn  rR   rg   rc  r  re  rf  rg  rh  r  r?  ri  r
  r$  rr  )rQ   r  r  rA  r@  r  top_edgerV  save_vr  r  r  rf  r  r  r  r  r  r  r   r  s                r8   r  zship.<locals>.vlist_out  s    ^
M		 .	I .	IA!T"" -I At$$ +Iqz??a''QX//EEQX%E%6E"F!iAG!!U++ 9!	!#Au-- 9!	!8&8888"QW,E%EEAs## IhW
W
8J'' +!$Jz)??zA~~[(EHHV"U]EEM'6 6 6 At$$ IK	'o5>> A~~$2j@@$	(99H$)%%x0G*H*H$I$IE"/:== I$44 %eeCL8,C&D&D E Eu$$At$$ I"GI I IIY.	I .	IrI   )r  r<   r.   r<   )rQ   rT  r.   r   )rQ   rn  r.   r   )r>   rP   r  rT  )rQ   r  rL   rM   r  r  r  r  r  r  r   r  s       @@@@@@@@r8   r   r   8  s    FBEEEOEC[[FI I I I=$ =$ =$ =$ =$ =$ =$ =$ =$ =$ =$ =$ =$~9I 9I 9I 9I 9I 9I 9I 9I 9I 9I 9I 9I 9Iv c5!!!!!IcNNNMrI   msgr   c                R     d
 fd	}t                                          |          S )z$Helper class to raise parser errors.rY  r-   locr/   toksr   r.   T.Anyc                &    t          | |          rT   r   )rY  r  r  r  s      r8   raise_errorzError.<locals>.raise_error  s    !!S#...rI   rY  r-   r  r/   r  r   r.   r  )r   setParseAction)r  r  s   ` r8   Errorr    s;    / / / / / / 77!!+...rI   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	dS )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.
    r  r   rY   r-   r   rZ   r<   r   c                L    || _         || _        || _        || _        || _        d S rT   )r  _fontr   rZ   r   )rU   r  rY   r   rZ   r   s         r8   rV   zParserState.__init__  s)    
$ rI   r.   c                *    t          j         |           S rT   )r  r  s    r8   r  zParserState.copy  s    yrI   c                    | j         S rT   )r  r  s    r8   rY   zParserState.font  s
    zrI   r  r   c                *    |dv r|| _         || _        d S )N)r  r  r  r  )r   r  )rU   r  s     r8   rY   zParserState.font  s     ---"DO


rI   c                X    | j                             | j        | j        | j                  S )z.Return the underline thickness for this state.)r  r   rY   rZ   r   r  s    r8   r~  z+ParserState.get_current_underline_thickness  s)    |33It}dh0 0 	0rI   N)
r  r   rY   r-   r   r-   rZ   r<   r   r<   r.   r  r  )r  r-   r.   r   )r.   r<   )
rC   rD   rE   rF   rV   r  propertyrY   setterr~  rH   rI   r8   r  r    s                   X 
[   [
0 0 0 0 0 0rI   exprargsc                    dfd|                      dd          d         }| |k    r+|d	                    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.
    eltr   r.   T.Generator[str, None, None]c              3     K   t          | t                    r| j        D ]} |          E d {V  d S | j        r| j        V  d S d S rT   )r  r   exprsresultsName)r  r  namess     r8   r  zcmd.<locals>.names	  s      c?++ 	"	 ' ' 5;;&&&&&&&&' '_ 	"/!!!!!	" 	"rI   r,  r   r    c              3      K   | ]	}d |z  V  
dS )z{%s}NrH   )r]   r  s     r8   r   zcmd.<locals>.<genexpr>  s&      BBdFTMBBBBBBrI   z	Expected )r  r   r.   r  )rr  rH  r  )r  r  csnamer7   r  s       @r8   cmdr    s    " " " " " " ZZQ"Ffnn BGGBBeeDkkBBBBBBB"& TE"3c"3"344455rI   c                      e Zd ZdZ G d dej                  Z ed                                          Z	 ed                                          Z
 ed                                          Ze	e
z  ez  Z ed                                          Z ed                                          Z ed	                                          Z ed
                                          Z ed                                          Z ed                                          Z ed                                          Z ed                                          Z ed                                          Zeez  ez  Z ed  e ed           ed          dz             D                       Z eej                  ZddZddZdd!Zdd"Z dd#Z!dd'Z"dd(Z#dd*Z$dd+Z% e&e'j(                  Z)dd,Z*dd/Z+d0d0d0d1d1d2d3d3d4dd5d6d7Z,dd8Z-dd9Z.dd=Z/dd>Z0i d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdNdVdFdWdHdXdJdYdLdZd@d[d\d]d^Z1 ed_                                          Z2dd`Z3ddaZ4ddbZ5ddcZ6dddZ7ddeZ8e8Z9ddfZ:ddgZ;ddhZ<ddlZ=ddmZ>ddnZ?d fdoZ@ddwZAddxZBddyZCddzZDdd{ZEdd|ZFdd}ZGeGxZHZIdd~ZJddZKddZLddZMddZNddZO xZPS )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dS )Parser._MathStyler   r   r   r'   N)rC   rD   rE   DISPLAYSTYLE	TEXTSTYLESCRIPTSTYLESCRIPTSCRIPTSTYLErH   rI   r8   
_MathStyler    s%        	rI   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
      c                    g | ]M}t          j        t          |                                                    d                                          NS )r  )r  r  r  rr  r   )r]   r9  s     r8   r`   zParser.<listcomp>  sX     G G G(Q006688<BBDD G G GrI   u   αu   ωr   r.   r   c                    t          j                    dJ fd}dKd	}t          d
          _         t	           j                  d          _         t	          d  j        D                       d          _         t          dd	                    d
                    t          t          j        t                                        z             d                                          _         t          d          d          _         |d j                  _        t)          d t	           j                  d          z             dz   _        t-          d          _        t	           j                  _        t5                      _        t5                      _        t5                      _        t5                      _        t5                      _        t5                      _         xj        j        z  c_         |             xj        d tC          j                   d          z   dz   z  c_        xj        d tE          j                   d          z   dz   z  c_        tG          dd                    d          z   dz             _$         |dg  j%         j&                                      d          z
  _'         |d j(                  _)        j         tC          j                   d          z   j        z   _*        j         tC          j                   d          z   tW                      z   _,        tG          d                    d                              d          z             _-        tG          d                    d                              d          z             _.        tG          d                    d                              d          z             _/        tG          dd t)          j                  d           z   dz   dz    t)          j                  d!          z   dz   dz                       d"          z   dz   dz    t)          j                  d#          z   dz                       d          z                       d          z             _0        tG          d$t)          d% tE          tc          d&          j         z             d'          z   d&z                                 d(          z             _2        tG          d)                    d*                    _3        tG          d+                    d,                              d*          z             _4        tG          d-                    d,                              d*          z             _5        tG          d.tm          dd/d0                    _7        tG          d1 tq          ddts          tE          j                             tC          t-          d2          :                                          z   3          d4                    _;         t)          j                  d5           tE          t	          d6d7g          j        z
            d8          z    t          d9          d:          z    t          d;          d:          z                      d5           t          d9          d:          z   z  _<        j        j$        z  j        z  j<        z  _=        xj         j=        j        z  j,        z  j        z  z  c_         tG          d<d tC          j=                  d          z   dz             _>        tG          d=d tC          j=                  d(          z   dz             _?        xj        j'        j        z  j)        z  j>        z  j*        z  j-        z  j.        z  j/        z  j0        z  j4        z  j5        z  j2        z  j3        z  j7        z  j?        z  j;        z  z  c_        d>                    d?          t          d@          z  z
  }xj        dA                    dB          t          d@          z  z
   tC          j=        j        z  |z            dC          z   dDz                       dE          t          d@          z  z
  z  c_        tE          j                   _A        tm          dFd/dGH          _B        t          dI                                          _C        jC        tC          jB        jC        z             z   tW                      z   _D         |             jD         _E        jA         _F        dG _G        d S )LNr.   r   c                    t                                                    D ]f\  } }|                     d          sL| dvr|                    |            t	          |           r#|                    t          |                      gd S )N_)token	placeable
auto_delim)varsr  r  setNamehasattrr  rd  )r  r   rV  rU   s     r8   set_names_and_parse_actionsz4Parser.__init__.<locals>.set_names_and_parse_actions  s     GGMMOO 	? 	?S~~c** ? "FFFC(((tS)) ?**74+=+=>>>	? 	?rI   groupr-   r  Iterable[str]r   c                   g }g }|D ]G}|d                                          r|                    |           2|                    |           Ht          d                    | d                    t          t          j        |                    |rdndd                    t          t          j        |                                        S )Nr  z<\\(?P<{group}>(?:{alpha})(?![A-Za-z]){additional}{nonalpha})|r  )r  alpharU  nonalpha)isalphar   r   rG  rH  rf   reescape)r  r  ends_with_alphaends_with_nonalphar  s        r8   csnamesz Parser.__init__.<locals>.csnames  s     O!# 4 48##%% 4#**40000&--d3333OVV((3ry/#B#BCC&8@ssb XXc")5G&H&HII	 W    rI   z[-+]?([0-9]+\.?[0-9]*|\.[0-9]+)spacec                6    g | ]}t          |j                  S rH   )r-   r  )r]   rf  s     r8   r`   z#Parser.__init__.<locals>.<listcomp>  s     333aS\\333rI   style_literalzI[a-zA-Z0-9 +\-*/<>=:,.;!\?&'@()\[\]|\U00000080-\U0001ffff]|\\[%${}\[\]_|]z|\\(?:{})(?![A-Za-z])r  r   z\\[A-Za-z]+r  rY   z\mathr,  r0  z\hspaceaccentz\fracr[   denz\dfracz\binomz\genfracldelimrdelimrulesizestylez\sqrt{value}r4  r7  rootr  z	\overlinebodyz\overset
annotationz	\undersetz\textr1   )endQuoteCharz	\substackz\\)openerclosercontentpartsnucleusr  rb  subsuperz'*apostrophesz'+z\operatornamez\boldsymbol\middlemdelimzExpected a delimiterz\leftleftr  z\rightrightr>  F)unquoteResultsz(?:(?:\\[$])|[^$])*r  )r  r-   r  r  r.   r   )HtypesSimpleNamespacer   float_literalr	   _space_widthsr  r  r  rG  rH  rf   r  r	  r   leaveWhitespacer,   unknown_symbol
_fontnamesrY   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)rU   r   r  r"  rV  s   `   @r8   rV   zParser.__init__  s	   !##
	? 
	? 
	? 
	? 
	? 
	? 
	?	 	 	 	" !!CDD45!344W==55334?3335 55DF F
5&--RY00113 33
 

  
 !"" 	
 150088"764?;;#H/EuT_/E/Ef/M/M$MNNQTT"3<< .. %YY$YY$YY$YY$YY$YY 	
ak)##%%%	S#6:ag#6#6w#?#??#EE	S#59QW#5#5g#>#>>DDJaoog.F.F(F(LMM GHF 0F43EFGG&&' 	
 WVT%9::
-"5*QW"5"5g">">>LM,?Jqw,?,?,H,HH9;;Vh 0 0 7 7!:J:J5:Q:Q QRRi!1!1%!8!81;K;KE;R;R!RSSi!1!1%!8!81;K;KE;R;R!RSS#(17##H---3%HQW%%h//0256OOJ//0256  .HQ_--g667 :== u%%	&
 u%%&' '	 S;9VC[[17%:;;FCCCcIJJw''() )
 q'7'7'?'?@@
\**Q-=-=f-E-EEG G	 \**Q-=-=f-E-EEG G
 X|CCHHHIIO;c#/4Yqw5G5G/H/H'1'&//2J2J2L2L'M'M0NO O OOVX XY Y
 #Xak""9--9ySz**Q[899*EEFuT{{=))* eDkk-(()   ++keDkk-.H.HH	J 	

 7Q]*QV3aj@	Hl 	
 -s5IZ5I5I&5Q5Q/QTW/WXXC"6*QX"6"6w"?"??#EG G 	
Hh j n	
 g f g g i	 i
 j f j f l  j!	
( qwwx0059O3P3PPQ	%0F*G*GGH:jAL069::5AAB777++e4J.K.KKM	
 $AG,,&sDGGG 677GGII
JAMAJ$>???)++M 	
 	$#%%%6 ! -2)))rI   rY  r-   fonts_objectr   rZ   r<   r   rT  c                z   t          |dd||          g| _        i | _        	 | j                            |          }n8# t
          $ r+}t          dt          j        |d          z             dd}~ww xY wg | _        d| _	        i | _        t          j                     t          j        t          |d                   S )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_cacherL  parseStringr   r6   r   explainrN  r   
resetCacher   r   rT  )rU   rY  rO  rZ   r   resultr7   s          r8   r%   zParser.parseo  s     ixEEGFH	N%11!44FF! 	N 	N 	NTN$:3$B$BBCCM	N ,1)! """veVAY'''s   = 
A2&A--A2r  c                    | j         d         S )z&Get the current `State` of the parser.r  )rR  r  s    r8   	get_statezParser.get_state  s     $$rI   c                8    | j                                          dS )zPop a `State` off of the stack.N)rR  popr  s    r8   	pop_statezParser.pop_state  s    rI   c                    | j                             |                                                                            dS )z=Push a new `State` onto the stack, copying the current state.N)rR  r   rY  r  r  s    r8   
push_statezParser.push_state  s5      !1!1!6!6!8!899999rI   r  r   list[Hlist]c                F    t          |                                          gS rT   )rT  asListrU   r  s     r8   rK  zParser.main  s    dkkmm$$%%rI   c                V    | j                             |d         dd         d          S )Nr   r   r  T)parseAll)rM  rT  rb  s     r8   rI  zParser.math_string  s*    $00a20NNNrI   r  c                r    t          |                                          }|                                  |gS rT   )rT  ra  r\  )rU   r  hlists      r8   rH  zParser.math  s.    dkkmm$$wrI   c                     |d                              dd          } fd|D             }t          |          }                                  t          j        d                                          _        |gS )Nr   z\$r>  c                T    g | ]$}t          |                                          %S rH   )r$  rY  )r]   rd  rU   s     r8   r`   z#Parser.non_math.<locals>.<listcomp>  s-    88844>>++,,888rI   r   )replacerT  r^  r   r   rY  rY   )rU   r  rY  symbolsrf  s   `    r8   rJ  zParser.non_math  so    GOOE3''8888a888g #-? @wrI   c                    |                                   |                                 d_        t          fd|d         D                       }|                                  |gS )Nr  c                0    g | ]}t          |          S rH   )r$  )r]   rd  r  s     r8   r`   zParser.text.<locals>.<listcomp>  s!    777!tAu~~777rI   r   )r^  rY  rY   rT  r\  )rU   r  rf  r  s      @r8   rB  zParser.text  sf      
7777tAw77788wrI   
percentager[  c                @   |                                  }|j        |j        |j        f}| j                            |          }|I|j                            dt          j	        d         d|j        |j                  }|j
        }|| j        |<   t          ||z            S )Nr  r   rH  )rY  rY   rZ   r   rS  r   r  r   r   r   r   r[  )rU   rm  r  r  r=   rr   s         r8   _make_spacezParser._make_space  s       z5>595$((--=m//cl#56	+ +G OE(-D %EJ&'''rI   gKqU?g0Bxq?g%?g1ZGU?r  r   gKqUſ)\,z
\thinspacez\/z\>z\:z\;z\ re  z\enspacez\quadz\qquadz\!c                X    | j         |d                  }|                     |          }|gS Nr  )r)  ro  )rU   r  r[   rQ   s       r8   r  zParser.space  s-     g/s##urI   c                :    |                      |d                   gS rr  )ro  rb  s     r8   r4  zParser.customspace  s      g//00rI   r  r/   ParseResults | dict[str, str]c                   |d         }|dk    rd}	 t          ||                                           }n'# t          $ r}t          ||d|z            |d }~ww xY w|| j        v rt          d |d |         d d d         D             d          }| j        sI|| j        v rCt          |d |         	                                          dk    s|d	h| j
        | j        v r|gS t          |                     d
          ||                     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+|                                r|                                r|gS t          ||                     d
          gd          gS |gS )Nr   r]  u   −zUnknown symbol: %sc              3  &   K   | ]}|d k    |V  dS r*  NrH   r]   rd  s     r8   r   z Parser.symbol.<locals>.<genexpr>  &      CCA!s((a((((CCrI   r  r  r   r,  r  Tr  c              3  &   K   | ]}|d k    |V  dS rw  rH   rx  s     r8   r   z Parser.symbol.<locals>.<genexpr>  ry  rI   c              3  &   K   | ]}|d k    |V  dS rw  rH   rx  s     r8   r   z Parser.symbol.<locals>.<genexpr>  s&      AAASaAArI   r   ra  r0  r_  )r$  rY  r6   r   _spaced_symbolsr  rN  _binary_operatorsr   rr  _left_delims_relation_symbolsrT  ro  _punctuation_symbolsisdigit)	rU   rY  r  r  rd  r  r7   	prev_char	next_chars	            r8   r,   zParser.symbol  sv   K88 !A	I4>>++,,DD 	I 	I 	I%a&:Q&>@ @EHI	I $$$ CC4C42CCCRHHI 1 	-///$3$((A--?J"/?J262H?J 2J 2Jvt//44##//446 '+, , , - - $+++CC4C42CCCRHHIAA3788AAA2FFI Cxx##	S(8(8 6M CxxI--//xI4E4E4G4GxvtT%5%5c%:%:;TJJJKKvs   "5 
AAAc                6    t          ||d|d                    )NzUnknown symbol: r  r  rU   rY  r  r  s       r8   r+  zParser.unknown_symbol	  s!    !!S*KT&\*K*KLLLrI   hatz\circumflexaccentbrevez\combiningbrevebarz\combiningoverlinegravez\combininggraveaccentacutez\combiningacuteaccenttildez\combiningtildedotz\combiningdotaboveddotz\combiningdiaeresisdddotz\combiningthreedotsaboveddddotz\combiningfourdotsabovevecz\combiningrightarrowabover6  `rJ  re  r_  rb  z\rightarrowz
\leftarrowz\circ)overrightarrowoverleftarrowmathringzwidehat widetilde widebarc                <   |                                  }|                                }|d         }|d         }|| j        v r!t          d|z   |j        |t
                    }nt          | j        |         |          }|dk    r(|                                 |                                 t          t          |j        dz            |g          }|
                    |j        d           t          |t          d|d	z            t          |g          g          S )
Nr  r   r1   )r  r  g      @exactlyr          @)rY  r~  r6  r  r=   r4  r5  r
  r  r  rY  rn  r  rT  )rU   r  r  rz  r  r   
accent_boxcentereds           r8   r  zParser.accent#	  s     99;;	h5kT'''&vsy%FD D DJJ   0 8%@@JZd39s?33Z@AAsy),,,RS))se   	rI   c                N    |                      |||          }|d         |_        |S )Nr  )rF  function_name)rU   rY  r  r  rf  s        r8   r8  zParser.function9	  s*    !!!S$//"6lrI   c                H   |                                   |                                 }d|_        g }|d         }|D ]}t          |t                    r1d|_        |                                 |                    |           Ht          |t                    r$|                    t	          ||                     |                    |           |t          |          z   dz   }t          |t                    r|t          d          z  }t          d ||d          D             d          }	| j        ddhz  }
|	|
vr-|| j        vr$||                     | j        d	                   gz  }|                                  |	d
v rd| _        nd| _        t#          |          S )Nr  r  r   zoperatorname{}c              3  &   K   | ]}|d k    |V  dS rw  rH   rx  s     r8   r   z&Parser.operatorname.<locals>.<genexpr>Q	  s&      CC!s((!((((CCrI   r  rb  r  rp  >   r  rb  TF)r^  rY  rY   r  r$  r&  r   r-   r   r   r  r/  _overunder_functionsro  r)  r\  rN  rT  )rU   rY  r  r  r  
hlist_listr  rd  next_char_locr  
delimiterss              r8   rF  zParser.operatorname>	  s     
!#
F| 	% 	%A!T"" %!!###!!!$$$$As## %!!$q%..1111!!!$$$$c$ii!+dL)) 	3S!1222MCCQ}~~%6CCCRHH	\S#J.
Z''D5554++D,>u,EFFGGJ 
""04D--05D-Z   rI   c                    |                                   |                    d          r,|                    d          |                                 _        g S NrY   )r^  r   rY  rY   rb  s     r8   r-  zParser.start_groupa	  sI    88F 	5$(HHV$4$4DNN!	rI   c                N    t          |                    dg                     }|gS Nr  rT  r   )rU   r  grps      r8   r  zParser.grouph	  s$    DHHWb))**urI   c                H    t          |                    dg                     S r  r  rb  s     r8   r2  zParser.required_groupl	  s    TXXgr**+++rI   c                .    |                                   g S rT   )r\  r  s    r8   r.  zParser.end_groupq	  s    	rI   c                >    t          |t          |          d          )NzExpected '}')r   r   r  s       r8   r9  zParser.unclosed_groupu	  s    !!SVV^<<<rI   c                D    |d         |                                  _        g S r  )rY  rY   rb  s     r8   rY   zParser.fontx	  s     $V	rI   r  r  ro   c                    t          |t                    r|j        | j        v S t          |t                    rt          |d          r|j        | j        v S dS )Nr  F)r  r$  rd  _overunder_symbolsrT  r  r  r  rU   r  s     r8   is_overunderzParser.is_overunder|	  s`    gt$$ 	F9 777'' 	FGG_,M,M 	F(D,EEEurI   c                L    t          |t                    r|j        | j        v S dS NF)r  r$  rd  _dropsub_symbolsr  s     r8   
is_dropsubzParser.is_dropsub	  s)    gt$$ 	69 555urI   c                X    t          |t                    r|                                S dS r  )r  r$  r.  r  s     r8   r.  zParser.is_slanted	  s+    gt$$ 	(%%'''urI   c           	        |                     dt          d                    }|                     dg           }t          |                     dg                     }|s|s|S d x}}|r4|^}	}
}|	dk    r|t          d          |
}n|t          d          |
}|4|                                 }|j                            |j        |j        |j	                  }|j        
                    |j        |j        |j	                  }|r||t          g           }t          |          D ]3}|j                            |                     ||dd	i                     4|                                 |                                 |                     |          rvg }d
}|j        }|)|                                 t+          ||j                  }|)|                                 t+          ||j                  }|dz  }|Kt-          |g          }|                    |d           |                    |t/          d|          g           t-          |g          }|                    |d           |                    |           |]t-          |g          }|                    |d           |                    t/          d|          |g           |j        |z   |j        z   }t7          |          }||_        t          |g          }|gS |}t;          |t                    r|j        }t          |          rdt;          |d         t<                    r t?          |d         d          r
|d d         }|d         }t?          |d          r|j         j!        |_        t          |d          }n6t;          |tD                    r|j         j!        |_        t          |g          }tG          |          }|j        }d}| $                    |          r|j        }|j%        |z  }|j%        |z  }| &                    |          re||j%        |z  z  }||j'        ||dz  dz  z
  z  z  }| $                    |          r+d|j%        z  |j(        z
  |z  }d|j%        z  |j(        z   |z  }nd}|t          t=          |          tS          j*        tV          |          g          }|                                 | $                    |          r||j,        |z  z   }n
|j-        |z  }||_        n(t          t=          |          |g          }|                                 | $                    |          r||j,        |z  z
  }n
|j.        |z  }|	| |_        nt          t=          |          |g          } |                                  | $                    |          r||j,        |z  z   }n
|j/        |z  }d|z  ||j        z
  | j        |z
  z
  z
  }!|!d
k    r||!z  }t7          |t=          ||j        z
  | j        |z
  z
            | g          }||_        | $                    |          s|xj        |j0        |z  z  c_        ||g}"| j1        r+|"| 2                    | j3        d                   gz  }"d| _1        t          |"          }|gS )Nr  r   r  r   r  zDouble subscriptzDouble superscriptr   r  r         @r  r  r+  Fr  r  r'   rp  )4r   r  r   r   rY  r  r   rY   rZ   r   r   rT  r  r>  extendr,   r0  rY  r  r=   r
  r   r  r  r   r>   r?   rn  r=  r  r[  r  r+  r   r$  r  r  r  r.  r  r  r   r   r  r  r  r  r  r  rN  ro  r)  )$rU   rY  r  r  r  r  napostrophessubr   opargr  rule_thicknessr   r9  vlistr  r=   vgaprf  vltrW  	last_charr\  r  	lc_heightlc_baseline	superkernsubkernr   
shift_downshift_upr   clrspaced_nucleusr   s$                                      r8   r  zParser.subsuper	  s   ((9d1gg..88J++488M26677 	 	Ne 		!)BhSyy?-.@AAA$-.BCCC  		   >>J	3 3-++J	3 3  	}b		<(( O O%%dkk!S5):L&M&MNNNN JJLLLKKMMM W%% 	EEME E5;//

E39--!C'D !5'**E9---eT!T]]3444wi((EKKy)))LL!3%((E9---d1dmmU3444t+gm;,,C$CC5\\F8O 	gu%% 	'"+L<   A|B/66 5R 0*==5#/#4L(,	9j11 A&/&8&@IOL%888GG'4(( ="+"4"<	WI&&G +511	&	??9%% 	*#/K Og-	/G+??9%% 
	722I)1$w|b'88: ;Iy)) y.$347@A0&569BC		  =
 tG}}afT3&7&7899AHHJJJy)) 6(9+<w+FF

&^g5
'ANNtI.//AHHJJJy)) 4$y'87'BB$>G3{"*4==#.//


??9-- :!,y/@7/J!JJJ!*'!9J^+!AG+:0EFH88OH(QW,J1FGHH   ",y)) 	8GGy-77GG "1, 	6t//0B50IJJKKN05D-~&&xrI   r  r  ruler{  r  r[   r  c           
        |                                  }|                                }t          |j                  D ]*}	|                                 |                                 +t          |g          }
t          |g          }t          |j        |j                  }|
                    |d           |                    |d           t          |
t          d|dz            t          ||          t          d|dz            |g          }|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|rZ|dk    rd	}|dk    rd	}|                     |t5          j        t8          t:          t<          z  t>          z           |          |          S |S )
Nr  r   r  r   =r   r  r  r_  ) rY  r~  r  r  r
  r  r   r=   rY  rn  r  ry  r  r   rY   r   r   rZ   r   r>   rz   r   r=  rT  r  _auto_sized_delimiterr   r   r  rR   r$  r-   )rU   r  r  r  r  r[   r  r  rz  r  cnumcdenr=   r  rr   r  rW  s                    r8   _genfraczParser._genfrac3
  s     99;;	u{## 	 	AJJLLLJJLLLL##CIsy))

5)$$$

5)$$$tAy3//UD))Ay3//	   -++J%78, , <',.!3c/"# #Y^ 4 45667 	6V 	6||||--f./fT#*s:J5K5;/= /=.46 6 6 rI   c                R    |                      t          |d                             S )Nr  )r  r/   rb  s     r8   r  zParser.style_literal]
  s!    s4#899:::rI   c           	         |                      |                    dd          |                    dd          |d         |                    d| j        j                  |d         |d                   S )Nr  r  r  r  r  r[   r  )r  r   r  r  rb  s     r8   r=  zParser.genfrac`
  sc    }}HHXr""DHHXr$:$:dhhw0IJJKe& & 	&rI   c           	         |                      dd|                                                                 | j        j        |d         |d                   S Nr  r[   r  )r  rY  r~  r  r  rb  s     r8   r:  zParser.fracf
  sL    }}DNN$$DDFFO%tE{DKA A 	ArI   c           	         |                      dd|                                                                 | j        j        |d         |d                   S r  )r  rY  r~  r  r  rb  s     r8   r;  zParser.dfrack
  sL    }}DNN$$DDFFO($u+tE{D D 	DrI   c           	     b    |                      ddd| j        j        |d         |d                   S )Nr"  r'  r   r[   r  )r  r  r  rb  s     r8   r<  zParser.binomp
  s6    }}aO%tE{DKA A 	ArI   c                >   |d         }|d         }|                                                                  }|                                 t          |g          }t          |g          }t	          |j        |j                  }	|                    |	d           |                    |	d           |dz  }
||dz            dk    r8t          |t          d|
          |g          }|j	        |j
        z   |
z   |_        n t          |t          d|
          |g          }|S )Nr  r  r  r'   r   ur   )rY  r~  r
  r  r   r=   rY  rn  r  r?   r>   r=  )rU   rY  r  r  r  r  rz  centered_annotationcentered_bodyr=   r  r  s               r8   _gensetzParser._gensetu
  s/   ,'
F|NN$$DDFF	'55!4&))'-}/BCC!!%333E9---1}S1W:Q#  E "/!47J7Q!QTX!XE#Q  E rI   c                   |                     d          }|d         }|                                 }|                                }|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        z  d	z  z   d
|           |st          |j        dz  dd          }n7t          |          }|                                 |                                 t          t          |g          g          }| dz  |_        t          |t%          |j         dz            ||
g          }|gS )Nr  r  g      @rU  T)r  r   r       @r  r  r   r  )r   rY  r~  r>   r=  r?   r  rT  r  rn  ry  re  rp  rZ   r   rR   r=   r
  r[  )rU   r  r  r  r  rz  r>   r?   checkpadded_body	rightside
root_vlistrf  s                r8   r>  zParser.sqrt
  s   xxG}  99;;	 t009s?B
T..|VUE$OOO 22e00 T!i-00$Q]8K8KLMM5<<f{CDD	%.59"<!NN!5	* 	* 	*
  	u{S("b11DD;;DKKMMMKKMMME4&MM?++
#)'C-
zU[L3.// 	" # #
 wrI   c                   |d         }|                                  }|                                }|j        |j        z
  |dz  z   }|j        |j        z   }t          t          |          t          d          t          |g          g          }|	                    ||j
        |j        z  dz  z   d|           t          |g          }|gS )Nr  r  r  r  r  )rY  r~  r>   r=  r?   rn  ry  re  rT  rp  rZ   r   )	rU   r  r  r  rz  r>   r?   r  rf  s	            r8   r?  zParser.overline
  s    F|  99;;	t009s?B
T.. 5<<fudV}}EFF	 	%.59"<!NN!5	* 	* 	* yk""wrI   frontmiddlelist[Box | Char | str]backc           	        |                                  }t          |          rt          d |D                       }t          d |D                       }d }t          |          D ]g\  }}	|	dk    r\t	          j        t          ||dz                      }
|
dk    rt          |
||||          ||dz   <   n|                    |
           ||= ht	          j        t          t          t          z           |          }nd}d}d}g }g }|dk    r'|                    t          |||||                     |                    |           |dk    r'|                    t          |||||                     t          |          }|S )	Nc                F    g | ]}t          |t                    |j        S rH   )r  r-   r>   rF  s     r8   r`   z0Parser._auto_sized_delimiter.<locals>.<listcomp>
  s)    MMMq*Q:L:LM!(MMMrI   c                F    g | ]}t          |t                    |j        S rH   )r  r-   r?   rF  s     r8   r`   z0Parser._auto_sized_delimiter.<locals>.<listcomp>
  s)    KKKQ
1c8J8JKKKKrI   r!  r   r_  )r  r   r  )rY  r   r   	enumerater   r   r-   r  remover  rR   r$  r   r  rT  )rU   r  r  r  r  r>   r?   r  idxelrd  middle_partr  rf  s                 r8   r  zParser._auto_sized_delimiter
  s      v;; 	MMFMMMNNFKK&KKKLLEF$V,, $ $R##sF37O44ACxx*8 !65%+H +H +HsQw a(((s &cDj!16::KKFEFKC<<LLufeU6JJJL L L[!!!3;;LLtVUE&IIIK K KerI   c                    |                      |d         d|v r|d                                         ng |d                   S )Nr#  r  r$  )r  ra  rb  s     r8   r  zParser.auto_delim
  sH    ))L$)TMMDK   rM	  	rI   c                   |                                   |                                 }g }|d         }|D ]}t          |t                    rS|j        d         }t          |t
                    rd|_        |                                 |                    |           kt          |t
                    rpd|_        |j	        | j
        v s|j	        dd          | j        v rd|_        |                                 |                                 |                    |           |                    |           |                                  t          |          S )Nr  r   r  r  )r^  rY  r  rT  r>  r$  rY   r&  r   rd  _latin_alphabets_small_greekr\  )rU   r  r  rf  r  rd  r@  s          r8   rG  zParser.boldsymbol
  sA     G} 	  	 A!U##  JqMa&& (!AF%%'''QAt$$ 	 C40003qrr7d///#AF%%'''!!###QQU||rI   c           	        |d         }|                                  }|                                }d |d         D             }t          t          d |                    }g }|D ]=}t	          |g          }	|	                    |d           |                    |	           >d t          |t          d|dz            gt          |          z            D             }
|
d= t          |
          }t          |g          g}|S )	Nr  c                ,    g | ]}t          |          S rH   )rT  )r]   r@  s     r8   r`   z#Parser.substack.<locals>.<listcomp>  s    ,,,aq,,,rI   r   c                    | j         S rT   r  r(  s    r8   <lambda>z!Parser.substack.<locals>.<lambda>  s    ag rI   r  c                    g | ]	}|D ]}|
S rH   rH   )r]   pairr   s      r8   r`   z#Parser.substack.<locals>.<listcomp>'  s=     " " " " "  " " " "rI   r   r  )rY  r~  r   rf   r  rY  r   zipr  r   rn  rT  )rU   r  r  r  rz  rf  	max_widthr  r  cpstackr  rW  s                r8   rD  zParser.substack  s   W  99;;	,,58,,,--u5566	 	 	CC5!!BHHY	***LL" " aQ)?)?(@3u::(MNN" " " "IEll,,rI   r  )
rY  r-   rO  r   rZ   r<   r   r<   r.   rT  r  )r  r   r.   r_  )r  r   r.   r   )r  r   r.   r  )rm  r<   r.   r[  )rY  r-   r  r/   r  rt  r.   r  r  )r.   r  )r  r  r.   ro   )r  r-   r  r-   r  r{  r  r  r[   rT  r  rT  r.   r  )r  r-   r  r  r  r-   r.   r  )QrC   rD   rE   rF   enumEnumr  rq  rr  r}  r  _arrow_symbolsr|  r  r  r  r  r,  r7  _ambi_delimsr~  _right_delimsr/  r  r2   r  stringascii_lettersr  rV   r%   rY  r\  r^  rK  rI  rH  rJ  staticmethodr   convertToFloatr(  rB  ro  r)  r  r4  r,   r+  r5  r6  r  r8  rF  r-  r  r2  r3  r.  r9  rY   r  r  r.  r  r  r  r=  r:  r;  r<  r  r@  rA  r>  r?  r  r  rG  rD  r  r  s   @r8   r  r    sS            TY    
0 %''3 6  5j  %uwwk5( 5(n S 	0 
1 N4 (*;;nLO37==??@@  577 
 3>DDFFGGsLRRTTUU 338577< <J c  !577$ $O
 3 //4uww8 8L 3 

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

%'' M ]*\9G3 G GuSS!?@@ S!?@@1DF FG G G H HL s6/00w2 w2 w2 w2r( ( ( (,% % % %       : : : :& & & &O O O O   
    !L!1!@AAM   ( ( ( ($  M   
1 1 1 1. . . .`M M M M/- 	0 	3	
 	3 	- 	0 	1 	6 	5 	7 	1 	3 	3 	-  	0!" 	/#$ *(#)  K. C4::<<==M   ,   
!! !! !! !!F      , , , , $N   = = = =         
   
d d d d d dL( ( ( (T; ; ; ;& & & &A A A A
D D D D
A A A A
   @ ! Gh& & & &P   &$ $ $ $L      4       rI   r  )r,   r-   r.   r/   )r  r  r.   r  )r  )rQ   rR   r  r  r.   rP   )r  r-   r.   r   )r  r-   r  r   r.   r   )|rF   
__future__r   abcr  r  r   loggingr   r  r&  r  r  typingr   r   numpyrg   	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  r9   r;   rD   rK   rP   r   r   ABCr   ABCMetar   r  rv  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rR   r  r  r$  r4  r9  rT  rn  ru  ry  r  r  r  re  r  r  r[  r  r  r   r  r  r  r  rH   rI   r8   <module>r     s    # " " " " " 



        				 				                                                                       D D D D D D D D D D D D < < < < < < < < < < : : : : : : : : : : : : 4 4 4 4 4 4 6 6 6 6 6 6="##)A--3333333%%%%%%? ((((((     w.//   ,3 3 3 3 3* 3 3 3& /     *   ( / 85 85 85 85 85 85 85 85v    *   @    z   i! i! i! i! i!CG i! i! i!XfI fI fI fI fIES[ fI fI fI fIRgC gC gC gC gC- gC gC gCTA! A! A! A! A!= A! A! A!H&A &A &A &A &A,#+ &A &A &A &AR    {   $    k   $p p p p p p p pf    I   B  !, !, !, !, !, !, !, !,H    "3       )       -   	 	 	 	 	0 	 	 		 	 	 	 	/ 	 	 	
*/ , (	
 ) ) ( ) ) ) $ ' ( ( )  '!" '#& 3-)   0                  .    $   *, , , , ,3 , , ,( ( ( ( (3 ( ( (D+ D+ D+ D+ D+4 D+ D+ D+NI I I I IT I I I.)/ )/ )/ )/ )/3 )/ )/ )/Xc< c< c< c< c<D c< c< c<LO< O< O< O< O<D O< O< O<dD D D D D3 D D D(7 7 7 7 7D 7 7 7; ; ; ; ;D ; ; ;    
    9RQA..9RQA..9RQA..9RQA..9RQA..9RQA..9RQA..9RQQ//	 		 G G G G G4 G G G8M M M M M M M M> > > > > > > >( ( ( ( (4 ( ( (6%" %" %" %" %"U %" %" %"P         E      :P P P P Pn/ / / /#0 #0 #0 #0 #0 #0 #0 #0L6 6 6 62W W W W W W W W W WrI   