
    NgT                   2   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
l3m4Z4m5Z5m6Z6 ddl7m8Z9 ddlm:Z;  e9e;          j<        dk     rddlm=Z> nddlm>Z> ej?        rddl@mAZA ddl3mBZB  ejC                      ejD        d          ZEddZF G d de          ZGdeG_H         G d de          ZIdeI_H         G d d          ZJ G d de          ZK G d  d!e          ZL G d" d#ejM                  ZN G d$ d%eNejO        &          ZP G d' d(eP          ZQ G d) d*eP          ZR G d+ d,eRejO        &          ZS G d- d.eS          ZT G d/ d0eS          ZU G d1 d2eR          ZV G d3 d4eV          ZWd5ZXd6ZY G d7 d8          ZZ G d9 d:eZ          Z[ G d; d<eZ          Z\ G d= d>eZ          Z] G d? d@eZ          Z^ G dA dBeZ          Z_i dCe_dDe_dEe^dFe[dGe[dHe[dIe[dJe[dKe[dLe[dMe\dNe\dOe\dPe\dQe\dRe\dSe\e_e_dTZ`ddXZa G dY dZ          Zb G d[ d\eb          Zc G d] d^ec          Zd G d_ d`ec          Ze G da dbeb          Zf G dc ddef          Zg G de dfec          Zh G dg dheh          Zi G di djeh          Zj G dk dlec          Zk G dm dnek          Zl G do dpek          Zm G dq dre          Zn endsdtddsd           endsdtdudsd           endsdtddsd           endsdsddtd           endsdsddtdu           endsdsddtd           endsdsddsd           endsdtddvd          dwen_o         G dx dyeb          Zp G dz d{ei          Zq G d| d}ej          Zr G d~ deb          Zs G d dei          Zt G d dei          ZudddZvddZw G d dV          ZxddZy G d d          Zzd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_DEFAULT)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     P/var/www/html/ai-engine/env/lib/python3.11/site-packages/matplotlib/_mathtext.pyget_unicode_indexr8   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__     r7   r:   r:   K   sQ           LLLMMMLLL::::222222rH   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"   imageNrA   rG   rH   r7   rJ   rJ   a   sR           IIIIIILLLMMMLLLOOOOOrH   rJ   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)rP   r?   r@   )selfrP   s     r7   __init__zOutput.__init__   s    ;=>@


rH   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 rG   )fontfontsizenumoffset).0rK   rL   infohs       r7   
<listcomp>z$Output.to_vector.<locals>.<listcomp>   sK     / / /"b$ y$-2q2v7KL / / /rH   c                8    g | ]\  }}}}||z
  ||z
  ||z
  fS rG   rG   )r\   x1y1x2y2r^   s        r7   r_   z$Output.to_vector.<locals>.<listcomp>   sF     0 0 0 "b"b 1r627BG, 0 0 0rH   )
mapnpceilrP   r<   r=   r>   r?   r@   r:   )rT   wdgsrsr^   s        @r7   	to_vectorzOutput.to_vector   s    Gdhndhotx~FH H1a/ / / /"&+/ / /0 0 0 0$(J0 0 01a!eQB///rH   antialiasedboolrJ   c          
        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          j	        |          t          j	        |t          |d          z                       }	t          | j        | | f          }
|
j        D ]7\  }}}|j                            |	|||j        j        z
  |j        |           8|
j        D ]\  }}}}t          t!          ||z
            dz
  d          }|dk    r!||z   dz  }t!          ||dz   dz  z
            }nt!          |          }|	                    t!          |          |t          j	        |          ||z              t%          dd|||z   ||	          S )Nc                4    g | ]\  }}}||j         j        z   S rG   )metricsxminr\   rK   rL   r]   s       r7   r_   z$Output.to_raster.<locals>.<listcomp>   (    MMMRb4<,,MMMrH   c                    g | ]	\  }}}}|
S rG   rG   r\   ra   rb   rc   rd   s        r7   r_   z$Output.to_raster.<locals>.<listcomp>        :::^RRb:::rH   r   r   c                4    g | ]\  }}}||j         j        z
  S rG   )rq   ymaxrs   s       r7   r_   z$Output.to_raster.<locals>.<listcomp>   rt   rH   c                    g | ]	\  }}}}|
S rG   rG   rv   s        r7   r_   z$Output.to_raster.<locals>.<listcomp>   rw   rH   c                4    g | ]\  }}}||j         j        z   S rG   )rq   xmaxrs   s       r7   r_   z$Output.to_raster.<locals>.<listcomp>   rt   rH   c                    g | ]	\  }}}}|
S rG   rG   rv   s        r7   r_   z$Output.to_raster.<locals>.<listcomp>   rw   rH   c                4    g | ]\  }}}||j         j        z
  S rG   )rq   yminrs   s       r7   r_   z$Output.to_raster.<locals>.<listcomp>   rt   rH   c                    g | ]	\  }}}}|
S rG   rG   rv   s        r7   r_   z$Output.to_raster.<locals>.<listcomp>   rw   rH   )rm      )minr?   r@   maxrP   r>   r=   r"   rf   rg   shiprX   draw_glyph_to_bitmaprq   icebergglyphr.   draw_rect_filledrJ   )rT   rm   rr   r   r|   ry   rh   r^   ri   rM   shiftedrK   rL   r]   ra   rb   rc   rd   r=   centerys                        r7   	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$(/)RWQQ]%;%;<< tx4%$00#N 	) 	)LBDI**r2 44dj' + ) ) ) ) &m 	H 	HNBBR"W)1--F{{r'Q&1*!1122GG""3r77Arwr{{AJGGGG1aAE1e444rH   N)rP   rQ   )r-   r:   )rm   rn   r-   rJ   )rB   rC   rD   rE   rU   rl   r   rG   rH   r7   rO   rO   x   s^         A A A A
0 0 0 0"5 "5 "5 "5 "5 "5rH   rO   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<   rr   r|   r   ry   r   rn   slantedNrA   rG   rH   r7   r   r      sm          ( NNNMMMLLLKKKKKKKKKKKKNNNMMMMMrH   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!   rX   r;   rY   r,   postscript_namer   rq   r.   rZ   r*   r   r[   NrB   rC   rD   rF   rG   rH   r7   r   r      sU         MMMOOOHHHLLLMMMMMrH   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 )au  
        Parameters
        ----------
        default_font_prop : `~.font_manager.FontProperties`
            The default non-math font, or the base font for Unicode (generic)
            font rendering.
        load_glyph_flags : int
            Flags passed to the glyph loader (e.g. ``FT_Load_Glyph`` and
            ``FT_Load_Char`` for FreeType-based fonts).
        N)r   r   )rT   r   r   s      r7   rU   zFonts.__init__   s     "3 0rH   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.
                rG   )
