
    ^j                       d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZddlZddlmZ ddlZddlmZ ddlmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* ddl+Z,ddl-m.Z. dd	l/m0Z0m1Z1m2Z2m3Z3 dd
l4m5Z5m6Z6m7Z7 ddl8m9Z9m:Z:m;Z; ejx                  rddl=m>Z> ddl8m?Z?m@Z@mAZA  e"j                           ej                  d      ZDdndZE G d de      ZFdeF_G         G d de      ZHdeH_G         G d d      ZI G d de      ZJ G d de      ZK G d dej                        ZM G d deMej                        ZO G d d eO      ZP G d! d"eO      ZQ G d# d$eQej                        ZR G d% d&eR      ZS G d' d(eR      ZT G d) d*eQ      ZU G d+ d,eU      ZVd-ZWd.ZX G d/ d0      ZY G d1 d2eY      ZZ G d3 d4eY      Z[ G d5 d6e[      Z\ G d7 d8eY      Z] G d9 d:eY      Z^ G d; d<      Z_ G d= d>e_      Z` G d? d@e`      Za G dA dBe`      Zb G dC dDe_      Zc G dE dFec      Zd G dG dHe`      Ze G dI dJee      Zf G dK dLee      Zg G dM dNe`      Zh G dO dPeh      Zi G dQ dReh      Zj G dS dTe      Zk ekdUdVddUd       ekdUdVdWdUd       ekdUdVdXdUd       ekdUdUddVd       ekdUdUddVdW       ekdUdUddVdX       ekdUdUddUd       ekdUdVddYd      dZek_l         G d[ d\e_      Zm G d] d^ef      Zn G d_ d`eg      Zo G da dbe_      Zp G dc ddef      Zq G de dfef      ZrdodpdgZsdqdhZt G di dj      ZudrdkZv G dl dm      Zwy)sz.
Implementation details for :mod:`.mathtext`.
    )annotationsN)
NamedTuple)NDArray)EmptyForwardLiteralGroupNotAny	OneOrMoreOptionalParseBaseExceptionParseExpressionParseFatalExceptionParserElementParseResultsQuotedStringRegex	StringEnd
ZeroOrMorepyparsing_commonnested_exprone_of   )cbook)latex_to_bakomastix_glyph_fixesstix_virtual_fontstex2uni)FontPropertiesfindfontget_font)FT2FontKerning	LoadFlags)Iterable)CharacterCodeTypeGlyphGlyphIndexTypezmatplotlib.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     M/opt/ringagent/.cad-venv/lib/python3.12/site-packages/matplotlib/_mathtext.pyget_unicode_indexr3   4   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depthzLlist[tuple[FT2Font, float, CharacterCodeType, GlyphIndexType, float, float]]glyphsz'list[tuple[float, float, float, float]]rectsN__name__
__module____qualname____doc____annotations__     r2   r5   r5   J   s$     LMLXX22rC   r5   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 : 2D array of uint8
        A raster image.
    r6   oxoyr7   r8   r9   zNDArray[np.uint8]imageNr<   rB   rC   r2   rE   rE   `   s(     	IILMLrC   rE   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;   )selfrM   s     r2   __init__zOutput.__init__   s    ;=>@
rC   c                   t        t        j                  | j                  j                  | j                  j
                  | j                  j                  g      \  }}}| j                  D cg c]F  \  }}}|j                  |j                  |j                  |j                  |||z
  |j                  z   fH }}}}| j                  D 	
cg c]  \  }}	}
}|||	|z   z
  |
|f }}
}	}}t        |||z   |||      S c c}}}w c c}}
}	}w rL   )mapnpceilrM   r7   r8   r9   r:   fontfontsizenumglyph_indexoffsetr;   r5   )rN   whdrF   rG   infogsbxbybwbhrss                r2   	to_vectorzOutput.to_vector   s    GGdhhnndhhootxx~~FH1a #'++/ /"b$ yy$--43C3C1r6DKK') / / %)JJ0 0 "b"b 1R="b) 0 0 1a!eQB///0s   .AC=D
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]  \  }}}}||z    c}}}}d      dz   }t        g | j                  D cg c]  \  }}}||j                  j                  z
  ! c}}}| j                  D cg c]  \  }}}}||z    c}}}}d      dz   }||	z
  }||
z
  | j                  j                  z
  }||
z
  | j                  j                  z
  }t        j                  t        j                  |t        |d      z         t        j                  |      ft        j                         }t#        | j                  |	 |
 f      }|j                  D ]Y  \  }}}|j$                  j'                  |t)        |      t)        ||j                  j*                  z
        |j,                  |       [ |j                  D ]  \  }}}}t        t)        |      dz
  d      }|dk(  r||dz  z   }t)        ||dz   dz  z
        }nt)        |      }t        j.                  |      }t        j                  ||z         }d||||z   dz   ||dz   f<    t1        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yminrM   r9   r8   rR   zerosmathrS   uint8shiprT   draw_glyph_to_bitmapinticebergglyphfloorrE   )rN   re   rF   rG   r\   xyrY   rZ   rj   rn   rm   rk   r[   rH   shiftedr`   ra   r8   centerx1x2s                         r2   	to_rasterzOutput.to_raster   s     :MMRb4<<,,,M :*.**55JAq!Qa5:78: ;=>? :MMRb4<<,,,M :*.**55JAq!Qa5:78: ;=>? >MMRb4<<,,,M >.2jj99
1aa!e9>;<> ?ABC >MMRb4<<,,,M >.2jj99
1aa!e9>;<> ?ABC4K4K$((..(4K$((//)$))AAq	M2DIIaLA288L txx4%$0#NN 	)LBDII**s2wB)=)=$= >

' + )	) $MM 		0LAq"bR1a(F{R!V&1*!112FAB1r6"B+/E!AfHQJ,2a4'(		0 1aAE1e44C N5M5M9M9s/   $NN$N?N3$N$-N+$$N3N:N)rM   Box)returnr5   )re   boolr   rE   )r=   r>   r?   r@   rO   rc   r~   rB   rC   r2   rJ   rJ   w   s    A
	0$5rC   rJ   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).
    r6   advancer8   r7   rj   rm   rn   rk   ru   r   slantedNr<   rB   rC   r2   r   r      s6    ( NML
K
K
K
KNMrC   r   c                  ^    e Zd ZU ded<   ded<   ded<   ded<   d	ed
<   ded<   ded<   ded<   y)FontInfor"   rT   r6   rU   strpostscript_namer   ri   r&   rV   r(   rW   r'   rv   rX   Nr=   r>   r?   rA   rB   rC   r2   r   r      s.    
MO	LMrC   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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)a  
        Parameters
        ----------
        default_font_prop : `~.font_manager.FontProperties`
            The default non-math font, or the base font for Unicode (generic)
            font rendering.
        load_glyph_flags : `.ft2font.LoadFlags`
            Flags passed to the glyph loader (e.g. ``FT_Load_Glyph`` and
            ``FT_Load_Char`` for FreeType-based fonts).
        N)default_font_propload_glyph_flags)rN   r   r   s      r2   rO   zFonts.__init__   s     "3 0rC   c
                     y)z
        Get the kerning distance for font between *sym1* and *sym2*.

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

        Returns
        -------
        FontMetrics
        )r   ri   )rN   rT   r   r   rU   r   r\   s          r2   get_metricszFonts.get_metrics	  s$    4 ~~dJXsC||rC   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)
rN   outputrF   rG   rT   r   r   rU   r   r\   s
             r2   render_glyphzFonts.render_glyph&  s2     ~~dJXsCb"d^,rC   c                B    |j                   j                  ||||f       y)zM
        Draw a filled rectangle at (*x*, *y*) with size (*w*, *h*).
        N)r;   r   rN   r   rx   ry   rY   rZ   s         r2   render_rect_filledzFonts.render_rect_filled/  s    
 	Q1aL)rC   c                    t               )zJ
        Get the axis height for the given *font* and *fontsize*.
        r   rN   rT   rU   r   s       r2   get_axis_heightzFonts.get_axis_height6       "##rC   c                    t               )zM
        Get the size of a quad for the given *font* and *fontsize*.
        r   r   s       r2   get_quadzFonts.get_quad<  r   rC   c                    t               )zF
        Get the xheight for the given *font* and *fontsize*.
        r   r   s       r2   get_xheightzFonts.get_xheightB  r   rC   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       r2   get_underline_thicknesszFonts.get_underline_thicknessH  s    
 "##rC   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.
        rB   rN   fontnamer   s      r2   !get_sized_alternatives_for_symbolz'Fonts.get_sized_alternatives_for_symbolO  s     3  rC   c                    t         S rL   )FontConstantsBaserN   s    r2   get_font_constantszFonts.get_font_constantsY  s      rC   Nr   r   r   r$   r   r   r   r   r   r   r   r6   r   r   r   r   r   r   r   r6   r   r6   r   r6   rT   r   r   r"   )rT   r   r   r   r   r   rU   r6   r   r6   r   r   )rT   r   r   r   r   r   rU   r6   r   r6   r   r   )r   rJ   rF   r6   rG   r6   rT   r   r   r   r   r   rU   r6   r   r6   r   Noner   rJ   rx   r6   ry   r6   rY   r6   rZ   r6   r   r   rT   r   rU   r6   r   r6   r   r6   r   r   r   r   r   zlist[tuple[str, str]]r   ztype[FontConstantsBase])r=   r>   r?   r@   rO   r   r   r   r   r   r   r   r   r   r   r   r   rB   rC   r2   r   r      s    1),47DI %"""!)"#.:-!$-+.-:?-FK-PT-*#*(-*27*<A*FJ*$$$$!/2!7L!!rC   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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)
superrO   	functoolscacher   _fontsfontmapr    r   r!   )rN   r   r   filenamedefault_font	__class__s        r2   rO   zTruetypeFonts.__init__c  sl    *,<="8')D223)!-I!-IrC   c                   | j                   j                  ||      }| j                  j                  |      }|yt        j                  j                  |      rZt        |      }|| j                  |<   || j                  |j                  <   || j                  |j                  j                         <   t        j                  t        |      S rL   )r   getr   ospathexistsr!   r   lowerTcastr"   )rN   rT   basenamecached_fonts       r2   r   zTruetypeFonts._get_fonto  s    <<##D$/kkooh/277>>(#;"8,K$/DKK!7BDKK334?JDKK3399;<vvg{++rC   c                ^    |j                   dk(  r|j                  dz  dz  |dz  |z  dz  z   S y)NCmex10@   rf      H   r   )r   r8   )rN   rT   rv   rU   r   s        r2   _get_offsetzTruetypeFonts._get_offsety  s:    8+LL2%)hqj3.>r.ABBrC   c                    t         rL   r   )rN   r   r   r   s       r2   
_get_glyphzTruetypeFonts._get_glyph  r   rC   c                   | j                  |||      \  }}}|j                  ||       |j                  |      }	|j                  |	| j                        }
d |
j
                  D        \  }}}}| j                  ||
