
    DVf                   <   d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlmZ ddlZddlmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% ddl&Z'ddl(m)Z) ddl*m+Z+m,Z,m-Z-m.Z. dd	l/m0Z0m1Z1m2Z2 dd
l3m4Z4m5Z5m6Z6 ddl7m8Z9 ddlm:Z;  e9e;      jx                  dk  rddlm=Z> nddlm>Z> ej~                  rddl@mAZA ddl3mBZB  ej                           ej                  d      ZEddZF G d de      ZGdeG_H         G d de      ZIdeI_H         G d d      ZJ G d de      ZK G d de      ZL G d dej                        ZN G d  d!eNej                  "      ZP G d# d$eP      ZQ G d% d&eP      ZR G d' d(eRej                  "      ZS G d) d*eS      ZT G d+ d,eS      ZU G d- d.eR      ZV G d/ d0eV      ZWd1ZXd2ZY G d3 d4      ZZ G d5 d6eZ      Z[ G d7 d8eZ      Z\ G d9 d:eZ      Z] G d; d<eZ      Z^ G d= d>eZ      Z_i d?e_d@e_dAe^dBe[dCe[dDe[dEe[dFe[dGe[dHe[dIe\dJe\dKe\dLe\dMe\dNe\dOe\e_e_dPZ`ddRZa G dS dT      Zb G dU dVeb      Zc G dW dXec      Zd G dY dZec      Ze G d[ d\eb      Zf G d] d^ef      Zg G d_ d`ec      Zh G da dbeh      Zi G dc ddeh      Zj G de dfec      Zk G dg dhek      Zl G di djek      Zm G dk dle      Zn endmdnddmd       endmdndodmd       endmdnddmd       endmdmddnd       endmdmddndo       endmdmddnd       endmdmddmd       endmdnddpd      dqen_o         G dr dseb      Zp G dt duei      Zq G dv dwej      Zr G dx dyeb      Zs G dz d{ei      Zt G d| d}ei      Zuddd~ZvddZw G d dQ      ZxddZy G d d      Zzy)z.
Implementation details for :mod:`.mathtext`.
    )annotationsN)
NamedTuple)EmptyForwardLiteralNotAnyoneOf	OneOrMoreOptionalParseBaseExceptionParseExceptionParseExpressionParseFatalExceptionParserElementParseResultsQuotedStringRegex	StringEnd
ZeroOrMorepyparsing_commonGroup   )cbook)latex_to_bakomastix_glyph_fixesstix_virtual_fontstex2uni)FontPropertiesfindfontget_font)FT2FontFT2ImageKERNING_DEFAULT)parse)__version__   )
nestedExpr)nested_expr)Iterable)Glyphzmatplotlib.mathtextc                    	 t        |       S # t        $ r Y nw xY w	 t        | j                  d         S # t        $ r}t        | d      |d}~ww xY w)z
    Return the integer index (from the Unicode table) of *symbol*.

    Parameters
    ----------
    symbol : str
        A single (Unicode) character, a TeX command (e.g. r'\pi') or a Type1
        symbol name (e.g. 'phi').
    \z5 is not a valid Unicode character or TeX/Type1 symbolN)ord	TypeErrorr   stripKeyError
ValueError)symbolerrs     ]/var/www/html/software/conda/envs/catlas/lib/python3.12/site-packages/matplotlib/_mathtext.pyget_unicode_indexr5   5   sg    6{ v||D)** jMN	s    
 	5 	AAAc                  D    e Zd ZU dZded<   ded<   ded<   ded<   ded	<   y
)VectorParsea  
    The namedtuple type returned by ``MathTextParser("path").parse(...)``.

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

    Attributes
    ----------
    ox, oy : float
        The offsets are always zero.
    width, height, depth : float
        The global metrics.
    image : FT2Image
        A raster image.
    r8   oxoyr9   r:   r;   r"   imageNr>   rD   rE   r4   rG   rG   a   s'     	IILMLOrE   rG   c                  (    e Zd ZdZddZddZddZy)	Outputz
    Result of `ship`\ping a box: lists of positioned glyphs and rectangles.

    This class is not exposed to end users, but converted to a `VectorParse` or
    a `RasterParse` by `.MathTextParser.parse`.
    c                .    || _         g | _        g | _        y N)boxr<   r=   )selfrO   s     r4   __init__zOutput.__init__   s    ;=>@
rE   c                   t        t        j                  | j                  j                  | j                  j
                  | j                  j                  g      \  }}}| j                  D cg c];  \  }}}|j                  |j                  |j                  |||z
  |j                  z   f= }}}}| j                  D 	
cg c]  \  }}	}
}|||z
  |
|z
  ||	z
  f }}
}	}}t        |||z   |||      S c c}}}w c c}}
}	}w rN   )mapnpceilrO   r9   r:   r;   r<   fontfontsizenumoffsetr=   r7   )rP   whdrH   rI   infogsx1y1x2y2rss                r4   	to_vectorzOutput.to_vector   s    GGdhhnndhhootxx~~FH1a #'++/ /"b$ yy$--2q2v7KL / / %)JJ0 0 "b"b 1r627BG, 0 01a!eQB//	/0s   .A C5C<
c               
   t        g | j                  D cg c]  \  }}}||j                  j                  z   ! c}}}| j                  D cg c]	  \  }}}}| c}}}}d      dz
  }	t        g | j                  D cg c]  \  }}}||j                  j
                  z
  ! c}}}| j                  D cg c]	  \  }}}}| c}}}}d      dz
  }
t        g | j                  D cg c]  \  }}}||j                  j                  z   ! c}}}| j                  D cg c]	  \  }}}}| c}}}}d      dz   }t        g | j                  D cg c]  \  }}}||j                  j                  z
  ! c}}}| j                  D cg c]	  \  }}}}| c}}}}d      dz   }||	z
  }||
z
  | j                  j                  z
  }||
z
  | j                  j                  z
  }t        t        j                  |      t        j                  |t        |d      z               }t        | j                  |	 |
 f      }|j                  D ]G  \  }}}|j                   j#                  ||||j                  j$                  z
  |j&                  |       I |j                  D ]  \  }}}}t        t)        ||z
        dz
  d      }|dk(  r||z   dz  }t)        ||dz   dz  z
        }nt)        |      }|j+                  t)        |      |t        j                  |      ||z           t-        dd|||z   ||      S c c}}}w c c}}}}w c c}}}w c c}}}}w c c}}}w c c}}}}w c c}}}w c c}}}}w )Nr   r   )antialiased   )minr<   metricsxminr=   ymaxmaxxmaxyminrO   r;   r:   r"   rT   rU   shiprV   draw_glyph_to_bitmapicebergglyphintdraw_rect_filledrG   )rP   rf   rH   rI   r]   r_   r`   ra   rb   rj   rn   rm   rk   rZ   r[   r\   rJ   shiftedr:   centerys                        r4   	to_rasterzOutput.to_raster   sT     ?MMRb4<<,,,M ?/3zz::^RRb:?<=? @BCD ?MMRb4<<,,,M ?/3zz::^RRb:?<=? @BCD ?MMRb4<<,,,M ?/3zz::^RRb:?<=? @BCD ?MMRb4<<,,,M ?/3zz::^RRb:?<=? @BCD4K4K$((..(4K$((//)RWWQQ]%;< txx4%$0#NN 	)LBDII**r2 4 44djj' + )	) &mm 	HNBBR"W)1-F{r'Q&1*!112G""3r7Arwwr{AJG	H 1aAE1e44? N:M:M:M:s/   $M	M$M?M3$M'-M.!$M6M=N)rO   Box)returnr7   )rf   boolrz   rG   )r?   r@   rA   rB   rQ   rd   rx   rD   rE   r4   rL   rL   x   s    A
0"5rE   rL   c                  l    e Zd ZU dZded<   ded<   ded<   ded<   ded<   ded<   ded	<   ded
<   ded<   y)FontMetricsaa  
    Metrics of a font.

    Attributes
    ----------
    advance : float
        The advance distance (in points) of the glyph.
    height : float
        The height of the glyph in points.
    width : float
        The width of the glyph in points.
    xmin, xmax, ymin, ymax : float
        The ink rectangle of the glyph.
    iceberg : float
        The distance from the baseline to the top of the glyph. (This corresponds to
        TeX's definition of "height".)
    slanted : bool
        Whether the glyph should be considered as "slanted" (currently used for kerning
        sub/superscripts).
    r8   advancer:   r9   rj   rm   rn   rk   rq   r{   slantedNr>   rD   rE   r4   r}   r}      s6    ( NML
K
K
K
KNMrE   r}   c                  T    e Zd ZU ded<   ded<   ded<   ded<   d	ed
<   ded<   ded<   y)FontInfor!   rV   r8   rW   strpostscript_namer}   ri   rs   rX   r*   rr   rY   Nr?   r@   rA   rC   rD   rE   r4   r   r      s'    
MO	HLMrE   r   c                      e Zd ZdZddZ	 	 	 	 	 	 	 	 	 	 	 	 ddZddZ	 	 	 	 ddZ	 	 	 	 ddZ	 	 	 	 	 	 	 	 	 	 ddZ		 	 	 	 	 	 	 	 	 	 ddZ
dd	Zdd
Z	 	 	 	 ddZy)Fontsz
    An abstract base class for a system of fonts to use for mathtext.

    The class must be able to take symbol keys and font file names and
    return the character metrics.  It also delegates to a backend class
    to do the actual drawing.
    c                     || _         || _        y)au  
        Parameters
        ----------
        default_font_prop : `~.font_manager.FontProperties`
            The default non-math font, or the base font for Unicode (generic)
            font rendering.
        load_glyph_flags : int
            Flags passed to the glyph loader (e.g. ``FT_Load_Glyph`` and
            ``FT_Load_Char`` for FreeType-based fonts).
        N)default_font_propload_glyph_flags)rP   r   r   s      r4   rQ   zFonts.__init__   s     "3 0rE   c
                     y)z
        Get the kerning distance for font between *sym1* and *sym2*.

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

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

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

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

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

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

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

    If a glyph is not found it will fallback to Stix Serif
    DejaVu SerifzDejaVu Serif:italiczDejaVu Serif:weight=boldzDejaVu Serif:italic:boldDejaVu SansDejaVu Sans MonozDejaVu Serif Displayr   r   r   bfitr   r   r   r   Nr?   r@   rA   rB   r  rD   rE   r4   r  r    s(     #(* $	HrE   r  c            	      &    e Zd ZdZdddddddddZy	)
DejaVuSansFontszt
    A font handling class for the DejaVu Sans fonts

    If a glyph is not found it will fallback to Stix Sans
    r  zDejaVu Sans:italiczDejaVu Sans:weight=boldzDejaVu Sans:italic:boldr  zDejaVu Sans Displayr  Nr  rD   rE   r4   r  r    s(     "') #	HrE   r  c                      e Zd ZU dZddddddddd	d
ddddZded<   dZdZddZ	 	 	 	 ddZ	e
j                  	 	 	 	 	 	 dd       Zy)r   aa  
    A font handling class for the STIX fonts.

    In addition to what UnicodeFonts provides, this class:

    - supports "virtual fonts" which are complete alpha numeric
      character sets with different font styles at special Unicode
      code points, such as "Blackboard".

    - handles sized alternative characters for the STIXSizeX fonts.
    rg  zSTIXGeneral:italiczSTIXGeneral:weight=boldzSTIXGeneral:italic:boldSTIXNonUnicodezSTIXNonUnicode:italiczSTIXNonUnicode:weight=boldrh  ri  rj  rk  rl  )r   r   r   r  nonunirmnonuniitnonunibfr   r   rg   r&   rm  rn  r  r  NFc                    t         j                  | ||       | j                  j                         D ].  \  }}t	        |      }|| j
                  |<   || j
                  |<   0 y rN   )r   rQ   r  r  r   r   r  s         r4   rQ   zStixFonts.__init__  s[    t%68HI,,. 	*IC~H (DLL!)DLL	*rE   c                Z   t        j                  |      }| j                  r||dvrt         d   }d}nd}t        |t              r	 ||   }nt        |t              r|}nd }|}d}t        |      }||k  r,||z   dz  }	||	   }