rT   r   r   r   r   r   r   r   r   r   s
             r7   get_kernzFonts.get_kern   s	     rrH   rX   r!   c                    t           rS   NotImplementedError)rT   rX   s     r7   	_get_fontzFonts._get_font   s    !!rH   
font_classsymrY   r   c                    t           rS   r   )rT   rX   r   r   rY   r   s         r7   	_get_infozFonts._get_info      !!rH   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   rq   )rT   rX   r   r   rY   r   r]   s          r7   get_metricszFonts.get_metrics  s%    2 ~~dJXsCC|rH   outputrO   rK   rL   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)
rT   r   rK   rL   rX   r   r   rY   r   r]   s
             r7   render_glyphzFonts.render_glyph!  s?     ~~dJXsCCb"d^,,,,,rH   ra   rb   rc   rd   c                B    |j                             ||||f           dS )zL
        Draw a filled rectangle from (*x1*, *y1*) to (*x2*, *y2*).
        N)r@   r   rT   r   ra   rb   rc   rd   s         r7   render_rect_filledzFonts.render_rect_filled*  s)    
 	RR,-----rH   c                    t                      )zF
        Get the xheight for the given *font* and *fontsize*.
        r   rT   rX   rY   r   s       r7   get_xheightzFonts.get_xheight1  s     "###rH   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       r7   get_underline_thicknesszFonts.get_underline_thickness7  s    
 "###rH   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.
        rG   rT   r   r   s      r7   !get_sized_alternatives_for_symbolz'Fonts.get_sized_alternatives_for_symbol>  s     3  rH   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;   )rX   r,   r-   r!   )rX   r,   r   r,   r   r,   rY   r;   r   r;   r-   r   )rX   r,   r   r,   r   r,   rY   r;   r   r;   r-   r   )r   rO   rK   r;   rL   r;   rX   r,   r   r,   r   r,   rY   r;   r   r;   r-   r   r   rO   ra   r;   rb   r;   rc   r;   rd   r;   r-   r   rX   r,   rY   r;   r   r;   r-   r;   r   r,   r   r,   r-   r   )rB   rC   rD   rE   rU   r   r   r   r   r   r   r   r   r   rG   rH   r7   r   r      s         1 1 1 1   " " " "" " " "   8- - - -. . . .$ $ $ $$ $ $ $! ! ! ! ! !rH   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)
superrU   	functoolscacher   _fontsfontmapr   r   r    )rT   r   r   filenamedefault_font	__class__s        r7   rU   zTruetypeFonts.__init__O  s{    *,<==="88-/D233))!-I!-IrH   rX   	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 rS   )r   Tcastr,   r   getospathexistsr    r   lowerr!   )rT   rX   basenamecached_fonts       r7   r   zTruetypeFonts._get_font[  s    4<|D)HH vc4((Hkooh//27>>(#;#;"8,,K$/DK!7BDK34?JDK399;;<vg{+++rH   r   r*   rY   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=   )rT   rX   r   rY   r   s        r7   _get_offsetzTruetypeFonts._get_offsetj  s:    8++L2%)hqj3.>r.ABBrrH   r   r,   r   r   tuple[FT2Font, int, bool]c                    t           rS   r   )rT   r   r   r   s       r7   
_get_glyphzTruetypeFonts._get_glyphp  r   rH   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                    g | ]}|d z  S )      P@rG   )r\   vals     r7   r_   z+TruetypeFonts._get_info.<locals>.<listcomp>{  s    !A!A!As#d(!A!A!ArH   g      @r   )	r   r=   r<   rr   r|   r   ry   r   r   )rX   rY   r   rq   rZ   r   r[   )r   set_size	load_charr   bboxr   r   linearHoriAdvancer=   r<   horiBearingYr   r   )rT   r   r   r   rY   r   rX   rZ   r   r   rr   r   r|   ry   r[   rq   s                   r7   r   zTruetypeFonts._get_infou  s   !__Xz3GGc7h$$$s$*?@@!A!Aej!A!A!AdD$!!$x==-g5l4'k$&6k6k(-6   "&"2%!#$   	rH   c                   |                      |          }|                    ||           |                    d          }|0|                     |t          j        d         d||          }|j        S |d         dz  |dz  z  |dz  z  }|S )Npcltmathtext.defaultxxHeightr   g      (@g      Y@)r   r   get_sfnt_tabler   mplrcParamsr   )rT   r   rY   r   rX   r   rq   r   s           r7   r   zTruetypeFonts.get_xheight  s    ~~h''h$$$""6**<&&#,'9:C3P PG?"	?T)ho>#+NrH   c                    d|z  |z  dz  S )Ng      ?g      R@rG   r   s       r7   r   z%TruetypeFonts.get_underline_thickness  s     (3.$66rH   r   r   r   r   r   r   r   r   c
                2   ||k    rh||k    rb|                      |||||	          }
|                      |||||	          }|
j        }|                    |
j        |j        t                    dz  S t                                          |||||||||		  	        S )Nr   )r   rX   get_kerningrZ   r#   r   r   )rT   r   r   r   r   r   r   r   r   r   info1info2rX   r   s                r7   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rH   r   )rX   r   r-   r!   )
rX   r!   r   r*   rY   r;   r   r;   r-   r;   r   r,   r   r,   r   r,   r-   r   )r   r,   r   r,   r   r,   rY   r;   r   r;   r-   r   )r   r,   rY   r;   r   r;   r-   r;   r   r   )rB   rC   rD   rE   rU   r   r   r   r   r   r   r   __classcell__r   s   @r7   r   r   I  s         

. 
. 
. 
. 
. 
., , , ,   " " " "
   >
 
 
 