||      }t        |
j                  dz  |
j                  dz  |
j                  dz  ||||z   ||z   |
j                  dz  |z   |	      }t        |||j                  |||	|
|      S )N)flagsc              3  &   K   | ]	  }|d z    yw)r   NrB   ).0vals     r2   	<genexpr>z*TruetypeFonts._get_info.<locals>.<genexpr>  s     !As#(!A      r   )	r   r8   r7   rj   rm   rn   rk   ru   r   )rT   rU   r   ri   rV   rW   rv   rX   )r   set_sizeget_char_index
load_glyphr   bboxr   r   linearHoriAdvancer8   r7   horiBearingYr   r   )rN   r   r   r   rU   r   rT   rV   r   rW   rv   rj   rn   rm   rk   rX   ri   s                    r2   r   zTruetypeFonts._get_info  s   !__Xz3Gc7h$))#.43H3HI!Aejj!AdD$!!$x=++e3<<"$++"&&+f4
  00#	
 		
rC   c                    | j                         }|j                  |j                  |z  |z  dz  S | j                  |t        j                  d   d||      }|j
                  |j                  z   dz  S )Nr   mathtext.default   −rf   )r   axis_heightr   mplrcParamsrk   rn   rN   r   rU   r   constsri   s         r2   r   zTruetypeFonts.get_axis_height  sx    ((*)%%036;; &&#,,'9:HhPSUGLL7<</144rC   c                    | j                         }|j                  |j                  |z  |z  dz  S | j                  |t        j                  d   d||      }|j
                  S )Nr   r   m)r   quadr   r   r   r   r   s         r2   r   zTruetypeFonts.get_quad  se    ((*;;";;)C/"44 &&#,,'9:C3PG??"rC   c                    | j                         }|j                  |j                  |z  |z  dz  S | j                  |t        j                  d   d||      }|j
                  S )Nr   r   rx   )r   x_heightr   r   r   ru   r   s         r2   r   zTruetypeFonts.get_xheight  se    ((*??&??X-3b88 &&#,,'9:C3PG??"rC   c                    d|z  |z  dz  S )Ng      ?r   rB   r   s       r2   r   z%TruetypeFonts.get_underline_thickness  s     h&,22rC   c
                "   ||k(  rs||k(  rn| j                  |||||	      }
| j                  |||||	      }|
j                  }|j                  |
j                  |j                  t        j
                        dz  S t        |   |||||||||		      S )Nr   )r   rT   get_kerningrW   r#   DEFAULTr   r   )rN   r   r   r   r   r   r   r   r   r   info1info2rT   r   s                r2   r   zTruetypeFonts.get_kern  s     E>i94NN5*dIsKENN5*dIsKE::D##E$5$5u7H7H$+OO579: :wz4 %z4CI 	IrC   r   r   )
rT   r"   rv   r'   rU   r6   r   r6   r   r6   r   r   r   r   r   r   r   z'tuple[FT2Font, CharacterCodeType, bool])r   r   r   r   r   r   rU   r6   r   r6   r   r   )r   r   rU   r6   r   r6   r   r6   r   r   )r=   r>   r?   r@   rO   r   r   r   r   r   r   r   r   r   __classcell__r   s   @r2   r   r   ]  s    

.,#("" G"


!)
B	5#	#3
I
I),
I47
IDI
I
I %
I 
IrC   r   )	metaclassc                     e Zd ZdZdddddddd	d
Zd=fdZ edj                               Z	 	 	 	 d>dZ	dZ
i ddge
D  cg c]
  }dd| df c}} ddge
D  cg c]
  }dd| df c}} de
D  cg c]
  }dd| df c}} de
D  cg c]
  }dd| df c}} ddge
D  cg c]
  }dd| df c}} ddge
D  cg c]
  }dd | df c}} d!d"ge
D  cg c]
  }dd#| df c}} d$d%ge
D  cg c]
  }dd&| df c}} d'e
D  cg c]
  }dd(| df c}} d)e
D  cg c]
  }dd*| df c}} d+e
D  cg c]
  }dd,| df c}} d-e
D  cg c]
  }dd.| df c}} d/e
D  cg c]
  }dd0| df c}} d1e
D  cg c]
  }dd2| df c}} d3d4ge
D  cg c]
  }dd5| df c}} d6g d7d8g d9Zd:D ]  \  ZZee   ee<    	 	 	 	 d?d;Zd@d<Zx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 c c}} w c c}} w c c}} w c c}} w c c}} w c c}} w c c}} w )ABakomaFontsz
    Use the Bakoma TrueType fonts for rendering.

    Symbols are strewn about a number of font files, each of which has
    its own proprietary 8-bit encoding.
    cmmi10cmsy10cmr10cmtt10cmti10cmb10cmss10cmex10)normalcalrmttitbfsfexc                    t        ||      | _        t        |   ||       | j                  j                         D ].  \  }}t        |      }|| j                  |<   || j                  |<   0 y rL   )	StixFonts_stix_fallbackr   rO   _fontmapitemsr    r   )rN   r   r   keyr   fullpathr   s         r2   rO   zBakomaFonts.__init__  sj    '(9;KL*,<=++- 	)HC}H (DLL (DLL	)rC   
\int \ointc                   d }|| j                   v r:|t        v r2t        |   \  }}|dv xs || j                  v }| j                  |      }nIt	        |      dk(  r;|dv }|dk(  r|j                         rd}d}| j                  |      }|t        |      }||j                        dk7  r||fS | j                  j                  |||      S )N)r  r  r   )r  r  r  r  Fr   )
r   r   _slanted_symbolsr   lenisdigitr+   r   r   r   )rN   r   r   r   rT   r   rV   r   s           r2   r   zBakomaFonts._get_glyph  s    t||#(>+C0MHc#77XC4CXCX<XG>>(+DX]#33G8#  >>(+D#h 3 3C 8A =g%%&&11(JLLrC   )bigBigbiggBigg()r  r.  r  z\__parenleft__))r  r0  z\__parenright{z\__braceleft}z\__braceright[)r  r3  z\__bracketleft])r  r4  z\__bracketright<)r  z\__angbracketleft__z\__angbracketleft>)r  z\__angbracketright__z\__angbracketrightz\lfloorz\__floorleftz\rfloorz\__floorrightz\lceilz\__ceilingleftz\rceilz\__ceilingright	\__sqrt__z
\__radicalz
\backslashz\__backslash/)r  r8  z\__slashz\widehat))r  ^)r  z\__hatwide__)r  z\__hatwider__)r  z\__hatwidest__z
\widetilde))r  ~)r  z\__tildewide__)r  z\__tildewider__)r  z\__tildewidest__))z
\leftparenr.  )z\rightparenr0  )z
\leftbracer1  )z\rightbracer2  )z\leftbracketr3  )z\rightbracketr4  )z\langler5  )z\rangler6  )\{r1  )\}r2  )\[r3  )\]r4  c                @    | j                   j                  |||fg      S rL   )_size_alternativesr   r   s      r2   r   z-BakomaFonts.get_sized_alternatives_for_symbol0  s"    &&**3(C0ABBrC   c                    t         S rL   )ComputerModernFontConstantsr   s    r2   r   zBakomaFonts.get_font_constants4  s    **rC   r   r  r   r   )r=   r>   r?   r@   r!  rO   setsplitr'  r   _latex_sizesr@  aliastargetr   r   r	  )r   sr   s   00@r2   r  r    sp    	H) =..01MM GM4 2LkRLQqd|A3b$9:QRkS\Rd}QCr$:;RS 	\BtQCr*+B 	lCtaS+,C	
 	kTlSd~aS$;<ST 	kU|T!dqc$<=TU 	- K<HIq+A3b12IK 	. L=IJ,QCr23JL 	LIqd|A3b12I 	\Jd}QCr23J 	\JTnQCr23J 	lKToaS34K 	LIqA3b12I  	|L!,qc45L!" 	{ONAt2%67NO#$ 	 1%( 	 Q)06 ?v %7v$>5!?C/2C7LC+G RRBCSTIJIJJKILNsZ   G3G98G?
H
,HH$H HH#
3H)
H/
%H5
>H;
I
2Ir  c                       e Zd ZU dZdddZded<   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"  z*dict[CharacterCodeType, CharacterCodeType]_cmr10_substitutionsc                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)012345)r   r   r  StixSansFontsr  r   _fallback_fontr   rO   rD  r    r   r   
isinstancer"  )rN   r   r   fallback_rcfont_clstexfontproprT   stixsizedaltfontssizenamer$  r   s               r2   rO   zUnicodeFonts.__init__L  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". 6rC   r%  c                
    ||fS rL   rB   )rN   r   r   uniindexs       r2   _map_virtual_fontzUnicodeFonts._map_virtual_fontr  s    !!rC   c                ^   	 t        |      }d}| j                  |||      \  }}|}|r|dk(  rT|dk  rOt        |      }t        j                  |      d   dk7  s$t        j                  |      j                  d	      rd
}n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.        j0                  j3                         v rd}t        j5                  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  r   r   LzGREEK CAPITALr  r  r  zfonts/ttf/cmsy10.ttf)r  r   r  zComputer ModernzSubstituting symbol %s from %szNFont %r does not have a glyph for %a [U+%x], substituting with a dummy symbol.   )r3   r/   r+   _logwarningrk  chrunicodedatacategoryrh  
startswithr'  r   rN  family_namer!   r   _get_data_pathr   r`  ra  r  r   r  r!  valuesr\   )rN   r   r   r   rj  found_symbolnew_fontnamecharr   rT   
glyphindexgfamilys                r2   r   zUnicodeFonts._get_glyphv  sB   	C(-HL "33Hj(S( 8#7(:8}((.q1S8&++D1<<_M#'L#'L#t+Lt7L7L0LG L>>,/D 9 99 ,,7#,,-CDFD#88BH!00:
?#'L"" ;;&t':':IF#H''228ZM1))[1188::.F		:CH  ;;&tY7??4SAA A)3: ~~d+Xw&&u  	C3xH LLL<cB	Cs   G< <,H,+H,c                \    | j                   r| j                   j                  ||      S ||fgS rL   )r`  r   r   s      r2   r   z.UnicodeFonts.get_sized_alternatives_for_symbol  s2    &&HHSVWW3  rC   r   r   r   r   r   rj  r&   r   ztuple[str, CharacterCodeType]r  r   )r=   r>   r?   r@   rN  rA   rO   rC  rD  r'  rk  r   r   r	  r
  s   @r2   rJ  rJ  8  s}    	 HD 
