
    rbit                      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%m&Z& ddl'Z(ddl)m*Z* ddl+m,Z,m-Z-m.Z.m/Z/ dd	l0m1Z1m2Z2m3Z3 dd
l4m5Z5m6Z6m7Z7m8Z8 ej9        rddl:m;Z; ddl4m<Z<  ej=                      ej>        d          Z?ddZ@ G d de          ZAdeA_B         G d de          ZCdeC_B         G d d          ZD G d de          ZE G d de          ZF G d dejG                  ZH G d d eHejI        !          ZJ G d" d#eJ          ZK G d$ d%eJ          ZL G d& d'eLejI        !          ZM G d( d)eM          ZN G d* d+eM          ZO G d, d-eL          ZP G d. d/eP          ZQd0ZRd1ZS G d2 d3          ZT G d4 d5eT          ZU G d6 d7eT          ZV G d8 d9eT          ZW G d: d;eT          ZX G d< d=eT          ZYi d>eYd?eYd@eXdAeUdBeUdCeUdDeUdEeUdFeUdGeUdHeVdIeVdJeVdKeVdLeVdMeVdNeVeYeYdOZZddSZ[ G dT dU          Z\ G dV dWe\          Z] G dX dYe]          Z^ G dZ d[e]          Z_ G d\ d]e\          Z` G d^ d_e`          Za G d` dae]          Zb G db dceb          Zc G dd deeb          Zd G df dge]          Ze G dh diee          Zf G dj dkee          Zg G dl dme          Zh ehdndoddnd           ehdndodpdnd           ehdndodqdnd           ehdndnddod           ehdndnddodp           ehdndnddodq           ehdndnddnd           ehdndoddrd          dseh_i         G dt due\          Zj G dv dwec          Zk G dx dyed          Zl G dz d{e\          Zm G d| d}ec          Zn G d~ dec          ZodddZpddZq G d dQ          ZrddZs G d d          ZtdS )z.
Implementation details for :mod:`.mathtext`.
    )annotationsN)
NamedTuple)EmptyForwardLiteralGroupNotAny	OneOrMoreOptionalParseBaseExceptionParseExceptionParseExpressionParseFatalExceptionParserElementParseResultsQuotedStringRegex	StringEnd
ZeroOrMorepyparsing_commonnested_exprone_of   )cbook)latex_to_bakomastix_glyph_fixesstix_virtual_fontstex2uni)FontPropertiesfindfontget_font)FT2FontFT2ImageKerning	LoadFlags)Iterable)Glyphzmatplotlib.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     d/var/www/html/mdtn/previsions/meteo_cartes/venv/lib/python3.11/site-packages/matplotlib/_mathtext.pyget_unicode_indexr5   /   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__     r4   r7   r7   E   sQ           LLLMMMLLL::::222222rE   r7   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.
    r8   oxoyr9   r:   r;   r#   imageNr>   rD   rE   r4   rG   rG   [   sR           IIIIIILLLMMMLLLOOOOOrE   rG   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)rM   r<   r=   )selfrM   s     r4   __init__zOutput.__init__z   s    ;=>@


rE   r*   r7   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 rD   )fontfontsizenumoffset).0rH   rI   infohs       r4   
<listcomp>z$Output.to_vector.<locals>.<listcomp>   sK     / / /"b$ y$-2q2v7KL / / /rE   c                8    g | ]\  }}}}||z
  ||z
  ||z
  fS rD   rD   )rY   x1y1x2y2r[   s        r4   r\   z$Output.to_vector.<locals>.<listcomp>   sF     0 0 0 "b"b 1r627BG, 0 0 0rE   )
mapnpceilrM   r9   r:   r;   r<   r=   r7   )rQ   wdgsrsr[   s        @r4   	to_vectorzOutput.to_vector   s    Gdhndhotx~FH H1a/ / / /"&+/ / /0 0 0 0$(J0 0 01a!eQB///rE   antialiasedboolrG   c               2   t          g d | j        D             d | j        D             d          dz
  }t          g d | j        D             d | j        D             d          dz
  }t          g d | j        D             d | j        D             d          dz   }t          g d	 | j        D             d
 | j        D             d          dz   }||z
  }||z
  | j        j        z
  }||z
  | j        j        z
  }t          t          t          j
        |                    t          t          j
        |t          |d          z                                 }	t          | j        | | f          }
|
j        D ]Q\  }}}|j                            |	t          |          t          ||j        j        z
            |j        |           R|
j        D ]\  }}}}t          t          ||z
            dz
  d          }|dk    r!||z   dz  }t          ||dz   dz  z
            }nt          |          }|	                    t          |          |t          t          j
        |                    ||z              t%          dd|||z   ||	          S )Nc                4    g | ]\  }}}||j         j        z   S rD   )metricsxminrY   rH   rI   rZ   s       r4   r\   z$Output.to_raster.<locals>.<listcomp>   (    MMMRb4<,,MMMrE   c                    g | ]	\  }}}}|
S rD   rD   rY   r^   r_   r`   ra   s        r4   r\   z$Output.to_raster.<locals>.<listcomp>        :::^RRb:::rE   r   r   c                4    g | ]\  }}}||j         j        z
  S rD   )rn   ymaxrp   s       r4   r\   z$Output.to_raster.<locals>.<listcomp>   rq   rE   c                    g | ]	\  }}}}|
S rD   rD   rs   s        r4   r\   z$Output.to_raster.<locals>.<listcomp>   rt   rE   c                4    g | ]\  }}}||j         j        z   S rD   )rn   xmaxrp   s       r4   r\   z$Output.to_raster.<locals>.<listcomp>   rq   rE   c                    g | ]	\  }}}}|
S rD   rD   rs   s        r4   r\   z$Output.to_raster.<locals>.<listcomp>   rt   rE   c                4    g | ]\  }}}||j         j        z
  S rD   )rn   yminrp   s       r4   r\   z$Output.to_raster.<locals>.<listcomp>   rq   rE   c                    g | ]	\  }}}}|
S rD   rD   rs   s        r4   r\   z$Output.to_raster.<locals>.<listcomp>   rt   rE   )rj      )minr<   r=   maxrM   r;   r:   r#   r+   rc   rd   shiprU   draw_glyph_to_bitmaprn   icebergglyphdraw_rect_filledrG   )rQ   rj   ro   r|   ry   rv   re   r[   rf   rJ   shiftedrH   rI   rZ   r^   r_   r`   ra   r:   centerys                        r4   	to_rasterzOutput.to_raster   s     ?MMMMM ?::tz:::?<=? @ @BCD ?MMMMM ?::tz:::?<=? @ @BCD ?MMMMM ?::tz:::?<=? @ @BCD ?MMMMM ?::tz:::?<=? @ @BCD4K4K$(.(4K$(/)RWQZZ#bga#a))m.D.D*E*EFF tx4%$00#N 	) 	)LBDI**s2wwB)=$= > >
' + ) ) ) ) &m 	M 	MNBBR"W)1--F{{r'Q&1*!1122GG""3r77As272;;/?/?VLLLL1aAE1e444rE   N)rM   rN   )r*   r7   )rj   rk   r*   rG   )r?   r@   rA   rB   rR   ri   r   rD   rE   r4   rL   rL   r   s^         A A A A
0 0 0 0"5 "5 "5 "5 "5 "5rE   rL   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).
    r8   advancer:   r9   ro   ry   r|   rv   r   rk   slantedNr>   rD   rE   r4   r   r      sm          ( NNNMMMLLLKKKKKKKKKKKKNNNMMMMMrE   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"   rU   r8   rV   r)   postscript_namer   rn   r+   rW   r'   r   rX   Nr?   r@   rA   rC   rD   rE   r4   r   r      sU         MMMOOOHHHLLLMMMMMrE   r   c                  b    e Zd ZdZd/dZd0dZd1dZd2dZd3dZd4d#Z	d5d(Z
d6d)Zd6d*Zd7d-Zd.S )8Fontsz
    An abstract base class for a system of fonts to use for mathtext.

    The class must be able to take symbol keys and font file names and
    return the character metrics.  It also delegates to a backend class
    to do the actual drawing.
    default_font_propr   load_glyph_flagsr%   c                "    || _         || _        dS )a  
        Parameters
        ----------
        default_font_prop : `~.font_manager.FontProperties`
            The default non-math font, or the base font for Unicode (generic)
            font rendering.
        load_glyph_flags : `.ft2font.LoadFlags`
            Flags passed to the glyph loader (e.g. ``FT_Load_Glyph`` and
            ``FT_Load_Char`` for FreeType-based fonts).
        N)r   r   )rQ   r   r   s      r4   rR   zFonts.__init__   s     "3 0rE   font1r)   