7 7 7 7	I 	I 	I 	I 	I 	I 	I 	I 	I 	IrH   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 rS   )	StixFonts_stix_fallbackr   rU   _fontmapitemsr   r   )rT   r   r   keyr   fullpathr   s         r7   rU   zBakomaFonts.__init__  s    '(9;KLL*,<===++-- 	) 	)HC}}H (DL (DL	) 	)rH   
\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   lenr1   get_char_indexr  r   )rT   r   r   r   rX   r   rZ   r   s           r7   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LrH   ())r  r  )r     ¡)r     ³)r     µ)r     Ã)))r  r$  )r     ¢)r     ´)r     ¶)r  !{))r  r)  )r     ©)r  n)r     ½)r  r  }))r  r-  )r     ª)r  o)r     ¾)r  r$  [))r  r1  )r     £)r  r^   )r  "]))r  r4  )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  -rX  ))r  rX  )r     ±)r  .)r     Ë)r  ,z\widehat))r  ^)r  b)r  c)r  ri   z
\widetilde))r  ~)r  e)r  f)r  g)r  r^   rI  )r  r6  rN  )<>)
)z
\leftparenr  )z\rightparentr$  )z
\leftbracer)  )z\rightbracer-  )z\leftbracketr1  )z\rightbracketr4  )\{r)  )\}r-  )\[r1  )\]r4  r   c                >    | j                             |||fg          S rS   )_size_alternativesr   r   s      r7   r   z-BakomaFonts.get_sized_alternatives_for_symbol  s"    &**3(C0ABBBrH   r   r   r   )rB   rC   rD   rE   r  rU   setsplitr  r   rm  aliastargetr   r   r  s   @r7   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rH   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   rU   ro  r   r   r   
isinstancer  )rT   r   r   fallback_rcfont_clstexfontproprX   stixsizedaltfontssizenamer  r   s               r7   rU   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""	. 	.. .rH   r  r   r,   r   uniindexr-   tuple[str, int]c                
    ||fS rS   rG   )rT   r   r   r  s       r7   _map_virtual_fontzUnicodeFonts._map_virtual_fontU  s    !!rH   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  i   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.   )r8   r5   r1   _logwarningr  chrunicodedatacategoryr  
startswithr  r   _cmr10_substitutionsfamily_namer    r   _get_data_pathr  r  r  r  r   listr  r  valuesr]   )rT   r   r   r   r  found_symbolnew_fontnamecharr   rX   
glyphindexre  familys                r7   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 rS   )r  r   r   s      r7   r   z.UnicodeFonts.get_sized_alternatives_for_symbol  s:     	&HH#  3  rH   r   r   r,   r   r,   r  r.   r-   r  r   r   )rB   rC   rD   rE   r  rU   rn  ro  r  r  r   r   r   r  s   @r7   rs  rs    s        	 	  
!. !. !. !. !. !.F s=..0011" " " "=' =' =' ='~! ! ! ! ! ! ! !rH   rs  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   rU   r  updater  r   r   rT   r   r   r  r  r  s         r7   rU   zDejaVuFonts.__init__  s    d,-- 	U"+,=?O"P"PD"/0ACS"T"TD!"35EFFt%68HIII!  
 
 	 	 	 ,,.. 	* 	*IC~~H (DL!)DL	* 	*rH   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   r8   r   r  r   )rT   r   r   r   r  rX   r  r   s          r7   r   zDejaVuFonts._get_glyph  s     );))(JDDD )--H>>$''D!00::