".H =..01"$5":W"?'?' G?'B!/2!7L!rC   rJ  c                  @     e Zd ZU i Zded<   ddZ	 	 	 	 d fdZ xZS )DejaVuFontszdict[str, 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 )NrT  rU  rV  rW  rX  )rZ  r[  r\  r]  r^  )ra  DejaVuSerifFontsr  r`  r_  r  bakomar   rO   r!  updater"  r    r   rN   r   r   r#  rh  r$  s         r2   rO   zDejaVuFonts.__init__  s    d,-"+,=?O"PD"/0ACS"TD!"35EFt%68HI!!#""
 	 ,,. 	*IC~H (DLL!)DLL	*rC   c                    |dk(  r| j                   j                  |||      S t        |      }| j                  d      }|'|j	                  |      }|dk7  rt
        |   d||      S t
        |   |||      S )N\primer  r   )r  r   r3   r   r   r   )rN   r   r   r   rj  rT   r|  r   s          r2   r   zDejaVuFonts._get_glyph  s     );;))(JDD )-H>>$'D!00:
? 7-dJDD7%h
C@@rC   r   r  )r=   r>   r?   r!  rA   rO   r   r	  r
  s   @r2   r  r    s0    !Hn!**AA GA ArC   r  c            	      .    e Zd ZdZddddddddd	Z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
    zDejaVu SerifzDejaVu Serif:italiczDejaVu Serif:weight=boldzDejaVu Serif:italic:boldDejaVu SansDejaVu Sans MonozDejaVu Serif Displayr  r  r  bfitr  r  r  rY  c                    t         S rL   )DejaVuSerifFontConstantsr   s    r2   r   z#DejaVuSerifFonts.get_font_constants  s    ''rC   Nr   r=   r>   r?   r@   r!  r   rB   rC   r2   r  r    s-     #(* $	H(rC   r  c            	      .    e Zd ZdZdddddddddZ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  c                    t         S rL   )DejaVuSansFontConstantsr   s    r2   r   z"DejaVuSansFonts.get_font_constants  s    &&rC   Nr   r  rB   rC   r2   r  r    s-     "') #	H'rC   r  c                      e Zd ZdZddddddddd	d
ddddZdZdZddZ	 	 	 	 ddZe	j                  	 	 	 	 dd       ZddZ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.
    rS  zSTIXGeneral:italiczSTIXGeneral:weight=boldzSTIXGeneral:italic:boldSTIXNonUnicodezSTIXNonUnicode:italiczSTIXNonUnicode:weight=boldrT  rU  rV  rW  rX  )r  r  r  r  nonunirmnonuniitnonunibfrY  rZ  r[  r\  r]  r^  NFc                    t         j                  | ||       | j                  j                         D ].  \  }}t	        |      }|| j
                  |<   || j
                  |<   0 y rL   )r   rO   r!  r"  r    r   r  s         r2   rO   zStixFonts.__init__/  s[    t%68HI,,. 	*IC~H (DLL!)DLL	*rC   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   rf   r   r   r   )r  r  r  )r  r  r  r  i   i  nonuni)r   r   _sansra  dictr.   listr(  r   r   r   )rN   r   r   rj  font_mappingdoing_sans_conversionmappinglohimidranges              r2   rk  zStixFonts._map_virtual_font6  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                J   ddddddd}|j                  ||      }	 t        |      }t        d      D cg c]D  }| j	                  t        |            j                  |      d	k7  rt        |      t        |      fF }}|d
k(  r|d d }|S # t        $ r ||fgcY S w xY wc c}w )Nr1  r2  r3  r4  u   ⟨u   ⟩)r;  r<  r=  r>  r5  r6     r   r7  )r   r3   r/   r  r   r   r   rr  )rN   r   r   fixesrj  ialternativess          r2   r   z+StixFonts.get_sized_alternatives_for_symboll  s     s3s67

 iiS!	%(-H :?q QA>>#a&1@@JaO QX/ Q Q ,',L  	%sO$$	%Qs   B A	B BBc                2    | j                   rt        S t        S rL   )r  STIXSansFontConstantsSTIXFontConstantsr   s    r2   r   zStixFonts.get_font_constants  s    ::(($$rC   r   r  r   r   )r=   r>   r?   r@   r!  r`  r  rO   rk  r   r   r   r   rB   rC   r2   r  r    s    
 "')$+0H NE*4"$54":W4"l __/27L (%rC   r  c                      e Zd ZdZdZy)r_  zd
    A font handling class for the STIX fonts (that uses sans-serif
    characters by default).
    TN)r=   r>   r?   r@   r  rB   rC   r2   r_  r_    s     ErC   r_  ffffff?r  c                      e Zd ZU dZdZded<   dZded<   dZded<   dZded	<   d
Z	ded<   dZ
ded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded <   dZded!<   y)"r   z
    A set of constants that controls how certain things, such as sub-
    and superscripts are laid out.  These are all metrics that can't
    be reliably retrieved from the font metrics in the font itself.
    皙?zT.ClassVar[float]script_spaceg?supdropsubdropr  sup1333333?sub1      ?sub2g?delta皙?delta_slanted皙?delta_integralgffffff?num1g      ?num2g?num3denom1g?denom2NzT.ClassVar[float | None]r   r   r  )r=   r>   r?   r@   r  rA   r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   r  rB   rC   r2   r   r     s     '+L#* "%G$ "%G$ "D
! "D
! "D
!  %E$
 (+M$* ),N%+ "D
! "D
! "D
! !$F# !$F# -1K)0 &*D
") *.H&-rC   r   c                      e Zd ZdZdZdZdZdZdez  Zdez  Z	dez  Z
dez  Zdez  Zd	ez  Zd
ez  Zdez  Zdez  Zdez  ZdZdZedz  Zy)rB  g?r  i i- i  i5 iff i i
 iL i i
 ix       ?g     ?i   N)r=   r>   r?   r  r  r  r  	_x_heightr  r  r  r  r  r  r  r  r  r  r   r   r  rB   rC   r2   rB  rB    s     "LEMNI y GiGIDIDIDIDIDIDiFiF !KD5 HrC   rB  c                      e Zd ZdZdZdZdZdZedz  Zdez  Z	dez  Z