fontclass1sym1	fontsize1r8   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.
                rD   )
rQ   r   r   r   r   r   r   r   r   r   s
             r4   get_kernzFonts.get_kern   s	     rrE   rU   r"   c                    t           rP   NotImplementedError)rQ   rU   s     r4   	_get_fontzFonts._get_font   s    !!rE   
font_classsymrV   r   c                    t           rP   r   )rQ   rU   r   r   rV   r   s         r4   	_get_infozFonts._get_info       !!rE   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   rn   )rQ   rU   r   r   rV   r   rZ   s          r4   get_metricszFonts.get_metrics   s%    2 ~~dJXsCC|rE   outputrL   rH   rI   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)
rQ   r   rH   rI   rU   r   r   rV   r   rZ   s
             r4   render_glyphzFonts.render_glyph  s?     ~~dJXsCCb"d^,,,,,rE   r^   r_   r`   ra   c                B    |j                             ||||f           dS )zL
        Draw a filled rectangle from (*x1*, *y1*) to (*x2*, *y2*).
        N)r=   r   rQ   r   r^   r_   r`   ra   s         r4   render_rect_filledzFonts.render_rect_filled$  s)    
 	RR,-----rE   c                    t                      )zF
        Get the xheight for the given *font* and *fontsize*.
        r   rQ   rU   rV   r   s       r4   get_xheightzFonts.get_xheight+  s     "###rE   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       r4   get_underline_thicknesszFonts.get_underline_thickness1  s    
 "###rE   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.
        rD   rQ   r   r   s      r4   !get_sized_alternatives_for_symbolz'Fonts.get_sized_alternatives_for_symbol8  s     3  rE   Nr   r   r   r%   r   r)   r   r)   r   r)   r   r8   r   r)   r   r)   r   r)   r   r8   r   r8   r*   r8   )rU   r)   r*   r"   )rU   r)   r   r)   r   r)   rV   r8   r   r8   r*   r   )rU   r)   r   r)   r   r)   rV   r8   r   r8   r*   r   )r   rL   rH   r8   rI   r8   rU   r)   r   r)   r   r)   rV   r8   r   r8   r*   r   r   rL   r^   r8   r_   r8   r`   r8   ra   r8   r*   r   rU   r)   rV   r8   r   r8   r*   r8   r   r)   r   r)   r*   r   )r?   r@   rA   rB   rR   r   r   r   r   r   r   r   r   r   rD   rE   r4   r   r      s         1 1 1 1   " " " "" " " "   8- - - -. . . .$ $ $ $$ $ $ $! ! ! ! ! !rE   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)
superrR   	functoolscacher   _fontsfontmapr    r   r!   )rQ   r   r   filenamedefault_font	__class__s        r4   rR   zTruetypeFonts.__init__I  s{    *,<==="88-/D233))!-I!-IrE   rU   	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 rP   )r   Tcastr)   r   getospathexistsr!   r   lowerr"   )rQ   rU   basenamecached_fonts       r4   r   zTruetypeFonts._get_fontU  s    4<|D)HH vc4((Hkooh//27>>(#;#;"8,,K$/DK!7BDK34?JDK399;;<vg{+++rE   r   r'   rV   r8   r   c                N    |j         dk    r|j        dz  dz  |dz  |z  dz  z   S dS )NCmex10@   r~      H   r   )r   r:   )rQ   rU   r   rV   r   s        r4   _get_offsetzTruetypeFonts._get_offsetd  s:    8++L2%)hqj3.>r.ABBrrE   r   r)   r   r   tuple[FT2Font, int, bool]c                    t           rP   r   )rQ   r   r   r   s       r4   
_get_glyphzTruetypeFonts._get_glyphj  r   rE   r   c                   |                      |||          \  }}}|                    ||           |                    || j                  }	d |	j        D             \  }
}}}|                     ||	||          }t          |	j        dz  |	j        dz  |	j	        dz  |
|||z   ||z   |	j
        dz  |z   |	  	        }t          |||j        |||	|          S )N)flagsc              3      K   | ]	}|d z  V  
dS )r   NrD   )rY   vals     r4   	<genexpr>z*TruetypeFonts._get_info.<locals>.<genexpr>u  s&      !A!As#(!A!A!A!A!A!ArE      r   )	r   r:   r9   ro   ry   r|   rv   r   r   )rU   rV   r   rn   rW   r   rX   )r   set_size	load_charr   bboxr   r   linearHoriAdvancer:   r9   horiBearingYr   r   )rQ   r   r   r   rV   r   rU   rW   r   r   ro   r|   ry   rv   rX   rn   s                   r4   r   zTruetypeFonts._get_infoo  s   !__Xz3GGc7h$$$s$*?@@!A!Aej!A!A!AdD$!!$x==+e3<"$+"&+f4
 
 
  0
 
 
 	
rE   c                   |                      |          }|                    ||           |                    d          }|0|                     |t          j        d         d||          }|j        S |d         dz  |dz  z  |dz  z  }|S )Npcltmathtext.defaultxxHeightg      P@g      (@g      Y@)r   r   get_sfnt_tabler   mplrcParamsr   )rQ   r   rV   r   rU   r   rn   r   s           r4   r   zTruetypeFonts.get_xheight  s    ~~h''h$$$""6**<&&#,'9:C3P PG?"	?T)ho>#+NrE   c                    d|z  |z  dz  S )Ng      ?g      R@rD   r   s       r4   r   z%TruetypeFonts.get_underline_thickness  s     (3.$66rE   r   r   r   r   r   r   r   r   c
                <   ||k    rm||k    rg|                      |||||	          }