?? 77--dJDDD77%%h
C@@@rH   r   r   )rB   rC   rD   r  rF   rU   r   r   r  s   @r7   r  r    sn         %'H''''* * * **A A A A A A A A A ArH   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rB   rC   rD   rE   r  rG   rH   r7   r  r    s>          #(* $	 	HHHrH   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  rG   rH   r7   r  r    s>          "') #	 	HHHrH   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 rS   )r   rU   r  r  r   r   r  s         r7   rU   zStixFonts.__init__  sm    t%68HIII,,.. 	* 	*IC~~H (DL!)DL	* 	*rH   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  dictr4   r  r  r   r   r   )rT   r   r   r  font_mappingdoing_sans_conversionmappinglohimidranges              r7   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)  r-  r1  r4  u   ⟨u   ⟩)rh  ri  rj  rk  rf  rg  c                    g | ]?}                     |                                        d k    .|t                    f@S )r   )r   r  r  )r\   r6  rT   r  s     r7   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JrH      rR  )r   r8   r5   r  )rT   r   r   fixesalternativesr  s   `    @r7   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  )rB   rC   rD   rE   r  rF   r  r  rU   r  r   r   r   rG   rH   r7   r  r    s         
 
 "')$+0& &H     NE* * * *4" 4" 4" 4"l _   _  rH   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)rB   rC   rD   rE   r  rG   rH   r7   r  r  `  s          EEErH   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)rB   rC   rD   rE   r  rF   r  r  r  r  r  r  r  rG   rH   r7   r  r    s           '+L**** "%G$$$$ "D!!!! "D!!!! "D!!!!  %E$$$$
 (+M**** ),N++++++rH   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)rB   rC   rD   r  r  r  r  r  r  r  r  rG   rH   r7   r  r    s6        LGDDDEMNNNrH   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)	rB   rC   rD   r  r  r  r  r  r  rG   rH   r7   r  r    s,        LDDEMNNNrH   r  c                      e Zd ZdZdZdZdZdS )STIXSansFontConstantsr  r  r  r  N)rB   rC   rD   r  r  r  r  rG   rH   r7   r  r    s"        LDMNNNrH   r  c                      e Zd ZdS )DejaVuSerifFontConstantsNrB   rC   rD   rG   rH   r7   r  r            DrH   r  c                      e Zd ZdS )DejaVuSansFontConstantsNr  rG   rH   r7   r  r    r  rH   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 rS   )_font_constant_mappingr   fontsetr   rX   r  r  r  r  r  r  )r  	constantss     r7   _get_font_constant_setr    sb    &**
++79JL LI 	&&&u}m44 	'$$rH   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  rT   s    r7   rU   zNode.__init__  s    			rH   r,   c                *    t          |           j        S rS   )typerB   r  s    r7   __repr__zNode.__repr__  s    Dzz""rH   nextNode | Noner;   c                    dS Nr   rG   )rT   r  s     r7   r   zNode.get_kerning  s    srH   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    r7   shrinkzNode.shrink  s    
 			Q				rH   r   rO   r   r   c                    dS )zRender this node.NrG   rT   r   r   r   s       r7   renderzNode.render  s      rH   Nr-   r   r-   r,   r  r  r-   r;   r   rO   r   r;   r   r;   r-   r   )	rB   rC   rD   rE   rU   r  r   r  r
  rG   rH   r7   r  r    s~        &&   # # # #                 rH   r  c                  8     e Zd ZdZd fdZd fd	ZddZ xZS )rQ   z A node with a physical location.r<   r;   r=   r>   r-   r   c                r    t                                                       || _        || _        || _        d S rS   )r   rU   r<   r=   r>   )rT   r<   r=   r>   r   s       r7   rU   zBox.__init__  s2    



rH   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 rS   )r   r  r  NUM_SIZE_LEVELSr<   SHRINK_FACTORr=   r>   rT   r   s    r7   r  z
Box.shrink  s`    9&&JJ=(JJKK=(KKJJ=(JJJJ '&rH   r   rO   ra   rb   rc   rd   c                    d S rS   rG   r   s         r7   r
  z
Box.render  s    rH   )r<   r;   r=   r;   r>   r;   r-   r   r  r   )rB   rC   rD   rE   rU   r  r
  r   r  s   @r7   rQ   rQ   	  su        **     ) ) ) ) ) )       rH   rQ   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   rU   )rT   r=   r>   r   s      r7   rU   zVbox.__init__!  s%    VU+++++rH   )r=   r;   r>   r;   rB   rC   rD   rE   rU   r   r  s   @r7   r  r    sC        .., , , , , , , , , ,rH   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  rT   r<   r   s     r7   rU   zHbox.__init__(  s%    B'''''rH   r<   r;   r  r  s   @r7   r  r  %  sC        88( ( ( ( ( ( ( ( ( (rH   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`.
    ra  r,   r  r  c                    t                                                       || _        |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        |                                  d S rS   )	r   rU   ra  r  rX   r   rY   r   _update_metrics)rT   ra  r  r   s      r7   rU   zChar.__init__9  sh    }J	*9 	rH   r-   c                    d| j         z  S )Nz`%s`ra  r  s    r7   r  zChar.__repr__E  s    rH   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   rX   r   ra  rY   r   _metricsr   r<   r   r=   r>   rT   rq   s     r7   r#  zChar._update_metricsH  sy    "&,":":Ittx#I #I 	I$-6S== DJJ DJo78


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


rH   c                p    t                                                       |                                  d S rS   )r   r  r#  r  s    r7   r  zAccent.shrink  s/    rH   r   rO   r   r;   r   c           
         | j                             ||| j        j        z
  || j        j        z   | j        | j        | j        | j        | j	                   d S rS   )
r  r   r(  rr   r   rX   r   ra  rY   r   r	  s       r7   r
  zAccent.render  s[    !!A**A0B,BIttx	I 	I 	I 	I 	IrH   r  r  )rB   rC   rD   rE   r#  r  r
  r   r  s   @r7   r1  r1  s  sw         
        I I I I I I I IrH   r1  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   rU   shift_amountchildrenglue_set	glue_sign
glue_orderrT   r7  r   s     r7   rU   zList.__init__  sK    R$$$#(rH   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 rG   )reprr\   r   s     r7   r_   z!List.__repr__.<locals>.<listcomp>  s    6661tAww666rH   )	formatr   r  r<   r=   r>   r:  joinr;  r  s    r7   r  zList.__repr__  sa    @GGGGJJ)II6666677	9 9 	9rH   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   NrG   )r\   r6  rG  s     r7   	<genexpr>z!List._set_glue.<locals>.<genexpr>  s+      CC1F1INNQNNNNCCrH   r  r   r   z	%s %s: %r)r  r  r  r>  r=  r<  
glue_ratior;  r  r  r   rB   )rT   r   rF  rG  rI  r/  s      `  r7   	_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rH   c                    | j         D ]}|                                 t                                                       | j        t          k     r,| xj        t          z  c_        | xj        t          z  c_        d S d S rS   )r;  r  r   r  r  r:  r  r<  )rT   childr   s     r7   r  zList.shrink  st    ] 	 	ELLNNNN9&&.MM.MMMM '&rH   )r7  r8  r  )
r   r;   rF  r.   rG  rH  rI  r,   r-   r   r  )	rB   rC   rD   rE   rU   r  rN  r  r   r  s   @r7   r6  r6    s        ::     9 9 9 9 9 9D D D D / / / / / / / / / /rH   r6  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   
additionalTr7  r8  rh   r;   rE  "T.Literal['additional', 'exactly']do_kernrn   c                    t                                          |           |r|                                  |                     ||           d S )N)rh   rE  )r   rU   r-  hpack)rT   r7  rh   rE  rU  r   s        r7   rU   zHlist.__init__  sN     	""" 	IIKKK

Q!
rH   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)rT   new_childrennum_childrenr6  elemr  kerning_distancer-  s           r7   r-  z
Hlist.kern  s     4=)) 	)<(( . .}Q'|a'''=Q/DDD##D)))#'#3#3D#9#9 #r)) 011D ''---(DMMM	) 	)rH   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:  rS  r   Nr   Overfulr  Underful)r;  r  r!  r<   r   r=   r>   rQ   rf   isinfgetattrGlue	glue_specstretch_orderstretchshrink_orderr  rY  r=  r>  rM  rN  )rT   rh   rE  r^   ri   r   total_stretchtotal_shrinkrS  rV  rd  s              r7   rW  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,
;;;;;rH   )r   rS  T)r7  r8  rh   r;   rE  rT  rU  rn   r  r   rS  )rh   r;   rE  rT  r-   r   )rB   rC   rD   rE   rU   r-  rW  r   r  s   @r7   rR  rR    s        %%>A9E!%      ) ) ) )2  #6B?< ?< ?< ?< ?< ?< ?< ?< ?<rH   rR  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   rS  r7  r8  r^   r;   rE  rT  c                x    t                                          |           |                     ||           d S )N)r^   rE  )r   rU   vpack)rT   r7  r^   rE  r   s       r7   rU   zVlist.__init__  s7    """

