
    l0j                       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ZddlZddlZddlmZ ddlZddlmZ ddlmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* ddl+Z,ddl-m.Z. dd	l/m0Z0m1Z1m2Z2m3Z3 dd
l4m5Z5m6Z6m7Z7 ddl8m9Z9m:Z:m;Z; ej<        rddl=m>Z> ddl8m?Z?m@Z@mAZA  e"jB                      ejC        d          ZDdzdZE G d de          ZFdeF_G         G d de          ZHdeH_G         G d d          ZI G d de          ZJ G d de          ZK G d dejL                  ZM G d  d!eMejN        "          ZO G d# d$eO          ZP G d% d&eO          ZQ G d' d(eQejN        "          ZR G d) d*eR          ZS G d+ d,eR          ZT G d- d.eQ          ZU G d/ d0eU          ZVd1ZWd2ZX G d3 d4          ZY G d5 d6eY          ZZ G d7 d8eY          Z[ G d9 d:e[          Z\ G d; d<eY          Z] G d= d>eY          Z^ G d? d@          Z_ G dA dBe_          Z` G dC dDe`          Za G dE dFe`          Zb G dG dHe_          Zc G dI dJec          Zd G dK dLe`          Ze G dM dNee          Zf G dO dPee          Zg G dQ dRe`          Zh G dS dTeh          Zi G dU dVeh          Zj G dW dXe          Zk ekdYdZddYd           ekdYdZd[dYd           ekdYdZd\dYd           ekdYdYddZd           ekdYdYddZd[           ekdYdYddZd\           ekdYdYddYd           ekdYdZdd]d          d^ek_l         G d_ d`e_          Zm G da dbef          Zn G dc ddeg          Zo G de dfe_          Zp G dg dhef          Zq G di djef          Zrd{d|doZsd}drZt G ds dt          Zud~dwZv G dx dy          ZwdS )z.
Implementation details for :mod:`.mathtext`.
    )annotationsN)
NamedTuple)NDArray)EmptyForwardLiteralGroupNotAny	OneOrMoreOptionalParseBaseExceptionParseExpressionParseFatalExceptionParserElementParseResultsQuotedStringRegex	StringEnd
ZeroOrMorepyparsing_commonnested_exprone_of   )cbook)latex_to_bakomastix_glyph_fixesstix_virtual_fontstex2uni)FontPropertiesfindfontget_font)FT2FontKerning	LoadFlags)Iterable)CharacterCodeTypeGlyphGlyphIndexTypezmatplotlib.mathtextsymbolstrreturnr&   c                    	 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     W/home/wildlama/miniconda3/envs/lam/lib/python3.11/site-packages/matplotlib/_mathtext.pyget_unicode_indexr5   4   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depthzLlist[tuple[FT2Font, float, CharacterCodeType, GlyphIndexType, float, float]]glyphsz'list[tuple[float, float, float, float]]rectsN__name__
__module____qualname____doc____annotations__     r4   r7   r7   J   sQ           LLLMMMLLLXXXX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 : 2D array of uint8
        A raster image.
    r8   oxoyr9   r:   r;   zNDArray[np.uint8]imageNr>   rD   rE   r4   rG   rG   `   sW           IIIIIILLLMMMLLLrE   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__   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           	     f    g | ]-\  }}}|j         |j        |j        |j        ||z
  |j        z   f.S rD   )fontfontsizenumglyph_indexoffset).0rH   rI   infohs       r4   
<listcomp>z$Output.to_vector.<locals>.<listcomp>   sS     / / /"b$ y$-43C1r6DK') / / /rE   c                2    g | ]\  }}}}|||z   z
  ||fS rD   rD   )rZ   bxbybwbhr\   s        r4   r]   z$Output.to_vector.<locals>.<listcomp>   sB     0 0 0 "b"b 1R="b) 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          	     
   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          j        t          j
        |t          |d          z             t          j
        |          ft          j                  }	t          | j        | | f          }
|
j        D ]Q\  }}}|j                            |	t          |          t          ||j        j        z
            |j        |           R|
j        D ]\  }}}}t          t          |          dz
  d          }|dk    r!||dz  z   }t          ||dz   dz  z
            }nt          |          }t          j        |          }t          j
        ||z             }d|	|||z   dz   ||dz   f<   t)          dd|||z   ||	          S )Nc                4    g | ]\  }}}||j         j        z   S rD   )metricsxminrZ   rH   rI   r[   s       r4   r]   z$Output.to_raster.<locals>.<listcomp>   (    MMMRb4<,,MMMrE   c                    g | ]	\  }}}}|
S rD   rD   rZ   xyrf   r\   s        r4   r]   z$Output.to_raster.<locals>.<listcomp>        555JAq!Qa555rE   r   r   c                4    g | ]\  }}}||j         j        z
  S rD   )ro   ymaxrq   s       r4   r]   z$Output.to_raster.<locals>.<listcomp>   rr   rE   c                    g | ]	\  }}}}|
S rD   rD   rt   s        r4   r]   z$Output.to_raster.<locals>.<listcomp>   rw   rE   c                4    g | ]\  }}}||j         j        z   S rD   )ro   xmaxrq   s       r4   r]   z$Output.to_raster.<locals>.<listcomp>   rr   rE   c                "    g | ]\  }}}}||z   S rD   rD   rt   s        r4   r]   z$Output.to_raster.<locals>.<listcomp>   $    999
1aa!e999rE   c                4    g | ]\  }}}||j         j        z
  S rD   )ro   yminrq   s       r4   r]   z$Output.to_raster.<locals>.<listcomp>   rr   rE   c                "    g | ]\  }}}}||z   S rD   rD   rt   s        r4   r]   z$Output.to_raster.<locals>.<listcomp>   r~   rE   )rk         )minr<   r=   maxrM   r;   r:   rd   zerosmathre   uint8shiprU   draw_glyph_to_bitmapintro   icebergglyphfloorrG   )rQ   rk   rp   r   r|   ry   rf   r\   rg   rJ   shiftedrH   rI   r[   ru   rv   ra   rb   r:   centerx1x2s                         r4   	to_rasterzOutput.to_raster   s	     :MMMMM :55$*555:78: ; ;=>? :MMMMM :55$*555:78: ; ;=>? >MMMMM >99dj999>;<> ? ?ABC >MMMMM >99dj999>;<> ? ?ABC4K4K$(.(4K$(/)$)AAq		M22DIaLLA28LL tx4%$00#N 	) 	)LBDI**s2wwB)=$= > >
' + ) ) ) ) $M 		0 		0LAq"bR1a((F{{R!V&1*!1122FFAB1r6""B+/E!AfHQJ,2a4'((1aAE1e444rE   N)rM   rN   )r+   r7   )rk   rl   r+   rG   )r?   r@   rA   rB   rR   rj   r   rD   rE   r4   rL   rL   w   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   rp   r|   r   ry   r   rl   slantedNr>   rD   rE   r4   r   r      sm          ( NNNMMMLLLKKKKKKKKKKKKNNNMMMMMrE   r   c                  `    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ed<   dS )FontInfor"   rU   r8   rV   r*   postscript_namer   ro   r&   rW   r(   rX   r'   r   rY   Nr?   r@   rA   rC   rD   rE   r4   r   r      sd         MMMOOOLLLMMMMMrE   r   c                  z    e Zd ZdZd3dZd4dZd5dZd6dZd7dZd8d#Z	d9d(Z
d:d)Zd:d*Zd:d+Zd:d,Zd;d/Zd<d1Zd2S )=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", "normal", "bb", "frak", "scr".  "default"
            and "regular" are synonyms and use the non-math font.
            "normal" denotes the normal math font.
        font_class : str
            One of the TeX font names (as for *font*), but **not** "bb",
            "frak", or "scr".  This is used to combine two font classes.  The
            only supported combination currently is ``get_metrics("frak", "bf",
            ...)``.
        sym : str
            A symbol in raw TeX form, e.g., "1", "x", or "\sigma".
        fontsize : float
            Font size in points.
        dpi : float
            Rendering dots-per-inch.

        Returns
        -------
        FontMetrics
        )r   ro   )rQ   rU   r   r   rV   r   r[   s          r4   get_metricszFonts.get_metrics	  s%    4 ~~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   r[   s
             r4   render_glyphzFonts.render_glyph&  s?     ~~dJXsCCb"d^,,,,,rE   ru   rv   rf   r\   c                B    |j                             ||||f           dS )zM
        Draw a filled rectangle at (*x*, *y*) with size (*w*, *h*).
        N)r=   r   rQ   r   ru   rv   rf   r\   s         r4   render_rect_filledzFonts.render_rect_filled/  s(    
 	Q1aL)))))rE   c                    t                      )zJ
        Get the axis height for the given *font* and *fontsize*.
        r   rQ   rU   rV   r   s       r4   get_axis_heightzFonts.get_axis_height6       "###rE   c                    t                      )zM
        Get the size of a quad for the given *font* and *fontsize*.
        r   r   s       r4   get_quadzFonts.get_quad<  r   rE   c                    t                      )zF
        Get the xheight for the given *font* and *fontsize*.
        r   r   s       r4   get_xheightzFonts.get_xheightB  r   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_thicknessH  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_symbolO  s     3  rE   type[FontConstantsBase]c                    t           S rP   )FontConstantsBaserQ   s    r4   get_font_constantszFonts.get_font_constantsY  s      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   ru   r8   rv   r8   rf   r8   r\   r8   r+   r   rU   r*   rV   r8   r   r8   r+   r8   r   r*   r   r*   r+   r   r+   r   )r?   r@   rA   rB   rR   r   r   r   r   r   r   r   r   r   r   r   r   rD   rE   r4   r   r      s"        1 1 1 1   " " " "" " " "   :- - - -* * * *$ $ $ $$ $ $ $$ $ $ $$ $ $ $! ! ! !! ! ! ! ! !rE   r   c                  p     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+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__c  s{    *,<==="88')D233))!-I!-IrE   rU   r*   r+   r"   c                t   | j                             ||          }| j                            |          }|ht          j                            |          rIt          |          }|| j        |<   || j        |j        <   || j        |j                                        <   t          j
        t          |          S rP   )r   getr   ospathexistsr!   r   lowerTcastr"   )rQ   rU   basenamecached_fonts       r4   r   zTruetypeFonts._get_fonto  s    <##D$//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_offsety  s:    8++L2%)hqj3.>r.ABBrrE   r   r   r   'tuple[FT2Font, CharacterCodeType, bool]c                    t           rP   r   )rQ   r   r   r   s       r4   