|                      |||||	          }|
j        }|                    |
j        |j        t          j                  dz  S t                                          |||||||||		  	        S )Nr   )r   rU   get_kerningrW   r$   DEFAULTr   r   )rQ   r   r   r   r   r   r   r   r   r   info1info2rU   r   s                r4   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rE   r   )rU   r   r*   r"   )
rU   r"   r   r'   rV   r8   r   r8   r*   r8   r   r)   r   r)   r   r)   r*   r   )r   r)   r   r)   r   r)   rV   r8   r   r8   r*   r   )r   r)   rV   r8   r   r8   r*   r8   r   r   )r?   r@   rA   rB   rR   r   r   r   r   r   r   r   __classcell__r   s   @r4   r   r   C  s         

. 
. 
. 
. 
. 
., , , ,   " " " "

 
 
 
>
 
 
 
7 7 7 7	I 	I 	I 	I 	I 	I 	I 	I 	I 	IrE   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 rP   )	StixFonts_stix_fallbackr   rR   _fontmapitemsr    r   )rQ   r   r   keyr   fullpathr   s         r4   rR   zBakomaFonts.__init__  s    '(9;KLL*,<===++-- 	) 	)HC}}H (DL (DL	) 	)rE   
\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   lenr.   get_char_indexr  r   )rQ   r   r   r   rU   r   rW   r   s           r4   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LrE   ())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  rf   z
\widetilde))r  ~)r  e)r  f)r  g)r  r[   rI  )r  r6  rN  )<>)
)z
\leftparenr  )z\rightparenr$  )z
\leftbracer)  )z\rightbracer-  )z\leftbracketr1  )z\rightbracketr4  )\{r)  )\}r-  )\[r1  )\]r4  r   c                >    | j                             |||fg          S rP   )_size_alternativesr   r   s      r4   r   z-BakomaFonts.get_sized_alternatives_for_symbol  s"    &**3(C0ABBBrE   r   r   r   )r?   r@   rA   rB   r  rR   setsplitr  r   rm  aliastargetr   r   r  s   @r4   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rE   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   rR   ro  r    r   r   
isinstancer  )rQ   r   r   fallback_rcfont_clstexfontproprU   stixsizedaltfontssizenamer  r   s               r4   rR   zUnicodeFonts.__init__*  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""	. 	.. .rE   r  r   r)   r   uniindexr+   r*   tuple[str, int]c                
    ||fS rP   rD   )rQ   r   r   r  s       r4   _map_virtual_fontzUnicodeFonts._map_virtual_fontO  s    !!rE   r   r   c                   	 t          |          }d}n<# t          $ r/ t          d          }d}t                              d|           Y nw xY w|                     |||          \  }}|}|r|dk    r\|dk     rVt          |          }t          j        |          d         dk    s't          j	        |          
                    d	          rd
}|dk    p|| j        v }d}|                     |          }	|	_|| j        v r9|	j        dk    r.t          t!          j        d                    }	| j        |         }|	                    |          }
|
dk    rd}|s| j        r|dv rt)          | j        t*                    rd
}| j                            |||          }|d         j        }|t/          t0          j                                                  v rd}t                              d||           |S |dv r,t)          | t*                    r|                     d
||          S t                              d|||           |                     d
          }	d}d}|	||fS )NT?Fz!No TeX to Unicode mapping for %a.r  r   r   LzGREEK CAPITALr  r  zfonts/ttf/cmsy10.ttf)r  r   zComputer ModernzSubstituting symbol %s from %szNFont %r does not have a glyph for %a [U+%x], substituting with a dummy symbol.   )r5   r2   r.   _logwarningr  chrunicodedatacategoryr  
startswithr  r   _cmr10_substitutionsfamily_namer!   r   _get_data_pathr  r  r  r  r   listr  r  valuesrZ   )rQ   r   r   r   r  found_symbolnew_fontnamecharr   rU   
glyphindexre  familys                r4   r   zUnicodeFonts._get_glyphS  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 rP   )r  r   r   s      r4   r   z.UnicodeFonts.get_sized_alternatives_for_symbol  s:     	&HH#  3  rE   r   r   r)   r   r)   r  r+   r*   r  r   r   )r?   r@   rA   rB   r  rR   rn  ro  r  r  r   r   r   r  s   @r4   rs  rs    s        	 	  
!. !. !. !. !. !.F s=..0011" " " "=' =' =' ='~! ! ! ! ! ! ! !rE   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   rR   r  updater  r    r   rQ   r   r   r  r  r  s         r4   rR   zDejaVuFonts.__init__  s    d,-- 	U"+,=?O"P"PD"/0ACS"T"TD!"35EFFt%68HIII!  
 
 	 	 	 ,,.. 	* 	*IC~~H (DL!)DL	* 	*rE   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   r5   r   r  r   )rQ   r   r   r   r  rU   r  r   s          r4   r   zDejaVuFonts._get_glyph  s     );))(JDDD )--H>>$''D!00::