Q!
rH   rA  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 VlistrS  r   Nr   r_  r  r`  )r;  r  rQ   r=   r>   rf   ra  r<   rb  r   rc  rd  re  rf  rg  r  rY  r!  RuntimeErrorr=  r>  rM  rN  )rT   r^   rE  rA  rh   ri   r   rh  ri  rS  rV  rd  s               r7   rn  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,
;;;;;rH   rj  )r7  r8  r^   r;   rE  rT  )r^   r;   rE  rT  rA  r;   r-   r   )	rB   rC   rD   rE   rU   rf   infrn  r   r  s   @r7   rl  rl    s}        ##>A9E      
  #6BG< G< G< G< G< G< G< G< G<rH   rl  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 rS   )r   rU   r  )rT   r<   r=   r>   r  r   s        r7   rU   zRule.__init__y  s,    ...}rH   r   rO   r   r   rh   r^   r-   r   c                N    | j                             |||||z   ||z              d S rS   )r  r   )rT   r   r   r   rh   r^   s         r7   r
  zRule.render}  s.    ''1a!eQUCCCCCrH   )r<   r;   r=   r;   r>   r;   r  r  )r   rO   r   r;   r   r;   rh   r;   r^   r;   r-   r   )rB   rC   rD   rE   rU   r
  r   r  s   @r7   rs  rs  n  sc         % % % % % %D D D D D D D DrH   rs  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   rU   rf   rq  )rT   r  rx  r=   r>   r   s        r7   rU   zHrule.__init__  sN    ==??I"S(66666rH   rS   )r  r  rx  ry  r  r  s   @r7   rw  rw    sH        887 7 7 7 7 7 7 7 7 7 7rH   rw  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 rS   r{  )rT   r  rx  r   s      r7   rU   zVrule.__init__  s<    99;;	BFBFE:::::rH   )r  r  r  r  s   @r7   r~  r~    sC        66; ; ; ; ; ; ; ; ; ;rH   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<   rf  r.   re  r  rg  Nr   rG   rH   r7   r  r    sE         LLLNNNMMMrH   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 )
rc  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   rU   r  r,   r  _namedr5   rd  )rT   r  rd  r   s      r7   rU   zGlue.__init__  sq     	i%% 	O!(3II	9-- 	O!IIMNNN"rH   r-   r   c                    t                                                       | j        t          k     r1| j        }|                    |j        t          z            | _        d S d S )Nr<   )r   r  r  r  rd  _replacer<   r  )rT   re  r   s     r7   r  zGlue.shrink  sS    9&&AZZag.EZFFDNNN '&rH   )r  r  r  )rB   rC   rD   rE   rU   r  r   r  s   @r7   rc  rc    so         # # # # # #G G G G G G G G G GrH   rc  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.
    r7  
list[Node]c                    t                                          t          d          g|t          d          d           d S )Nr  FrU  r   rU   rc  r?  s     r7   rU   zHCentered.__init__  s?    $t**<x<d<eLLLLLrH   r7  r  r  r  s   @r7   r  r    sQ         
M M M M M M M M M MrH   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.
    r7  r  c                    t                                          t          d          g|t          d                     d S )Nr  r  r?  s     r7   rU   zVCentered.__init__  s:    $t**<x<d<=====rH   r  r  r  s   @r7   r  r    sG         
> > > > > > > > > >rH   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 )rY  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 rS   )r   rU   r<   r  s     r7   rU   zKern.__init__  s$    


rH   r-   r,   c                    d| j         z  S )Nzk%.02fr  r  s    r7   r  zKern.__repr__  s    $*$$rH   r   c                    t                                                       | j        t          k     r| xj        t
          z  c_        d S d S rS   )r   r  r  r  r<   r  r  s    r7   r  zKern.shrink  s@    9&&JJ-'JJJJ '&rH   r  r  r  )
rB   rC   rD   rE   r=   r>   rU   r  r  r   r  s   @r7   rY  rY    s          FE     % % % %( ( ( ( ( ( ( ( ( (rH   rY  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.
    FNra  r,   r=   r;   r>   r  r  alwaysrn   factorry  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   rX   r   rY   r   copyr!  r=   r>   r  r   rU   r:  )rT   ra  r=   r>   r  r  r  r  r   target_totalr   r   r  shiftr   s                 r7   rU   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$   !rH   )FN)ra  r,   r=   r;   r>   r;   r  r  r  rn   r  ry  r  r  s   @r7   r  r    sR          ?C" " " " " " " " " " "rH   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.
    Fra  r,   r<   r;   r  r  r  rn   
char_class
type[Char]c                h   |j                             |j        |          }|                                }|D ]%\  }}||_         |||          }	|	j        |k    r n&||	j        z  }
|xj        |
z  c_         |||          }	t                                          |	g           |	j        | _        d S rS   )r  r   rX   r  r<   rY   r   rU   )rT   ra  r<   r  r  r  r  r   r   r  r  r   s              r7   rU   zAutoWidthChar.__init__$  s    }FFJ  

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


rH   )
ra  r,   r<   r;   r  r  r  rn   r  r  )rB   rC   rD   rE   r!  rU   r   r  s   @r7   r  r    sV          QV*.                     rH   r  r   r   rP   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    eArG   )r  s    r7   clampzship.<locals>.clampI  s     t||tt5HrH   rP   rR  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   )r>  r=  r;  r  r!  r
  r<   rY  r6  r  r:  rR  rl  rQ   r=   r>   rf   ra  rc  rd  re  rf  roundr<  rg  r  )rP   cur_gcur_gluer>  r=  	base_line	left_edgerS  edgerule_height
rule_depth
rule_widthrd  r  cur_hcur_v	hlist_outoff_hoff_vr   	vlist_outs                r7   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	$rH   rl  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)r>  r=  r=   r;  r  rY  r<   r6  r  r>   r:  rR  rl  rQ   rf   ra  r
  rc  rd  re  rf  r  r<  rg  r  r!  rp  )rP   r  r  r>  r=  r  top_edgerS  save_vr  r  r  rd  r  r  r  r  r  r  r   r  s                r7   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rH   )r  r;   r-   r;   )rP   rR  r-   r   )rP   rl  r-   r   )r=   rO   r  rR  )rP   r  rK   rL   r  r  r  r  r  r  r   r  s       @@@@@@@@r7   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MrH   msgr   c                R     d
 fd	}t                                          |          S )z$Helper class to raise parser errors.rV  r,   locr.   toksr   r-   T.Anyc                &    t          | |          rS   r   )rV  r  r  r  s      r7   raise_errorzError.<locals>.raise_error  s    !!S#...rH   rV  r,   r  r.   r  r   r-   r  )r   setParseAction)r  r  s   ` r7   Errorr    s;    / / / / / / 77!!+...rH   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   rX   r,   r   rY   r;   r   c                L    || _         || _        || _        || _        || _        d S rS   )r  _fontr   rY   r   )rT   r  rX   r   rY   r   s         r7   rU   zParserState.__init__  s)    