_get_glyphzTruetypeFonts._get_glyph  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   )rZ   vals     r4   	<genexpr>z*TruetypeFonts._get_info.<locals>.<genexpr>  s&      !A!As#(!A!A!A!A!A!ArE      r   )	r   r:   r9   rp   r|   r   ry   r   r   )rU   rV   r   ro   rW   rX   r   rY   )r   set_sizeget_char_index
load_glyphr   bboxr   r   linearHoriAdvancer:   r9   horiBearingYr   r   )rQ   r   r   r   rV   r   rU   rW   r   rX   r   rp   r   r|   ry   rY   ro   s                    r4   r   zTruetypeFonts._get_info  s"   !__Xz3GGc7h$$$))#..43HII!A!Aej!A!A!AdD$!!$x==+e3<"$+"&+f4
 
 
  0#	
 	
 	
 		
rE   c                    |                                  }|j        |j        |z  |z  dz  S |                     |t          j        d         d||          }|j        |j        z   dz  S )Nr   mathtext.default   −r   )r   axis_heightr   mplrcParamsry   r   rQ   r   rV   r   constsro   s         r4   r   zTruetypeFonts.get_axis_height  su    ((**)%036;; &&#,'9:HhPSU UGL7</144rE   c                    |                                  }|j        |j        |z  |z  dz  S |                     |t          j        d         d||          }|j        S )Nr   r  m)r   quadr   r  r  r   r  s         r4   r   zTruetypeFonts.get_quad  sf    ((**;";)C/"44 &&#,'9:C3P PG?"rE   c                    |                                  }|j        |j        |z  |z  dz  S |                     |t          j        d         d||          }|j        S )Nr   r  ru   )r   x_heightr   r  r  r   r  s         r4   r   zTruetypeFonts.get_xheight  sf    ((**?&?X-3b88 &&#,'9:C3P PG?"rE   c                    d|z  |z  dz  S )Ng      ?r   rD   r   s       r4   r   z%TruetypeFonts.get_underline_thickness  s     h&,22rE   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_kerningrX   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##E$5u7H$+O5 579: :wwz4 %z4CI I 	IrE   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   r   r   __classcell__r   s   @r4   r   r   ]  s        

. 
. 
. 
. 
. 
., , , ,   " " " "

 
 
 
B	5 	5 	5 	5# # # #	# 	# 	# 	#3 3 3 3
I 
I 
I 
I 
I 
I 
I 
I 
I 
IrE   r   )	metaclassc            	      ~    e Zd ZdZdddddddd	d
ZdG fdZ ed                                          ZdHdZ	dZ
i ddgd e
D             ddgd e
D             dd  e
D             d!d" e
D             d#d$gd% e
D             d&d'gd( e
D             d)d*gd+ e
D             d,d-gd. e
D             d/d0 e
D             d1d2 e
D             d3d4 e
D             d5d6 e
D             d7d8 e
D             d9d: e
D             d;d<gd= e
D             d>g d?d@g dAZdBD ]\  ZZee         ee<   dIdDZdJdFZ xZS )K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.
    cmmi10cmsy10cmr10cmtt10cmti10cmb10cmss10cmex10)normal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 r3t          |         \  }}|dv p|| j        v }|                     |          }n[t	          |          dk    rH|dv }|dk    r|                                rd}d}|                     |          }|t          |          }||                    |          dk    r|||fS | j        	                    |||          S )N)r   r$  r   )r,  r(  r(  r*  Fr   )
r   r   _slanted_symbolsr   lenisdigitr.   r  r2  r   )rQ   r   r   r   rU   r   rW   r   s           r4   r   zBakomaFonts._get_glyph  s    t|##(>(>+C0MHc#77XC4CX<XG>>(++DDXX]]#33G8###  >>(++D#hh 3 3C 8 8A = =g%%&11(JLLLrE   )bigBigbiggBigg()r*  r@  c                    g | ]
}d d| dfS )r/  z\__parenleft__rD   rZ   ss     r4   r]   zBakomaFonts.<listcomp>  s)    QQQqd$9A$9$9$9:QQQrE   ))r*  rE  c                    g | ]
}d d| dfS )r/  z\__parenrightrB  rD   rC  s     r4   r]   zBakomaFonts.<listcomp>  s)    RRRd$:Q$:$:$:;RRRrE   {c                    g | ]
}d d| dfS )r/  z\__braceleftrB  rD   rC  s     r4   r]   zBakomaFonts.<listcomp>  s)    BBBt*Q***+BBBrE   }c                    g | ]
}d d| dfS )r/  z\__bracerightrB  rD   rC  s     r4   r]   zBakomaFonts.<listcomp>  s)    CCCt+a+++,CCCrE   [)r*  rK  c                    g | ]
}d d| dfS )r/  z\__bracketleftrB  rD   rC  s     r4   r]   zBakomaFonts.<listcomp>  s)    SSSd$;a$;$;$;<SSSrE   ])r*  rM  c                    g | ]
}d d| dfS )r/  z\__bracketrightrB  rD   rC  s     r4   r]   zBakomaFonts.<listcomp>  s)    TTT!d$<q$<$<$<=TTTrE   <)r)  z\__angbracketleft__c                    g | ]
}d d| dfS )r/  z\__angbracketleftrB  rD   rC  s     r4   r]   zBakomaFonts.<listcomp>  s)    IIIq1A1112IIIrE   >)r)  z\__angbracketright__c                    g | ]
}d d| dfS )r/  z\__angbracketrightrB  rD   rC  s     r4   r]   zBakomaFonts.<listcomp>  s)    JJJ2Q2223JJJrE   z\lfloorc                    g | ]
}d d| dfS )r/  z\__floorleftrB  rD   rC  s     r4   r]   zBakomaFonts.<listcomp>  s)    IIIqd1A1112IIIrE   z\rfloorc                    g | ]
}d d| dfS )r/  z\__floorrightrB  rD   rC  s     r4   r]   zBakomaFonts.<listcomp>  s)    JJJd2Q2223JJJrE   z\lceilc                    g | ]
}d d| dfS )r/  z\__ceilingleftrB  rD   rC  s     r4   r]   zBakomaFonts.<listcomp>  s)    JJJT2Q2223JJJrE   z\rceilc                    g | ]
}d d| dfS )r/  z\__ceilingrightrB  rD   rC  s     r4   r]   zBakomaFonts.<listcomp>  s)    KKKT3a3334KKKrE   	\__sqrt__c                    g | ]
}d d| dfS )r/  z
\__radicalrB  rD   rC  s     r4   r]   zBakomaFonts.<listcomp>  s)    IIIq1A1112IIIrE   z
\backslashc                    g | ]
}d d| dfS )r/  z\__backslashrB  rD   rC  s     r4   r]   zBakomaFonts.<listcomp>   s)    LLL!4q4445LLLrE   /)r*  rZ  c                    g | ]
}d d| dfS )r/  z\__slashrB  rD   rC  s     r4   r]   zBakomaFonts.<listcomp>!  s)    NNNAt%6%6%6%67NNNrE   z\widehat))r*  ^)r/  z\__hatwide__)r/  z\__hatwider__)r/  z\__hatwidest__z
\widetilde))r*  ~)r/  z\__tildewide__)r/  z\__tildewider__)r/  z\__tildewidest__))z
\leftparenr@  )z\rightparenrE  )z
\leftbracerG  )z\rightbracerI  )z\leftbracketrK  )z\rightbracketrM  )z\langlerO  )z\ranglerQ  )\{rG  )\}rI  )\[rK  )\]rM  r   c                >    | j                             |||fg          S rP   )_size_alternativesr   r   s      r4   r   z-BakomaFonts.get_sized_alternatives_for_symbol0  s"    &**3(C0ABBBrE   r   c                    t           S rP   )ComputerModernFontConstantsr   s    r4   r   zBakomaFonts.get_font_constants4  s    **rE   r   r  r   r   )r?   r@   rA   rB   r3  rR   setsplitr9  r   _latex_sizesrc  aliastargetr   r   r  r  s   @r4   r  r    s         	 	H) ) ) ) ) ) s=..0011M M M M4 2LkRQQLQQQRkSRR\RRRS 	BB\BBB 	CClCCC	
 	kTSSlSSST 	kUTT|TTTU 	- KIILIIIK 	. LJJ\JJJL 	IILIII 	JJ\JJJ 	JJ\JJJ 	KKlKKK 	IILIII  	LL|LLL!" 	{ONNNNNO#$ 	 1 1 1%( 	 Q Q Q)06 ? ?v %7v$>5!!C C C C+ + + + + + + +rE   r  c                       e Zd ZU dZdddZded<   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"  z*dict[CharacterCodeType, CharacterCodeType]_cmr10_substitutionsr   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)012345)r  r  r1  StixSansFontsr  r   _fallback_fontr   rR   rg  r    r   r   