dez  Zd	ez  Zd
ez  Zdez  Zdez  Zdez  Zdez  Zdez  ZdZdZy)r  r  r  r  i  i  i  gǺ I@i     i5  i  i  i  i  iw  r        ?N)r=   r>   r?   r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r   rB   rC   r2   r  r    s    LEMNI4H IoG	!G?D?D?D?D?D?D9_F9_F KDrC   r  c                      e Zd ZdZdZdZy)r  r  333333?r  N)r=   r>   r?   r  r  r  rB   rC   r2   r  r  +  s    LMNrC   r  c                      e Zd ZdZedz  Zdez  Zdez  Zdez  Zdez  Zdez  Z	dez  Z
d	ez  Zd
ez  Zdez  Zdez  ZdZy)r  i'     K7@皙Y@;On@w/3s@-ƃ@=
ףp@A`"@tV@\(1@   r  Nr=   r>   r?   r  r  r  r  r  r  r  r  r  r  r  r  r   rB   rC   r2   r  r  1  }    I4H 	!GiGYDYDYDYDYDYDy F9_F KrC   r  c                      e Zd ZdZedz  Zdez  Zdez  Zdez  Zdez  Zdez  Z	dez  Z
d	ez  Zd
ez  Zdez  Zdez  ZdZy)r  i`  r  r  r  r  r  r  r  r  r  r  r  r  Nr  rB   rC   r2   r  r  F  r  rC   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	y)NodezA node in the TeX box model.c                    d| _         y Nr   rg  r   s    r2   rO   zNode.__init__^  s	    	rC   c                ,    t        |       j                  S rL   )typer=   r   s    r2   __repr__zNode.__repr__a  s    Dz"""rC   c                     yNr   rB   )rN   nexts     r2   r  zNode.get_kerningd  s    rC   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    r2   shrinkzNode.shrinkg  s    
 			Q	rC   c                     y)zRender this node.NrB   rN   r   rx   ry   s       r2   renderzNode.rendern  s    rC   c                     y)NTrB   r   s    r2   is_char_nodezNode.is_char_nodeq  s     rC   Nr   r   r   r   r  zNode | Noner   r6   r   rJ   rx   r6   ry   r6   r   r   r   r   )
r=   r>   r?   r@   rO   r  r  r  r  r  rB   rC   r2   r  r  [  s#    &# rC   r  c                  L     e Zd ZdZd fdZd fdZ	 	 	 	 	 	 	 	 	 	 ddZ xZS )r   z A node with a physical location.c                L    t         |           || _        || _        || _        y rL   )r   rO   r7   r8   r9   )rN   r7   r8   r9   r   s       r2   rO   zBox.__init__~  s#    

rC   c                    t         |           | j                  t        k  rL| xj                  t
        z  c_        | xj                  t
        z  c_        | xj                  t
        z  c_        y y rL   )r   r  rg  NUM_SIZE_LEVELSr7   SHRINK_FACTORr8   r9   rN   r   s    r2   r  z
Box.shrink  sH    99&JJ=(JKK=(KJJ=(J 'rC   c                     y rL   rB   )rN   r   r|   y1r}   y2s         r2   r  z
Box.render  s    rC   )r7   r6   r8   r6   r9   r6   r   r   r  )r   rJ   r|   r6   r  r6   r}   r6   r  r6   r   r   )r=   r>   r?   r@   rO   r  r  r	  r
  s   @r2   r   r   {  s=    *)#).49>BrC   r   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   rO   )rN   r8   r9   r   s      r2   rO   zVbox.__init__  s    VU+rC   )r8   r6   r9   r6   r=   r>   r?   r@   rO   r	  r
  s   @r2   r  r    s    ., ,rC   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  rN   r7   r   s     r2   rO   zHbox.__init__  s    B'rC   r7   r6   r  r
  s   @r2   r  r    s    8( (rC   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 rL   )	r   rO   cfontsetrT   r   rU   r   _update_metrics)rN   r  stater   s      r2   rO   zChar.__init__  s\    }}JJ	**99 	rC   c                     d| j                   z  S )Nz`%s`r  r   s    r2   r  zChar.__repr__  s    rC   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   rT   r   r  rU   r   _metricsr   r7   ru   r8   r9   rN   ri   s     r2   r  zChar._update_metrics  s    "&,,":":IIttxx#I 	I$-66S= DJ DJoo78
rC   c                .    | j                   j                  S rL   )r  r   r   s    r2   
is_slantedzChar.is_slanted  s    }}$$$rC   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   r7   ra  r	  r  r   rT   r   r  rU   r   )rN   r  r   kerns       r2   r  zChar.get_kerning  s     --''$**4dD!<<((		4??DFFDMM		4??DFFDMMD ~rC   c           
         | j                   j                  |||| j                  | j                  | j                  | j
                  | j                         y rL   )r  r   rT   r   r  rU   r   r  s       r2   r  zChar.render  s;    !!AqIIttxx	IrC   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 rL   )	r   r  rg  r  rU   r  r7   r8   r9   r  s    r2   r  zChar.shrink  sV    99&MM]*MJJ]*JKK]*KJJ]*J	 'rC   )r  r   r  ParserStater  r  r  r  r  )r=   r>   r?   r@   rO   r  r  r  r  r  r  r	  r
  s   @r2   r	  r	    s1    

9% I
+ +rC   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   rT   r   r  rU   r   r  rm   rj   r7   rk   rn   r8   r9   r  s     r2   r  zAccent._update_metrics  so    "&,,":":IIttxx#I 	I$-\\GLL0
llW\\1
rC   c                B    t         |           | j                          y rL   )r   r  r  r  s    r2   r  zAccent.shrink  s    rC   c           
        | j                   j                  ||| j                  j                  z
  || j                  j                  z   | j
                  | j                  | j                  | j                  | j                         y rL   )
r  r   r  rj   rn   rT   r   r  rU   r   r  s       r2   r  zAccent.render  sY    !!A***A0B0B,BIIttxx	IrC   r  r  )r=   r>   r?   r@   r  r  r  r	  r
  s   @r2   r  r    s    
IrC   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   rO   shift_amountchildrenglue_set	glue_sign
glue_orderrN   elementsr   s     r2   rO   zList.__init__  s<    R$#(rC   c                J   dj                  t        | 	         | j                  | j                  | j
                  | j                  | j                  rMdt        j                  dj                  t        dj                   | j                              d      z   dz         S d      S )Nz/{}<w={:.02f} h={:.02f} d={:.02f} s={:.02f}>[{}]
z{!r},z   )formatr   r  r7   r8   r9   r$  r%  textwrapindentjoinrQ   r  s    r2   r  zList.__repr__  s    @GGGJJJJ)) }} 8??		#gnndmm<= 	
 	
 #%
 	
rC   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   NrB   )r   r  totalss     r2   r   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%  rp  rq  r  r=   )rN   rx   signr4  
error_typeos      `  r2   	_set_gluezList._set_glue  s    "Cc&k*4R40CQH 	H! !9?q	MDMDN DO64==!['d)<)<dD " rC   c                    | j                   D ]  }|j                           t        |           | j                  t        k  r3| xj
                  t        z  c_        | xj                  t        z  c_        y y rL   )r%  r  r   rg  r  r$  r  r&  )rN   childr   s     r2   r  zList.shrink#  sY    ]] 	ELLN	99&.MM.M 'rC   )r*  T.Sequence[Node]r  )
rx   r6   r6  rt   r4  zlist[float]r7  r   r   r   r  )	r=   r>   r?   r@   rO   r  r9  r  r	  r
  s   @r2   r"  r"    s2    :	
D!D&*D / /rC   r"  c                  V     e Zd ZdZ	 	 	 d	 	 	 d fdZddZd	dZ	 	 d
	 	 	 ddZ xZS )HlistzA horizontal list of boxes.c                |    t         |   |       |r| j                          | j                  ||       d| _        y )N)rY   r   F)r   rO   r  hpack
is_phantom)rN   r*  rY   r   do_kernr   s        r2   rO   zHlist.__init__/  s5     	"IIK

Q!
rC   c                B    t        t        d | j                              S )Nc                "    | j                         S rL   )r  )nodes    r2   <lambda>z$Hlist.is_char_node.<locals>.<lambda>:  s    D$5$5$7 rC   )allrQ   r%  r   s    r2   r  zHlist.is_char_node8  s    37GHHrC   c                   g }t        j                  | j                  | j                  dd       D ]I  \  }}|j                  |       |j	                  |      }|dk7  s.t        |      }|j                  |       K || _        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   )	itertoolszip_longestr%  r   r  Kern)rN   new_childrenelem0elem1kerning_distancer  s         r2   r  z
Hlist.kern<  s     %11$--qrARS 	*LE5&$0072%,-##D)	* %rC   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      r$  
additionalr   Nr   Overfulr  Underful)r%  ra  r	  r7   rl   r8   r9   r   rR   isinfgetattrGlue	glue_specstretch_orderstretchshrink_orderr  rK  r'  r(  r5  r9  )rN   rY   r   rZ   r[   rx   total_stretchtotal_shrinkprH  rX  s              r2   r@  zHlist.hpackM  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,
;rC   )r   rR  T)r*  r<  rY   r6   r   "T.Literal['additional', 'exactly']rB  r   r  r  r   rR  )rY   r6   r   r_  r   r   )	r=   r>   r?   r@   rO   r  r  r@  r	  r
  s   @r2   r>  r>  ,  sL    %>A9E!% 6  I%"  #6B?<3?<GK?<rC   r>  c                  b     e Zd ZdZ	 	 d	 d fdZd	dZddej                  f	 	 	 	 	 d
dZ xZ	S )VlistzA vertical list of boxes.r   rR  c                J    t         |   |       | j                  ||       y )N)rZ   r   )r   rO   vpack)rN   r*  rZ   r   r   s       r2   rO   zVlist.__init__  s     "

Q!
rC   c                     yNFrB   r   s    r2   r  zVlist.is_char_node  s    rC   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   rQ  r$  z1Internal mathtext error: Char node found in VlistrR  r   Nr   rS  r  rT  )r%  ra  r   r8   r9   rR   rU  r7   rV  rl   rW  rX  rY  rZ  r[  r  rK  r	  RuntimeErrorr'  r(  r5  r9  )rN   rZ   r   lrY   r[   rx   r\  r]  r^  rH  rX  s               r2   rd  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,
;rC   r`  )r*  r<  rZ   r6   r   r_  r  )rZ   r6   r   r_  ri  r6   r   r   )
r=   r>   r?   r@   rO   r  rR   infrd  r	  r
  s   @r2   rb  rb    sN    #>A9E6
  #6BG<3G<G<$(G<rC   rb  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 rL   )r   rO   r  )rN   r7   r8   r9   r  r   s        r2   rO   zRule.__init__  s    .}}rC   c                H    | j                   j                  ||||z
  ||       y rL   )r  r   r   s         r2   r  zRule.render  s     ''1q5!Q?rC   )r7   r6   r8   r6   r9   r6   r  r  r   )r=   r>   r?   r@   rO   r  r	  r
  s   @r2   rl  rl    s@    %@@!@&+@05@:>@rC   rl  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   rO   rR   rj  )rN   r  	thicknessr8   r9   r   s        r2   rO   zHrule.__init__  s<    ==?I"S(6rC   rL   )r  r  rt  float | Noner  r
  s   @r2   rp  rp    s    87 7rC   rp  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 rL   rr  )rN   r  rt  r   s      r2   rO   zVrule.__init__  s,    99;	BFFBFFE:rC   )r  r  r  r
  s   @r2   rw  rw    s    6; ;rC   rw  c                  @    e Zd ZU ded<   ded<   ded<   ded<   ded<   y)		_GlueSpecr6   r7   rZ  rt   rY  r  r[  Nr   rB   rC   r2   rz  rz    s    LNMrC   rz  r   r  rf   r   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 )rW  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   rO   ra  r   rz  _namedr/   rX  )rN   	glue_typerX  r   s      r2   rO   zGlue.__init__'  s[     	i%!((3I
 #	 	9-!I # MNNrC   c                    t         |           | j                  t        k  r5| j                  }|j                  |j                  t        z        | _        y y )Nr7   )r   r  rg  r  rX  _replacer7   r  )rN   r}  r   s     r2   r  zGlue.shrink4  sB    99&AZZagg.EZFDN 'rC   )r  z`_GlueSpec | T.Literal['fil', 'fill', 'filll', 'neg_fil', 'neg_fill', 'neg_filll', 'empty', 'ss']r  )r=   r>   r?   r@   rO   r  r	  r
  s   @r2   rW  rW    s$    #A#G GrC   rW  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 )Nr  FrB  r   rO   rW  r)  s     r2   rO   zHCentered.__init__A  s*    $t*<x<d<eLrC   r*  z
list[Node]r  r
  s   @r2   r  r  ;  s    
M MrC   r  c                  $     e Zd ZdZd fdZ xZS )	VCenteredzk
    A convenience class to create a `Vlist` whose contents are
    centered within its enclosing box.
    c                R    t         |   t        d      g|t        d             y )Nr  r  r)  s     r2   rO   zVCentered.__init__K  s%    $t*<x<d<=rC   r  r  r
  s   @r2   r  r  E  s    
> >rC   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 )	rK  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 rL   )r   rO   r7   r  s     r2   rO   zKern.__init__]  s    
rC   c                     d| j                   z  S )Nzk%.02fr  r   s    r2   r  zKern.__repr__a  s    $**$$rC   c                |    t         |           | j                  t        k  r| xj                  t
        z  c_        y y rL   )r   r  rg  r  r7   r  r  s    r2   r  zKern.shrinkd  s,    99&JJ-'J 'rC   r  r  r  )
r=   r>   r?   r@   r8   r9   rO   r  r  r	  r
  s   @r2   rK  rK  O  s(     FE%( (rC   rK  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   rY  r   )r  r   rT   r   rU   r   copyr	  r8   r9   r(  r   rO   r$  )rN   r  r8   r9   r  factorr  r  target_totalr   r   r{  shiftr   s                r2   rO   zAutoHeightChar.__init__s  s   }}FFuzzSTU==,,UZZS

~) 	MHc!EJU#D {{TZZ'<#.+HH	 ::L 1Q 6~%tzz)ABNNf$NU#DTZZ'E$ !rC   rL   )
r  r   r8   r6   r9   r6   r  r  r  ru  r  r
  s   @r2   r  r  j  s     )-"%" "rC   r  c                  *     e Zd ZdZef	 d fdZ xZS )AutoWidthChara  
    A character as close to the given width as possible.

    When using a font with multiple width versions of some characters (such as
    the BaKoMa fonts), the correct glyph will be selected, otherwise this will
    always just return a scaled version of the glyph.
    c                d   |j                   j                  |j                  |      }|j                         }|D ]&  \  }}||_         |||      }|j                  |k\  s& n |j                  z  }	|xj
                  |	z  c_         ||      }t        
|   |g       |j                  | _        y rL   )r  r   rT   r  r7   rU   r   rO   )rN   r  r7   r  
char_classr  r   r   r{  r  r   s             r2   rO   zAutoWidthChar.__init__  s    }}FFuzzSTU

) 	MHc!EJc5)DzzU"		 #& #u%$ ZZ
rC   )r  r   r7   r6   r  r  r  z
type[Char])r=   r>   r?   r@   r	  rO   r	  r
  s   @r2   r  r    s     +/ '   rC   r  c                   	
 |\  }}dd||| j                   z   	t        |       
g fdddd	
f
dd	
f	dt        | t              sJ  |        
S )	a  
    Ship out *box* at offset *xy*, converting it to an `Output`.

    Since boxes can be inside of boxes inside of boxes, the main work of `ship`
    is done by two mutually recursive routines, `hlist_out` and `vlist_out`,
    which traverse the `Hlist` nodes and `Vlist` nodes inside of horizontal
    and vertical boxes.  The global variables used in TeX to store state as it
    processes have become local variables here.
    r   c                <    t              s | j                  |  y y rL   )anyr  )rE  argsphantoms     r2   r  zship.<locals>.render  s    7|DKK rC   c                "    | dk  rdS | dkD  rdS | S )Ng    eg    eArB   )values    r2   clampzship.<locals>.clamp  s    t|tHH5HrC   c           	     B  
 d}d}| j                   }| j                  }}}j                  | j                         | j                  D ]C  }t        |t              r! |z   z          |j                  z  5t        |t              r|j                  z  Ut        |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    |z   z   ||	       ||z  t        |t&              s|j(                  }|j                  |z
  }|dk7  r~|dk(  r=|j*                  |k(  rj||j,                  z  }t/         | j0                  |z              }n<|j2                  |k(  r-||j4                  z  }t/         | j0                  |z              }||z  }|z  F j7                          y )Nr   r   unreachable coder   )r(  r'  r   rA  r%  ra  r	  r7   rK  r"  r(  r$  r>  rb  r   r8   r9   rR   rU  rW  rX  rY  rZ  roundr&  r[  r  pop)rM   cur_gcur_gluer(  r'  	base_line	left_edger^  edgerule_height
rule_depth
rule_widthrX  r  cur_hcur_v	hlist_outoff_hoff_vr   r  r  	vlist_outs                r2   r  zship.<locals>.hlist_out  s_    ^^
MM			s~~& 3	$A!T"q&%%-? 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1f 5=%%-%{4 &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	$j 	rC   c           	       	 d}d}| j                   }| j                  }}| j                  z  }| j                  D ];  }t	        |t
              r|j                  z  $t	        |t              rt        |j                        dk(  r|j                  |j                  z   z  i|j                  z  ||j                  z   }| j                  |_        t	        |t              r	 |       n t	        |t              r	 |       nJ d       ||j                  z   |t	        |t              rr|j                  }	|j                  }
|j                  }t        j                  |      r| j                  }|	|
z  }	|	dkD  sF|
dkD  sM|	z   |z   z   ||	       gt	        |t               r|j"                  }|j                  |z
  }	|dk7  r~|dk(  r=|j$                  |k(  rj||j&                  z  }t)         | j*                  |z              }n<|j,                  |k(  r-||j.                  z  }t)         | j*                  |z              }|	|z  }	|	z  !t	        |t0              s3t3        d       y )Nr   r   r  r   z1Internal mathtext error: Char node found in vlist)r(  r'  r8   r%  ra  rK  r7   r"  r(  r9   r$  r>  rb  r   rR   rU  rW  rX  rY  rZ  r  r&  r[  r  r	  rh  )rM   r  r  r(  r'  r  top_edger^  save_vr  r  r  rX  r  r  r  r  r  r  r   r  r  s                r2   r  zship.<locals>.vlist_out  sJ    ^^
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1f 5=%%-%{4 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rC   )r  r6   r   r6   )rM   r>  r   r   )rM   rb  r   r   )r8   rJ   ra  r>  )rM   xyrF   rG   r  r  r  r  r  r  r   r  r  r  s       @@@@@@@@@@r2   rr   rr     s|     FBEEEOEC[FGIA AF9I 9Iv c5!!!cNMrC   c                B     d fd}t               j                  |      S )z$Helper class to raise parser errors.c                    t        | |      rL   r   )rH  loctoksmsgs      r2   raise_errorzError.<locals>.raise_errorN  s    !!S#..rC   rH  r   r  rt   r  r   r   T.Any)r   set_parse_action)r  r  s   ` r2   Errorr  L  s    / 7##K00rC   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 rL   )r  _fontr   rU   r   )rN   r  rT   r   rU   r   s         r2   rO   zParserState.__init___  s%    
$ rC   c                ,    t        j                   |       S rL   )r  r   s    r2   r  zParserState.copyg  s    yyrC   c                    | j                   S rL   )r  r   s    r2   rT   zParserState.fontj  s    zzrC   c                (    |dv r|| _         || _        y )N)r  r  r  r  r  )r   r  )rN   rh  s     r2   rT   zParserState.fontn  s    77"DO
rC   c                x    | j                   j                  | j                  | j                  | j                        S )z.Return the underline thickness for this state.)r  r   rT   rU   r   r   s    r2   rs  z+ParserState.get_current_underline_thicknesst  s,    ||33IIt}}dhh0 	0rC   N)
r  r   rT   r   r   r   rU   r6   r   r6   r   r  r  )rh  r   r   r   )r   r6   )
r=   r>   r?   r@   rO   r  propertyrT   setterrs  rB   rC   r2   r  r  T  sJ       
[[ 
0rC   r  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rL   )ra  r   exprsresultsName)eltexprnamess     r2   r  zcmd.<locals>.names  sL     c?+		 ' ;&&'__//!  's   +AA$Ar1  r   r   r-  c              3  &   K   | ]	  }d |z    yw)z{%s}NrB   )r   rh  s     r2   r   zcmd.<locals>.<genexpr>  s     BdFTMBr   z	Expected )r  r   r   zT.Generator[str, None, None])rD  r1  r  )r  r  csnamer1   r  s       @r2   cmdr  z  sg    " ZZQ"Ffn BGGBeDkBBB"& TEIcU"34455rC   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 djdZ!dkdZ"dldZ#djdZ$djdZ%dmdZ&dndZ'dodZ(dodZ) e*e+jX                        Z-dodZ.dpdZ/dddd d d!d"d"d#dd$d%d&Z0dod'Z1dod(Z2	 	 	 	 dqd)Z3drd*Z4dod+Z5dod,Z6dod-Z7i d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDd=dEd5dFd7dGd9dHd;dId/dJdKdLdMZ8 edNj                               Z9dodOZ:drdPZ;drdQZ<dodRZ=dodSZ>dodTZ?e?Z@dsdUZAdrdVZBdodWZCdtdXZDdtdYZEdtdZZFdrfd[ZG	 	 	 	 	 	 dud\ZHdod]ZIdod^ZJdod_ZKdod`ZLdodaZMdrdbZNeNxZOZPdodcZQdoddZRdodeZS	 	 	 	 	 	 dvdfZTdodgZUdodhZVdodiZWxZXS c c}}}} w )w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   rf   r   N)r=   r>   r?   DISPLAYSTYLE	TEXTSTYLESCRIPTSTYLESCRIPTSCRIPTSTYLErB   rC   r2   
_MathStyler    s    	rC   r  u  + * - −
      \pm             \sqcap                   \rhd
      \mp             \sqcup                   \unlhd
      \times          \vee                     \unrhd
      \div            \wedge                   \oplus
      \ast            \setminus                \ominus
      \star           \wr                      \otimes
      \circ           \diamond                 \oslash
      \bullet         \bigtriangleup           \odot
      \cdot           \bigtriangledown         \bigcirc
      \cap            \triangleleft            \dagger
      \cup            \triangleright           \ddagger
      \uplus          \lhd                     \amalg
      \dotplus        \dotminus                \Cap
      \Cup            \barwedge                \boxdot
      \boxminus       \boxplus                 \boxtimes
      \curlyvee       \curlywedge              \divideontimes
      \doublebarwedge \leftthreetimes          \rightthreetimes
      \slash          \veebar                  \barvee
      \cupdot         \intercal                \amalg
      \circledcirc    \circleddash             \circledast
      \boxbar         \obar                    \merge
      \minuscolon     \dotsminusdots
      aF  
      = < > :
      \leq          \geq          \equiv       \models
      \prec         \succ         \sim         \perp
      \preceq       \succeq       \simeq       \mid
      \ll           \gg           \asymp       \parallel
      \subset       \supset       \approx      \bowtie
      \subseteq     \supseteq     \cong        \Join
      \sqsubset     \sqsupset     \neq         \smile
      \sqsubseteq   \sqsupseteq   \doteq       \frown
      \in           \ni           \propto      \vdash
      \dashv        \dots         \doteqdot    \leqq
      \geqq         \lneqq        \gneqq       \lessgtr
      \leqslant     \geqslant     \eqgtr       \eqless
      \eqslantless  \eqslantgtr   \lesseqgtr   \backsim
      \backsimeq    \lesssim      \gtrsim      \precsim
      \precnsim     \gnsim        \lnsim       \succsim
      \succnsim     \nsim         \lesseqqgtr  \gtreqqless
      \gtreqless    \subseteqq    \supseteqq   \subsetneqq
      \supsetneqq   \lessapprox   \approxeq    \gtrapprox
      \precapprox   \succapprox   \precnapprox \succnapprox
      \npreccurlyeq \nsucccurlyeq \nsqsubseteq \nsqsupseteq
      \sqsubsetneq  \sqsupsetneq  \nlesssim    \ngtrsim
      \nlessgtr     \ngtrless     \lnapprox    \gnapprox
      \napprox      \approxeq     \approxident \lll
      \ggg          \nparallel    \Vdash       \Vvdash
      \nVdash       \nvdash       \vDash       \nvDash
      \nVDash       \oequal       \simneqq     \triangle
      \triangleq         \triangleeq         \triangleleft
      \triangleright     \ntriangleleft      \ntriangleright
      \trianglelefteq    \ntrianglelefteq    \trianglerighteq
      \ntrianglerighteq  \blacktriangleleft  \blacktriangleright
      \equalparallel     \measuredrightangle \varlrtriangle
      \Doteq        \Bumpeq       \Subset      \Supset
      \backepsilon  \because      \therefore   \bot
      \top          \bumpeq       \circeq      \coloneq
      \curlyeqprec  \curlyeqsucc  \eqcirc      \eqcolon
      \eqsim        \fallingdotseq \gtrdot     \gtrless
      \ltimes       \rtimes       \lessdot     \ne
      \ncong        \nequiv       \ngeq        \ngtr
      \nleq         \nless        \nmid        \notin
      \nprec        \nsubset      \nsubseteq   \nsucc
      \nsupset      \nsupseteq    \pitchfork   \preccurlyeq
      \risingdotseq \subsetneq    \succcurlyeq \supsetneq
      \varpropto    \vartriangleleft \scurel
      \vartriangleright \rightangle \equal     \backcong
      \eqdef        \wedgeq       \questeq     \between
      \veeeq        \disin        \varisins    \isins
      \isindot      \varisinobar  \isinobar    \isinvb
      \isinE        \nisd         \varnis      \nis
      \varniobar    \niobar       \bagmember   \ratio
      \Equiv        \stareq       \measeq      \arceq
      \rightassert  \rightModels  \smallin     \smallowns
      \notsmallowns \nsimeqa  
     \leftarrow \longleftarrow \uparrow \Leftarrow \Longleftarrow
     \Uparrow \rightarrow \longrightarrow \downarrow \Rightarrow
     \Longrightarrow \Downarrow \leftrightarrow \updownarrow
     \longleftrightarrow \updownarrow \Leftrightarrow
     \Longleftrightarrow \Updownarrow \mapsto \longmapsto \nearrow
     \hookleftarrow \hookrightarrow \searrow \leftharpoonup
     \rightharpoonup \swarrow \leftharpoondown \rightharpoondown
     \nwarrow \rightleftharpoons \leadsto \dashrightarrow
     \dashleftarrow \leftleftarrows \leftrightarrows \Lleftarrow
     \Rrightarrow \twoheadleftarrow \leftarrowtail \looparrowleft
     \leftrightharpoons \curvearrowleft \circlearrowleft \Lsh
     \upuparrows \upharpoonleft \downharpoonleft \multimap
     \leftrightsquigarrow \rightrightarrows \rightleftarrows
     \rightrightarrows \rightleftarrows \twoheadrightarrow
     \rightarrowtail \looparrowright \rightleftharpoons
     \curvearrowright \circlearrowright \Rsh \downdownarrows
     \upharpoonright \downharpoonright \rightsquigarrow \nleftarrow
     \nrightarrow \nLeftarrow \nRightarrow \nleftrightarrow
     \nLeftrightarrow \to \Swarrow \Searrow \Nwarrow \Nearrow
     \leftsquigarrow \overleftarrow \overleftrightarrow \cwopencirclearrow
     \downzigzagarrow \cupleftarrow \rightzigzagarrow \twoheaddownarrow
     \updownarrowbar \twoheaduparrow \rightarrowbar \updownarrows
     \barleftarrow \mapsfrom \mapsdown \mapsup \Ldsh \Rdsh
     z, ; . ! \ldotp \cdotpz}
       \sum \prod \coprod \bigcap \bigcup \bigsqcup \bigvee
       \bigwedge \bigodot \bigotimes \bigoplus \biguplus
       zlim liminf limsup sup max minz.\int \oint \iint \oiint \iiint \oiiint \iiiintz:rm cal it tt sf bf bfit default bb frak scr regular normalz
      arccos csc ker min arcsin deg lg Pr arctan det lim sec arg dim
      liminf sin cos exp limsup sinh cosh gcd ln sup cot hom log tan
      coth inf max tanhzn
      | \| / \backslash \uparrow \downarrow \updownarrow \Uparrow
      \Downarrow \Updownarrow . \vert \Vertz[
      ( [ \{ < \lfloor \langle \lceil \lbrace \leftbrace \lbrack \leftparen \lgroup
      z]
      ) ] \} > \rfloor \rangle \rceil \rbrace \rightbrace \rbrack \rightparen \rgroup
      u   αu   ωr   r  c                    t        j                         dG fd}dHd}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               _!        t9               _"        xj>                  j<                  z  c_         |        xjB                  d tG        jD                        d      z   dz   z  c_!        xj@                  d tI        jD                        d      z   dz   z  c_         tK        ddj                  d      z   dz         _&        tK        djC                  d            _'        tK        djC                  d            _(        tK        djC                  d            _)         |dg  jT                   jV                        j?                  d
      z
  _,         |d jZ                        _.        j.                   tG        jD                        d      z   j2                  z   _/        j.                   tG        jD                        d      z   ta               z   _1        tK        djA                  d      jA                  d      z         _2        tK        djA                  d      jA                  d      z         _3        tK        djA                  d      jA                  d      z         _4        tK        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   jA                  d      z   jA                  d      z         _5        tK        d!t-        d" tI        tm        d#      jD                  z         d$      z   d#z         jA                  d      z         _7        tK        d%jA                  d&            _8        tK        d'jA                  d&            _9        tK        d(jC                  d)      jC                  d&      z         _:        tK        d*jC                  d)      jC                  d&      z         _;        tK        d+ty        dd,d-            _=        tK        d. t}        ddt        tI        jD                              tG        t1        d/      j                               z   0      d1            _A         t-        j<                        d2       tI        t	        d3d4g      j<                  z
        d5      z    t        d6      d7      z    t        d8      d7      z  j?                  d2       t        d6      d7      z   z  _B        j                  jL                  z  j*                  z  j                  z  _C        xjD                  j                  j:                  z  jb                  z  j&                  z  z  c_"        tK        d9d tG        j                        d      z   dz         _D        tK        d:d tG        j                        d      z   dz         _E        xj<                  jN                  jP                  z  jR                  z  jX                  z  j$                  z  j\                  z  j                  z  j^                  z  jd                  z  jf                  z  jh                  z  jj                  z  jt                  z  jv                  z  jn                  z  jp                  z  jr                  z  jz                  z  j                  z  j                  z  j:                  z  z  c_        d;j7                  d<      t        d=      z  z
  }xj:                  d>j7                  d?      t        d=      z  z
   tG        j                  j:                  z  |z        d@      z   dAz   j7                  dB      t        d=      z  z
  z  c_        tI        jD                        _G        ty        dCd,dDE      _H        t        dF      j#                         _I        j                  tG        j                  j                  z         z   ta               z   _J         |        j                   _K        j                   _L        dD _M        y c c}w )INc                     t              j                         D ]T  \  } }| j                  d      r| dvr|j                  |        t	        |       s:|j                  t        |              V y )N_)token	placeable
auto_delim)varsr"  ru  set_namehasattrr  rV  )r#  r   r^  rN   s     r2   set_names_and_parse_actionsz4Parser.__init__.<locals>.set_names_and_parse_actions6  sd     GMMO 	AS~~c* "FFS)tS),,WT3-?@	ArC   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  alpharR  nonalpha)isalphar   r   r.  r1  rQ   reescape)r  r  ends_with_alphaends_with_nonalpharh  s        r2   csnamesz Parser.__init__.<locals>.csnamesE  s     O!# 48##%#**40&--d3	4
 OVV((3ryy/#BC&8sb XXc"))5G&HI	 W  rC   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]+rh  rT   z\mathr1  r2  z\hspacez\phantomr  z\llapz\rlapaccentz\fracrV   denz\dfracz\binomz\genfracldelimrdelimrulesizestylez\sqrt{value}r3  r4  rootz	\overlinebodyz
\underlinez\overset
annotationz	\undersetz\textr*   )end_quote_charz	\substackz\\)openerclosercontentpartsnucleusr  r9  subsuperz'*apostrophesz'+z\operatornamez\boldsymbol\middlemdelimzExpected a delimiterz\leftleftr  z\rightright$F)unquote_resultsz(?:(?:\\[$])|[^$])*r  )r  r   r  zIterable[str]r   r   )NtypesSimpleNamespacer   float_literalr   _space_widthsr  r  r   r  r  r.  r1  rQ   r  r  r   leave_whitespacer0   unknown_symbol
_fontnamesrT   r   start_groupr   	end_group_delimsdelimr   r  r  named_placeablerequired_groupoptional_groupr  r   r   r  customspacer  llaprlap_accent_map_wide_accentsr  _function_namesfunctionr  r   unclosed_groupfracdfracbinomgenfracr
   sqrtoverline	underlineoversetundersetr   textr   r	   suppresssubstackr  simpleoperatorname
boldsymbolr  rp   math_stringnon_mathmain_expression_math_expression_needs_space_after_subsuper)rN   r  r  er  r^  s   `    @r2   rO   zParser.__init__3  s1	   !!#
	A	" !!CD56$"4"45g>56#'??3aS\355DF
5&--RYY0133

 
 "!# 	
 1508"64??;#H/Fvdoo/Fv/N$NORUU"3<!$,,/ %Y$Y$Y$Y$Y$Y 	
akk)#%	S#6:agg#6w#??#EE	S#59QWW#5g#>>DDJaoog.F(F(LMQ%5%5g%>?	Xq//89Xq//89 HF 0 0F43E3EFG&' 	
 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'?@
-)9)9&)AB\*Q-=-=f-EEG	 \*Q-=-=f-EEG
 X|CcJKO;c#/4Yqww5G/H'1'&/2J2J2L'M0NOOVXY
 #Xakk"9-:yc
+akk9::FGuT{=)* eDk-()   +keDk-.HH	J 	

 77Q]]*QVV3ajj@	HHll 	
 -s5IZ5I&5Q/QTW/WXC"6*QXX"6w"??#EG 	
II'hhhh jj	
 nn gg ff gg gg	 ii
 ii jj ff jj kk  ff!" ll#$ jj%& ll'	
. qwwx059O3PPQ	%0F*GGH:jALL069:5AB777+e4J.KKM	
 $AGG,&sD%H 67HHJ
JJAMMAJJ$>??)+M 	
 	$%66 ! ,1(s 4s   &i
c                \   t        |dd||      g| _        i | _        	 | j                  j	                  |      }g | _        d| _        i | _        t        j                          t        j                  t        |d         S # t
        $ r#}t        d|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,  r   NF)r  _state_stack_em_width_cacher>  parse_stringr   r/   explainr@  r   reset_cacher   r   r>  )rN   rH  fonts_objectrU   r   resultr1   s          r2   parsezParser.parse  s     ixEGFH	>%%2215F +0(!!!#vveVAY'' " 	>TCKKN23=	>s   A? ?	B+B&&B+c                     | j                   d   S )z&Get the current `State` of the parser.r  )rC  r   s    r2   	get_statezParser.get_state
	  s      $$rC   c                8    | j                   j                          y)zPop a `State` off of the stack.N)rC  r  r   s    r2   	pop_statezParser.pop_state	  s    rC   c                r    | j                   j                  | j                         j                                y)z=Push a new `State` onto the stack, copying the current state.N)rC  r   rL  r  r   s    r2   
push_statezParser.push_state	  s&      !1!6!6!89rC   c                6    t        |j                               gS rL   )r>  as_listrN   r  s     r2   r=  zParser.main	  s    dlln%&&rC   c                H    | j                   j                  |d   dd d      S )Nr   r   r  T)	parse_all)r?  rE  rS  s     r2   r;  zParser.math_string	  s(    $$11$q'!B-41PPrC   c                Z    t        |j                               }| j                          |gS rL   )r>  rR  rN  )rN   r  hlists      r2   rp   zParser.math	  s#    dlln%wrC   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	  rL  r>  rP  r   r   rT   )rN   r  rH  r  symbolsrW  s         r2   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   )rP  rL  rT   r>  r	  rN  )rN   r  r  r  rW  s        r2   r5  zParser.text,	  sT     
tAw7!tAu~78w 8s   A!c                >   | j                         }|j                  |j                  |j                  f}| j                  j                  |      }|@|j                  j                  d|j                  |j                        }|| j                  |<   t        ||z        S )Nr  )	rL  rT   rU   r   rD  r   r  r   rK  )rN   
percentager  r#  r7   s        r2   _make_spacezParser._make_space4	  s      zz5>>5995$$((-=MM**8U^^UYYOE(-D  %EJ&''rC   gKqU?g0Bxq?g%?g1ZGU?r  rf   gKqUſ)\,z
\thinspacez\/z\>z\:z\;z\ r:  z\enspacez\quadz\qquadz\!c                N    | j                   |d      }| j                  |      }|gS Nr  )r  r^  )rN   r  rV   rM   s       r2   r  zParser.spaceR	  s-      g/s#urC   c                ,    | j                  |d         gS ra  )r^  rS  s     r2   r$  zParser.customspaceW	  s      g/00rC   c                6   |d   }|dk(  rd}	 t        || j                               }|| j                  v rt        d |d | d d d   D        d      }| j                  sJ|| j                  v r?t        |d | j                               dk(  s|d	h| j                  | 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   -r   zUnknown symbol: %sc              3  ,   K   | ]  }|d k7  s	|  ywr  NrB   r   r  s     r2   r   z Parser.symbol.<locals>.<genexpr>m	       CA!s(aC   
r  r-  r   r1  r  Tr  c              3  ,   K   | ]  }|d k7  s	|  ywrf  rB   rg  s     r2   r   z Parser.symbol.<locals>.<genexpr>{	  rh  ri  c              3  ,   K   | ]  }|d k7  s	|  ywrf  rB   rg  s     r2   r   z Parser.symbol.<locals>.<genexpr>|	  s     AASaAri  r   ,r2  .)r	  rL  r/   r   _spaced_symbolsr  r@  _binary_operatorsr(  rD  _left_delims_relation_symbolsr>  r^  _punctuation_symbolsr)  )	rN   rH  r  r  r  r{  r1   	prev_char	next_chars	            r2   r0   zParser.symbolZ	  s   K8 !A	I4>>+,D
 $$$ C4C2CRHI 00///$3(A-?J"//?J262H2H?J 2J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   E9 9	FFFc                (    t        ||d|d          )NzUnknown symbol: rh  r  rN   rH  r  r  s       r2   r  zParser.unknown_symbol	  s    !!S,<T&\N*KLLrC   c                     d|d   _         |d   S )NTr  )rA  rS  s     r2   r  zParser.phantom	  s    #'W G}rC   c                R    t        t        |d   j                         |d   g      gS Nr  r>  rK  r7   rS  s     r2   r%  zParser.llap	  s+    tT']00014=ABCCrC   c                R    t        |d   t        |d   j                         g      gS ry  rz  rS  s     r2   r&  zParser.rlap	  s+    tG}dDM,?,?+?&@ABCCrC   hatz\circumflexaccentbrevez\combiningbrevebarz\combiningoverlinegravez\combininggraveaccentacutez\combiningacuteaccenttildez\combiningtildedotz\combiningdotaboveddotz\combiningdiaeresisdddotz\combiningthreedotsaboveddddotz\combiningfourdotsabovevecz\combiningrightarrowabove"`'r:  rm  r9  z\rightarrowz
\leftarrowz\circ)overrightarrowoverleftarrowmathringzwidehat widetilde widebarc                   | j                         }|j                         }|d   }|d   }|| j                  v r-t        d|z   |j                  |t
              }t        |g      }nat        | 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  r  g      @exactlyr   g       @)rL  rs  r(  r  r7   r  r  r'  r  r  r@  rb  r  r>  )rN   r  r  rt  r  r   
accent_boxcentereds           r2   r  zParser.accent	  s     99;	h5kT'''&vsyy%FDJ *.H 0 0 8%@J#!!#!!# $syy3"7!DEHsyy),RS)se  	rC   c                @    | j                  |||      }|d   |_        |S )Nrh  )r9  function_name)rN   rH  r  r  rW  s        r2   r*  zParser.function	  s'    !!!S$/"6lrC   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r"|| j                  | j                  d	         gz  }| j                          |	d
v | _        t!        |      S )Nr  rh  r   zoperatorname{}c              3  ,   K   | ]  }|d k7  s	|  ywrf  rB   rg  s     r2   r   z&Parser.operatorname.<locals>.<genexpr>	  s     C!s(!Cri  r-  r9  r  r_  >   r  r9  )rP  rL  rT   ra  r	  r  r   r   r(  r   r  r  r^  r  rN  r@  r>  )rN   rH  r  r  r  
hlist_listrh  r  next_char_locrt  
delimiterss              r2   r9  zParser.operatorname	  s;    
!#
F| 	%A!T"!!#!!!$As#!!$q%.1!!!$	% c$i!+dL)S!122MCQ}~%6CRH	\\S#J.
J&4++D,>,>u,EFGGJ ,5
+B(Z  rC   c                    | j                          |j                  d      r$|j                  d      | j                         _        g S NrT   )rP  r   rL  rT   rS  s     r2   r  zParser.start_group	  s5    88F$(HHV$4DNN!	rC   c                >    t        |j                  dg             }|gS Nr  r>  r   )rN   r  grps      r2   r  zParser.group	  s    DHHWb)*urC   c                8    t        |j                  dg             S r  r  rS  s     r2   r"  zParser.required_group	  s    TXXgr*++rC   c                &    | j                          g S rL   )rN  r   s    r2   r  zParser.end_group	  s    	rC   c                .    t        |t        |      d      )NzExpected '}')r   r(  rv  s       r2   r+  zParser.unclosed_group	  s    !!SV^<<rC   c                6    |d   | j                         _        g S r  )rL  rT   rS  s     r2   rT   zParser.font
  s     $V	rC   c                    t        |t              r|j                  | j                  v S t        |t              r$t        |d      r|j                  | j                  v S y)Nr  F)ra  r	  r  _overunder_symbolsr>  r  r  _overunder_functionsrN   r  s     r2   is_overunderzParser.is_overunder
  sN    gt$99 7 777'GG_,M((D,E,EEErC   c                T    t        |t              r|j                  | j                  v S yrf  )ra  r	  r  _dropsub_symbolsr  s     r2   
is_dropsubzParser.is_dropsub
  s$    gt$99 5 555rC   c                D    t        |t              r|j                         S yrf  )ra  r	  r  r  s     r2   r  zParser.is_slanted
  s    gt$%%''rC   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%                  |      rg }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        |      }||_        | j:                  r| j=                  | j>                  d         gng }d| _        t        |g|      }|gS |}tA        |t              r|j                  }t        |      r[tA        |d   tB              rtA        |d   tD              r|d d }|d   }tA        |tD              r|jF                  jH                  |_        t        |d      }n7tA        |tD              r|jF                  jH                  |_        t        |g      }|j
                  jK                         }|j2                  }d
}| jM                  |      r|j4                  }|jN                  |z  }|jN                  |z  }| jQ                  |      r||jN                  |z  z  }||jR                  ||dz  dz  z
  z  z  }| jM                  |      r?d|jN                  z  |jT                  z
  |z  }d|jN                  z  |jT                  z   |z  }nd}|jW                         rd
}d
}nz|j
                  j                  |j                  |j                  tX        z  |j                        } |j2                  |jZ                  | z  z
  }|j4                  |j\                  | z  z   }|t        tC        |      t_        j`                  tb        |      g      }!|!j)                          | jM                  |      r||j\                  |z  z   }n-t+        ||jd                  |z  |!j2                  |dz  dz  z
        }||!_        nst        tC        |      |g      }!|!j)                          | jM                  |      r||j\                  |z  z
  }n*t+        ||jf                  |z  |!j4                  |dz  z         }|	| |!_        nt        tC        |      |g      }"|"j)                          | jM                  |      r||j\                  |z  z   }nt+        ||jh                  |z        }d|z  ||!j4                  z
  |"j2                  |z
  z
  z
  }#|#d
kD  r,||#z  }|dz  dz  |z
  |!j4                  z   }#|#dkD  r
||#z  }||#z  }t7        |!tC        ||!j4                  z
  |"j2                  |z
  z
        |"g      }!||!_        | jM                  |      s"|!xj&                  |jj                  |z  z  c_        | j:                  r| j=                  | j>                  d         gng }d| _        t        ||!g|      }|gS )Nr  r   r  r  r  zDouble subscriptzDouble superscriptr   r  r   g      @r  r_  Fr  r  rf   r   rQ     )6r   r  r(  r   rL  r  r   rT   rU   r   r   r>  r  r%  extendr0   r  r@  r  r7   r  rl   r  r  r   r8   r9   rb  r$  r@  r^  r  ra  rK  r	  r  r   r   r  r  r  r  r  r  r  r  r  r   r   r  r  r  r  r  )%rN   rH  r  r  r  r  napostrophessubr   opargr  rule_thicknessr  r  vlistr  r7   vgaprW  vltoptional_spacingrI  	last_charrL  r   	lc_heightlc_baseline	superkernsubkernshift_up
shift_downshrunk_x_heightrx   ry   clrr   s%                                       r2   r  zParser.subsuper
  s7   ((9d1g.88J+488M267Ne!)BhSy?-.@AA$-.BCC   >>JJ		3==,,UZZS}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#'#C#C "&!1!1$2D2DU2K!L MIK /4D,C3"234F8O 	gu%"++L< |B/6"<#3T:#/#4L(,	i.&/&8&8&@&@IOL%8G'4("+"4"4"<"<	WI&G 113&&	??9%#//K LL8+	,,)??9%00I--X\A=M1MNNIy)v||+f.C.CCyP-0E0EER	 !HJ#mm77

ENN]:EIIGO~~(HHH /)IIJ =
 tG}affT3&789AHHJy)(6>>H+DD
 V[[8-C!"HqL1,<!<>
'AN tI./AHHJy)$v~~'@@xx)?8VW<AWX{"* 4=#./
??9-!,v~~/H!HJ!$Zx1G!HJ >)!AGG+:0EFH8#%J"Q,*X5?CQw C"c)
(QWW,J1FGH  ",y)GGv**X55G
  $?? "--d.@.@.GHIEG 	+0(6%567xrC   c           	        | j                         }|j                         }|j                  j                  |j                  |j
                  |j                        }	|j                  j                         }
|j                  j                  |j                  |j
                  |j                        }t        |j                        D ]+  }|t        z  }|j                          |j                          - t        |g      }t        |g      }t        |j                  |j                        }|j!                  |d       |j!                  |d       |r|| j"                  j$                  u r$|
j&                  |z  }|
j(                  |z  }d|z  }n |
j*                  |z  }|
j,                  |z  }|}|dz  }t        ||j.                  z
  |	|z   z
  |      }t        |	|z
  |j0                  |z
  z
  |      }t3        |t5        d|      t7        ||      t5        d|      |g      }|j0                  |z   |z   |	z
  |_        n|| j"                  j$                  u r$|
j&                  |z  }|
j(                  |z  }d|z  }n#|
j:                  |z  }|
j,                  |z  }d|z  }||j.                  z
  |j0                  |z
  z
  }t        ||      }t3        |t5        d|      |g      }||_        ||k  r|xj8                  ||z
  dz  z  c_        t=        t?        |      |t?        |      g      g}|s|r| jA                  |xs d||xs d      S |S )Nr  r   rf   r      rm  )!rL  rs  r  r   rT   rU   r   r   r   r  r  r  r  r  rl   r7   r@  r  r  r  r  r  r  r9   r8   rb  r  rp  r$  r  r>  r  _auto_sized_delimiter)rN   r  r  ruler  rV   r   r  rt  r   r   r  r  cnumcdenr7   num_shift_upden_shift_downr  r  num_clrden_clrr  min_clrdef_clrrI  s                             r2   _genfraczParser._genfrac
  s	    99;	mm33JJ		3113==,,UZZSu{{# 	A%HJJLJJL	 ##CIIsyy)

5)$

5)$ 444%{{X5!'!9$h%{{X5!'!91HE<$**4u9LMsSG;.4;;3OPRUVG47+ -7+	 E "&w!6!>!LE 444%{{X5!'!9i-%{{X5!'!9i-#djj0T[[>5QRGgw'C43< E "0E ""w'8A&=="*/OO1
 + *
 V--fmVV]sSSrC   c                <    | j                  t        |d               S )Nr  )r  rt   rS  s     r2   r  zParser.style_literal  s    s4#89::rC   c           	         | j                  |j                  dd      |j                  dd      |d   |j                  d| j                  j                        |d   |d         S )Nr  r-  r  r  r  rV   r   )r  r   r  r  rS  s     r2   r/  zParser.genfrac  sZ    }}HHXr"DHHXr$:dhhw0I0IJKe& 	&rC   c           	         | j                  dd| j                         j                         | j                  j                  |d   |d         S Nr-  rV   r   )r  rL  rs  r  r  rS  s     r2   r,  zParser.frac  sE    }}DNN$DDFOO%%tE{DKA 	ArC   c           	         | j                  dd| j                         j                         | j                  j                  |d   |d         S r  )r  rL  rs  r  r  rS  s     r2   r-  zParser.dfrac  sE    }}DNN$DDFOO(($u+tE{D 	DrC   c           	     b    | j                  ddd| j                  j                  |d   |d         S )Nr.  r0  r   rV   r   )r  r  r  rS  s     r2   r.  zParser.binom$  s5    }}aOO%%tE{DKA 	ArC   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  r  r   r   ur   )rL  rs  r  r  rl   r7   r@  rb  r  r9   r8   r$  )rN   rH  r  r  r  r  rt  centered_annotationcentered_bodyr7   r  r  s               r2   _gensetzParser._genset)  s   ,'
F|NN$DDF	'5!4&)'--}/B/BC!!%3E9-1}S1W:Q# E "/!4!47J7Q7Q!QTX!XE  #Q E rC   c                l   |j                  d      }|d   }| j                         }|j                         }|j                  |j                  z
  d|z  z   }|j
                  |j                  z   }t        d|||      }|j                  |j                  z
  }|j
                  |j                  z   }t        t        d|z        |t        d|z        g      }	t        t        |      t        d      |	g      }
|
j                  ||j                  |j                  z  dz  z   d|       |st        d	|j                   z  d
d
      }n+t        |      }|j#                          |j#                          t        t        |g      g      }| dz  |_        t        |t%        d|j                   z        ||
g      }|gS )Nr  r  r  r7  rf   r|    r  r  r   r  g      )r   rL  rs  r8   r$  r9   r  r>  r  rb  rp  rW  rd  rU   r   r   r7   r  rK  )rN   r  r  r  r  rt  r8   r9   checkpadded_body	rightside
root_vlistrW  s                r2   r0  zParser.sqrtK  s   xxG} 99;	 t0001y=@

T...|VUEB 2 22e000 T!i-0$Q]8KLM5<f{CD	%..599"<!JJ!5	*
 sU[[("b1D;DKKMKKME4&M?+
#)'C-
#$	
  wrC   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   r|  r  r  )rL  rs  r8   r$  r9   rb  rp  rW  r>  rd  rU   r   )	rN   r  r  r  rt  r8   r9   r  rW  s	            r2   r1  zParser.overlinet  s    F| 99;	t0001y=@

T... 5<fudV}EF	 	%..599"<!JJ!5	* yk"wrC   c                D   |d   }| j                         }|j                         }t        t        |g      t	        d|z        t        ||      g      }|j                  |j                  z   |z   }|j                  |_        ||j                  z
  |_        t        |g      gS )Nr  r   )rL  rs  rb  r>  rK  rp  r8   r9   )rN   r  r  r  rt  r  r  s          r2   r2  zParser.underline  s    F| 99;	4&MY%#
 
 u{{*Y6{{ell*ugrC   c           	     $   | j                         }t        |      rt        |D cg c]  }t        |t              r|j
                  ! c}      }t        |D cg c]  }t        |t              r|j                  ! c}      }d }t        |      D ][  \  }	}
|
dk(  st        j                  t        ||	dz            }|dk7  rt        |||||      ||	dz   <   n|j                  |       ||	= ] t        j                  t        t        t        z     |      }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   rm  )r  r   r  )rL  r(  rl   ra  r   r8   r9   	enumerater   r   r  remover  r   r	  r   r  r>  )rN   frontmiddlebackr  rx   r8   r9   r  idxelr  middle_partr  rW  s                  r2   r  zParser._auto_sized_delimiter  sq     v;FMq*Q:L!((MNF&KQ
1c8JKLEF$V, $R#sF37O4ACx*8 !65%+HsQw a(s$ &&cDj!16:KFEFKC<LLufeU6JL[!3;LLtVUE&IKe? NKs   FFF/Fc                V    | j                  |d   |d   j                         |d         S )Nr  r  r  )r  rR  rS  s     r2   r  zParser.auto_delim  s3    ))L$u+--/g@ 	@rC   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  )rP  rL  ra  r>  r%  r	  rT   r  r   r  _latin_alphabets_small_greekrN  )rN   r  r  rW  rh  r  ks          r2   r:  zParser.boldsymbol  s     G} 	 A!U#JJqMa&!AF%%'QAt$CC400033qr7d///#AF%%'!!#QQ!	 " 	U|rC   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 rL   r  r  s    r2   rF  z!Parser.substack.<locals>.<lambda>  s
    agg rC   r  rf   r  )rL  rs  r>  rl   rQ   r  r@  r   zipr  r(  rb  )rN   r  r  r  rt  r  rW  	max_widthr  r  cppairr   stackr  rI  s                   r2   r7  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  )
rH  r   rH  r   rU   r6   r   r6   r   r>  r  )r  r   r   zlist[Hlist])r  r   r   r   )r  r   r   r  )r]  r6   r   rK  )rH  r   r  rt   r  zParseResults | dict[str, str]r   r  r  )r   r  )r  r  r   r   )r  r   r  r   r  ru  r  r  rV   r>  r   r>  r   r  )r  r   r  zlist[Box | Char | str]r  r   r   r  )Yr=   r>   r?   r@   enumEnumr  rC  rD  ro  rq  _arrow_symbolsrn  rr  r  r  r  r  r)  _ambi_delimsrp  _right_delimsr  r  r+   rs  rh  rr  r   r  stringascii_lettersr  rO   rJ  rL  rN  rP  r=  r;  rp   r<  staticmethodr   convert_to_floatr  r5  r^  r  r  r$  r0   r  r  r%  r&  r'  r(  r  r*  r9  r  r  r"  r#  r  r+  rT   r  r  r  r  r  r  r/  r,  r-  r.  r  r3  r4  r0  r1  r2  r  r  r:  r7  r	  )r   r  rs  rr  r   s   0000@r2   r  r    sq   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 ::?%'C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@1D(*% :'Q
 !!1!B!BCM(  M
1.2.7<.`MDD/- 	0 	3	
 	3 	- 	0 	1 	6 	5 	7 	1 	3 	3 	-  	0!" 	/#$ *(#)K. 4::<=M.
!<, $N=

sjDD"'D,1DL;&A
D
A
@ ! Gh'R& $&<$$'$,1$L@4YGs   AK6r  )r0   r   r   r&   ))r   r   )rM   r   r  ztuple[float, float]r   rJ   )r  r   r   r   )r  r   r  r   r   r   )xr@   
__future__r   abcr  r  r   rI  loggingrp   r   r  r  rs  r  r/  typingr   r   numpyrR   numpy.typingr   	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$   TYPE_CHECKINGcollections.abcr%   r&   r'   r(   enable_packrat	getLoggerrp  r3   r5   r>   rE   rJ   r   r   ABCr   ABCMetar   r  rJ  r  r  r  r  r_  r  r  r   rB  r  r  r  r  r  r   r  r  r	  r  r"  r>  rb  rl  rp  rw  rz  r  rW  r  r  rK  r  r  rr   r  r  r  r  rB   rC   r2   <module>r     s   # 
       	 	         + + + + + +  D D < < 0 0 ??(AA    w./,3* 3& / * ( / <5 <5~* @z y!CGG y!xxIES[[ xIv]+- ]+@C!= C!L&A,#++ &AR({ (*'k '*t% t%nI B  A. A.H!"3 !<) 4- 0 */ * @$ *,3 ,(3 (D+4 D+NIT I.-/3 -/``<D `<FS<D S<l@3 @(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 #"L E  8Y@1#0 #0L62[ [rC   