$ rH   r-   c                *    t          j         |           S rS   )r  r  s    r7   r  zParserState.copy  s    yrH   c                    | j         S rS   )r  r  s    r7   rX   zParserState.font  s
    zrH   r  r   c                *    |dv r|| _         || _        d S )N)r  r  r  r  )r   r  )rT   r  s     r7   rX   zParserState.font  s     ---"DO


rH   c                X    | j                             | j        | j        | j                  S )z.Return the underline thickness for this state.)r  r   rX   rY   r   r  s    r7   r|  z+ParserState.get_current_underline_thickness  s)    |33It}dh0 0 	0rH   N)
r  r   rX   r,   r   r,   rY   r;   r   r;   r-   r  r  )r  r,   r-   r   )r-   r;   )
rB   rC   rD   rE   rU   r  propertyrX   setterr|  rG   rH   r7   r  r    s                   X 
[   [
0 0 0 0 0 0rH   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 rS   )r  r   exprsresultsName)r  r  namess     r7   r  zcmd.<locals>.names	  s      c?++ 	"	 ' ' 5;;&&&&&&&&' '_ 	"/!!!!!	" 	"rH   r)  r   r    c              3      K   | ]	}d |z  V  
dS )z{%s}NrG   )r\   r  s     r7   rL  zcmd.<locals>.<genexpr>  s&      BBdFTMBBBBBBrH   z	Expected )r  r   r-   r  )ro  rE  r  )r  r  csnamer6   r  s       @r7   cmdr    s    " " " " " " ZZQ"Ffnn BGGBBeeDkkBBBBBBB"& TE"3c"3"344455rH   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)rB   rC   rD   DISPLAYSTYLE	TEXTSTYLESCRIPTSTYLESCRIPTSCRIPTSTYLErG   rH   r7   
_MathStyler    s%        	rH   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  ro  r   )r\   r6  s     r7   r_   zParser.<listcomp>  sX     G G G(Q006688<BBDD G G GrH   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  rb  )r  r   rS  rT   s     r7   set_names_and_parse_actionsz4Parser.__init__.<locals>.set_names_and_parse_actions  s     GGMMOO 	? 	?S~~c** ? "FFFC(((tS)) ?**74+=+=>>>	? 	?rH   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  alpharS  nonalpha)isalphar   r   rD  rE  re   reescape)r  r  ends_with_alphaends_with_nonalphar  s        r7   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    rH   z[-+]?([0-9]+\.?[0-9]*|\.[0-9]+)spacec                6    g | ]}t          |j                  S rG   )r,   r  )r\   rc  s     r7   r_   z#Parser.__init__.<locals>.<listcomp>  s     333aS\\333rH   style_literalzI[a-zA-Z0-9 +\-*/<>=:,.;!\?&'@()\[\]|\U00000080-\U0001ffff]|\\[%${}\[\]_|]z|\\(?:{})(?![A-Za-z])r  r   z\\[A-Za-z]+r  rX   z\mathr)  r-  z\hspaceaccentz\fracrZ   denz\dfracz\binomz\genfracldelimrdelimrulesizestylez\sqrt{value}r1  r4  rootr  z	\overlinebodyz\overset
annotationz	\undersetz\textr0   )endQuoteCharz	\substackz\\)openerclosercontentpartsnucleusr  r_  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  rD  rE  re   r  r  r   leaveWhitespacer+   unknown_symbol
_fontnamesrX   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)rT   r  r
  r   rS  s   `   @r7   rU   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)))rH   rV  r,   fonts_objectr   rY   r;   r   rR  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_cacherJ  parseStringr   r5   r   explainrL  r   
resetCacher   r   rR  )rT   rV  rM  rY   r   resultr6   s          r7   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  )rP  r  s    r7   	get_statezParser.get_state  s     $$rH   c                8    | j                                          dS )zPop a `State` off of the stack.N)rP  popr  s    r7   	pop_statezParser.pop_state  s    rH   c                    | j                             |                                                                            dS )z=Push a new `State` onto the stack, copying the current state.N)rP  r   rW  r  r  s    r7   
push_statezParser.push_state  s5      !1!1!6!6!8!899999rH   r  r   list[Hlist]c                F    t          |                                          gS rS   )rR  asListrT   r  s     r7   rI  zParser.main  s    dkkmm$$%%rH   c                V    | j                             |d         dd         d          S )Nr   r   r  T)parseAll)rK  rR  r`  s     r7   rG  zParser.math_string  s*    $00a20NNNrH   r  c                r    t          |                                          }|                                  |gS rS   )rR  r_  rZ  )rT   r  hlists      r7   rF  zParser.math  s.    dkkmm$$wrH   c                     |d                              dd          } fd|D             }t          |          }                                  t          j        d                                          _        |gS )Nr   z\$r;  c                T    g | ]$}t          |                                          %S rG   )r!  rW  )r\   ra  rT   s     r7   r_   z#Parser.non_math.<locals>.<listcomp>  s-    88844>>++,,888rH   r   )replacerR  r\  r   r   rW  rX   )rT   r  rV  symbolsrd  s   `    r7   rH  zParser.non_math  so    GOOE3''8888a888g #-? @wrH   c                    |                                   |                                 d_        t          fd|d         D                       }|                                  |gS )Nr  c                0    g | ]}t          |          S rG   )r!  )r\   ra  r  s     r7   r_   zParser.text.<locals>.<listcomp>  s!    777!tAu~~777rH   r   )r\  rW  rX   rR  rZ  )rT   r  rd  r  s      @r7   r@  zParser.text  sf      
7777tAw77788wrH   
percentagerY  c                @   |                                  }|j        |j        |j        f}| j                            |          }|I|j                            dt          j	        d         d|j        |j                  }|j
        }|| j        |<   t          ||z            S )Nr  r   rE  )rW  rX   rY   r   rQ  r   r  r   r   r   r   rY  )rT   rk  r  r  r<   rq   s         r7   _make_spacezParser._make_space  s       z5>595$((--=m//cl#56	+ +G OE(-D %EJ&'''rH   gKqU?g0Bxq?g%?g1ZGU?r  r   gKqUſ)\,z
\thinspacez\/z\>z\:z\;z\ rb  z\enspacez\quadz\qquadz\!c                X    | j         |d                  }|                     |          }|gS Nr  )r'  rm  )rT   r  rZ   rP   s       r7   r  zParser.space  s-     g/s##urH   c                :    |                      |d                   gS rp  )rm  r`  s     r7   r2  zParser.customspace  s      g//00rH   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        sE|| j        v r?t          |d |         	                                          dk    s|d	k    s	|| 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   rZ  u   −zUnknown symbol: %sc              3  &   K   | ]}|d k    |V  dS r'  NrG   r\   ra  s     r7   rL  z Parser.symbol.<locals>.<genexpr>  &      CCA!s((a((((CCrH   r  r  r   r)  r  Tr  c              3  &   K   | ]}|d k    |V  dS ru  rG   rv  s     r7   rL  z Parser.symbol.<locals>.<genexpr>  rw  rH   c              3  &   K   | ]}|d k    |V  dS ru  rG   rv  s     r7   rL  z Parser.symbol.<locals>.<genexpr>  s&      AAASaAArH   r   r^  r-  r\  )r!  rW  r5   r   _spaced_symbolsr  rL  _binary_operatorsr  ro  _left_delimsrR  rm  _punctuation_symbolsisdigit)	rT   rV  r  r  ra  r  r6   	prev_char	next_chars	            r7   r+   zParser.symbol  s_   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--c1A1A!222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  rT   rV  r  r  s       r7   r)  zParser.unknown_symbol	  s!    !!S*KT&\*K*KLLLrH   hatz\circumflexaccentbrevez\combiningbrevebarz\combiningoverlinegravez\combininggraveaccentacutez\combiningacuteaccenttildez\combiningtildedotz\combiningdotaboveddotz\combiningdiaeresisdddotz\combiningthreedotsaboveddddotz\combiningfourdotsabovevecz\combiningrightarrowabover3  `rG  rb  r\  r_  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   r0   )r  r  g      @exactlyr          @)rW  r|  r4  r  r<   r1  r3  r  r  r  rW  rl  r  rR  )rT   r  r  rx  r  r   
accent_boxcentereds           r7   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   	rH   c                N    |                      |||          }|d         |_        |S )Nr  )rD  function_name)rT   rV  r  r  rd  s        r7   r6  zParser.function9	  s*    !!!S$//"6lrH   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 ru  rG   rv  s     r7   rL  z&Parser.operatorname.<locals>.<genexpr>Q	  s&      CC!s((!((((CCrH   r  r_  r  rn  >   r  r_  TF)r\  rW  rX   r  r!  r#  r   r,   r  r   r  r-  _overunder_functionsrm  r'  rZ  rL  rR  )rT   rV  r  r  r  
hlist_listr  ra  next_char_locr  
delimiterss              r7   rD  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   rH   c                    |                                   |                    d          r,|                    d          |                                 _        g S NrX   )r\  r   rW  rX   r`  s     r7   r+  zParser.start_groupa	  sI    88F 	5$(HHV$4$4DNN!	rH   c                N    t          |                    dg                     }|gS Nr  rR  r   )rT   r  grps      r7   r  zParser.grouph	  s$    DHHWb))**urH   c                H    t          |                    dg                     S r  r  r`  s     r7   r0  zParser.required_groupl	  s    TXXgr**+++rH   c                .    |                                   g S rS   )rZ  r  s    r7   r,  zParser.end_groupq	  s    	rH   c                >    t          |t          |          d          )NzExpected '}')r   r  r  s       r7   r7  zParser.unclosed_groupu	  s    !!SVV^<<<rH   c                D    |d         |                                  _        g S r  )rW  rX   r`  s     r7   rX   zParser.fontx	  s     $V	rH   r  r  rn   c                    t          |t                    r|j        | j        v S t          |t                    rt          |d          r|j        | j        v S dS )Nr  F)r  r!  ra  _overunder_symbolsrR  r  r  r  rT   r  s     r7   is_overunderzParser.is_overunder|	  s`    gt$$ 	F9 777'' 	FGG_,M,M 	F(D,EEEurH   c                L    t          |t                    r|j        | j        v S dS NF)r  r!  ra  _dropsub_symbolsr  s     r7   
is_dropsubzParser.is_dropsub	  s)    gt$$ 	69 555urH   c                X    t          |t                    r|                                S dS r  )r  r!  r+  r  s     r7   r+  zParser.is_slanted	  s+    gt$$ 	(%%'''urH   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&   rn  )4r   r  r  r   rW  r  r   rX   rY   r   r   rR  r  r;  extendr+   r-  rW  r  r<   r  r   r  r  r   r=   r>   rl  r:  r  rY  r  r(  r   r!  r  r  r  r+  r  r  r   r   r  r  r  r  r  r  rL  rm  r'  )$rT   rV  r  r  r  r  napostrophessubr   opargr  rule_thicknessr   r6  vlistr  r<   vgaprd  vltrU  	last_charrZ  r  	lc_heightlc_baseline	superkernsubkernr   
shift_downshift_upr   clrspaced_nucleusr   s$                                      r7   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rH   r  r  rulery  r  rZ   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|rg|dk    rd	}|dk    rd	}|                     |t5          j        t8          t4          j        t<          t>          t@          f                  |          |          S |S )
Nr  r   r  r   =r   r  r  r\  )!rW  r|  r  r  r  r  r   r<   rW  rl  r  rw  r  r   rX   r   r   rY   r   r=   ry   r   r:  rR  r  _auto_sized_delimiterr   r   r  UnionrQ   r!  r,   )rT   r  r  r  r  rZ   r  r  rx  r  cnumcdenr<   r  rq   r  rU  s                    r7   _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!'#tS.:Q5R5;/= /=.46 6 6 rH   c                R    |                      t          |d                             S )Nr  )r  r.   r`  s     r7   r  zParser.style_literal]
  s!    s4#899:::rH   c           	         |                      |                    dd          |                    dd          |d         |                    d| j        j                  |d         |d                   S )Nr  r  r  r  r  rZ   r  )r  r   r  r  r`  s     r7   r;  zParser.genfrac`
  sc    }}HHXr""DHHXr$:$:dhhw0IJJKe& & 	&rH   c           	         |                      dd|                                                                 | j        j        |d         |d                   S Nr  rZ   r  )r  rW  r|  r  r  r`  s     r7   r8  zParser.fracf
  sL    }}DNN$$DDFFO%tE{DKA A 	ArH   c           	         |                      dd|                                                                 | j        j        |d         |d                   S r  )r  rW  r|  r  r  r`  s     r7   r9  zParser.dfrack
  sL    }}DNN$$DDFFO($u+tE{D D 	DrH   c           	     b    |                      ddd| j        j        |d         |d                   S )Nr  r$  r   rZ   r  )r  r  r  r`  s     r7   r:  zParser.binomp
  s6    }}aO%tE{DKA A 	ArH   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   )rW  r|  r  r  r   r<   rW  rl  r  r>   r=   r:  )rT   rV  r  r  r  r  rx  centered_annotationcentered_bodyr<   r  r  s               r7   _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 rH   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      @rR  T)r  r   r       @r  r  r   r  )r   rW  r|  r=   r:  r>   r  rR  r  rl  rw  rc  rn  rY   r   rQ   r<   r  rY  )rT   r  r  r  r  rx  r=   r>   checkpadded_body	rightside
root_vlistrd  s                r7   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rH   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  )rW  r|  r=   r:  r>   rl  rw  rc  rR  rn  rY   r   )	rT   r  r  r  rx  r=   r>   r  rd  s	            r7   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rH   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          j
        t          t          f                  |          }nd}d}d}g }g }|dk    r'|                    t          |||||                     |                    |           |dk    r'|                    t          |||||                     t          |          }|S )	Nc                F    g | ]}t          |t                    |j        S rG   )r  r,   r=   rC  s     r7   r_   z0Parser._auto_sized_delimiter.<locals>.<listcomp>
  s)    MMMq*Q:L:LM!(MMMrH   c                F    g | ]}t          |t                    |j        S rG   )r  r,   r>   rC  s     r7   r_   z0Parser._auto_sized_delimiter.<locals>.<listcomp>
  s)    KKKQ
1c8J8JKKKKrH   r  r   r\  )r  r   r  )rW  r  r   	enumerater   r   r,   r  remover  r  rQ   r!  r   r  rR  )rT   r  r  r  r  r=   r>   r  idxelra  middle_partr  rd  s                 r7   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 &agc4i&8!96BBKKFEFKC<<LLufeU6JJJL L L[!!!3;;LLtVUE&IIIK K KerH   c                    |                      |d         d|v r|d                                         ng |d                   S )Nr!  r  r"  )r  r_  r`  s     r7   r  zParser.auto_delim
  sH    ))L$)TMMDK   rM	  	rH   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\  rW  r  rR  r;  r!  rX   r#  r   ra  _latin_alphabets_small_greekrZ  )rT   r  r  rd  r  ra  r=  s          r7   rE  zParser.boldsymbol
  sA     G} 	  	 A!U##  JqMa&& (!AF%%'''QAt$$ 	 C40003qrr7d///#AF%%'''!!###QQU||rH   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 rG   )rR  )r\   r=  s     r7   r_   z#Parser.substack.<locals>.<listcomp>  s    ,,,aq,,,rH   r   c                    | j         S rS   r  r%  s    r7   <lambda>z!Parser.substack.<locals>.<lambda>  s    ag rH   r  c                    g | ]	}|D ]}|