isinstancer4  )rQ   r   r   fallback_rcfont_clstexfontproprU   stixsizedaltfontssizenamer6  r   s               r4   rR   zUnicodeFonts.__init__L  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   r7  r   r*   r   uniindexr&   r+   tuple[str, CharacterCodeType]c                
    ||fS rP   rD   )rQ   r   r   r  s       r4   _map_virtual_fontzUnicodeFonts._map_virtual_fontr  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     rYt          |          }t          j        |          d         dk    s't          j	        |          
                    d	          rd
}n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.          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,  r"  zfonts/ttf/cmsy10.ttf)r,  r   r(  zComputer ModernzSubstituting symbol %s from %szNFont %r does not have a glyph for %a [U+%x], substituting with a dummy symbol.   )r5   r2   r.   _logwarningr  chrunicodedatacategoryr  
startswithr9  r   rp  family_namer!   r   _get_data_pathr  r  r  r1  r   r  r3  valuesr[   )rQ   r   r   r   r  found_symbolnew_fontnamecharr   rU   
glyphindexgfamilys                r4   r   zUnicodeFonts._get_glyphv  s   	C(--HLL 	C 	C 	C3xxH LLL<cBBBBB	C
 "33Hj(SS(  	(8##7(:(:8}}(..q1S88&+D11<<_MM 9#'LL#'L#t+Lt7L0LG L>>,//D 999 ,77#,-CDDF FD#8BH!00::
??#'L 	 "   ;;;&t':IFF <#H'228ZMM1)[188::::.F		:CHHH  ;;;&tY77 <??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  s5     	X&HHSVWWW3  rE   r   r   r*   r   r*   r  r&   r+   r  r  r   )r?   r@   rA   rB   rp  rC   rR   rf  rg  r9  r  r   r   r  r  s   @r4   rl  rl  8  s         	 	 H H    
". ". ". ". ". ".H s=..0011" " " "?' ?' ?' ?'B! ! ! ! ! ! ! !rE   rl  c                  8     e Zd ZU i Zded<   ddZd fdZ xZS )DejaVuFontszdict[str, str]r3  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 )Nrv  rw  rx  ry  rz  )r|  r}  r~  r  r  )r  DejaVuSerifFontsr1  r  r  r  bakomar   rR   r3  updater4  r    r   rQ   r   r   r5  r  r6  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   r3  rC   rR   r   r  r  s   @r4   r  r    sn         !H!!!!* * * **A A A A A A A A A ArE   r  c            	      0    e Zd ZdZddddddddd	Z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
    zDejaVu SerifzDejaVu Serif:italiczDejaVu Serif:weight=boldzDejaVu Serif:italic:boldDejaVu SansDejaVu Sans MonozDejaVu Serif Displayr*  r,  r-  bfitr.  r+  r/  r{  r+   r   c                    t           S rP   )DejaVuSerifFontConstantsr   s    r4   r   z#DejaVuSerifFonts.get_font_constants  s    ''rE   Nr   r?   r@   rA   rB   r3  r   rD   rE   r4   r  r    sX          #(* $	 	H( ( ( ( ( (rE   r  c            	      0    e Zd ZdZdddddddddZ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  r+   r   c                    t           S rP   )DejaVuSansFontConstantsr   s    r4   r   z"DejaVuSansFonts.get_font_constants  s    &&rE   Nr   r  rD   rE   r4   r  r    sX          "') #	 	H' ' ' ' ' 'rE   r  c                  t    e Zd ZdZddddddddd	d
ddddZdZdZd#dZd$dZe	j
        d%d             Zd&d"ZdS )'r1  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.
    ru  zSTIXGeneral:italiczSTIXGeneral:weight=boldzSTIXGeneral:italic:boldSTIXNonUnicodezSTIXNonUnicode:italiczSTIXNonUnicode:weight=boldrv  rw  rx  ry  rz  )r*  r,  r-  r  nonunirmnonuniitnonunibfr{  r|  r}  r~  r  r  NFr   r   r   r$   c                    t                               | ||           | j                                        D ](\  }}t	          |          }|| j        |<   || j        |<   )d S rP   )r   rR   r3  r4  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-  r  i   i  nonuni)r   r   _sansr  dictr1   listr:  r  r  r   )rQ   r   r   r  font_mappingdoing_sans_conversionmappinglohimidranges              r4   r  zStixFonts._map_virtual_font6  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   r   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 )NrG  rI  rK  rM  u   ⟨u   ⟩)r^  r_  r`  ra  rO  rQ  c                    g | ]Y}                     t          |                                                  d k    ;t          |          t                    fZS )r   )r   r*   r  r  )rZ   irQ   r  s     r4   r]   z?StixFonts.get_sized_alternatives_for_symbol.<locals>.<listcomp>y  sa     Q Q QA>>#a&&11@@JJaOO QX/OOOrE      rW  )r   r5   r2   r  )rQ   r   r   fixesalternativesr  s   `    @r4   r   z+StixFonts.get_sized_alternatives_for_symboll  s     s3s67
 

 iiS!!	%(--HH 	% 	% 	%sO$$$$	%Q Q Q Q Qq Q Q Q ,',Ls   3 AAr   c                ,    | j         rt          S t          S rP   )r  STIXSansFontConstantsSTIXFontConstantsr   s    r4   r   zStixFonts.get_font_constants  s    : 	%(($$rE   r   r  r   r   )r?   r@   rA   rB   r3  r  r  rR   r  r   r   r   r   rD   rE   r4   r1  r1    s        
 
 "')$+0 H NE* * * *4" 4" 4" 4"l _   _(% % % % % %rE   r1  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    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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Zded!<   dS )"r   z
    A set of constants that controls how certain things, such as sub-
    and superscripts are laid out.  These are all metrics that can't
    be reliably retrieved from the font metrics in the font itself.
    皙?zT.ClassVar[float]script_spaceg?supdropsubdropr  sup1333333?sub1      ?sub2g?delta皙?delta_slanted皙?delta_integralgffffff?num1g      ?num2g?num3denom1g?denom2NzT.ClassVar[float | None]r
  r  r  )r?   r@   rA   rB   r  rC   r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  rD   rE   r4   r   r     s_          '+L**** "%G$$$$ "%G$$$$ "D!!!! "D!!!! "D!!!!  %E$$$$
 (+M**** ),N++++ "D!!!! "D!!!! "D!!!! !$F#### !$F#### -1K0000 &*D)))) *.H------rE   r   c                      e Zd ZdZdZdZdZdZdez  Zdez  Z	dez  Z
dez  Zdez  Zd	ez  Zd
ez  Zdez  Zdez  Zdez  ZdZdZedz  ZdS )re  g?r  i i- i  i5 iff i i
 iL i i
 ix       ?g     ?i   N)r?   r@   rA   r  r  r  r  	_x_heightr  r  r  r  r  r  r  r  r  r  r
  r  r  rD   rE   r4   re  re    s         "LEMNI y GiGIDIDIDIDIDIDiFiF !KD5 HHHrE   re  c                      e Zd ZdZdZdZdZdZedz  Zdez  Z	dez  Z