?? 77--dJDDD77%%h
C@@@rE   r   r   )r?   r@   rA   r  rC   rR   r   r   r  s   @r4   r  r    sn         %'H''''* * * **A A A A A A A A A ArE   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r?   r@   rA   rB   r  rD   rE   r4   r  r    s>          #(* $	 	HHHrE   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  rD   rE   r4   r  r    s>          "') #	 	HHHrE   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 rP   )r   rR   r  r  r    r   r  s         r4   rR   zStixFonts.__init__  sm    t%68HIII,,.. 	* 	*IC~~H (DL!)DL	* 	*rE   r   r)   r   r  r+   r*   r  c                   t          j        |          }| j        r||dvrt           d         }d}nd}t          |t                    r"	 ||         }n2# t
          $ r |d         }Y nw xY wt          |t                    r|}nd }|d}t          |          }||k     r7||z   dz  }	||	         }
||
d         k     r|	}n||
d         k    rn|	dz   }||k     7|
d         |cxk    r|
d         k    r n n||
d         z
  |
d	         z   }|
d         }n|sd}t          j	        d
         }|dv rt          j        ||          }|dv rd|cxk    rdk    rn nd|z   }||fS )N)r   r   r  TFr  r   r~   r   r   r   )r  r  )r  r  r  r  i   i  nonuni)r   r   _sansr  dictr1   r  r  r   r   r   )rQ   r   r   r  font_mappingdoing_sans_conversionmappinglohimidranges              r4   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  )rY   r6  rQ   r  s     r4   r\   z?StixFonts.get_sized_alternatives_for_symbol.<locals>.<listcomp>Q  sU     L L Lq>>!,,;;HEEJJ CMM*JJJrE      rR  )r   r5   r2   r  )rQ   r   r   fixesalternativesr  s   `    @r4   r   z+StixFonts.get_sized_alternatives_for_symbolB  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  )r?   r@   rA   rB   r  rC   r  r  rR   r  r   r   r   rD   rE   r4   r  r    s         
 
 "')$+0& &H     NE* * * *4" 4" 4" 4"l _   _  rE   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)r?   r@   rA   rB   r  rD   rE   r4   r  r  Z  s          EEErE   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)r?   r@   rA   rB   r  rC   r  r  r  r  r  r  r  rD   rE   r4   r  r    s           '+L**** "%G$$$$ "D!!!! "D!!!! "D!!!!  %E$$$$
 (+M**** ),N++++++rE   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)r?   r@   rA   r  r  r  r  r  r  r  r  rD   rE   r4   r  r    s6        LGDDDEMNNNrE   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)	r?   r@   rA   r  r  r  r  r  r  rD   rE   r4   r  r    s,        LDDEMNNNrE   r  c                      e Zd ZdZdZdZdZdS )STIXSansFontConstantsr  r  r  r  N)r?   r@   rA   r  r  r  r  rD   rE   r4   r  r    s"        LDMNNNrE   r  c                      e Zd ZdS )DejaVuSerifFontConstantsNr?   r@   rA   rD   rE   r4   r  r            DrE   r  c                      e Zd ZdS )DejaVuSansFontConstantsNr  rD   rE   r4   r  r    r  rE   r  r  r  r  r	  r  r  r  r
  r  r  r{  r  r  r  r~  r}  r|  )zBitstream Vera SanszBitstream VerastateParserStatetype[FontConstantsBase]c                    t                               | j                            | j                  j        t                    }|t          u r!t          | j        t                    rt          S |S rP   )_font_constant_mappingr   fontsetr   rU   r  r  r  r  r  r  )r  	constantss     r4   _get_font_constant_setr    sb    &**
++79JL LI 	&&&u}m44 	'$$rE   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  rQ   s    r4   rR   zNode.__init__  s    			rE   r)   c                *    t          |           j        S rP   )typer?   r  s    r4   __repr__zNode.__repr__  s    Dzz""rE   nextNode | Noner8   c                    dS Nr   rD   )rQ   r  s     r4   r   zNode.get_kerning  s    srE   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    r4   shrinkzNode.shrink  s    
 			Q				rE   r   rL   r   r   c                    dS )zRender this node.NrD   rQ   r   r   r   s       r4   renderzNode.render  s      rE   Nr*   r   r*   r)   r  r  r*   r8   r   rL   r   r8   r   r8   r*   r   )	r?   r@   rA   rB   rR   r  r   r  r
  rD   rE   r4   r  r    s~        &&   # # # #                 rE   r  c                  8     e Zd ZdZd fdZd fd	ZddZ xZS )rN   z A node with a physical location.r9   r8   r:   r;   r*   r   c                r    t                                                       || _        || _        || _        d S rP   )r   rR   r9   r:   r;   )rQ   r9   r:   r;   r   s       r4   rR   zBox.__init__  s2    



rE   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 rP   )r   r  r  NUM_SIZE_LEVELSr9   SHRINK_FACTORr:   r;   rQ   r   s    r4   r  z
Box.shrink  s`    9&&JJ=(JJKK=(KKJJ=(JJJJ '&rE   r   rL   r^   r_   r`   ra   c                    d S rP   rD   r   s         r4   r
  z
Box.render  s    rE   )r9   r8   r:   r8   r;   r8   r*   r   r  r   )r?   r@   rA   rB   rR   r  r
  r   r  s   @r4   rN   rN     su        **     ) ) ) ) ) )       rE   rN   c                  $     e Zd ZdZd fdZ xZS )Vboxz$A box with only height (zero width).r:   r8   r;   c                N    t                                          d||           d S r  r   rR   )rQ   r:   r;   r   s      r4   rR   zVbox.__init__  s%    VU+++++rE   )r:   r8   r;   r8   r?   r@   rA   rB   rR   r   r  s   @r4   r  r    sC        .., , , , , , , , , ,rE   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).r9   r8   c                N    t                                          |dd           d S r  r  rQ   r9   r   s     r4   rR   zHbox.__init__"  s%    B'''''rE   r9   r8   r  r  s   @r4   r  r    sC        88( ( ( ( ( ( ( ( ( (rE   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 rP   )	r   rR   ra  r  rU   r   rV   r   _update_metrics)rQ   ra  r  r   s      r4   rR   zChar.__init__3  sh    }J	*9 	rE   r*   c                    d| j         z  S )Nz`%s`ra  r  s    r4   r  zChar.__repr__?  s    rE   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   rU   r   ra  rV   r   _metricsr   r9   r   r:   r;   rQ   rn   s     r4   r#  zChar._update_metricsB  sy    "&,":":Ittx#I #I 	I$-6S== DJJ DJo78


rE   rk   c                    | j         j        S rP   )r(  r   r  s    r4   
is_slantedzChar.is_slantedL  s    }$$rE   r  r  r8   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   r9   r  r!  r  r   rU   r   ra  rV   r   )rQ   r  r   kerns       r4   r   zChar.get_kerningO  sv     -'$*4dD!! 	<((	4?DFDM	4?DFDM D ~rE   r   rL   r   r   c           
     z    | j                             |||| j        | j        | j        | j        | j                   d S rP   )r  r   rU   r   ra  rV   r   r	  s       r4   r
  zChar.render_  sG    !!AqIttx	I 	I 	I 	I 	IrE   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 rP   )	r   r  r  r  rV   r  r9   r:   r;   r  s    r4   r  zChar.shrinkd  sp    9&&MM]*MMJJ]*JJKK]*KKJJ]*JJJJ	 '&rE   )ra  r)   r  r  r  r  )r*   rk   r  r  )r?   r@   rA   rB   rR   r  r#  r+  r   r
  r  r   r  s   @r4   r!  r!  &  s        
 

 
 
 
 
 
   9 9 9 9% % % %    I I I I
+ + + + + + + + + +rE   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   rU   r   ra  rV   r   r(  ry   ro   r9   rv   r|   r:   r;   r)  s     r4   r#  zAccent._update_metricss  se    "&,":":Ittx#I #I 	I$-\GL0
lW\1


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

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