||
d   k  r|	}n||
d   k  rn|	dz   }||k  r,
d   |cxk  r|
d   k  rn n||
d   z
  |
d	   z   }|
d   }n|sd}t        j                  d
   }|dv rt        j                  ||      }|dv rd|cxk  rdk  rn ||fS d|z   }||fS # t
        $ r |d   }Y w xY w)N)r   r   r   TFr   r   rg   r   r&   r   )r   r   )r   r   r   r  i   i  nonuni)r   r   _sansrq  dictr0   r  r	  r   r   r   )rP   r   r   rz  font_mappingdoing_sans_conversionmappinglohimidranges              r4   r{  zStixFonts._map_virtual_font  s    *--h7JJ</$::-d3L$(!$)!lD)-&z2 d+"GGBWBr'"uqjeAh&Bq)qB r' Qx8/uQx/#eAh.q9 8*<<(:; |#'++Hh?H 11f6RF6R !!  (*H!!K  -&t,-s   D D*)D*c                &   ddddddd}|j                  ||      }	 t        |      }t        d      D cg c]2  }| j	                  |      j                  |      d	k7  r|t        |      f4 }}|d
k(  r|d d }|S # t        $ r ||fgcY S w xY wc c}w )Nr  r  r  r   u   ⟨u   ⟩)rT  rU  rV  rW  rR  rS     r   r>  )r   r5   r1   r  r   r
  r  )rP   r   r   fixesrz  r"  alternativess          r4   r   z+StixFonts.get_sized_alternatives_for_symbolH  s     s3s67

 iiS!	%(-H 5:!H Lq>>!,;;HEJ CM* L L ,',L  	%sO$$	%Ls   A: 7B:B
Br   r  )r   r   r   r   rz   z-list[tuple[str, str]] | list[tuple[int, str]])r?   r@   rA   rB   r  rC   rp  r  rQ   r{  r   r   r   rD   rE   r4   r   r     s    
 "')$+0&H"  NE*4"$'4",;4"l __  G rE   r   c                      e Zd ZdZdZy)ro  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   ro  ro  `  s     ErE   ro  ffffff?r  c                      e Zd ZU dZdZded<   dZded<   dZded<   d	Zded
<   dZ	ded<   dZ
ded<   dZded<   dZded<   y)FontConstantsBasez
    A set of constants that controls how certain things, such as sub-
    and superscripts are laid out.  These are all metrics that can't
    be reliably retrieved from the font metrics in the font itself.
    皙?zT.ClassVar[float]script_spaceg?subdropr  sup1333333?sub1      ?sub2g?delta皙?delta_slanted皙?delta_integralN)r?   r@   rA   rB   r  rC   r  r  r  r  r  r  r  rD   rE   r4   r  r    so     '+L#* "%G$ "D
! "D
! "D
!  %E$
 (+M$* ),N%+rE   r  c                  ,    e Zd ZdZdZdZdZdZdZdZ	dZ
y)ComputerModernFontConstantsg333333?r  g?r  N)r?   r@   rA   r  r  r  r  r  r  r  r  rD   rE   r4   r  r    s*    LGDDDEMNrE   r  c                  $    e Zd ZdZdZdZdZdZdZy)STIXFontConstantsr  皙?333333?r  r  N)	r?   r@   rA   r  r  r  r  r  r  rD   rE   r4   r  r    s     LDDEMNrE   r  c                      e Zd ZdZdZdZdZy)STIXSansFontConstantsr  r  r  r  N)r?   r@   rA   r  r  r  r  rD   rE   r4   r  r    s    LDMNrE   r  c                      e Zd Zy)DejaVuSerifFontConstantsNr?   r@   rA   rD   rE   r4   r  r        rE   r  c                      e Zd Zy)DejaVuSansFontConstantsNr  rD   rE   r4   r  r    r  rE   r  r  r  r  r   r   r   r   r   r   r   rg  r  rl  rk  rj  ri  rh  )zBitstream Vera SanszBitstream VeraParserStatec                    t         j                  | j                  j                  | j                        j
                  t              }|t        u r t        | j                  t              rt        S |S rN   )_font_constant_mappingr   fontsetr   rV   r  r  r  rq  ro  r  )state	constantss     r4   _get_font_constant_setr    sW    &**