dez  Zd	ez  Zd
ez  Zdez  Zdez  Zdez  Zdez  Zdez  ZdZdZdS )r  r  r  r  i  i  i  gǺ I@i     i5  i  i  i  i  iw  r        ?N)r?   r@   rA   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  rD   rE   r4   r  r    s        LEMNI4H IoG	!G?D?D?D?D?D?D9_F9_F KDDDrE   r  c                      e Zd ZdZdZdZdS )r  r  333333?r  N)r?   r@   rA   r  r  r  rD   rE   r4   r  r  +  s        LMNNNrE   r  c                      e Zd ZdZedz  Zdez  Zdez  Zdez  Zdez  Zdez  Z	dez  Z
d	ez  Zd
ez  Zdez  Zdez  ZdZdS )r  i'     K7@皙Y@;On@w/3s@-ƃ@=
ףp@A`"@tV@\(1@   r  Nr?   r@   rA   r  r  r  r  r  r  r  r  r  r  r  r  r
  rD   rE   r4   r  r  1          I4H 	!GiGYDYDYDYDYDYDy F9_F KKKrE   r  c                      e Zd ZdZedz  Zdez  Zdez  Zdez  Zdez  Zdez  Z	dez  Z
d	ez  Zd
ez  Zdez  Zdez  ZdZdS )r  i`  r  r  r  r  r  r  r  r  r  r  r  r  Nr  rD   rE   r4   r  r  F  r   rE   r  c                  B    e Zd ZdZddZddZdd
ZddZddZddZ	dS )NodezA node in the TeX box model.r+   r   c                    d| _         d S Nr   r  r   s    r4   rR   zNode.__init__^  s    			rE   r*   c                *    t          |           j        S rP   )typer?   r   s    r4   __repr__zNode.__repr__a  s    Dzz""rE   nextNode | Noner8   c                    dS Nr   rD   )rQ   r
  s     r4   r  zNode.get_kerningd  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.shrinkg  s    
 			Q				rE   r   rL   ru   rv   c                    dS )zRender this node.NrD   rQ   r   ru   rv   s       r4   renderzNode.rendern  s      rE   rl   c                    dS )NTrD   r   s    r4   is_char_nodezNode.is_char_nodeq  s	     trE   Nr+   r   r+   r*   r
  r  r+   r8   r   rL   ru   r8   rv   r8   r+   r   r+   rl   )