Q!
rE   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 VlistrR  r   Nr   r^  r  r_  )r;  r  rN   r:   r;   rc   r`  r9   ra  r   rb  rc  rd  re  rf  r  rX  r!  RuntimeErrorr=  r>  rL  rM  )rQ   r[   rE  rA  re   rf   r   rg  rh  rS  rV  rc  s               r4   rm  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,
;;;;;rE   ri  )r7  r8  r[   r8   rE  rS  )r[   r8   rE  rS  rA  r8   r*   r   )	r?   r@   rA   rB   rR   rc   infrm  r   r  s   @r4   rk  rk    s}        ##>A9E      
  #6BG< G< G< G< G< G< G< G< G<rE   rk  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`.
    r9   r8   r:   r;   r  r  c                f    t                                          |||           |j        | _        d S rP   )r   rR   r  )rQ   r9   r:   r;   r  r   s        r4   rR   zRule.__init__s  s,    ...}rE   r   rL   r   r   re   r[   r*   r   c                N    | j                             |||||z   ||z              d S rP   )r  r   )rQ   r   r   r   re   r[   s         r4   r
  zRule.renderw  s.    ''1a!eQUCCCCCrE   )r9   r8   r:   r8   r;   r8   r  r  )r   rL   r   r8   r   r8   re   r8   r[   r8   r*   r   )r?   r@   rA   rB   rR   r
  r   r  s   @r4   rr  rr  h  sc         % % % % % %D D D D D D D DrE   rr  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   rR   rc   rp  )rQ   r  rw  r:   r;   r   s        r4   rR   zHrule.__init__  sN    ==??I"S(66666rE   rP   )r  r  rw  rx  r  r  s   @r4   rv  rv  |  sH        887 7 7 7 7 7 7 7 7 7 7rE   rv  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 rP   rz  )rQ   r  rw  r   s      r4   rR   zVrule.__init__  s<    99;;	BFBFE:::::rE   )r  r  r  r  s   @r4   r}  r}    sC        66; ; ; ; ; ; ; ; ; ;rE   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 )		_GlueSpecr8   r9   re  r+   rd  r  rf  Nr   rD   rE   r4   r  r    sE         LLLNNNMMMrE   r  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 )
rb  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   rR   r  r)   r  _namedr2   rc  )rQ   r  rc  r   s      r4   rR   zGlue.__init__  sq     	i%% 	O!(3II	9-- 	O!IIMNNN"rE   r*   r   c                    t                                                       | j        t          k     r1| j        }|                    |j        t          z            | _        d S d S )Nr9   )r   r  r  r  rc  _replacer9   r  )rQ   re  r   s     r4   r  zGlue.shrink  sS    9&&AZZag.EZFFDNNN '&rE   )r  r  r  )r?   r@   rA   rB   rR   r  r   r  s   @r4   rb  rb    so         # # # # # #G G G G G G G G G GrE   rb  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rT  r   rR   rb  r?  s     r4   rR   zHCentered.__init__  s?    $t**<x<d<eLLLLLrE   r7  r  r  r  s   @r4   r  r    sQ         
M M M M M M M M M MrE   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     r4   rR   zVCentered.__init__  s:    $t**<x<d<=====rE   r  r  r  s   @r4   r  r    sG         
> > > > > > > > > >rE   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 )rX  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   r9   r8   c                V    t                                                       || _        d S rP   )r   rR   r9   r  s     r4   rR   zKern.__init__  s$    


rE   r*   r)   c                    d| j         z  S )Nzk%.02fr  r  s    r4   r  zKern.__repr__  s    $*$$rE   r   c                    t                                                       | j        t          k     r| xj        t
          z  c_        d S d S rP   )r   r  r  r  r9   r  r  s    r4   r  zKern.shrink  s@    9&&JJ-'JJJJ '&rE   r  r  r  )
r?   r@   rA   rB   r:   r;   rR   r  r  r   r  s   @r4   rX  rX    s          FE     % % % %( ( ( ( ( ( ( ( ( (rE   rX  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:   r8   r;   r  r  alwaysrk   factorrx  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   rU   r   rV   r   copyr!  r:   r;   r  r   rR   r:  )rQ   ra  r:   r;   r  r  r  r  r   target_totalr   r   r  shiftr   s                 r4   rR   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$   !rE   )FN)ra  r)   r:   r8   r;   r8   r  r  r  rk   r  rx  r  r  s   @r4   r  r    sR          ?C" " " " " " " " " " "rE   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)   r9   r8   r  r  r  rk   
char_class
type[Char]c                h   |j                             |j        |          }|                                }|D ]%\  }}||_         |||          }	|	j        |k    r n&||	j        z  }
|xj        |
z  c_         |||          }	t                                          |	g           |	j        | _        d S rP   )r  r   rU   r  r9   rV   r   rR   )rQ   ra  r9   r  r  r  r  r   r   r  r  r   s              r4   rR   zAutoWidthChar.__init__  s    }FFJ  

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


rE   )
ra  r)   r9   r8   r  r  r  rk   r  r  )r?   r@   rA   rB   r!  rR   r   r  s   @r4   r  r    sV          QV*.                     rE   r  r   r   rM   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   valuer8   r*   c                &    | dk     rdn	| dk    rdn| S )Ng    eg    eArD   )r  s    r4   clampzship.<locals>.clampC  s     t||tt5HrE   rM   rQ  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
  r9   rX  r6  r  r:  rQ  rk  rN   r:   r;   rc   r`  rb  rc  rd  re  roundr<  rf  r  )rM   cur_gcur_gluer>  r=  	base_line	left_edgerS  edgerule_height
rule_depth
rule_widthrc  r  cur_hcur_v	hlist_outoff_hoff_vr   	vlist_outs                r4   r  zship.<locals>.hlist_outF  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	$rE   rk  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  rX  r9   r6  r  r;   r:  rQ  rk  rN   rc   r`  r
  rb  rc  rd  re  r  r<  rf  r  r!  ro  )rM   r  r  r>  r=  r  top_edgerS  save_vr  r  r  rc  r  r  r  r  r  r  r   r  s                r4   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rE   )r  r8   r*   r8   )rM   rQ  r*   r   )rM   rk  r*   r   )r:   rL   r  rQ  )rM   r  rH   rI   r  r  r  r  r  r  r   r  s       @@@@@@@@r4   r   r   2  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MrE   msgr   c                R     d
 fd	}t                                          |          S )z$Helper class to raise parser errors.rV  r)   locr+   toksr   r*   T.Anyc                &    t          | |          rP   r   )rV  r  r  r  s      r4   raise_errorzError.<locals>.raise_error  s    !!S#...rE   rV  r)   r  r+   r  r   r*   r  )r   set_parse_action)r  r  s   ` r4   Errorr    s;    / / / / / / 77##K000rE   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   rU   r)   r   rV   r8   r   c                L    || _         || _        || _        || _        || _        d S rP   )r  _fontr   rV   r   )rQ   r  rU   r   rV   r   s         r4   rR   zParserState.__init__  s)    
$ rE   r*   c                *    t          j         |           S rP   )r  r  s    r4   r  zParserState.copy  s    yrE   c                    | j         S rP   )r  r  s    r4   rU   zParserState.font  s
    zrE   r  r   c                *    |dv r|| _         || _        d S )N)r  r  r  r  )r   r  )rQ   r  s     r4   rU   zParserState.font  s     ---"DO