S rG   rG   )r\   pairr   s      r7   r_   z#Parser.substack.<locals>.<listcomp>'  s=     " " " " "  " " " "rH   r   r  )rW  r|  r   re   r  rW  r   zipr  r  rl  rR  )rT   r  r  r  rx  rd  	max_widthr  r  cpstackr  rU  s                r7   rB  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,,rH   r  )
rV  r,   rM  r   rY   r;   r   r;   r-   rR  r  )r  r   r-   r]  )r  r   r-   r   )r  r   r-   r  )rk  r;   r-   rY  )rV  r,   r  r.   r  rr  r-   r  r  )r-   r  )r  r  r-   rn   )r  r,   r  r,   r  ry  r  r  rZ   rR  r  rR  r-   r  )r  r,   r  r  r  r,   r-   r  )QrB   rC   rD   rE   enumEnumr  rn  ro  r{  _relation_symbols_arrow_symbolsrz  r}  r  r  r  r*  r5  _ambi_delimsr|  _right_delimsr-  r  r1   r  stringascii_lettersr  rU   r$   rW  rZ  r\  rI  rG  rF  rH  staticmethodr   convertToFloatr&  r@  rm  r'  r  r2  r+   r)  r3  r4  r  r6  rD  r+  r  r0  r1  r,  r7  rX   r  r  r+  r  r  r  r;  r8  r9  r:  r  r>  r?  r<  r=  r  r  rE  rB  r   r  s   @r7   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       rH   r  )r+   r,   r-   r.   )r  r  r-   r  )r  )rP   rQ   r  r  r-   rO   )r  r,   r-   r   )r  r,   r  r   r-   r   ){rE   
__future__r   abcr  r  r   loggingr   r  r$  r  r  typingr   r   numpyrf   	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#   packaging.versionr$   parse_versionr%   pyparsing_versionmajorr'   r(   TYPE_CHECKINGcollections.abcr)   r*   enablePackrat	getLoggerr  r8   r:   rC   rJ   rO   r   r   ABCr   ABCMetar   r  rs  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rQ   r  r  r!  r1  r6  rR  rl  rs  rw  r~  r  r  rc  r  r  rY  r  r  r   r  r  r  r  rG   rH   r7   <module>r     s    # " " " " " 



        				 				                                                                       D D D D D D D D D D D D < < < < < < < < < < 7 7 7 7 7 7 7 7 7 7 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rH   