r?   r@   rA   rB   rR   r	  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   y1r   y2c                    d S rP   rD   )rQ   r   r   r   r   r!  s         r4   r  z
Box.render  s    rE   )r9   r8   r:   r8   r;   r8   r+   r   r  )r   rL   r   r8   r   r8   r   r8   r!  r8   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`.
    cr*   stateParserStatec                    t                                                       || _        |j        | _        |j        | _        |j        | _        |j        | _        |j        | _        |                                  d S rP   )	r   rR   r/  fontsetrU   r   rV   r   _update_metrics)rQ   r/  r0  r   s      r4   rR   zChar.__init__  sh    }J	*9 	rE   r+   c                    d| j         z  S )Nz`%s`r/  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 )r3  r   rU   r   r/  rV   r   _metricsr   r9   r   r:   r;   rQ   ro   s     r4   r4  zChar._update_metrics  sy    "&,":":Ittx#I #I 	I$-6S== DJJ DJo78


rE   rl   c                    | j         j        S rP   )r9  r   r   s    r4   
is_slantedzChar.is_slanted  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   )r9  r   r9   r  r.  r3  r   rU   r   r/  rV   r   )rQ   r
  r   kerns       r4   r  zChar.get_kerning  sv     -'$*4dD!! 	<((	4?DFDM	4?DFDM D ~rE   r   rL   ru   rv   c           
     z    | j                             |||| j        | j        | j        | j        | j                   d S rP   )r3  r   rU   r   r/  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.shrink  sp    9&&MM]*MMJJ]*JJKK]*KKJJ]*JJJJ	 '&rE   )r/  r*   r0  r1  r  r  r  r  r  )r?   r@   rA   rB   rR   r	  r4  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  )r3  r   rU   r   r/  rV   r   r9  r|   rp   r9   ry   r   r:   r;   r:  s     r4   r4  zAccent._update_metrics  se    "&,":":Ittx#I #I 	I$-\GL0
lW\1


rE   c                p    t                                                       |                                  d S rP   )r   r  r4  r  s    r4   r  zAccent.shrink  s/    rE   r   rL   ru   r8   rv   c           
         | j                             ||| j        j        z
  || j        j        z   | j        | j        | j        | j        | j	                   d S rP   )
r3  r   r9  rp   r   rU   r   r/  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   r4  r  r  r  r  s   @r4   rB  rB    sw         
        I I I I I I I IrE   rB  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   rH  r   s     r4   rR   zList.__init__  sK    R$$$#(rE   r+   r*   c                6   d                     t                                                      | j        | j        | j        | j        | j        rFdt          j	        d
                    t          dj         | j                            d          z   dz   nd          S )Nz/{}<w={:.02f} h={:.02f} d={:.02f} s={:.02f}>[{}]
z{!r},z   )formatr   r	  r9   r:   r;   rK  rL  textwrapindentjoinrc   r  s    r4   r	  zList.__repr__  s    @GGGGJJ) }%D8?		#gndm<<==    #%
 
 	
rE   ru   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   )rZ   r  rY  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:  rO  rN  rM  
glue_ratiorL  r  r  r  r?   )rQ   ru   rX  rY  r[  os      `  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   )rL  r  r   r  r  rK  r  rM  )rQ   childr   s     r4   r  zList.shrink#  st    ] 	 	ELLNNNN9&&.MM.MMMM '&rE   )rH  rI  r  )
ru   r8   rX  r   rY  rZ  r[  r*   r+   r   r  )	r?   r@   rA   rB   rR   r	  r`  r  r  r  s   @r4   rG  rG    s        ::     	
 	
 	
 	
 	
 	
D D D D / / / / / / / / / /rE   rG  c                  J     e Zd ZdZ	 	 	 dd fdZddZddZ	 	 dddZ xZS )HlistzA horizontal list of boxes.r   
additionalTrH  rI  rf   r8   r  "T.Literal['additional', 'exactly']do_kernrl   c                    t                                          |           |r|                                  |                     ||           d| _        d S )N)rf   r  F)r   rR   r>  hpack
is_phantom)rQ   rH  rf   r  rg  r   s        r4   rR   zHlist.__init__/  sS     	""" 	IIKKK

Q!
rE   r+   c                H    t          t          d | j                            S )Nc                *    |                                  S rP   )r  )nodes    r4   <lambda>z$Hlist.is_char_node.<locals>.<lambda>:  s    D$5$5$7$7 rE   )allrc   rL  r   s    r4   r  zHlist.is_char_node8  s     377GGHHHrE   r   c                   g }t          j        | j        | j        dd                   D ]Y\  }}|                    |           |                    |          }|dk    r$t          |          }|                    |           Z|| _        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   )	itertoolszip_longestrL  r   r  Kern)rQ   new_childrenelem0elem1kerning_distancer>  s         r4   r>  z
Hlist.kern<  s     %1$-qrrARSS 	* 	*LE5&&&$00772%%,--##D)))$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      rK  re  r   Nr   Overfulr  Underful)rL  r  r.  r9   r   r:   r;   rN   rd   isinfgetattrGlue	glue_specstretch_orderstretchshrink_orderr  rs  rN  rO  r^  r`  )rQ   rf   r  r\   rg   ru   total_stretchtotal_shrinkprD  r  s              r4   ri  zHlist.hpackM  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   re  T)rH  rI  rf   r8   r  rf  rg  rl   r  r  r   re  )rf   r8   r  rf  r+   r   )	r?   r@   rA   rB   rR   r  r>  ri  r  r  s   @r4   rd  rd  ,  s        %%>A9E!%             I I I I% % % %"  #6B?< ?< ?< ?< ?< ?< ?< ?< ?<rE   rd  c                  L     e Zd ZdZ	 	 dd fd
ZddZddej        fddZ xZ	S )VlistzA vertical list of boxes.r   re  rH  rI  r\   r8   r  rf  c                x    t                                          |           |                     ||           d S )N)r\   r  )r   rR   vpack)rQ   rH  r\   r  r   s       r4   rR   zVlist.__init__  s7    """

Q!
rE   r+   rl   c                    dS NFrD   r   s    r4   r  zVlist.is_char_node  s    urE   lr   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   ry  rK  z1Internal mathtext error: Char node found in Vlistre  r   Nr   rz  r  r{  )rL  r  rN   r:   r;   rd   r|  r9   r}  r   r~  r  r  r  r  r  rs  r.  RuntimeErrorrN  rO  r^  r`  )rQ   r\   r  r  rf   rg   ru   r  r  r  rD  r  s               r4   r  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   r  )rH  rI  r\   r8   r  rf  r  )r\   r8   r  rf  r  r8   r+   r   )
r?   r@   rA   rB   rR   r  rd   infr  r  r  s   @r4   r  r    s        ##>A9E      
     #6BG< G< G< G< G< G< G< G< G<rE   r  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;   r0  r1  c                f    t                                          |||           |j        | _        d S rP   )r   rR   r3  )rQ   r9   r:   r;   r0  r   s        r4   rR   zRule.__init__  s,    ...}rE   r   rL   ru   rv   rf   r\   r+   r   c                H    | j                             ||||z
  ||           d S rP   )r3  r   r   s         r4   r  zRule.render  s*    ''1q5!Q?????rE   )r9   r8   r:   r8   r;   r8   r0  r1  r   )r?   r@   rA   rB   rR   r  r  r  s   @r4   r  r    sc         % % % % % %@ @ @ @ @ @ @ @rE   r  c                  &     e Zd ZdZdd	 fdZ xZS )
Hrulez.Convenience class to create a horizontal rule.Nr0  r1  	thicknessfloat | Nonec                    ||                                 }|dz  x}}t                                          t          j        |||           d S )Nr  get_current_underline_thicknessr   rR   rd   r  )rQ   r0  r  r:   r;   r   s        r4   rR   zHrule.__init__  sN    ==??I"S(66666rE   rP   )r0  r1  r  r  r'  r  s   @r4   r  r    sH        887 7 7 7 7 7 7 7 7 7 7rE   r  c                  $     e Zd ZdZd fdZ xZS )Vrulez,Convenience class to create a vertical rule.r0  r1  c                    |                                 }t                                          |t          j        t          j        |           d S rP   r  )rQ   r0  r  r   s      r4   rR   zVrule.__init__  s<    99;;	BFBFE:::::rE   )r0  r1  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   r  r   r  r  r  Nr   rD   rE   r4   r  r    sE         LLLNNNMMMrE   r  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 )
r~  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   r  )rQ   r  r  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  r  _replacer9   r  )rQ   r  r   s     r4   r  zGlue.shrink4  sS    9&&AZZag.EZFFDNNN '&rE   )r  r  r  )r?   r@   rA   rB   rR   r  r  r  s   @r4   r~  r~    so         # # # # # #G G G G G G G G G GrE   r~  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.
    rH  
list[Node]c                    t                                          t          d          g|t          d          d           d S )Nr  Frg  r   rR   r~  rP  s     r4   rR   zHCentered.__init__A  s?    $t**<x<d<eLLLLLrE   rH  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.
    rH  r  c                    t                                          t          d          g|t          d                     d S )Nr  r  rP  s     r4   rR   zVCentered.__init__K  s:    $t**<x<d<=====rE   r  r'  r  s   @r4   r  r  E  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 )rs  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__a  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.shrinkd  s@    9&&JJ-'JJJJ '&rE   r,  r  r  )
r?   r@   rA   rB   r:   r;   rR   r	  r  r  r  s   @r4   rs  rs  O  s          FE     % % % %( ( ( ( ( ( ( ( ( (rE   rs  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.
    Nr/  r*   r:   r8   r;   r0  r1  factorr  c                R   |j                             |j        |          }|j                             |j        |j        |j                  }|                                }||z   }|D ]7\  }	}
|	|_        t          |
|          }|j        |j	        z   |d|z  z
  k    r n8d}|j        dk    st          |          dk    r>|||j        |j	        z   z  }|xj        |z  c_        t          |
|          }||j	        z
  }t                                          |g           || _        d S )Nr  r   r{  r   )r3  r   rU   r   rV   r   copyr.  r:   r;   r:  r   rR   rK  )rQ   r/  r:   r;   r0  r  r  r  target_totalr   r   r  shiftr   s                r4   rR   zAutoHeightChar.__init__s  s6   }FFuzSTUU=,,UZSS

~) 	 	MHc!EJU##D {TZ'<#.+HHH I :L 1 1Q 6 6~%tz)ABNNf$NNU##DTZ'E$   !rE   rP   )
r/  r*   r:   r8   r;   r8   r0  r1  r  r  r'  r  s   @r4   r  r  j  sQ          )-" " " " " " " " " " "rE   r  c                  (     e Zd ZdZ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.
    r/  r*   r9   r8   r0  r1  
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   )r3  r   rU   r  r9   rV   r   rR   )rQ   r/  r9   r0  r  r  r   r   r  r  r   s             r4   rR   zAutoWidthChar.__init__  s    }FFuzSTUU

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


rE   )r/  r*   r9   r8   r0  r1  r  r  )r?   r@   rA   rB   r.  rR   r  r  s   @r4   r  r    sQ          +/                     rE   r  r   r   rM   xytuple[float, float]c                   	
 |\  }}dd||| j         z   	t          |           
g fdddd	
f
d
d	
f	dt          | t                    sJ  |            
S )a  
    Ship out *box* at offset *xy*, converting it to an `Output`.

    Since boxes can be inside of boxes inside of boxes, the main work of `ship`
    is done by two mutually recursive routines, `hlist_out` and `vlist_out`,
    which traverse the `Hlist` nodes and `Vlist` nodes inside of horizontal
    and vertical boxes.  The global variables used in TeX to store state as it
    processes have become local variables here.
    r   c                >    t                    s | j        |  d S d S rP   )anyr  )rm  argsphantoms     r4   r  zship.<locals>.render  s0    7|| 	DK	 	rE   valuer8   r+   c                &    | dk     rdn	| dk    rdn| S )Ng    eg    eArD   )r  s    r4   clampzship.<locals>.clamp  s     t||tt5HrE   rM   rd  r   c           	       
 d}d}| j         }| j        }}}                    | j                   | j        D ]+}t          |t                    r |z   z              |j        z  7t          |t                    r|j        z  Wt          |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   )rO  rN  r   rj  rL  r  r.  r9   rs  rG  r:  rK  rd  r  rN   r:   r;   rd   r|  r~  r  r  r  roundrM  r  r  pop)rM   cur_gcur_gluerO  rN  	base_line	left_edger  edgerule_height
rule_depth
rule_widthr  r  cur_hcur_v	hlist_outoff_hoff_vr   r  r  	vlist_outs                r4   r  zship.<locals>.hlist_out  s    ^
M			s~&&& 3	$ 3	$A!T"" 2$q&%%-??? At$$ /$ At$$ -$qz??a''QW$EE D%6E!!U++ 9!	!#Au-- 9!	!8&888u 17NE%EEAs## $hW
W
8K(( -"%*K8J'' +!$J??zA~~%
2EF1f 5=%%-%{4 4 4 &E#At$$ $K	&_u4
>> A~~$2j@@$	(99H$)%%x0G*H*H$I$IE"/:== I$44 %eeCL8,C&D&D E Ee#
#rE   r  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                    r^|j        }	|j	        }
|j        }t          j        |          r| j        }|	|
z  }	|	dk    r!|
dk    r|	z   |z   z   ||	           Qt	          |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	          |t0                    rt3          d           d S )Nr   r   Fr  r   z1Internal mathtext error: Char node found in vlist)rO  rN  r:   rL  r  rs  r9   rG  r:  r;   rK  rd  r  rN   rd   r|  r~  r  r  r  r  rM  r  r  r.  r  )rM   r  r  rO  rN  r  top_edger  save_vr  r  r  r  r  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8u"QW,E%EEAs## IhW
W
8J'' +!$Jz)??zA~~[(EF1f 5=%%-%{4 4 4 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   rd  r+   r   )rM   r  r+   r   )r:   rL   r  rd  )rM   r  rH   rI   r  r  r  r  r  r  r   r  r  r  s       @@@@@@@@@@r4   r   r     sL    FBEEEOEC[[FG    I I I IA A A A A A A A A A A A A A AF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 9Iv c5!!!!!IcNNNMrE   msgr   c                R     d
 fd	}t                                          |          S )z$Helper class to raise parser errors.rD  r*   locr   toksr   r+   T.Anyc                &    t          | |          rP   r   )rD  r  r  r  s      r4   raise_errorzError.<locals>.raise_errorN  s    !!S#...rE   rD  r*   r  r   r  r   r+   r  )r   set_parse_action)r  r  s   ` r4   Errorr  L  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 )r1  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.
    r3  r   rU   r*   r   rV   r8   r   c                L    || _         || _        || _        || _        || _        d S rP   )r3  _fontr   rV   r   )rQ   r3  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.copyg  s    yrE   c                    | j         S rP   )r  r   s    r4   rU   zParserState.fontj  s
    zrE   r  r   c                *    |dv r|| _         || _        d S )N)r(  r*  r,  r-  r  )r   r  )rQ   r  s     r4   rU   zParserState.fontn  s     777"DO


rE   c                X    | j                             | j        | j        | j                  S )z.Return the underline thickness for this state.)r3  r   rU   rV   r   r   s    r4   r  z+ParserState.get_current_underline_thicknesst  s)    |33It}dh0 0 	0rE   N)
r3  r   rU   r*   r   r*   rV   r8   r   r8   r+   r1  r  )r  r*   r+   r   )r+   r8   )
r?   r@   rA   rB   rR   r  propertyrU   setterr  rD   rE   r4   r1  r1  T  s                   X 
[   [
0 0 0 0 0 0rE   r1  exprr  c                    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   rG  r   r   rS  c              3      K   | ]	}d |z  V  
dS )z{%s}NrD   )rZ   r  s     r4   r   zcmd.<locals>.<genexpr>  s&      BBdFTMBBBBBBrE   z	Expected )r  r   r+   r  )rg  rW  r  )r   r  csnamer3   r  s       @r4   cmdr
  z  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>Z0dd?Z1dd@Z2ddAZ3i dBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdQdYdIdZdKd[dMd\dOd]dCd^d_d`daZ4 edb                                          Z5ddcZ6dddZ7ddeZ8ddfZ9ddgZ:ddhZ;e;Z<ddiZ=ddjZ>ddkZ?ddoZ@ddpZAddqZBd fdrZCddzZDdd{ZEdd|ZFdd}ZGdd~ZHddZIddZJeJxZKZLddZMddZNddZOddZPddZQddZRddZS xZTS )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 \iiiintz:rm cal it tt sf bf bfit default bb frak scr regular normalz
      arccos csc ker min arcsin deg lg Pr arctan det lim sec arg dim
      liminf sin cos exp limsup sinh cosh gcd ln sup cot hom log tan
      coth inf max tanhzn
      | \| / \backslash \uparrow \downarrow \updownarrow \Uparrow
      \Downarrow \Updownarrow . \vert \Vertz[
      ( [ \{ < \lfloor \langle \lceil \lbrace \leftbrace \lbrack \leftparen \lgroup
      z]
      ) ] \} > \rfloor \rangle \rceil \rbrace \rightbrace \rbrack \rightparen \rgroup
      c                    g | ]M}t          j        t          |                                                    d                                          NS )r  )r  r  r  rg  r   )rZ   r  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                    dN fd}dOd	}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             _$        tG          d                    d                    _%        tG          d                    d                    _&        tG          d                    d                    _'         |dg  j(         j)                                      d          z
  _*         |d j+                  _,        j         tC          j                   d          z   j        z   _-        j         tC          j                   d          z   t]                      z   _/        tG          d                    d                              d           z             _0        tG          d!                    d                              d           z             _1        tG          d"                    d                              d           z             _2        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             _3        tG          d(t)          d) tE          ti          d*          j         z             d+          z   d*z                                 d          z             _5        tG          d,                    d-                    _6        tG          d.                    d-                    _7        tG          d/                    d0                              d-          z             _8        tG          d1                    d0                              d-          z             _9        tG          d2tu          dd3d4                    _;        tG          d5 ty          ddt{          tE          j                             tC          t-          d6          >                                          z   7          d8                    _?         t)          j                  d9           tE          t	          d:d;g          j        z
            d<          z    t          d=          d>          z    t          d?          d>          z                      d9           t          d=          d>          z   z  _@        j        j$        z  j        z  j@        z  _A        xj         jA        j        z  j/        z  j        z  z  c_         tG          d@d tC          jA                  d          z   dz             _B        tG          dAd tC          jA                  d          z   dz             _C        xj        j%        j&        z  j'        z  j*        z  j        z  j,        z  jB        z  j-        z  j0        z  j1        z  j2        z  j3        z  j8        z  j9        z  j5        z  j6        z  j7        z  j;        z  jC        z  j?        z  j        z  z  c_        dB                    dC          t          dD          z  z
  }xj        dE                    dF          t          dD          z  z
   tC          jA        j        z  |z            dG          z   dHz                       dI          t          dD          z  z
  z  c_        tE          j                   _E        tu          dJd3dKL          _F        t          dM                                          _G        jG        tC          jF        jG        z             z   t]                      z   _H         |             jH         _I        jE         _J        dK _K        d S )PNr+   r   c                    t                                                    D ]f\  } }|                     d          sL| dvr|                    |            t	          |           r#|                    t          |                      gd S )N_)token	placeable
auto_delim)varsr4  r  set_namehasattrr  r}  )r5  r   r  rQ   s     r4   set_names_and_parse_actionsz4Parser.__init__.<locals>.set_names_and_parse_actions6  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})|rS  )r  alphare  nonalpha)isalphar   r   rT  rW  rc   reescape)r  r  ends_with_alphaends_with_nonalphar  s        r4   csnamesz Parser.__init__.<locals>.csnamesE  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  )rZ   es     r4   r]   z#Parser.__init__.<locals>.<listcomp>Z  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\mathrG  rI  z\hspacez\phantomr  z\llapz\rlapaccentz\fracrW   denz\dfracz\binomz\genfracldelimrdelimrulesizestylez\sqrt{value}rK  rM  rootz	\overlinebodyz
\underlinez\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right$F)unquote_resultsz(?:(?:\\[$])|[^$])*r  )r  r*   r  r   r+   r   )LtypesSimpleNamespacer   float_literalr   _space_widthsr+  r  r.  rT  rW  rc   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
  customspacer  llaprlap_accent_map_wide_accentsr/  _function_namesfunctionr  r   unclosed_groupfracdfracbinomgenfracr
   sqrtoverline	underlineoversetundersetr   textr   r	   suppresssubstackr>  simpleoperatorname
boldsymbolr  r   math_stringnon_mathmain_expression_math_expression_needs_space_after_subsuper)rQ   r  r*  rA  r  s   `   @r4   rR   zParser.__init__3  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Q%5%5g%>%>??	Xq//8899Xq//8899 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'?'?@@
-)9)9&)A)ABB\**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 	
I'hh j	
 n g f g g	 i
 i j f j k  f!" l#$ j%& l'	
. 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 ! ,1(((rE   rD  r*   fonts_objectr   rV   r8   r   rd  c                z   t          |dd||          g| _        i | _        	 | j                            |          }n8# t
          $ r+}t          d|                    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*  rR  r   NF)r1  _state_stack_em_width_cachern  parse_stringr   r2   explainrp  r   reset_cacher   r   rd  )rQ   rD  rq  rV   r   resultr3   s          r4   parsezParser.parse  s     ixEEGFH	>%22155FF! 	> 	> 	>TCKKNN233=	>+0(!!###veVAY'''s   = 
A2&A--A2r1  c                    | j         d         S )z&Get the current `State` of the parser.r  )rs  r   s    r4   	get_statezParser.get_state
	  s     $$rE   c                8    | j                                          dS )zPop a `State` off of the stack.N)rs  r  r   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)rs  r   r{  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   )rd  as_listrQ   r  s     r4   rm  zParser.main	  s    dllnn%%&&rE   c                V    | j                             |d         dd         d          S )Nr   r   r  T)	parse_all)ro  ru  r  s     r4   rk  zParser.math_string	  s*    $11$q'!B$-41PPPrE   r  c                r    t          |                                          }|                                  |gS rP   )rd  r  r}  )rQ   r  hlists      r4   r   zParser.math	  s.    dllnn%%wrE   c                     |d                              dd          } fd|D             }t          |          }                                  t          j        d                                          _        |gS )Nr   z\$rD  c                T    g | ]$}t          |                                          %S rD   )r.  r{  )rZ   r/  rQ   s     r4   r]   z#Parser.non_math.<locals>.<listcomp>#	  s-    88844>>++,,888rE   r  )replacerd  r  r  r  r{  rU   )rQ   r  rD  symbolsr  s   `    r4   rl  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.  )rZ   r/  r0  s     r4   r]   zParser.text.<locals>.<listcomp>0	  s!    777!tAu~~777rE   r   )r  r{  rU   rd  r}  )rQ   r  r  r0  s      @r4   re  zParser.text,	  sf      
7777tAw77788wrE   
percentagers  c                   |                                  }|j        |j        |j        f}| j                            |          }|0|j                            d|j        |j                  }|| j        |<   t          ||z            S )Nr(  )	r{  rU   rV   r   rt  r   r3  r   rs  )rQ   r  r0  r5  r9   s        r4   _make_spacezParser._make_space4	  s}       z5>595$((--=M**8U^UYOOE(-D %EJ&'''rE   gKqU?g0Bxq?g%?g1ZGU?r  r   gKqUſ)\,z
\thinspacez\/z\>z\:z\;z\ r]  z\enspacez\quadz\qquadz\!c                X    | j         |d                  }|                     |          }|gS Nr+  )rI  r  )rQ   r  rW   rM   s       r4   r+  zParser.spaceR	  s-     g/s##urE   c                :    |                      |d                   gS r  )r  r  s     r4   rT  zParser.customspaceW	  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   -r	  zUnknown symbol: %sc              3  &   K   | ]}|d k    |V  dS r8  NrD   rZ   r/  s     r4   r   z Parser.symbol.<locals>.<genexpr>m	  &      CCA!s((a((((CCrE   r  rS  r   rG  r  Tr  c              3  &   K   | ]}|d k    |V  dS r  rD   r  s     r4   r   z Parser.symbol.<locals>.<genexpr>{	  r  rE   c              3  &   K   | ]}|d k    |V  dS r  rD   r  s     r4   r   z Parser.symbol.<locals>.<genexpr>|	  s&      AAASaAArE   r   ,rI  .)r.  r{  r2   r   _spaced_symbolsr
  rp  _binary_operatorsr:  rg  _left_delims_relation_symbolsrd  r  _punctuation_symbolsr;  )	rQ   rD  r  r  r/  r  r3   	prev_char	next_chars	            r4   r)   zParser.symbolZ	  sv   K88 !A	I4>>++,,DD 	I 	I 	I%a&:Q&>@ @EHI	I $$$ CC4C42CCCRHHI 0 	-///$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   rD  r  r  s       r4   rK  zParser.unknown_symbol	  s!    !!S*KT&\*K*KLLLrE   c                ,    d|d         _         |d         S )NTr  )rj  r  s     r4   r  zParser.phantom	  s    #'W G}rE   c                d    t          t          |d         j                   |d         g          gS Nr  rd  rs  r9   r  s     r4   rU  zParser.llap	  s.    tT']00114=ABBCCrE   c                d    t          |d         t          |d         j                   g          gS r  r  r  s     r4   rV  zParser.rlap	  s.    tG}dDM,?+?&@&@ABBCCrE   hatz\circumflexaccentbrevez\combiningbrevebarz\combiningoverlinegravez\combininggraveaccentacutez\combiningacuteaccenttildez\combiningtildedotz\combiningdotaboveddotz\combiningdiaeresisdddotz\combiningthreedotsaboveddddotz\combiningfourdotsabovevecz\combiningrightarrowabove"`'r]  r  r\  z\rightarrowz
\leftarrowz\circ)overrightarrowoverleftarrowmathringzwidehat widetilde widebarc                \   |                                  }|                                }|d         }|d         }|| j        v r1t          d|z   |j        |t
                    }t          |g          }not          | 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   g       @)r{  r  rX  r  r9   rB  r  rW  r  r)  ri  r  r$  rd  )rQ   r  r0  r  r/  r   
accent_boxcentereds           r4   r/  zParser.accent	  s+     99;;	h5kT'''&vsy%FD D DJ *..HH 0 8%@@J##!!###!!### $sy3"7"7!DEEHsy),,,RS))se   	rE   c                N    |                      |||          }|d         |_        |S )Nr  )ri  function_name)rQ   rD  r  r  r  s        r4   rZ  zParser.function	  s*    !!!S$//"6lrE   c                "   |                                   |                                 }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        d	                   gz  }|                                  |	d
v | _        t!          |          S )Nr*  r  r   zoperatorname{}c              3  &   K   | ]}|d k    |V  dS r  rD   r  s     r4   r   z&Parser.operatorname.<locals>.<genexpr>	  s&      CC!s((!((((CCrE   rS  r\  r  r  >   r  r\  )r  r{  rU   r  r.  r4  r   r*   r:  r   r
  rO  r  rI  r}  rp  rd  )rQ   rD  r  r  r0  
hlist_listr  r/  next_char_locr  
delimiterss              r4   ri  zParser.operatorname	  s     
!#
F| 	% 	%A!T"" %!!###!!!$$$$As## %!!$q%..1111!!!$$$$c$ii!+dL)) 	3S!1222MCCQ}~~%6CCCRHH	\S#J.
J&&4++D,>u,EFFGGJ ,5
+B(Z   rE   c                    |                                   |                    d          r,|                    d          |                                 _        g S NrU   )r  r   r{  rU   r  s     r4   rM  zParser.start_group	  sI    88F 	5$(HHV$4$4DNN!	rE   c                N    t          |                    dg                     }|gS Nr  rd  r   )rQ   r  grps      r4   r  zParser.group	  s$    DHHWb))**urE   c                H    t          |                    dg                     S r  r  r  s     r4   rR  zParser.required_group	  s    TXXgr**+++rE   c                .    |                                   g S rP   )r}  r   s    r4   rN  zParser.end_group	  s    	rE   c                >    t          |t          |          d          )NzExpected '}')r   r:  r  s       r4   r[  zParser.unclosed_group	  s    !!SVV^<<<rE   c                D    |d         |                                  _        g S r  )r{  rU   r  s     r4   rU   zParser.font
  s     $V	rE   r=  r  rl   c                    t          |t                    r|j        | j        v S t          |t                    rt          |d          r|j        | j        v S dS )Nr  F)r  r.  r/  _overunder_symbolsrd  r  r  _overunder_functionsrQ   r=  s     r4   is_overunderzParser.is_overunder
  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 r  )r  r.  r/  _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|                                 |                                 |                     |          rg }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          |          }||_        | j        r!|                     | j        d                   gng }d| _        t          |g|          }|gS |}tA          |t                    r|j        }t          |          rntA          |d         tB                    r%tA          |d         tD                    r
|d d         }|d         }tA          |tD                    r|j#        j$        |_        t          |d          }n6tA          |tD                    r|j#        j$        |_        t          |g          }|j        %                                }|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}|+                                rd
}d
}nW|j        
                    |j        |j        tX          z  |j	                  } |j        |j-        | z  z
  }|j        |j.        | z  z   }|t          tC          |          t_          j0        tb          |          g          }!|!                                 | &                    |          r||j.        |z  z   }n't+          ||j2        |z  |!j        |dz  dz  z
            }||!_        nst          tC          |          |g          }!|!                                 | &                    |          r||j.        |z  z
  }n$t+          ||j3        |z  |!j        |dz  z             }|	| |!_        nt          tC          |          |g          }"|"                                 | &                    |          r||j.        |z  z   }nt+          ||j4        |z            }d|z  ||!j        z
  |"j        |z
  z
  z
  }#|#d
k    r(||#z  }|dz  dz  |z
  |!j        z   }#|#dk    r
||#z  }||#z  }t7          |!tC          ||!j        z
  |"j        |z
  z
            |"g          }!||!_        | &                    |          s|!xj        |j5        |z  z  c_        | j        r!|                     | j        d                   gng }d| _        t          ||!g|          }|gS )Nr=  r   r>  r?  r  zDouble subscriptzDouble superscriptr   r  r   g      @r  r  Fr  r  r   r   ry     )6r   r)  r:  r   r{  r3  r   rU   rV   r   r   rd  r  rL  extendr)   r>  ri  r  r9   r  r   r  r$  r   r:   r;   r  rK  rp  r  rI  r  rs  r.  r9  r   r   r  r  r<  r  r  r  r  r  r  r   r   r  r  r  r  r  )%rQ   rD  r  r  r=  r>  napostrophessubr   opargr0  rule_thicknessr  r  vlistr  r9   vgapr  vltoptional_spacingrx  	last_charrt  r  	lc_heightlc_baseline	superkernsubkernshift_up
shift_downshrunk_x_heightru   rv   clrr   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=,,UZSS 	}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#'#C!L!1!1$2DU2K!L!L M MIK /4D,C3"2344F8O 	gu%% 	'"+L<   A|B/66 5"<#3T::5#/#4L(,	i.. A&/&8&@IOL%888GG'4(( ="+"4"<	WI&&G 1133&	??9%% 	*#/K L8+	,)??9%% 	00I-X\A=M1MNNIy)) v|+f.CCyP-0EER		 !! 	JHJJ#m77
EN]:EIG GO~(HHH /)IIJ =
 tG}}afT3&7&7899AHHJJJy)) >(6>H+DD

 V[8-C!"HqL1,<!<> >
'ANN tI.//AHHJJJy)) Y$v~'@@xx)?8VW<AWXX{"* 4==#.//


??9-- I!,v~/H!HJJ!$Zx1G!H!HJ >)!AG+:0EFH88#%J"Q,*X5?CQww C"c)
(QW,J1FGHH   ",y)) 	6GGv*X55GG
  $?HT--d.@.GHHIIEG 	+0(6%5677xrE   r1  r2  ruler  r4  rW   r0  c           	     &   |                                  }|                                }|j                            |j        |j        |j                  }	|j                                        }
|j                            |j        |j        |j                  }t          |j
                  D ]4}|t          z  }|                                 |                                 5t          |g          }t          |g          }t          |j        |j                  }|                    |d           |                    |d           |r|| j        j        u r|
j        |z  }|
j        |z  }d|z  }n|
j        |z  }|
j        |z  }|}|dz  }t          ||j        z
  |	|z   z
  |          }t          |	|z
  |j        |z
  z
  |          }t3          |t5          d|          t7          ||          t5          d|          |g          }|j        |z   |z   |	z
  |_        n|| j        j        u r|
j        |z  }|
j        |z  }d|z  }n|
j        |z  }|
j        |z  }d|z  }||j        z
  |j        |z
  z
  }t          ||          }t3          |t5          d|          |g          }||_        ||k     r|xj        ||z
  dz  z  c_        t=          t?          |          |t?          |          g          g}|s|r|                      |pd||pd          S |S )Nr  r   r   r      r  )!r{  r  r3  r   rU   rV   r   r   r   r  r  r  r  r  r   r9   ri  r  r  r  r  r  r  r;   r:   r  r$  r  rK  r  rd  r)  _auto_sized_delimiter)rQ   r1  r2  r  r4  rW   r0  r0  r  r
  r  r  r  cnumcdenr9   num_shift_upden_shift_downr  r  num_clrden_clrr  min_clrdef_clrrx  s                             r4   _genfraczParser._genfrac
  sL     99;;	m33J	3 31133=,,UZSSu{## 	 	A%HJJLLLJJLLLL##CIsy))

5)$$$

5)$$$  &	>444%{X5!'!9$h%{X5!'!91HE<$*4u9LMsSSG;.4;3OPRUVVG47++ --7++	  E "&w!6!>!LE 444%{X5!'!9i-%{X5!'!9i-#dj0T[>5QRGgw''C43<<  E "0E  ""w'8A&==""*/OOOO1
 + + *
  	TV 	T--fmVV]sSSSrE   c                R    |                      t          |d                             S )Nr.  )r  r   r  s     r4   r.  zParser.style_literal  s!    s4#899:::rE   c           	         |                      |                    dd          |                    dd          |d         |                    d| j        j                  |d         |d                   S )Nr1  rS  r2  r3  r4  rW   r0  )r  r   r  r  r  s     r4   r_  zParser.genfrac  sc    }}HHXr""DHHXr$:$:dhhw0IJJKe& & 	&rE   c           	         |                      dd|                                                                 | j        j        |d         |d                   S NrS  rW   r0  )r  r{  r  r  r  r  s     r4   r\  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  r{  r  r  r  r  s     r4   r]  zParser.dfrac  sL    }}DNN$$DDFFO($u+tE{D D 	DrE   c           	     b    |                      ddd| j        j        |d         |d                   S )Nr@  rE  r   rW   r0  )r  r  r  r  s     r4   r^  zParser.binom$  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 )Nr7  r6  r  r   r   ur   )r{  r  r  r  r   r9   ri  r  r$  r;   r:   rK  )rQ   rD  r  r  r7  r6  r  centered_annotationcentered_bodyr9   r  r  s               r4   _gensetzParser._genset)  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|||          }|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          d	|j        z  d
d
          }n7t          |          }|                                 |                                 t          t          |g          g          }| dz  |_        t          |t%          d|j        z            ||
g          }|gS )Nr5  r  r  rW  r   r    r  r  r   r  g      )r   r{  r  r:   rK  r;   r  rd  r)  r  r  r~  r  rV   r   rN   r9   r  rs  )rQ   r  r5  r6  r0  r  r:   r;   checkpadded_body	rightside
root_vlistr  s                r4   r`  zParser.sqrtK  s   xxG}  99;;	 t001y=@
T..|VUEBB 22e00 T!i-00$Q]8K8KLMM5<<f{CDD	%.59"<!JJ!5	* 	* 	*
  	sU[("b11DD;;DKKMMMKKMMME4&MM?++
#)'C-
#$$	
   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 )Nr6  r   r  r  r  )r{  r  r:   rK  r;   r  r  r~  rd  r  rV   r   )	rQ   r  r6  r0  r  r:   r;   r  r  s	            r4   ra  zParser.overlinet  s    F|  99;;	t001y=@
T.. 5<<fudV}}EFF	 	%.59"<!JJ!5	* 	* 	* yk""wrE   c                Z   |d         }|                                  }|                                }t          t          |g          t	          d|z            t          ||          g          }|j        |j        z   |z   }|j        |_        ||j        z
  |_        t          |g          gS )Nr6  r   )r{  r  r  rd  rs  r  r:   r;   )rQ   r  r6  r0  r  r  r  s          r4   rb  zParser.underline  s    F|  99;;	4&MMY%##
  
 u{*Y6{el*ug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:   rZ   ru   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;   r  s     r4   r]   z0Parser._auto_sized_delimiter.<locals>.<listcomp>  s)    KKKQ
1c8J8JKKKKrE   r@  r   r  )r  r   r  )r{  r:  r   	enumerater   r   r*   r  remover  rN   r.  r   r  rd  )rQ   r  r  r  r0  r:   r;   r  idxelr/  middle_partr<  r  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                x    |                      |d         |d                                         |d                   S )NrB  r  rC  )r  r  r  s     r4   r  zParser.auto_delim  s<    ))L$u+--//g@ @ 	@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  r{  r  rd  rL  r.  rU   r4  r   r/  _latin_alphabets_small_greekr}  )rQ   r  r0  r  r  r/  ks          r4   rj  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   )rd  )rZ   r$  s     r4   r]   z#Parser.substack.<locals>.<listcomp>  s    ,,,aq,,,rE   r   c                    | j         S rP   r  r6  s    r4   rn  z!Parser.substack.<locals>.<lambda>  s    ag rE   r  c                    g | ]	}|D ]}|
S rD   rD   )rZ   pairr   s      r4   r]   z#Parser.substack.<locals>.<listcomp>  s=     " " " " "  " " " "rE   r   r  )r{  r  r   rc   r  ri  r   zipr$  r:  r  rd  )rQ   r  r<  r0  r  r  	max_widthr  r  cpstackr  rx  s                r4   rg  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  )
rD  r*   rq  r   rV   r8   r   r8   r+   rd  r  )r  r   r+   r  )r  r   r+   r   )r  r   r+   r  )r  r8   r+   rs  )rD  r*   r  r   r  r  r+   r  r  )r+   r  )r=  r  r+   rl   )r1  r*   r2  r*   r  r  r4  r  rW   rd  r0  rd  r+   r  )r  r*   r  r  r  r*   r+   r  )Ur?   r@   rA   rB   enumEnumr  rf  rg  r  r  _arrow_symbolsr  r  r  r  r  rL  rY  _ambi_delimsr  _right_delimsrO  r  r.   r#  stringascii_lettersr"  rR   ry  r{  r}  r  rm  rk  r   rl  staticmethodr   convert_to_floatrH  re  r  rI  r+  rT  r)   rK  r  rU  rV  rW  rX  r/  rZ  ri  rM  r  rR  rS  rN  r[  rU   r  r  r<  r>  r  r.  r_  r\  r]  r^  r
  rc  rd  r`  ra  rb  r  r  rj  rg  r  r  s   @r4   r  r    s            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 ::?%''C C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@1 @1 @1 @1D( ( ( (*% % % %       : : : :' ' ' 'Q Q Q Q   
    !L!1!BCCM   ( ( ( (   M   
1 1 1 1. . . .`M M M M   D D D DD D D D/- 	0 	3	
 	3 	- 	0 	1 	6 	5 	7 	1 	3 	3 	-  	0!" 	/#$ *(#)  K. C4::<<==M   .   
! ! ! !<      , , , , $N   = = = =         
   
s s s s s sjD D D DL; ; ; ;& & & &A A A A
D D D D
A A A A
   @ ! Gh' ' ' 'R   &       $ $ $ $L@ @ @ @   4       rE   r  )r)   r*   r+   r&   )r  )rM   rN   r  r  r+   rL   )r  r*   r+   r   )r   r*   r  r   r+   r   )xrB   
__future__r   abcr  r.  r   rq  loggingr   r   r&  rF  r  r3  rU  typingr   r   numpyrd   numpy.typingr   	pyparsingr   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   
matplotlibr  rS  r   _mathtext_datar   r   r   r   font_managerr   r    r!   ft2fontr"   r#   r$   TYPE_CHECKINGcollections.abcr%   r&   r'   r(   enable_packrat	getLoggerr  r5   r7   r@   rG   rL   r   r   ABCr   ABCMetar   r  rl  r  r  r  r1  r  r  r  r   re  r  r  r  r  r  rN   r$  r)  r.  rB  rG  rd  r  r  r  r  r  r  r~  r  r  rs  r  r  r   r  r1  r
  r  rD   rE   r4   <module>rH     sU    # " " " " " 



             				 				                                 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +          D D D D D D D D D D D D < < < < < < < < < < 0 0 0 0 0 0 0 0 0 0 ? B((((((AAAAAAAAAA     w.//   ,3 3 3 3 3* 3 3 3& /     *   ( / <5 <5 <5 <5 <5 <5 <5 <5~    *   @    z   y! y! y! y! y!CG y! y! y!xxI xI xI xI xIES[ xI xI xI xIv]+ ]+ ]+ ]+ ]+- ]+ ]+ ]+@C! C! C! C! C!= C! C! C!L&A &A &A &A &A,#+ &A &A &A &AR( ( ( ( ({ ( ( (*' ' ' ' 'k ' ' '*t% t% t% t% t% t% t% t%n    I   B  A. A. A. A. A. A. A. A.H! ! ! ! !"3 ! ! !<    )   4    -       0   *    /   *       @    $   *, , , , ,3 , , ,( ( ( ( (3 ( ( (D+ D+ D+ D+ D+4 D+ D+ D+NI I I I IT I I I.-/ -/ -/ -/ -/3 -/ -/ -/``< `< `< `< `<D `< `< `<FS< S< S< S< S<D S< S< S<l@ @ @ @ @3 @ @ @(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 #" #" #"L         E      8Y Y Y Y Y@1 1 1 1#0 #0 #0 #0 #0 #0 #0 #0L6 6 6 62[ [ [ [ [ [ [ [ [ [rE   