rE   c                X    | j                             | j        | j        | j                  S )z.Return the underline thickness for this state.)r  r   rU   rV   r   r  s    r4   r{  z+ParserState.get_current_underline_thickness  s)    |33It}dh0 0 	0rE   N)
r  r   rU   r)   r   r)   rV   r8   r   r8   r*   r  r  )r  r)   r*   r   )r*   r8   )
r?   r@   rA   rB   rR   r  propertyrU   setterr{  rD   rE   r4   r  r    s                   X 
[   [
0 0 0 0 0 0rE   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 rP   )r  r   exprsresultsName)r  r  namess     r4   r  zcmd.<locals>.names  s      c?++ 	"	 ' ' 5;;&&&&&&&&' '_ 	"/!!!!!	" 	"rE   r)  r   r    c              3      K   | ]	}d |z  V  
dS )z{%s}NrD   )rY   r  s     r4   r   zcmd.<locals>.<genexpr>  s&      BBdFTMBBBBBBrE   z	Expected )r  r   r*   r  )ro  rE  r  )r  r  csnamer3   r  s       @r4   cmdr    s    " " " " " " ZZQ"Ffnn BGGBBeeDkkBBBBBBB"& TE"3c"3"344455rE   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)r?   r@   rA   DISPLAYSTYLE	TEXTSTYLESCRIPTSTYLESCRIPTSCRIPTSTYLErD   rE   r4   
_MathStyler    s%        	rE   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   )rY   r6  s     r4   r\   zParser.<listcomp>  sX     G G G(Q006688<BBDD G G GrE   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  set_namehasattrr  ra  )r  r   rS  rQ   s     r4   set_names_and_parse_actionsz4Parser.__init__.<locals>.set_names_and_parse_actions  s     GGMMOO 	A 	AS~~c** A "FFFS)))tS)) A,,WT3-?-?@@@	A 	ArE   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  alpharR  nonalpha)isalphar   r   rD  rE  rb   reescape)r  r  ends_with_alphaends_with_nonalphar  s        r4   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    rE   z[-+]?([0-9]+\.?[0-9]*|\.[0-9]+)spacec                6    g | ]}t          |j                  S rD   )r)   r  )rY   rc  s     r4   r\   z#Parser.__init__.<locals>.<listcomp>  s     333aS\\333rE   style_literalzI[a-zA-Z0-9 +\-*/<>=:,.;!\?&'@()\[\]|\U00000080-\U0001ffff]|\\[%${}\[\]_|]z|\\(?:{})(?![A-Za-z])r  r   z\\[A-Za-z]+r  rU   z\mathr)  r-  z\hspaceaccentz\fracrW   denz\dfracz\binomz\genfracldelimrdelimrulesizestylez\sqrt{value}r1  r4  rootr  z	\overlinebodyz\overset
annotationz	\undersetz\textr-   )end_quote_charz	\substackz\\)openerclosercontentpartsnucleusr  r_  subsuperz'*apostrophesz'+z\operatornamez\boldsymbol\middlemdelimzExpected a delimiterz\leftleftr  z\rightrightr;  F)unquote_resultsz(?:(?:\\[$])|[^$])*r  )r  r)   r  r  r*   r   )HtypesSimpleNamespacer   float_literalr   _space_widthsr
  r  r  rD  rE  rb   r  r  r   leave_whitespacer(   unknown_symbol
_fontnamesrU   r   start_groupr   	end_group_delimsdelimr   r  r  named_placeablerequired_groupoptional_groupr  r   r
   r  customspace_accent_map_wide_accentsr  _function_namesfunctionr  r   unclosed_groupfracdfracbinomgenfracr	   sqrtoverlineoversetundersetr   textr   r   suppresssubstackr  simpleoperatorname
boldsymbolr  mathmath_stringnon_mathmain_expression_math_expression_in_subscript_or_superscript)rQ   r  r	  r  rS  s   `   @r4   rR   zParser.__init__  s	   !##
	A 
	A 
	A 
	A 
	A 
	A 
	A	 	 	 	" !!CDD56$"455g>>56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/Fvdo/F/Fv/N/N$NOORUU"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JJJKKO;c#/4Yqw5G5G/H/H'1'&//2J2J2L2L'M'M0NO O OOVX XY Y
 #Xak""9--:yc
++ak9:::FFG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%HHH 677HHJJ
JAMAJ$>???)++M 	
 	$#%%%6 ! -2)))rE   rV  r)   fonts_objectr   rV   r8   r   rQ  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_cacherI  parse_stringr   r2   r   explainrK  r   reset_cacher   r   rQ  )rQ   rV  rL  rV   r   resultr3   s          r4   parsezParser.parsei  s     ixEEGFH	N%22155FF! 	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  )rO  r  s    r4   	get_statezParser.get_state  s     $$rE   c                8    | j                                          dS )zPop a `State` off of the stack.N)rO  popr  s    r4   	pop_statezParser.pop_state  s    rE   c                    | j                             |                                                                            dS )z=Push a new `State` onto the stack, copying the current state.N)rO  r   rW  r  r  s    r4   
push_statezParser.push_state  s5      !1!1!6!6!8!899999rE   r  r   list[Hlist]c                F    t          |                                          gS rP   )rQ  as_listrQ   r  s     r4   rH  zParser.main  s    dllnn%%&&rE   c                V    | j                             |d         dd         d          S )Nr   r   r  T)	parse_all)rJ  rQ  r`  s     r4   rF  zParser.math_string  s*    $11$q'!B$-41PPPrE   r  c                r    t          |                                          }|                                  |gS rP   )rQ  r_  rZ  )rQ   r  hlists      r4   rE  zParser.math  s.    dllnn%%wrE   c                     |d                              dd          } fd|D             }t          |          }                                  t          j        d                                          _        |gS )Nr   z\$r;  c                T    g | ]$}t          |                                          %S rD   )r!  rW  )rY   ra  rQ   s     r4   r\   z#Parser.non_math.<locals>.<listcomp>  s-    88844>>++,,888rE   r   )replacerQ  r\  r   r   rW  rU   )rQ   r  rV  symbolsrd  s   `    r4   rG  zParser.non_math  so    GOOE3''8888a888g #-? @wrE   c                    |                                   |                                 d_        t          fd|d         D                       }|                                  |gS )Nr  c                0    g | ]}t          |          S rD   )r!  )rY   ra  r  s     r4   r\   zParser.text.<locals>.<listcomp>  s!    777!tAu~~777rE   r   )r\  rW  rU   rQ  rZ  )rQ   r  rd  r  s      @r4   r?  zParser.text  sf      
7777tAw77788wrE   
percentagerX  c                @   |                                  }|j        |j        |j        f}| j                            |          }|I|j                            dt          j	        d         d|j        |j                  }|j
        }|| j        |<   t          ||z            S )Nr  r   rE  )rW  rU   rV   r   rP  r   r  r   r   r   r   rX  )rQ   rk  r  r  r9   rn   s         r4   _make_spacezParser._make_space  s       z5>595$((--=m//cl#56	+ +G OE(-D %EJ&'''rE   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  )rQ   r  rW   rM   s       r4   r
  zParser.space  s-     g/s##urE   c                :    |                      |d                   gS rp  )rm  r`  s     r4   r1  zParser.customspace  s      g//00rE   r  r+   ParseResults | dict[str, str]c                   |d         }|dk    rd}	 t          ||                                           }n'# t          $ r}t          ||d|z            |d }~ww xY w|| j        v rt          d |d |         d d d         D             d          }| j        sI|| j        v rCt          |d |         	                                          dk    s|d	h| j
        | j        v r|gS t          |                     d
          ||                     d
          gd          gS || j        v rt          d |d |         d d d         D             d          }t          d ||dz   d          D             d          }|dk    r|d	k    r	|dk    r|gS |dk    r+|                                r|                                r|gS t          ||                     d
          gd          gS |gS )Nr   rZ  u   −zUnknown symbol: %sc              3  &   K   | ]}|d k    |V  dS r'  NrD   rY   ra  s     r4   r   z Parser.symbol.<locals>.<genexpr>  &      CCA!s((a((((CCrE   r  r  r   r)  r  Tr  c              3  &   K   | ]}|d k    |V  dS ru  rD   rv  s     r4   r   z Parser.symbol.<locals>.<genexpr>  rw  rE   c              3  &   K   | ]}|d k    |V  dS ru  rD   rv  s     r4   r   z Parser.symbol.<locals>.<genexpr>  s&      AAASaAArE   r   r^  r-  r\  )r!  rW  r2   r   _spaced_symbolsr  rK  _binary_operatorsr  ro  _left_delims_relation_symbolsrQ  rm  _punctuation_symbolsisdigit)	rQ   rV  r  r  ra  r  r3   	prev_char	next_chars	            r4   r(   zParser.symbol  sv   K88 !A	I4>>++,,DD 	I 	I 	I%a&:Q&>@ @EHI	I $$$ CC4C42CCCRHHI 1 	-///$3$((A--?J"/?J262H?J 2J 2Jvt//44##//446 '+, , , - - $+++CC4C42CCCRHHIAA3788AAA2FFI Cxx##	S(8(8 6M CxxI--//xI4E4E4G4GxvtT%5%5c%:%:;TJJJKKvs   "5 