+779JLI 	&&u}}m4$$rE   c                  8    e Zd ZdZddZd	dZd
dZddZddZy)NodezA node in the TeX box model.c                    d| _         y Nr   rw  rP   s    r4   rQ   zNode.__init__  s	    	rE   c                ,    t        |       j                  S rN   )typer?   r  s    r4   __repr__zNode.__repr__  s    Dz"""rE   c                     yNr   rD   )rP   nexts     r4   r   zNode.get_kerning  s    rE   c                .    | xj                   dz  c_         y)z
        Shrinks one level smaller.  There are only three levels of
        sizes, after which things will no longer get smaller.
        r   Nr  r  s    r4   shrinkzNode.shrink  s    
 			Q	rE   c                     y)zRender this node.NrD   rP   r   r   rw   s       r4   renderzNode.render  s    rE   Nrz   r   rz   r   r  zNode | Nonerz   r8   r   rL   r   r8   rw   r8   rz   r   )	r?   r@   rA   rB   rQ   r  r   r  r  rD   rE   r4   r  r    s    &# rE   r  c                  L     e Zd ZdZd fdZd fdZ	 	 	 	 	 	 	 	 	 	 ddZ xZS )ry   z A node with a physical location.c                L    t         |           || _        || _        || _        y rN   )r   rQ   r9   r:   r;   )rP   r9   r:   r;   r   s       r4   rQ   zBox.__init__  s#    

rE   c                    t         |           | j                  t        k  rL| xj                  t
        z  c_        | xj                  t
        z  c_        | xj                  t
        z  c_        y y rN   )r   r  rw  NUM_SIZE_LEVELSr9   SHRINK_FACTORr:   r;   rP   r   s    r4   r  z
Box.shrink  sH    99&JJ=(JKK=(KJJ=(J 'rE   c                     y rN   rD   r   s         r4   r  z
Box.render  s    rE   )r9   r8   r:   r8   r;   r8   rz   r   r  r   )r?   r@   rA   rB   rQ   r  r  r   r   s   @r4   ry   ry   	  s=    *)#).49>BrE   ry   c                  $     e Zd ZdZd fdZ xZS )Vboxz$A box with only height (zero width).c                (    t         |   d||       y r  r   rQ   )rP   r:   r;   r   s      r4   rQ   zVbox.__init__!  s    VU+rE   )r:   r8   r;   r8   r?   r@   rA   rB   rQ   r   r   s   @r4   r  r    s    ., ,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).c                (    t         |   |dd       y r  r   rP   r9   r   s     r4   rQ   zHbox.__init__(  s    B'rE   r9   r8   r  r   s   @r4   r  r  %  s    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`.
    c                    t         |           || _        |j                  | _        |j                  | _        |j
                  | _        |j                  | _        |j                  | _        | j                          y rN   )	r   rQ   rM  r  rV   r   rW   r   _update_metrics)rP   rM  r  r   s      r4   rQ   zChar.__init__9  s\    }}JJ	**99 	rE   c                     d| j                   z  S )Nz`%s`rM  r  s    r4   r  zChar.__repr__E  s    rE   c                x   | j                   j                  | j                  | j                  | j                  | j
                  | j                        x}| _        | j                  dk(  r|j                  | _	        n|j                  | _	        |j                  | _        |j                  |j                  z
   | _        y )N )r  r   rV   r   rM  rW   r   _metricsr~   r9   rq   r:   r;   rP   ri   s     r4   r
  zChar._update_metricsH  s    "&,,":":IIttxx#I 	I$-66S= DJ DJoo78
rE   c                .    | j                   j                  S rN   )r  r   r  s    r4   
is_slantedzChar.is_slantedR  s    }}$$$rE   c                p   | j                   j                  | j                  z
  }d}t        |t              r}| j
                  j                  | j                  | j                  | j                  | j                  |j                  |j                  |j                  |j                  | j                  	      }||z   S )z
        Return the amount of kerning between this and the given character.

        This method is called when characters are strung together into `Hlist`
        to create `Kern` nodes.
        r   )r  r~   r9   rq  r  r  r   rV   r   rM  rW   r   )rP   r  r~   kerns       r4   r   zChar.get_kerningU  s     --''$**4dD!<<((		4??DFFDMM		4??DFFDMMD ~rE   c           
         | j                   j                  |||| j                  | j                  | j                  | j
                  | j                         y rN   )r  r   rV   r   rM  rW   r   r  s       r4   r  zChar.rendere  s;    !!AqIIttxx	IrE   c                   t         |           | j                  t        k  re| xj                  t
        z  c_        | xj                  t
        z  c_        | xj                  t
        z  c_        | xj                  t
        z  c_        y y rN   )	r   r  rw  r  rW   r  r9   r:   r;   r  s    r4   r  zChar.shrinkj  sV    99&MM]*MJJ]*JKK]*KJJ]*J	 'rE   )rM  r   r  r  r  r  )rz   r{   r  r  )r?   r@   rA   rB   rQ   r  r
  r  r   r  r  r   r   s   @r4   r  r  ,  s1    

9% 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.
    c                :   | j                   j                  | j                  | j                  | j                  | j
                  | j                        x}| _        |j                  |j                  z
  | _
        |j                  |j                  z
  | _        d| _        y r  )r  r   rV   r   rM  rW   r   r  rm   rj   r9   rk   rn   r:   r;   r  s     r4   r
  zAccent._update_metricsy  so    "&,,":":IIttxx#I 	I$-\\GLL0
llW\\1
rE   c                B    t         |           | j                          y rN   )r   r  r
  r  s    r4   r  zAccent.shrink  s    rE   c           
        | j                   j                  ||| j                  j                  z
  || j                  j                  z   | j
                  | j                  | j                  | j                  | j                         y rN   )
r  r   r  rj   rn   rV   r   rM  rW   r   r  s       r4   r  zAccent.render  sY    !!A***A0B0B,BIIttxx	IrE   r  r  )r?   r@   rA   rB   r
  r  r  r   r   s   @r4   r  r  s  s    
IrE   r  c                  L     e Zd ZdZd fdZd fdZ	 	 	 	 ddZd	 fdZ xZS )
Listz0A list of nodes (either horizontal or vertical).c                r    t         |   ddd       d| _        g || _        d| _        d| _        d| _        y )Nr   r   )r   rQ   shift_amountchildrenglue_set	glue_sign
glue_orderrP   elementsr   s     r4   rQ   zList.__init__  s<    R$#(rE   c                   dj                  t        | 	         | j                  | j                  | j
                  | j                  dj                  | j                  D cg c]  }t        |       c}            S c c}w )Nz/{}<w={:.02f} h={:.02f} d={:.02f} s={:.02f}>[{}]z, )
formatr   r  r9   r:   r;   r  joinr   repr)rP   r   r   s     r4   r  zList.__repr__  sa    @GGGJJJJ))II61tAw67	9 	9 7s   A<c                R   t        fdt        t                    d d d   D        d      x| _        }|| _        |   dk7  r||   z  | _        nd| _        d| _        |dk(  rBt        | j                        r,t        j                  d|t        |       j                  |        y y y )Nc              3  4   K   | ]  }|   d k7  s|  yw)r   NrD   ).0r"  totalss     r4   	<genexpr>z!List._set_glue.<locals>.<genexpr>  s     C1F1INQCs   r  r   r   z	%s %s: %r)r  r  r	  r#  r"  r!  
glue_ratior   r  r  r  r?   )rP   r   signr-  
error_typer  s      `  r4   	_set_gluezList._set_glue  s    "Cc&k*4R40CQH 	H! !9?q	MDMDN DO64==!['d)<)<dD " rE   c                    | j                   D ]  }|j                           t        |           | j                  t        k  r3| xj
                  t        z  c_        | xj                  t        z  c_        y y rN   )r   r  r   rw  r  r  r  r!  )rP   childr   s     r4   r  zList.shrink  sY    ]] 	ELLN	99&.MM.M 'rE   )r%  T.Sequence[Node]r  )
r   r8   r0  rs   r-  zlist[float]r1  r   rz   r   r  )	r?   r@   rA   rB   rQ   r  r2  r  r   r   s   @r4   r  r    s2    :9D!D&*D / /rE   r  c                  N     e Zd ZdZ	 	 	 d	 	 	 d fdZddZ	 	 d	 	 	 d	dZ xZS )
HlistzA horizontal list of boxes.c                n    t         |   |       |r| j                          | j                  ||       y )N)rZ   r1  )r   rQ   r  hpack)rP   r%  rZ   r1  do_kernr   s        r4   rQ   zHlist.__init__  s.     	"IIK

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

        The `Char` nodes themselves determine the amount of kerning they need
        (in `~Char.get_kerning`), and this function just creates the correct
        linked list.
        r   Nr   )r	  r   r  r   r   Kern)rP   new_childrennum_childrenr"  elemr  kerning_distancer  s           r4   r  z
Hlist.kern  s     4==)<( .}}Q'|a''==Q/DD##D)#'#3#3D#9 #r) 01D ''-. )DM rE   c                   d}d}d}dgdz  }dgdz  }| j                   D ]~  }t        |t              r<||j                  z  }t	        ||j
                        }t	        ||j                        }Pt        |t              r||j                  z  }t        j                  |j
                        rt        j                  |j                        rt        |dd      }	t	        ||j
                  |	z
        }t	        ||j                  |	z         }t        |t              r_|j                  }
||
j                  z  }||
j                  xx   |
j                  z  cc<   ||
j                  xx   |
j                   z  cc<   ^t        |t"              sp||j                  z  } || _        || _        |dk(  r||z  }|| _        ||z
  }|dk(  rd| _        d| _        d| _        y|dkD  r| j+                  |d|d       y| j+                  |d	|d
       y)a  
        Compute the dimensions of the resulting boxes, and adjust the glue if
        one of those dimensions is pre-specified.  The computed sizes normally
        enclose all of the material inside the new box; but some items may
        stick out if negative glue is used, if the box is overfull, or if a
        ``\vbox`` includes other boxes that have been shifted left.

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

        Notes
        -----
        The defaults produce a box with the natural width of the contents.
        r   rm  r  
additionalr   Nr   Overfulr  Underful)r   rq  r  r9   rl   r:   r;   ry   rT   isinfgetattrGlue	glue_specstretch_orderstretchshrink_orderr  r<  r"  r#  r/  r2  )rP   rZ   r1  r[   r\   r   total_stretchtotal_shrinkr?  rB  rH  s              r4   r9  zHlist.hpack  s   0 qtax 	A!T"QWW188$177OAs#QWWxx)"((1772C>26AAqxx!|,AAqww{+AAt$KK	Y__$i556):K:KK6Y334	8H8HH4At$QWW#	$ 
FA
E7DNDO DOr6NN1a	:NN1b,
;rE   )r   rB  T)r%  r5  rZ   r8   r1  "T.Literal['additional', 'exactly']r:  r{   r  r   rB  )rZ   r8   r1  rN  rz   r   )r?   r@   rA   rB   rQ   r  r9  r   r   s   @r4   r7  r7    sF    %>A9E!%6)2  #6B?<3?<GK?<rE   r7  c                  Z     e Zd ZdZ	 	 d	 d fdZddej                  f	 	 	 	 	 ddZ xZS )	VlistzA vertical list of boxes.r   rB  c                J    t         |   |       | j                  ||       y )N)r[   r1  )r   rQ   vpack)rP   r%  r[   r1  r   s       r4   rQ   zVlist.__init__  s     "

Q!
rE   c                   d}d}d}dgdz  }dgdz  }| j                   D ].  }	t        |	t              re|||	j                  z   z  }|	j                  }t        j                  |	j                        rRt        |	dd      }
t        ||	j                  |
z         }yt        |	t              re||z  }d}|	j                  }||j                  z  }||j                  xx   |j                  z  cc<   ||j                  xx   |j                  z  cc<   t        |	t               r|||	j                  z   z  }d}t        |	t"              s&t%        d       || _        ||kD  r|||z
  z  }|| _        n|| _        |dk(  r||z  }|| _        ||z
  }|dk(  rd| _        d| _        d| _        y|dkD  r| j-                  |d|d	       y| j-                  |d
|d       y)ak  
        Compute the dimensions of the resulting boxes, and to adjust the glue
        if one of those dimensions is pre-specified.

        Parameters
        ----------
        h : float, default: 0
            A height.
        m : {'exactly', 'additional'}, default: 'additional'
            Whether to produce a box whose height is 'exactly' *h*; or a box
            with the natural height of the contents, plus *h* ('additional').
        l : float, default: np.inf
            The maximum height.

        Notes
        -----
        The defaults produce a box with the natural height of the contents.
        r   rm  r  z1Internal mathtext error: Char node found in VlistrB  r   Nr   rC  r  rD  )r   rq  ry   r:   r;   rT   rE  r9   rF  rl   rG  rH  rI  rJ  rK  r  r<  r  RuntimeErrorr"  r#  r/  r2  )rP   r[   r1  r-  rZ   r\   r   rL  rM  r?  rB  rH  s               r4   rS  zVlist.vpack$  s   0 qtax 	IA!S!Q\!GGxx(>26AAqww{+AAt$QKK	Y__$i556):K:KK6Y334	8H8HH4At$Q[ At$"GI I%	I* 
q5QJADJDJFAE6DNDO DOr6NN1a	:NN1b,
;rE   rO  )r%  r5  r[   r8   r1  rN  )r[   r8   r1  rN  r-  r8   rz   r   )	r?   r@   rA   rB   rQ   rT   infrS  r   r   s   @r4   rQ  rQ    sI    #>A9E6
  #6BG<3G<G<$(G<rE   rQ  c                  @     e Zd ZdZd fdZ	 	 	 	 	 	 	 	 	 	 ddZ xZS )Rulea  
    A solid black rectangle.

    It has *width*, *depth*, and *height* fields just as in an `Hlist`.
    However, if any of these dimensions is inf, the actual value will be
    determined by running the rule up to the boundary of the innermost
    enclosing box.  This is called a "running dimension".  The width is never
    running in an `Hlist`; the height and depth are never running in a `Vlist`.
    c                J    t         |   |||       |j                  | _        y rN   )r   rQ   r  )rP   r9   r:   r;   r  r   s        r4   rQ   zRule.__init__y  s    .}}rE   c                N    | j                   j                  |||||z   ||z          y rN   )r  r   )rP   r   r   rw   rZ   r[   s         r4   r  zRule.render}  s$    ''1a!eQUCrE   )r9   r8   r:   r8   r;   r8   r  r  )r   rL   r   r8   rw   r8   rZ   r8   r[   r8   rz   r   )r?   r@   rA   rB   rQ   r  r   r   s   @r4   rX  rX  n  s@    %DD!D&+D05D:>DrE   rX  c                  &     e Zd ZdZdd fdZ xZS )Hrulez.Convenience class to create a horizontal rule.c                x    ||j                         }|dz  x}}t        | 	  t        j                  |||       y )Nr  get_current_underline_thicknessr   rQ   rT   rV  )rP   r  	thicknessr:   r;   r   s        r4   rQ   zHrule.__init__  s<    ==?I"S(6rE   rN   )r  r  r`  float | Noner  r   s   @r4   r\  r\    s    8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.c                    |j                         }t        | 	  |t        j                  t        j                  |       y rN   r^  )rP   r  r`  r   s      r4   rQ   zVrule.__init__  s,    99;	BFFBFFE:rE   )r  r  r  r   s   @r4   rc  rc    s    6; ;rE   rc  c                  @    e Zd ZU ded<   ded<   ded<   ded<   ded<   y)		_GlueSpecr8   r9   rJ  rs   rI  r  rK  Nr   rD   rE   r4   rf  rf    s    LNMrE   rf  r         ?rg   g      )filfillfilllneg_filneg_fill	neg_filllemptyssc                  4     e Zd ZdZ	 	 d fdZd fdZ xZS )rG  a  
    Most of the information in this object is stored in the underlying
    ``_GlueSpec`` class, which is shared between multiple glue objects.
    (This is a memory optimization which probably doesn't matter anymore, but
    it's easier to stick to what TeX does.)
    c                    t         |           t        |t              rt        j
                  |   }|| _        y t        |t              r
|}|| _        y t        d      )Nz.glue_type must be a glue spec name or instance)r   rQ   rq  r   rf  _namedr1   rH  )rP   	glue_typerH  r   s      r4   rQ   zGlue.__init__  s[     	i%!((3I
 #	 	9-!I # MNNrE   c                    t         |           | j                  t        k  r5| j                  }|j                  |j                  t        z        | _        y y )Nr9   )r   r  rw  r  rH  _replacer9   r  )rP   rQ  r   s     r4   r  zGlue.shrink  sB    99&AZZagg.EZFDN 'rE   )rs  z`_GlueSpec | T.Literal['fil', 'fill', 'filll', 'neg_fil', 'neg_fill', 'neg_filll', 'empty', 'ss']r  )r?   r@   rA   rB   rQ   r  r   r   s   @r4   rG  rG    s$    #A#G GrE   rG  c                  $     e Zd ZdZd fdZ xZS )	HCenteredzl
    A convenience class to create an `Hlist` whose contents are
    centered within its enclosing box.
    c                V    t         |   t        d      g|t        d      d       y )Nro  Fr:  r   rQ   rG  r$  s     r4   rQ   zHCentered.__init__  s*    $t*<x<d<eLrE   r%  z
list[Node]r  r   s   @r4   rx  rx    s    
M MrE   rx  c                  $     e Zd ZdZd fdZ xZS )	VCenteredzk
    A convenience class to create a `Vlist` whose contents are
    centered within its enclosing box.
    c                R    t         |   t        d      g|t        d             y )Nro  r{  r$  s     r4   rQ   zVCentered.__init__  s%    $t*<x<d<=rE   r|  r  r   s   @r4   r~  r~    s    
> >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 )	r<  a  
    A `Kern` node has a width field to specify a (normally
    negative) amount of spacing. This spacing correction appears in
    horizontal lists between letters like A and V when the font
    designer said that it looks better to move them closer together or
    further apart. A kern node can also appear in a vertical list,
    when its *width* denotes additional spacing in the vertical
    direction.
    r   c                0    t         |           || _        y rN   )r   rQ   r9   r  s     r4   rQ   zKern.__init__  s    
rE   c                     d| j                   z  S )Nzk%.02fru  r  s    r4   r  zKern.__repr__  s    $**$$rE   c                |    t         |           | j                  t        k  r| xj                  t
        z  c_        y y rN   )r   r  rw  r  r9   r  r  s    r4   r  zKern.shrink  s,    99&JJ-'J 'rE   r  r  r  )
r?   r@   rA   rB   r:   r;   rQ   r  r  r   r   s   @r4   r<  r<    s(     FE%( (rE   r<  c                  .     e Zd ZdZ	 d	 	 	 d fdZ xZS )AutoHeightChara  
    A character as close to the given height and depth as possible.

    When using a font with multiple height versions of some characters (such as
    the BaKoMa fonts), the correct glyph will be selected, otherwise this will
    always just return a scaled version of the glyph.
    c                |   |j                   j                  |j                  |      }|j                   j                  |j                  |j                  |j
                        }|j                         }||z   }	|D ]<  \  }
}|
|_        t        ||      }|j                  |j                  z   |	d|z  z
  k\  s< n d}|j                  dk7  st        |      dk(  rN||	j                  |j                  z   z  }|xj                  |z  c_        t        |      }||j                  z
  }t        | 1  g       || _        y )Nr  r   r   r   )r  r   rV   r   rW   r   copyr  r:   r;   r	  r   rQ   r  )rP   rM  r:   r;   r  alwaysfactorr  r   target_totalr   r   r  shiftr   s                 r4   rQ   zAutoHeightChar.__init__  s!   }}FFJJ --++JJ		3 

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

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

) 	MHc!EJc5)DzzU"		 #& #u%$ ZZ
rE   )
rM  r   r9   r8   r  r  r  r{   r  z
type[Char])r?   r@   rA   rB   r  rQ   r   r   s   @r4   r  r    s$     QV*. '   rE   r  c           	        	
 |\  }}dd||| j                   z   	t        |       
ddd	
fdd	
fdt        | t              sJ  |        
S )a  
    Ship out *box* at offset *xy*, converting it to an `Output`.

    Since boxes can be inside of boxes inside of boxes, the main work of `ship`
    is done by two mutually recursive routines, `hlist_out` and `vlist_out`,
    which traverse the `Hlist` nodes and `Vlist` nodes inside of horizontal
    and vertical boxes.  The global variables used in TeX to store state as it
    processes have become local variables here.
    r   c                "    | dk  rdS | dkD  rdS | S )Ng    eg    eArD   )values    r4   clampzship.<locals>.clampI  s    t|tHH5HrE   c                   d}d}| j                   }| j                  }}}| j                  D ]S  }t        |t              r)|j                  z   z          |j                  z  =t        |t              r|j                  z  ]t        |t              rt        |j                        dk(  r|j                  z  }||j                  z   t        |t              r	 |       n t        |t              r	 |       nJ d       ||j                  z   |t        |t              r|j                  }	|j                  }
|j                  }t!        j"                  |	      r| j                  }	t!        j"                  |
      r| j                  }
|	dkD  r'|dkD  r"||
z   |j                  z   z   ||	       ||z  t        |t$              s|j&                  }|j                  |z
  }|dk7  r~|dk(  r=|j(                  |k(  rj||j*                  z  }t-         | j.                  |z              }n<|j0                  |k(  r-||j2                  z  }t-         | j.                  |z              }||z  }|z  V y )Nr   r   unreachable coder   )r#  r"  r   rq  r  r  r9   r<  r  r	  r  r7  rQ  ry   r:   r;   rT   rE  rG  rH  rI  rJ  roundr!  rK  r  )rO   cur_gcur_gluer#  r"  	base_line	left_edger?  edgerule_height
rule_depth
rule_widthrH  r  cur_hcur_v	hlist_outoff_hoff_vr   	vlist_outs                r4   r  zship.<locals>.hlist_outL  sG    ^^
MM			 3	$A!T"> At$ At$qzz?a'QWW$E D%6E!!U+!!#Au-!!8&88u 177NE%EAs#hhWW
WW
88K("%**K88J'!$J?zA~%
2EHHV"U]EEM'6 &E#At$KK	&__u4
> A~$22j@$	(9(99H$)%x0G*H$IE"//:= I$4$44 %eCLL8,C&D Ee#
#g3	$rE   c                
   d}d}| j                   }| j                  }}| j                  z  }| j                  D ]C  }t	        |t
              r|j                  z  $t	        |t              rt        |j                        dk(  r|j                  |j                  z   z  i|j                  z  ||j                  z   }| j                  |_        t	        |t              r	 |       n t	        |t              r	 |       nJ d       ||j                  z   |t	        |t              rz|j                  }	|j                  }
|j                  }t        j                  |      r| j                  }|	|
z  }	|	dkD  sF|
dkD  sM|	z  |j!                  z   z   ||	       ot	        |t"              r|j$                  }|j                  |z
  }	|dk7  r~|dk(  r=|j&                  |k(  rj||j(                  z  }t+         | j,                  |z              }n<|j.                  |k(  r-||j0                  z  }t+         | j,                  |z              }|	|z  }	|	z  )t	        |t2              s;t5        d       y )Nr   r   r  r   z1Internal mathtext error: Char node found in vlist)r#  r"  r:   r   rq  r<  r9   r  r	  r;   r  r7  rQ  ry   rT   rE  r  rG  rH  rI  rJ  r  r!  rK  r  r  rU  )rO   r  r  r#  r"  r  top_edger?  save_vr  r  r  rH  r  r  r  r  r  r  r   r  s                r4   r  zship.<locals>.vlist_out  sL    ^^
MM		 .	IA!T" At$qzz?a'QXX//EQXX%E%6E"F!iiAG!!U+!!#Au-!!8&88u"QWW,E%EAs#hhWW
WW
88J'!$Jz)?zA~[(EHHV"U]EEM'6 At$KK	'oo5> A~$22j@$	(9(99H$)%x0G*H$IE"//:= I$4$44 %eCLL8,C&D Eu$$At$"GI I[.	IrE   )r  r8   rz   r8   )rO   r7  rz   r   )rO   rQ  rz   r   )r:   rL   rq  r7  )rO   xyrH   rI   r  r  r  r  r  r  r   r  s       @@@@@@@@r4   ro   ro   8  so     FBEEEOEC[FI=$ =$~9I 9Iv c5!!!cNMrE   c                B     d fd}t               j                  |      S )z$Helper class to raise parser errors.c                    t        | |      rN   r   )rB  loctoksmsgs      r4   raise_errorzError.<locals>.raise_error  s    !!S#..rE   rB  r   r  rs   r  r   rz   T.Any)r   setParseAction)r  r  s   ` r4   Errorr    s    / 7!!+..rE   c                  d    e Zd ZdZ	 	 ddZd	dZed
d       Zej                  dd       ZddZ	y)r  a   
    Parser state.

    States are pushed and popped from a stack as necessary, and the "current"
    state is always at the top of the stack.

    Upon entering and leaving a group { } or math/non-math, the stack is pushed
    and popped accordingly.
    c                J    || _         || _        || _        || _        || _        y rN   )r  _fontr   rW   r   )rP   r  rV   r   rW   r   s         r4   rQ   zParserState.__init__  s%    
$ rE   c                ,    t        j                   |       S rN   )r  r  s    r4   r  zParserState.copy  s    yyrE   c                    | j                   S rN   )r  r  s    r4   rV   zParserState.font  s    zzrE   c                (    |dv r|| _         || _        y )N)r   r   r   r  )r   r  )rP   rx  s     r4   rV   zParserState.font  s    --"DO
rE   c                x    | j                   j                  | j                  | j                  | j                        S )z.Return the underline thickness for this state.)r  r   rV   rW   r   r  s    r4   r_  z+ParserState.get_current_underline_thickness  s,    ||33IIt}}dhh0 	0rE   N)
r  r   rV   r   r   r   rW   r8   r   r8   rz   r  r  )rx  r   rz   r   )rz   r8   )
r?   r@   rA   rB   rQ   r  propertyrV   setterr_  rD   rE   r4   r  r    sJ       
[[ 
0rE   c                    dfd| j                  dd      d   }| |k(  r!|dj                  d  |      D              z   n| }||t        d|       z  z
  S )	a  
    Helper to define TeX commands.

    ``cmd("\cmd", args)`` is equivalent to
    ``"\cmd" - (args | Error("Expected \cmd{arg}{...}"))`` where the names in
    the error message are taken from element names in *args*.  If *expr*
    already includes arguments (e.g. "\cmd{arg}{...}"), then they are stripped
    when constructing the parse element, but kept (and *expr* is used as is) in
    the error message.
    c              3     K   t        | t              r"| j                  D ]  } |      E d {     y | j                  r| j                   y y 7 #wrN   )rq  r   exprsresultsName)eltexprnamess     r4   r  zcmd.<locals>.names	  sL     c?+		 ' ;&&'__//!  's   +AA$Ar  r   r    c              3  &   K   | ]	  }d |z    yw)z{%s}NrD   )r,  rx  s     r4   r.  zcmd.<locals>.<genexpr>  s     BdFTMBs   z	Expected )r  r   rz   zT.Generator[str, None, None])r[  r(  r  )r  argscsnamer3   r  s       @r4   cmdr    sg    " ZZQ"Ffn BGGBeDkBBB"& TEIcU"34455rE   c                     e Zd ZdZ G d dej
                        Z edj                               Z	 edj                               Z
 edj                               Ze	e
z  ez  Z edj                               Z edj                               Z ed	j                               Z ed
j                               Z edj                               Z edj                               Z edj                               Z edj                               Z edj                               Zeez  ez  Z e e ed       ed      dz         D  cg c]?  }t3        j4                  t7        |            j                         d   j9                         A c}}}}       Z eej>                        Z dfdZ!dgdZ"dhdZ#dfdZ$dfdZ%didZ&djdZ'dkdZ(dkdZ) e*e+jX                        Z-dkdZ.dldZ/dddd d d!d"d"d#dd$d%d&Z0dkd'Z1dkd(Z2	 	 	 	 dmd)Z3dnd*Z4i d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAd:dBd2dCd4dDd6dEd8dFd,dGdHdIdJZ5 edKj                               Z6dkdLZ7dndMZ8dndNZ9dkdOZ:dkdPZ;dkdQZ<e<Z=dodRZ>dndSZ?dkdTZ@dpdUZAdpdVZBdpdWZCdnfdXZD	 	 	 	 	 	 dqdYZEdkdZZFdkd[ZGdkd\ZHdkd]ZIdkd^ZJdnd_ZKeKxZLZMdkd`ZNdkdaZO	 	 	 	 	 	 drdbZPdkdcZQdkddZRdkdeZSxZTS c c}}}} w )sParserz
    A pyparsing-based parser for strings containing math expressions.

    Raw text may also appear outside of pairs of ``$``.

    The grammar is based directly on that in TeX, though it cuts a few corners.
    c                      e Zd ZdZdZdZdZy)Parser._MathStyler   r   rg   r&   N)r?   r@   rA   DISPLAYSTYLE	TEXTSTYLESCRIPTSTYLESCRIPTSCRIPTSTYLErD   rE   r4   
_MathStyler    s    	rE   r  u  + * - −
      \pm             \sqcap                   \rhd
      \mp             \sqcup                   \unlhd
      \times          \vee                     \unrhd
      \div            \wedge                   \oplus
      \ast            \setminus                \ominus
      \star           \wr                      \otimes
      \circ           \diamond                 \oslash
      \bullet         \bigtriangleup           \odot
      \cdot           \bigtriangledown         \bigcirc
      \cap            \triangleleft            \dagger
      \cup            \triangleright           \ddagger
      \uplus          \lhd                     \amalg
      \dotplus        \dotminus                \Cap
      \Cup            \barwedge                \boxdot
      \boxminus       \boxplus                 \boxtimes
      \curlyvee       \curlywedge              \divideontimes
      \doublebarwedge \leftthreetimes          \rightthreetimes
      \slash          \veebar                  \barvee
      \cupdot         \intercal                \amalg
      \circledcirc    \circleddash             \circledast
      \boxbar         \obar                    \merge
      \minuscolon     \dotsminusdots
      aF  
      = < > :
      \leq          \geq          \equiv       \models
      \prec         \succ         \sim         \perp
      \preceq       \succeq       \simeq       \mid
      \ll           \gg           \asymp       \parallel
      \subset       \supset       \approx      \bowtie
      \subseteq     \supseteq     \cong        \Join
      \sqsubset     \sqsupset     \neq         \smile
      \sqsubseteq   \sqsupseteq   \doteq       \frown
      \in           \ni           \propto      \vdash
      \dashv        \dots         \doteqdot    \leqq
      \geqq         \lneqq        \gneqq       \lessgtr
      \leqslant     \geqslant     \eqgtr       \eqless
      \eqslantless  \eqslantgtr   \lesseqgtr   \backsim
      \backsimeq    \lesssim      \gtrsim      \precsim
      \precnsim     \gnsim        \lnsim       \succsim
      \succnsim     \nsim         \lesseqqgtr  \gtreqqless
      \gtreqless    \subseteqq    \supseteqq   \subsetneqq
      \supsetneqq   \lessapprox   \approxeq    \gtrapprox
      \precapprox   \succapprox   \precnapprox \succnapprox
      \npreccurlyeq \nsucccurlyeq \nsqsubseteq \nsqsupseteq
      \sqsubsetneq  \sqsupsetneq  \nlesssim    \ngtrsim
      \nlessgtr     \ngtrless     \lnapprox    \gnapprox
      \napprox      \approxeq     \approxident \lll
      \ggg          \nparallel    \Vdash       \Vvdash
      \nVdash       \nvdash       \vDash       \nvDash
      \nVDash       \oequal       \simneqq     \triangle
      \triangleq         \triangleeq         \triangleleft
      \triangleright     \ntriangleleft      \ntriangleright
      \trianglelefteq    \ntrianglelefteq    \trianglerighteq
      \ntrianglerighteq  \blacktriangleleft  \blacktriangleright
      \equalparallel     \measuredrightangle \varlrtriangle
      \Doteq        \Bumpeq       \Subset      \Supset
      \backepsilon  \because      \therefore   \bot
      \top          \bumpeq       \circeq      \coloneq
      \curlyeqprec  \curlyeqsucc  \eqcirc      \eqcolon
      \eqsim        \fallingdotseq \gtrdot     \gtrless
      \ltimes       \rtimes       \lessdot     \ne
      \ncong        \nequiv       \ngeq        \ngtr
      \nleq         \nless        \nmid        \notin
      \nprec        \nsubset      \nsubseteq   \nsucc
      \nsupset      \nsupseteq    \pitchfork   \preccurlyeq
      \risingdotseq \subsetneq    \succcurlyeq \supsetneq
      \varpropto    \vartriangleleft \scurel
      \vartriangleright \rightangle \equal     \backcong
      \eqdef        \wedgeq       \questeq     \between
      \veeeq        \disin        \varisins    \isins
      \isindot      \varisinobar  \isinobar    \isinvb
      \isinE        \nisd         \varnis      \nis
      \varniobar    \niobar       \bagmember   \ratio
      \Equiv        \stareq       \measeq      \arceq
      \rightassert  \rightModels  \smallin     \smallowns
      \notsmallowns \nsimeqa  
     \leftarrow \longleftarrow \uparrow \Leftarrow \Longleftarrow
     \Uparrow \rightarrow \longrightarrow \downarrow \Rightarrow
     \Longrightarrow \Downarrow \leftrightarrow \updownarrow
     \longleftrightarrow \updownarrow \Leftrightarrow
     \Longleftrightarrow \Updownarrow \mapsto \longmapsto \nearrow
     \hookleftarrow \hookrightarrow \searrow \leftharpoonup
     \rightharpoonup \swarrow \leftharpoondown \rightharpoondown
     \nwarrow \rightleftharpoons \leadsto \dashrightarrow
     \dashleftarrow \leftleftarrows \leftrightarrows \Lleftarrow
     \Rrightarrow \twoheadleftarrow \leftarrowtail \looparrowleft
     \leftrightharpoons \curvearrowleft \circlearrowleft \Lsh
     \upuparrows \upharpoonleft \downharpoonleft \multimap
     \leftrightsquigarrow \rightrightarrows \rightleftarrows
     \rightrightarrows \rightleftarrows \twoheadrightarrow
     \rightarrowtail \looparrowright \rightleftharpoons
     \curvearrowright \circlearrowright \Rsh \downdownarrows
     \upharpoonright \downharpoonright \rightsquigarrow \nleftarrow
     \nrightarrow \nLeftarrow \nRightarrow \nleftrightarrow
     \nLeftrightarrow \to \Swarrow \Searrow \Nwarrow \Nearrow
     \leftsquigarrow \overleftarrow \overleftrightarrow \cwopencirclearrow
     \downzigzagarrow \cupleftarrow \rightzigzagarrow \twoheaddownarrow
     \updownarrowbar \twoheaduparrow \rightarrowbar \updownarrows
     \barleftarrow \mapsfrom \mapsdown \mapsup \Ldsh \Rdsh
     z, ; . ! \ldotp \cdotpz}
       \sum \prod \coprod \bigcap \bigcup \bigsqcup \bigvee
       \bigwedge \bigodot \bigotimes \bigoplus \biguplus
       zlim liminf limsup sup max minz.\int \oint \iint \oiint \iiint \oiiint \iiiintz3rm cal it tt sf bf bfit default bb frak scr regularz
      arccos csc ker min arcsin deg lg Pr arctan det lim sec arg dim
      liminf sin cos exp limsup sinh cosh gcd ln sup cot hom log tan
      coth inf max tanhzn
      | \| / \backslash \uparrow \downarrow \updownarrow \Uparrow
      \Downarrow \Updownarrow . \vert \Vertz[
      ( [ \{ < \lfloor \langle \lceil \lbrace \leftbrace \lbrack \leftparen \lgroup
      z]
      ) ] \} > \rfloor \rangle \rceil \rbrace \rightbrace \rbrack \rightparen \rgroup
      u   αu   ωr   r  c                    t        j                         dC fd}dDd}t        d      _         t	         j
                        d      _         t	         j                  D cg c]  }t        |j                         c}      d      _
         t        ddj                  d	j                  t        t        j                  t                           z         d
      j#                         _         t        d      d      _         |d j(                        _        t-        d t	         j(                        d      z         dz   _        t1        d      _        t	         j4                        _        t9               _        t9               _        t9               _        t9               _         t9               _!         |        xj@                  d tE        jB                        d      z   dz   z  c_         xj>                  d tG        jB                        d      z   dz   z  c_        tI        ddj                  d      z   dz         _%         |dg  jL                   jN                        j=                  d
      z
  _(         |d jR                        _*        j.                   tE        jB                        d      z   j2                  z   _+        j.                   tE        jB                        d      z   tY               z   _-        tI        dj?                  d      j?                  d      z         _.        tI        dj?                  d      j?                  d      z         _/        tI        dj?                  d      j?                  d      z         _0        tI        dd t-        j6                        d      z   dz   dz    t-        j6                        d      z   dz   dz   j                  d      z   dz   dz    t-        j                        d      z   dz   j?                  d      z   j?                  d      z         _1        tI        dt-        d tG        te        d      jB                  z         d       z   dz         j?                  d!      z         _3        tI        d"j?                  d#            _4        tI        d$jA                  d%      jA                  d#      z         _5        tI        d&jA                  d%      jA                  d#      z         _6        tI        d'to        dd(d)            _8        tI        d* ts        ddtu        tG        jB                              tE        t1        d+      jw                               z   ,      d-            _<         t-        j<                        d.       tG        t	        d/d0g      j<                  z
        d1      z    t        d2      d3      z    t        d4      d3      z  j=                  d.       t        d2      d3      z   z  _=        j                  jJ                  z  j*                  z  jz                  z  _>        xjB                  j|                  j:                  z  jZ                  z  j&                  z  z  c_!        tI        d5d tE        j|                        d      z   dz         _?        tI        d6d tE        j|                        d!      z   dz         _@        xj<                  jP                  j$                  z  jT                  z  j~                  z  jV                  z  j\                  z  j^                  z  j`                  z  jb                  z  jj                  z  jl                  z  jf                  z  jh                  z  jp                  z  j                  z  jx                  z  z  c_        d7j7                  d8      t        d9      z  z
  }xj:                  d:j7                  d;      t        d9      z  z
   tE        j|                  j:                  z  |z        d<      z   d=z   j7                  d>      t        d9      z  z
  z  c_        tG        jB                        _B        to        d?d(d@A      _C        t        dB      j#                         _D        j                  tE        j                  j                  z         z   tY               z   _E         |        j                   _F        j                   _G        d@ _H        y c c}w )ENc                     t              j                         D ]T  \  } }| j                  d      r| dvr|j                  |        t	        |       s:|j                  t        |              V y )N_)token	placeable
auto_delim)varsr  r  setNamehasattrr  rF  )r  r   r?  rP   s     r4   set_names_and_parse_actionsz4Parser.__init__.<locals>.set_names_and_parse_actions  sb     GMMO 	?S~~c* "FFC(tS)**74+=>	?rE   groupc                d   g }g }|D ]8  }|d   j                         r|j                  |       (|j                  |       : t        dj                  | dj	                  t        t        j                  |            |rdnddj	                  t        t        j                  |                        S )Nr  z<\\(?P<{group}>(?:{alpha})(?![A-Za-z]){additional}{nonalpha})|r  )r  alpharB  nonalpha)isalphar   r   r'  r(  rS   reescape)r  r  ends_with_alphaends_with_nonalpharx  s        r4   csnamesz Parser.__init__.<locals>.csnames  s     O!# 48##%#**40&--d3	4
 OVV((3ryy/#BC&8sb XXc"))5G&HI	 W  rE   z[-+]?([0-9]+\.?[0-9]*|\.[0-9]+)spacestyle_literalzI[a-zA-Z0-9 +\-*/<>=:,.;!\?&'@()\[\]|\U00000080-\U0001ffff]|\\[%${}\[\]_|]z|\\(?:{})(?![A-Za-z])r  r   z\\[A-Za-z]+rx  rV   z\mathr  r  z\hspaceaccentz\fracrX   denz\dfracz\binomz\genfracldelimrdelimrulesizestylez\sqrt{value}r  r   rootr  z	\overlinebodyz\overset
annotationz	\undersetz\textr,   )endQuoteCharz	\substackz\\)openerclosercontentpartsnucleusr  rK  subsuperz'*apostrophesz'+z\operatornamez\boldsymbol\middlemdelimzExpected a delimiterz\leftleftr  z\rightrightr'  F)unquoteResultsz(?:(?:\\[$])|[^$])*r  )r  r   r  zIterable[str]rz   r   )ItypesSimpleNamespacer   float_literalr	   _space_widthsr  r  r   r  r  r'  r(  rS   r  r  r   leaveWhitespacer2   unknown_symbol
_fontnamesrV   r   start_groupr   	end_group_delimsdelimr   r  r  required_groupoptional_groupr  r   r
   r  customspace_accent_map_wide_accentsr  _function_namesfunctionr  r   unclosed_groupfracdfracbinomgenfracr   sqrtoverlineoversetundersetr   textr(   r   suppresssubstackr  simpleoperatorname
boldsymbolr  mathmath_stringnon_mathmain_expression_math_expression_in_subscript_or_superscript)rP   r  r  rO  r  r?  s   `    @r4   rQ   zParser.__init__  sl   !!#
	?	" !!CD45!3!34W=55#'??3aS\355DF
5&--RYY0133

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

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

        Returns the parse tree of `Node` instances.
        r   r   
r   NF)r  _state_stack_em_width_cacher%  parseStringr   r1   r   explainr'  r   
resetCacher   r   r7  )rP   rB  fonts_objectrW   r   resultr3   s          r4   r$   zParser.parseg  s     ixEGFH	N%%11!4F ,1)!  "vveVAY'' " 	NTN$:$:3$BBCM	Ns   A? ?	B0#B++B0c                     | j                   d   S )z&Get the current `State` of the parser.r  )r*  r  s    r4   	get_statezParser.get_state}  s      $$rE   c                8    | j                   j                          y)zPop a `State` off of the stack.N)r*  popr  s    r4   	pop_statezParser.pop_state  s    rE   c                r    | j                   j                  | j                         j                                y)z=Push a new `State` onto the stack, copying the current state.N)r*  r   r2  r  r  s    r4   
push_statezParser.push_state  s&      !1!6!6!89rE   c                6    t        |j                               gS rN   )r7  asListrP   r  s     r4   r$  zParser.main  s    dkkm$%%rE   c                H    | j                   j                  |d   dd d      S )Nr   r   r  T)parseAll)r&  r,  r:  s     r4   r"  zParser.math_string  s(    $$00a20NNrE   c                Z    t        |j                               }| j                          |gS rN   )r7  r9  r5  )rP   r  hlists      r4   r!  zParser.math  s#    dkkm$wrE   c                   |d   j                  dd      }|D cg c]  }t        || j                                }}t        |      }| j	                          t
        j                  d   | j                         _        |gS c c}w )Nr   z\$r'  r   )replacer  r2  r7  r7  r   r   rV   )rP   r  rB  rM  symbolsr>  s         r4   r#  zParser.non_math  so    GOOE3'67844>>+,88g #-? @w 9s   !Bc           	         | j                          | j                         }d|_        t        |d   D cg c]  }t	        ||       c}      }| j                          |gS c c}w )Nr   r   )r7  r2  rV   r7  r  r5  )rP   r  r  rM  r>  s        r4   r  zParser.text  sT     
tAw7!tAu~78w 8s   A!c                |   | j                         }|j                  |j                  |j                  f}| j                  j                  |      }|_|j                  j                  dt        j                  d   d|j                  |j                        }|j                  }|| j                  |<   t        ||z        S )Nr   r   r1  )r2  rV   rW   r   r+  r   r  r   r   r   r~   r<  )rP   
percentager  r  r9   ri   s         r4   _make_spacezParser._make_space  s      zz5>>5995$$((-=mm//cll#56		+G OOE(-D  %EJ&''rE   gKqU?g0Bxq?g%?g1ZGU?r  rg   gKqUſ)\,z
\thinspacez\/z\>z\:z\;z\ rN  z\enspacez\quadz\qquadz\!c                N    | j                   |d      }| j                  |      }|gS Nr  )r  rE  )rP   r  rX   rO   s       r4   r  zParser.space  s-      g/s#urE   c                ,    | j                  |d         gS rH  )rE  r:  s     r4   r  zParser.customspace  s      g/00rE   c                "   |d   }|dk(  rd}	 t        || j                               }|| j                  v rt        d |d | d d d   D        d      }| j                  s@|| j                  v r5t        |d | j                               dk(  s|d	k(  s|| j                  v r|gS t        | j                  d
      || j                  d
      gd      gS || j                  v rt        d |d | d d d   D        d      }t        d ||dz   d  D        d      }|dk(  r|d	k(  r|dk(  r|gS |dk(  r#|j                         r|j                         r|gS t        || j                  d
      gd      gS |gS # t        $ r}t        ||d|z        |d }~ww xY w)Nr   rF  u   −zUnknown symbol: %sc              3  ,   K   | ]  }|d k7  s	|  ywr  NrD   r,  rM  s     r4   r.  z Parser.symbol.<locals>.<genexpr>       CA!s(aC   
r  r  r   r  r  Trz  c              3  ,   K   | ]  }|d k7  s	|  ywrL  rD   rM  s     r4   r.  z Parser.symbol.<locals>.<genexpr>  rN  rO  c              3  ,   K   | ]  }|d k7  s	|  ywrL  rD   rM  s     r4   r.  z Parser.symbol.<locals>.<genexpr>  s     AASaArO  r   rJ  r  rH  )r  r2  r1   r   _spaced_symbolsr  r'  _binary_operatorsr	  r[  _left_delimsr7  rE  _punctuation_symbolsisdigit)	rP   rB  r  r  rM  r  r3   	prev_char	next_chars	            r4   r2   zParser.symbol  s   K8 !A	I4>>+,D
 $$$ C4C2CRHI 11///$3(A-c1A!2!22vt//4##//46 '+, - - $+++C4C2CRHIA378A2FI Cx#	S(8 6M CxI--/I4E4E4GvtT%5%5c%:;TJKKvE  	I%a&:Q&>@EHI	Is   E/ /	F8F		Fc                (    t        ||d|d          )NzUnknown symbol: rx  r  rP   rB  r  r  s       r4   r  zParser.unknown_symbol  s    !!S,<T&\N*KLLrE   hatz\circumflexaccentbrevez\combiningbrevebarz\combiningoverlinegravez\combininggraveaccentacutez\combiningacuteaccenttildez\combiningtildedotz\combiningdotaboveddotz\combiningdiaeresisdddotz\combiningthreedotsaboveddddotz\combiningfourdotsabovevecz\combiningrightarrowabover  `r3  rN  rH  rK  z\rightarrowz
\leftarrowz\circ)overrightarrowoverleftarrowmathringzwidehat widetilde widebarc                   | j                         }|j                         }|d   }|d   }|| j                  v r!t        d|z   |j                  |t
              }nt        | j                  |   |      }|dk(  r |j                          |j                          t        t        |j                  dz        |g      }|j                  |j                  d       t        |t        d|d	z        t        |g      g      S )
Nr  r   r,   )r  ri  g      @exactlyr          @)r2  r_  r  r  r9   r  r  r  rx  r  r9  rQ  r  r7  )rP   r  r  r`  r  r   
accent_boxcentereds           r4   r  zParser.accent	  s     99;	h5kT'''&vsyy%FDJ   0 0 8%@JZd399s?3Z@Asyy),RS)se  	rE   c                @    | j                  |||      }|d   |_        |S )Nrx  )r  function_name)rP   rB  r  r  r>  s        r4   r  zParser.function1	  s'    !!!S$/"6lrE   c                   | j                          | j                         }d|_        g }|d   }|D ]x  }t        |t              r)d|_        |j                          |j                  |       <t        |t              r|j                  t	        ||             h|j                  |       z |t        |      z   dz   }t        |t              r|t        d      z  }t        d ||d  D        d      }	| j                  ddhz  }
|	|
vr0|| j                  vr"|| j                  | j                  d	         gz  }| j                          |	d
v rd| _        t#        |      S d| _        t#        |      S )Nr   rx  r   zoperatorname{}c              3  ,   K   | ]  }|d k7  s	|  ywrL  rD   rM  s     r4   r.  z&Parser.operatorname.<locals>.<genexpr>I	  s     C!s(!CrO  r  rK  r  rF  >   r  rK  TF)r7  r2  rV   rq  r  r
  r   r   r	  r   r  r	  _overunder_functionsrE  r  r5  r'  r7  )rP   rB  r  r  r  
hlist_listrx  rM  next_char_locrX  
delimiterss              r4   r  zParser.operatorname6	  sc    
!#
F| 	%A!T"!!#!!!$As#!!$q%.1!!!$	% c$i!+dL)S!122MCQ}~%6CRH	\\S#J.
Z'D5554++D,>,>u,EFGGJ 
"04D- Z   16D-Z  rE   c                    | j                          |j                  d      r$|j                  d      | j                         _        g S NrV   )r7  r   r2  rV   r:  s     r4   r  zParser.start_groupY	  s5    88F$(HHV$4DNN!	rE   c                >    t        |j                  dg             }|gS Nr  r7  r   )rP   r  grps      r4   r  zParser.group`	  s    DHHWb)*urE   c                8    t        |j                  dg             S rz  r{  r:  s     r4   r  zParser.required_groupd	  s    TXXgr*++rE   c                &    | j                          g S rN   )r5  r  s    r4   r  zParser.end_groupi	  s    	rE   c                .    t        |t        |      d      )NzExpected '}')r   r	  rZ  s       r4   r  zParser.unclosed_groupm	  s    !!SV^<<rE   c                6    |d   | j                         _        g S rx  )r2  rV   r:  s     r4   rV   zParser.fontp	  s     $V	rE   c                    t        |t              r|j                  | j                  v S t        |t              r$t        |d      r|j                  | j                  v S y)Nrp  F)rq  r  rM  _overunder_symbolsr7  r  rp  rs  rP   r  s     r4   is_overunderzParser.is_overundert	  sN    gt$99 7 777'GG_,M((D,E,EEErE   c                T    t        |t              r|j                  | j                  v S yNF)rq  r  rM  _dropsub_symbolsr  s     r4   
is_dropsubzParser.is_dropsub{	  s$    gt$99 5 555rE   c                D    t        |t              r|j                         S yr  )rq  r  r  r  s     r4   r  zParser.is_slanted	  s    gt$%%''rE   c           	     (   |j                  dt        d            }|j                  dg       }t        |j                  dg             }|s|s|S d x}}|r,|^}	}
}|	dk(  r|t        d      |
}n|t        d      |
}|r,| j	                         }|j
                  j                  |j                  |j                  |j                        }|j
                  j                  |j                  |j                  |j                        }|rk|t        g       }t        |      D ]0  }|j                  j                  | j                  ||dd	i             2 |j!                          |j#                          | j%                  |      rKg }d
}|j&                  }|&|j)                          t+        ||j&                        }|&|j)                          t+        ||j&                        }|dz  }|;t-        |g      }|j#                  |d       |j                  |t/        d|      g       t-        |g      }|j#                  |d       |j1                  |       |Wt-        |g      }|j#                  |d       |j                  t/        d|      |g       |j2                  |z   |j4                  z   }t7        |      }||_        t        |g      }|gS |}t;        |t              rx|j                  }t        |      rSt;        |d   t<              rt?        |d   d      r|d d }|d   }t?        |d      r|j@                  jB                  |_        t        |d      }n7t;        |tD              r|j@                  jB                  |_        t        |g      }tG        |      }|j2                  }d}| jI                  |      r|j4                  }|jJ                  |z  }|jJ                  |z  }| jM                  |      r||jJ                  |z  z  }||jN                  ||dz  dz  z
  z  z  }| jI                  |      r?d|jJ                  z  |jP                  z
  |z  }d|jJ                  z  |jP                  z   |z  }nd}|zt        t=        |      tS        jT                  tV        |      g      }|j)                          | jI                  |      r||jX                  |z  z   }n|jZ                  |z  }||_        n't        t=        |      |g      }|j)                          | jI                  |      r||jX                  |z  z
  }n|j\                  |z  }|	| |_        nt        t=        |      |g      } | j)                          | jI                  |      r||jX                  |z  z   }n|j^                  |z  }d|z  ||j4                  z
  | j2                  |z
  z
  z
  }!|!d
kD  r||!z  }t7        |t=        ||j4                  z
  | j2                  |z
  z
        | g      }||_        | jI                  |      s"|xj&                  |j`                  |z  z  c_        ||g}"| jb                  r)|"| je                  | jf                  d         gz  }"d| _1        t        |"      }|gS )Nr  r   r  r  r  zDouble subscriptzDouble superscriptr   r  r         @rk  r  r  Frz  rl  r&   rF  )4r   r  r	  r   r2  r  r   rV   rW   r   r   r7  r  r   extendr2   r  r9  r  r9   r  rl   rx  r  r   r:   r;   rQ  r  rq  r<  r  r  r~   r  r  r  r  r  r  r  r   r   r  r  r  r  r  r  r'  rE  r  )$rP   rB  r  r  r  r  napostrophessubr   opargr  rule_thicknessr   r"  vlistr  r9   vgapr>  vltr0  	last_charr=  r  	lc_heightlc_baseline	superkernsubkernr   
shift_downshift_uprw   clrspaced_nucleusr   s$                                      r4   r  zParser.subsuper	  s   ((9d1g.88J+488M267Ne!)BhSy?-.@AA$-.BCC   >>JJ		3--++JJ		3 }b	<( O%%dkk!S5):L&MNO JJLKKM W%EEMME E5;;/

E399-!C'D !5'*E9-eT!T]34wi(EKKy)LL!3%(E9-d1dmU34t+gmm;,C$CC5\F8O 	gu%"++L< |B/6R 0*=#/#4L(,	9j1&/&8&8&@&@IOL%8G'4("+"4"4"<"<	WI&G +51	&&	??9%#//K OOg-	//G+??9%722I)11$w|b'88: ;Iy)y.$3347@A0&5569BC	  =
 tG}affT3&789AHHJy)(9+<+<w+FF
&^^g5
'ANtI./AHHJy)$y'8'87'BB$>>G3{"*4=#./
??9-!,y/@/@7/J!JJ!*'!9J^+!AGG+:0EFH8OH(QWW,J1FGH  ",y)GGy--77G "1,,t//0B0B50IJKKN05D-~&xrE   c           
        | j                         }|j                         }t        |j                        D ]"  }	|j	                          |j	                          $ t        |g      }
t        |g      }t        |j                  |j                        }|
j                  |d       |j                  |d       t        |
t        d|dz        t        ||      t        d|dz        |g      }|j                  j                  |j                  t        j                   d   d|j"                  |j$                        }|j&                  |j(                  |j*                  z   dz  |dz  z
  z
  }||_        t/        |t1        |dz        g      g}|s|r\|dk(  rd	}|dk(  rd	}| j3                  |t5        j6                  t8        t4        j:                  t<        t>        t@        f      |      |      S |S )
Nrk  r   rl  r   =rg   r  r  rH  )!r2  r_  r  r  r  rx  rl   r9   r9  rQ  r  r\  r  r   rV   r   r   rW   r   r:   rk   rn   r  r7  r  _auto_sized_delimiterr   r   r  Unionry   r  r   )rP   r  r  ruler  rX   r  r  r`  r  cnumcdenr9   r  ri   r  r0  s                    r4   _genfraczParser._genfrac+
  s    99;	u{{# 	AJJLJJL	 ##CIIsyy)

5)$

5)$tAy3/UD)Ay3/	  --++JJ%78, <<',,.!3c/"# #Y^ 4567V||--f./ffT!''#tS.:Q5R5;/=.46 6 rE   c                <    | j                  t        |d               S )Nr  )r  rs   r:  s     r4   r  zParser.style_literalU
  s    s4#89::rE   c           	         | j                  |j                  dd      |j                  dd      |d   |j                  d| j                  j                        |d   |d         S )Nr  r  r  r  r  rX   r  )r  r   r  r  r:  s     r4   r  zParser.genfracX
  sZ    }}HHXr"DHHXr$:dhhw0I0IJKe& 	&rE   c           	         | j                  dd| j                         j                         | j                  j                  |d   |d         S Nr  rX   r  )r  r2  r_  r  r  r:  s     r4   r  zParser.frac^
  sE    }}DNN$DDFOO%%tE{DKA 	ArE   c           	         | j                  dd| j                         j                         | j                  j                  |d   |d         S r  )r  r2  r_  r  r  r:  s     r4   r  zParser.dfracc
  sE    }}DNN$DDFOO(($u+tE{D 	DrE   c           	     b    | j                  ddd| j                  j                  |d   |d         S )Nr  r  r   rX   r  )r  r  r  r:  s     r4   r  zParser.binomh
  s5    }}aOO%%tE{DKA 	ArE   c                   |d   }|d   }| j                         j                         }|j                          t        |g      }t        |g      }t	        |j
                  |j
                        }	|j                  |	d       |j                  |	d       |dz  }
||dz      dk(  r;t        |t        d|
      |g      }|j                  |j                  z   |
z   |_        |S t        |t        d|
      |g      }|S )Nr  r  rk  r&   r   ur   )r2  r_  r  rx  rl   r9   r9  rQ  r  r;   r:   r  )rP   rB  r  r  r  r  r`  cannotationcbodyr9   r  r  s               r4   _gensetzParser._gensetm
  s   ,'
F|NN$DDF	-4&!K%%u{{3%+E9%1}S1W:54=& E
 "'{/A/A!AD!HE  ;4=  E rE   c                r   |j                  d      }|d   }| j                         }|j                         }|j                  |j                  z
  |dz  z   }|j
                  |j                  z   }t        d|||d      }|j                  |j                  z
  }|j
                  |j                  z   }t        t        d|z        |t        d|z        g      }	t        t        |      t        d      |	g      }
|
j                  ||j                  |j                  z  d	z  z   d
|       |st        |j                   dz  dd      }n+t        |      }|j#                          |j#                          t        t        |g      g      }| dz  |_        t        |t%        |j                    dz        ||
g      }|gS )Nr  r  g      @r>  T)r  rg   ri       @rk  r  r   r  )r   r2  r_  r:   r  r;   r  r7  r  rQ  r\  rG  rS  rW   r   ry   r9   r  r<  )rP   r  r  r  r  r`  r:   r;   checkpadded_body	rightside
root_vlistr>  s                r4   r  zParser.sqrt
  s   xxG} 99;	 t0009s?B

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

T... 5<fudV}EF	 	%..599"<!NN!5	* yk"wrE   c           	     h   | j                         }t        |      rt        |D cg c]  }t        |t              r|j
                  ! c}      }t        |D cg c]  }t        |t              r|j                  ! c}      }d }t        |      D ]l  \  }	}
t        |
t              s|
dk(  st        j                  t        ||	dz            }|dk7  rt        |||||      ||	dz   <   n|j                  |       ||	= n t        j                  t        t        j                  t        t        f      |      }nd}d}d}g }g }|dk7  r|j!                  t        |||||             |j#                  |       |dk7  r|j!                  t        |||||             t%        |      }|S c c}w c c}w )Nr  r   rH  )r  r   rg  )r2  r	  rl   rq  r   r:   r;   	enumerater   r   r  remover  r  ry   r  r   r  r7  )rP   frontmiddlebackr  r   r:   r;   r  idxelrM  middle_partr  r>  s                  r4   r  zParser._auto_sized_delimiter
  s     v;FMq*Q:L!((MNF&KQ
1c8JKLEF$V, $Rb#&2+;sF37O4ACx*8 !65%+HsQw a(s$ &&aggc4i&8!96BKFEFKC<LLufeU6JL[!3;LLtVUE&IKe? NKs   F*F*F/0F/c                b    | j                  |d   d|v r|d   j                         ng |d         S )Nr  r  r  )r  r9  r:  s     r4   r  zParser.auto_delim
  s;    ))L$)TMDK rM	 	rE   c                l   | j                          | j                         }g }|d   }|D ]  }t        |t              rH|j                  d   }t        |t
              rd|_        |j                          |j                  |       [t        |t
              rsd|_        |j                  | j                  v s|j                  dd  | j                  v rd|_        |j                          |j                          |j                  |       |j                  |        | j                          t        |      S )Nr  r   r   r  )r7  r2  rq  r7  r   r  rV   r
  r   rM  _latin_alphabets_small_greekr5  )rP   r  r  r>  rx  rM  r)  s          r4   r   zParser.boldsymbol
  s     G} 	 A!U#JJqMa&!AF%%'QAt$CC400033qr7d///#AF%%'!!#QQ!	 " 	U|rE   c                   |d   }| j                         }|j                         }|d   D cg c]  }t        |       }}t        t	        d |            }g }|D ]1  }	t        |	g      }
|
j                  |d       |j                  |
       3 t        |t        d|dz        gt        |      z        D cg c]  }|D ]  }|  }}}|d= t        |      }t        |g      g}|S c c}w c c}}w )Nr  r   c                    | j                   S rN   ru  r  s    r4   <lambda>z!Parser.substack.<locals>.<lambda>  s
    agg rE   rk  rg   r  )r2  r_  r7  rl   rS   rx  r9  r   zipr  r	  rQ  )rP   r  r  r  r`  r)  r>  	max_widthr  r  cppairr   stackr  r0  s                   r4   r  zParser.substack  s	   W 99;	#(8,aq,,-u56	 	CC5!BHHY	*LL	 !aQ)?(@3u:(MN" "  " " " "IEl, -"s   C(8C-r  )
rB  r   r/  r   rW   r8   r   r8   rz   r7  r  )r  r   rz   zlist[Hlist])r  r   rz   r   )r  r   rz   r  )rD  r8   rz   r<  )rB  r   r  rs   r  zParseResults | dict[str, str]rz   r  r  )rz   r  )r  r  rz   r{   )r  r   r  r   r  ra  r  r  rX   r7  r  r7  rz   r  )r  r   r  zlist[Box | Char | str]r  r   rz   r  )Ur?   r@   rA   rB   enumEnumr  rZ  r[  rS  _relation_symbols_arrow_symbolsrR  rU  r  rs  r  r  r  _ambi_delimsrT  _right_delimsr	  r  r-   r  rx  r  r   r  stringascii_lettersr  rQ   r$   r2  r5  r7  r$  r"  r!  r#  staticmethodr   convertToFloatr  r  rE  r  r  r  r2   r  r  r  r  r  r  r  r  r  r  r  r  rV   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r   )r,  r"  r  r  r   s   0000@r4   r  r    sU   TYY  
0 %'36  5j  %uwk5(n  	0 
1N4 (*;;nLO7==?@  57
 >DDFGLRRTU 33857<J   !57$O
  //4uw8L  

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

%'M ]*\9GS!?@ !?@1DFG G((Q0668<BBD G HL 6//0o2b(,% :&O
 !!1!@!@AM($ M
1.2.7<.`M/- 	0 	3	
 	3 	- 	0 	1 	6 	5 	7 	1 	3 	3 	-  	0!" 	/#$ *(#)K. 4::<=M,
!!F, $N=

dL(("'(,1(T;&A
D
A
< ! Gh&P&$&<$$'$,1$L4}Gs   AK&r  )r2   r   rz   rs   )r  r  rz   ztype[FontConstantsBase]))r   r   )rO   ry   r  ztuple[float, float]rz   rL   )r  r   rz   r   )r  r   r  r   rz   r   ){rB   
__future__r   abcr  r  r   loggingr   r  r   r  r  typingr   r   numpyrT   	pyparsingr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   
matplotlibr   r  r   _mathtext_datar   r   r   r   font_managerr   r   r    ft2fontr!   r"   r#   packaging.versionr$   parse_versionr%   pyparsing_versionmajorr'   r(   TYPE_CHECKINGcollections.abcr)   r*   enablePackrat	getLoggerr  r5   r7   r@   rG   rL   r}   r   ABCr   ABCMetar   r   r_  r  r  r  r   ro  r  r  r  r  r  r  r  r  r  r  r  ry   r  r  r  r  r  r7  rQ  rX  r\  rc  rf  rr  rG  rx  r~  r<  r  r  ro   r  r  r  r  rD   rE   r4   <module>r     s   # 
     	 	             D D < < 7 7 4 6"#))A-3%??(    w./,3* 3& / * ( / 85 85v* @z i!CGG i!XfIES[[ fIRgC- gCTA!= A!H&A,#++ &AR{ $k $p pfI B  !, !,H"3 ) - 	0 		/ 	
*/ , (	
 ) ) ( ) ) ) $ ' ( ( )  '!" '#& 3-) 0   .$ *,3 ,(3 (D+4 D+NIT I.)/3 )/Xc<D c<LO<D O<dD3 D(7D 7;D ;
  RQA.RQA.RQA.RQA.RQA.RQA.RQA.RQQ/		 G4 G8M M> >(4 (6%"U %"P E  :Pn/#0 #0L62M MrE   