AAAc                6    t          ||d|d                    )NzUnknown symbol: r  r  rQ   rV  r  r  s       r4   r(  zParser.unknown_symbol	  s!    !!S*KT&\*K*KLLLrE   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   r-   )r  r  g      @exactlyr          @)rW  r{  r3  r  r9   r1  r2  r  r  r  rV  rk  r  rQ  )rQ   r  r  rw  r  r   
accent_boxcentereds           r4   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   	rE   c                N    |                      |||          }|d         |_        |S )Nr  )rC  function_name)rQ   rV  r  r  rd  s        r4   r5  zParser.function3	  s*    !!!S$//"6lrE   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  rD   rv  s     r4   r   z&Parser.operatorname.<locals>.<genexpr>K	  s&      CC!s((!((((CCrE   r  r_  r  rn  >   r  r_  TF)r\  rW  rU   r  r!  r#  r   r)   r  r   r  r,  _overunder_functionsrm  r&  rZ  rK  rQ  )rQ   rV  r  r  r  
hlist_listr  ra  next_char_locr  
delimiterss              r4   rC  zParser.operatorname8	  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   rE   c                    |                                   |                    d          r,|                    d          |                                 _        g S NrU   )r\  r   rW  rU   r`  s     r4   r*  zParser.start_group[	  sI    88F 	5$(HHV$4$4DNN!	rE   c                N    t          |                    dg                     }|gS Nr  rQ  r   )rQ   r  grps      r4   r  zParser.groupb	  s$    DHHWb))**urE   c                H    t          |                    dg                     S r  r  r`  s     r4   r/  zParser.required_groupf	  s    TXXgr**+++rE   c                .    |                                   g S rP   )rZ  r  s    r4   r+  zParser.end_groupk	  s    	rE   c                >    t          |t          |          d          )NzExpected '}')r   r  r  s       r4   r6  zParser.unclosed_groupo	  s    !!SVV^<<<rE   c                D    |d         |                                  _        g S r  )rW  rU   r`  s     r4   rU   zParser.fontr	  s     $V	rE   r  r  rk   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_symbolsrQ  r  r  r  rQ   r  s     r4   is_overunderzParser.is_overunderv	  s`    gt$$ 	F9 777'' 	FGG_,M,M 	F(D,EEEurE   c                L    t          |t                    r|j        | j        v S dS NF)r  r!  ra  _dropsub_symbolsr  s     r4   
is_dropsubzParser.is_dropsub}	  s)    gt$$ 	69 555urE   c                X    t          |t                    r|                                S dS r  )r  r!  r+  r  s     r4   r+  zParser.is_slanted	  s+    gt$$ 	(%%'''urE   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          |          rnt;          |d         t<                    r%t;          |d         t>                    r
|d d         }|d         }t;          |t>                    r|j         j!        |_        t          |d          }n6t;          |t>                    r|j         j!        |_        t          |g          }tE          |          }|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=          |          tQ          j)        tT          |          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        |j/        |z  z  c_        ||g}"| j0        r+|"| 1                    | j2        d                   gz  }"d| _0        t          |"          }|gS )Nr  r   r  r  r  zDouble subscriptzDouble superscriptr   r  r         @r  r  Fr  r  r   rn  )3r   r  r  r   rW  r  r   rU   rV   r   r   rQ  r  r;  extendr(   r-  rV  r  r9   r  r   r  r  r   r:   r;   rk  r:  r  rX  r!  r(  r   r  r  r  r+  r  r  r   r   r  r  r  r  r  r  rK  rm  r&  )$rQ   rV  r  r  r  r  napostrophessubr   opargr  rule_thicknessr   r6  vlistr  r9   vgaprd  vltrT  	last_charrY  r  	lc_heightlc_baseline	superkernsubkernr   
shift_downshift_upr   clrspaced_nucleusr   s$                                      r4   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"<#3T::5#/#4L(,	i.. 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 '.q\, 	6t//0B50IJJKKN05D-~&&xrE   r  r  rulerx  r  rW   r  c           
        |                                  }|                                }t          |j                  D ]*}	|                                 |                                 +t          |g          }
t          |g          }t          |j        |j                  }|
                    |d           |                    |d           t          |
t          d|dz            t          ||          t          d|dz            |g          }|j                            |j        t          j        d         d|j        |j                  }|j        |j        |j        z   dz  |dz  z
  z
  }||_        t/          |t1          |dz            g          g}|s|rZ|dk    rd	}|dk    rd	}|                     |t5          j        t8          t:          t<          z  t>          z           |          |          S |S )
Nr  r   r  r   =r~   r  r  r\  ) rW  r{  r  r  r  r  r   r9   rV  rk  r  rv  r  r   rU   r   r   rV   r   r:   rv   r|   r:  rQ  r  _auto_sized_delimiterr   r   r  rN   r!  r)   )rQ   r  r  r  r  rW   r  r  rw  r  cnumcdenr9   r  rn   r  rT  s                    r4   _genfraczParser._genfrac-
  s     99;;	u{## 	 	AJJLLLJJLLLL##CIsy))

5)$$$

5)$$$tAy3//UD))Ay3//	   -++J%78, , <',.!3c/"# #Y^ 4 45667 	6V 	6||||--f./fT#*s:J5K5;/= /=.46 6 6 rE   c                R    |                      t          |d                             S )Nr  )r  r+   r`  s     r4   r  zParser.style_literalW
  s!    s4#899:::rE   c           	         |                      |                    dd          |                    dd          |d         |                    d| j        j                  |d         |d                   S )Nr  r  r  r  r  rW   r  )r  r   r  r  r`  s     r4   r:  zParser.genfracZ
  sc    }}HHXr""DHHXr$:$:dhhw0IJJKe& & 	&rE   c           	         |                      dd|                                                                 | j        j        |d         |d                   S Nr  rW   r  )r  rW  r{  r  r  r`  s     r4   r7  zParser.frac`
  sL    }}DNN$$DDFFO%tE{DKA A 	ArE   c           	         |                      dd|                                                                 | j        j        |d         |d                   S r  )r  rW  r{  r  r  r`  s     r4   r8  zParser.dfrace
  sL    }}DNN$$DDFFO($u+tE{D D 	DrE   c           	     b    |                      ddd| j        j        |d         |d                   S )Nr  r$  r   rW   r  )r  r  r  r`  s     r4   r9  zParser.binomj
  s6    }}aO%tE{DKA A 	ArE   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   r9   rV  rk  r  r;   r:   r:  )rQ   rV  r  r  r  r  rw  centered_annotationcentered_bodyr9   r  r  s               r4   _gensetzParser._genseto
  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 rE   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  rQ  r  rk  rv  rb  rm  rV   r   rN   r9   r  rX  )rQ   r  r  r  r  rw  r:   r;   checkpadded_body	rightside
root_vlistrd  s                r4   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rE   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;   rk  rv  rb  rQ  rm  rV   r   )	rQ   r  r  r  rw  r:   r;   r  rd  s	            r4   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rE   frontmiddlelist[Box | Char | str]backc           	        |                                  }t          |          rt          d |D                       }t          d |D                       }d }t          |          D ]g\  }}	|	dk    r\t	          j        t          ||dz                      }
|
dk    rt          |
||||          ||dz   <   n|                    |
           ||= ht	          j        t          t          t          z           |          }nd}d}d}g }g }|dk    r'|                    t          |||||                     |                    |           |dk    r'|                    t          |||||                     t          |          }|S )	Nc                F    g | ]}t          |t                    |j        S rD   )r  r)   r:   rC  s     r4   r\   z0Parser._auto_sized_delimiter.<locals>.<listcomp>
  s)    MMMq*Q:L:LM!(MMMrE   c                F    g | ]}t          |t                    |j        S rD   )r  r)   r;   rC  s     r4   r\   z0Parser._auto_sized_delimiter.<locals>.<listcomp>
  s)    KKKQ
1c8J8JKKKKrE   r  r   r\  )r  r   r  )rW  r  r   	enumerater   r   r)   r  remover  rN   r!  r   r  rQ  )rQ   r  r  r  r  r:   r;   r  idxelra  middle_partr  rd  s                 r4   r  zParser._auto_sized_delimiter
  s      v;; 	MMFMMMNNFKK&KKKLLEF$V,, $ $R##sF37O44ACxx*8 !65%+H +H +HsQw a(((s &cDj!16::KKFEFKC<<LLufeU6JJJL L L[!!!3;;LLtVUE&IIIK K KerE   c                    |                      |d         d|v r|d                                         ng |d                   S )Nr   r  r!  )r  r_  r`  s     r4   r  zParser.auto_delim
  sH    ))L%*d]]DK!!!M	  	rE   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  rQ  r;  r!  rU   r#  r   ra  _latin_alphabets_small_greekrZ  )rQ   r  r  rd  r  ra  r=  s          r4   rD  zParser.boldsymbol
  sA     G} 	  	 A!U##  JqMa&& (!AF%%'''QAt$$ 	 C40003qrr7d///#AF%%'''!!###QQU||rE   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 rD   )rQ  )rY   r=  s     r4   r\   z#Parser.substack.<locals>.<listcomp>  s    ,,,aq,,,rE   r   c                    | j         S rP   r  r%  s    r4   <lambda>z!Parser.substack.<locals>.<lambda>  s    ag rE   r  c                    g | ]	}|D ]}|
S rD   rD   )rY   pairr   s      r4   r\   z#Parser.substack.<locals>.<listcomp>!  s=     " " " " "  " " " "rE   r~   r  )rW  r{  r   rb   r  rV  r   zipr  r  rk  rQ  )rQ   r  r  r  rw  rd  	max_widthr  r  cpstackr  rT  s                r4   rA  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,,rE   r  )
rV  r)   rL  r   rV   r8   r   r8   r*   rQ  r  )r  r   r*   r]  )r  r   r*   r   )r  r   r*   r  )rk  r8   r*   rX  )rV  r)   r  r+   r  rr  r*   r  r  )r*   r  )r  r  r*   rk   )r  r)   r  r)   r  rx  r  r  rW   rQ  r  rQ  r*   r  )r  r)   r  r  r  r)   r*   r  )Qr?   r@   rA   rB   enumEnumr  rn  ro  r{  r}  _arrow_symbolsrz  r~  r  r  r  r)  r4  _ambi_delimsr|  _right_delimsr,  r  r.   r  stringascii_lettersr  rR   rU  rW  rZ  r\  rH  rF  rE  rG  staticmethodr   convert_to_floatr%  r?  rm  r&  r
  r1  r(   r(  r2  r3  r  r5  rC  r*  r  r/  r0  r+  r6  rU   r  r  r+  r  r  r  r:  r7  r8  r9  r  r=  r>  r;  r<  r  r  rD  rA  r   r  s   @r4   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( ( ( (,% % % %       : : : :' ' ' 'Q Q Q Q   
    !L!1!BCCM   ( ( ( ($  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       rE   r  )r(   r)   r*   r+   )r  r  r*   r  )r  )rM   rN   r  r  r*   rL   )r  r)   r*   r   )r  r)   r  r   r*   r   )urB   
__future__r   abcr  r  r   loggingr   r  r#  r  r   typingr   r   numpyrc   	pyparsingr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   
matplotlibr   r  r   _mathtext_datar   r   r   r   font_managerr   r    r!   ft2fontr"   r#   r$   r%   TYPE_CHECKINGcollections.abcr&   r'   enable_packrat	getLoggerr  r5   r7   r@   rG   rL   r   r   ABCr   ABCMetar   r  rs  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rN   r  r  r!  r1  r6  rQ  rk  rr  rv  r}  r  r  rb  r  r  rX  r  r  r   r  r  r  r  rD   rE   r4   <module>r     s1    # " " " " " 



        				 				                    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +          D D D D D D D D D D D D < < < < < < < < < < : : : : : : : : : : : : ? ((((((     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1 1 1 1#0 #0 #0 #0 #0 #0 #0 #0L6 6 6 62W W W W W W W W W WrE   