rL itdZddlmZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Zddl mZddlZddlmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&ddl'Z(ddl)m*Z*ddl+m,Z,m-Z-m.Z.m/Z/dd l0m1Z1m2Z2m3Z3dd l4m5Z5m6Z6m7Z7m8Z8ejrr dd l:m;Z;dd l4meUd?eUd@eUdAeUdBeUdCeUdDeVdEeVdFeVdGeVdHeVdIeVdJeVeYeYdKZZddMZ[GdNdOZ\GdPdQe\Z]GdRdSe]Z^GdTdUe]Z_GdVdWe\Z`GdXdYe`ZaGdZd[e]ZbGd\d]ebZcGd^d_ebZdGd`dae]ZeGdbdceeZfGdddeeeZgGdfdgeZhehdhdiddhdehdhdidjdhdehdhdidkdhdehdhdhddidehdhdhddidjehdhdhddidkehdhdhddhdehdhdiddlddmeh_iGdndoe\ZjGdpdqecZkGdrdsedZlGdtdue\ZmGdvdwecZnGdxdyecZodddzZpdd{ZqGd|dLZrdd}ZsGd~dZty)z. Implementation details for :mod:`.mathtext`. ) annotationsN) NamedTuple)EmptyForwardLiteralGroupNotAny OneOrMoreOptionalParseBaseExceptionParseExceptionParseExpressionParseFatalException ParserElement ParseResults QuotedStringRegex StringEnd ZeroOrMorepyparsing_common nested_exprone_of)cbook)latex_to_bakomastix_glyph_fixesstix_virtual_fontstex2uni)FontPropertiesfindfontget_font)FT2FontFT2ImageKerning LoadFlags)Iterable)Glyphzmatplotlib.mathtextc t|S#t$rYnwxYw t|jdS#t$r}t |d|d}~wwxYw)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 TypeErrorrstripKeyError ValueError)symbolerrs Z/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/matplotlib/_mathtext.pyget_unicode_indexr2/sg 6{    v||D)** jM N s 5 AA  AcDeZdZUdZded<ded<ded<ded<ded <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. floatwidthheightdepthz.list[tuple[FT2Font, float, int, float, float]]glyphsz'list[tuple[float, float, float, float]]rectsN__name__ __module__ __qualname____doc____annotations__r1r4r4Es$  L M L :: 22rBr4cNeZdZUdZded<ded<ded<ded<ded<ded <y ) RasterParsea The namedtuple type returned by ``MathTextParser("agg").parse(...)``. Attributes ---------- ox, oy : float The offsets are always zero. width, height, depth : float The global metrics. image : FT2Image A raster image. r5oxoyr6r7r8r#imageNr;rArBr1rDrD[s'  I I L M L OrBrDc(eZdZdZddZddZddZy) 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|_yN)boxr9r:)selfrLs r1__init__zOutput.__init__zs;= >@ rBc ttj|jj|jj |jj g\}}}|jDcgc];\}}}|j|j|j|||z |jzf=}}}}|jD cgc]\}} } } ||| z | |z | | z f} } } }} t|||z||| Scc}}}wcc} } } }wrK)mapnpceilrLr6r7r8r9fontfontsizenumoffsetr:r4) rMwhdrErFinfogsx1y1x2y2rss r1 to_vectorzOutput.to_vectors GGdhhnndhhootxx~~FH1a#'++//"b$yy$--2q2v 7KL//%)JJ00 "b"b1r627BG,001a!eQB// /0s .AC5C< c dtg|jDcgc]\}}}||jjz!c}}}|jDcgc] \}}}}| c}}}}ddz } tg|jDcgc]\}}}||jj z !c}}}|jDcgc] \}}}}| c}}}}ddz } t g|jDcgc]\}}}||jjz!c}}}|jDcgc] \}}}}| c}}}}ddz} t g|jDcgc]\}}}||jjz !c}}}|jDcgc] \}}}}| c}}}}ddz} | | z } | | z |jjz }| | z |jjz }tttj| ttj|t |dz}t!|j| | f}|jD]Y\}}}|j"j%|t|t||jj&z |j(|[|jD]\}}}}t t||z dz d}|dk(r||zdz }t||dzdz z }n t|}|j+t||ttj|||zt-dd| ||z||Scc}}}wcc}}}}wcc}}}wcc}}}}wcc}}}wcc}}}}wcc}}}wcc}}}}w)Nrr) antialiased)minr9metricsxminr:ymaxmaxxmaxyminrLr8r7r#intrQrRshiprSdraw_glyph_to_bitmapicebergglyphdraw_rect_filledrD)rMrcrErFrZr\r]r^r_rgrkrjrhrWrXrYrGshiftedr7centerys r1 to_rasterzOutput.to_rastersk?MMRb4<<,,,M?/3zz::^RRb:?<=?@BCD?MMRb4<<,,,M?/3zz::^RRb:?<=?@BCD?MMRb4<<,,,M?/3zz::^RRb:?<=?@BCD?MMRb4<<,,,M?/3zz::^RRb:?<=?@BCD 4K 4K$((.. ( 4K$((// )RWWQZ#bgga#a)m.D*EF txx4%$0#NN )LBD II * *s2wB)=)=$= > ' + ) )&mm MNBBR"W)1-F{r'Q&1*!112G  " "3r7As2772;/?V L M1aAE1e44?N:M:M:M:s/$M6M=$N?N 3$N-N!$N#N*N)rLBox)returnr4)rcboolrwrD)r<r=r>r?rNrarurArBr1rIrIrsA 0"5rBrIcleZdZUdZded<ded<ded<ded<ded<ded<ded <ded <d ed <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). r5advancer7r6rgrjrkrhrorxslantedNr;rArBr1rzrzs6(N M L K K K K N MrBrzcTeZdZUded<ded<ded<ded<d ed <d ed <ded <y)FontInfor"rSr5rTstrpostscript_namerzrfrlrUr'rprVNr<r=r>r@rArBr1r~r~s' MO  H L MrBr~ceZdZdZd dZ ddZddZ ddZ ddZ ddZ ddZ dd Z dd Z dd 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_propload_glyph_flags)rMrrs r1rNzFonts.__init__s"3 0rBc y)z Get the kerning distance for font between *sym1* and *sym2*. See `~.Fonts.get_metrics` for a detailed description of the parameters. rA) rMfont1 fontclass1sym1 fontsize1font2 fontclass2sym2 fontsize2dpis r1get_kernzFonts.get_kernsrBctrKNotImplementedError)rMrSs r1 _get_fontzFonts._get_fonts!!rBctrKr)rMrS font_classsymrTrs r1 _get_infozFonts._get_info!!rBcD|j|||||}|jS)a# Parameters ---------- font : str One of the TeX font names: "tt", "it", "rm", "cal", "sf", "bf", "default", "regular", "bb", "frak", "scr". "default" and "regular" are synonyms and use the non-math font. font_class : str One of the TeX font names (as for *font*), but **not** "bb", "frak", or "scr". This is used to combine two font classes. The only supported combination currently is ``get_metrics("frak", "bf", ...)``. sym : str A symbol in raw TeX form, e.g., "1", "x", or "\sigma". fontsize : float Font size in points. dpi : float Rendering dots-per-inch. Returns ------- FontMetrics )rrf)rMrSrrrTrrZs r1 get_metricszFonts.get_metricss$2~~dJXsC||rBc j|j|||||} |jj||| fy)z At position (*ox*, *oy*), draw the glyph specified by the remaining parameters (see `get_metrics` for their detailed description). N)rr9append) rMoutputrErFrSrrrTrrZs r1 render_glyphzFonts.render_glyphs2 ~~dJXsC b"d^,rBcB|jj||||fy)zL Draw a filled rectangle from (*x1*, *y1*) to (*x2*, *y2*). N)r:rrMrr\r]r^r_s r1render_rect_filledzFonts.render_rect_filled$s  RR,-rBct)zF Get the xheight for the given *font* and *fontsize*. rrMrSrTrs r1 get_xheightzFonts.get_xheight+s "##rBct)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. rrs r1get_underline_thicknesszFonts.get_underline_thickness1s "##rBc ||fgS)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. rArMfontnamers r1!get_sized_alternatives_for_symbolz'Fonts.get_sized_alternatives_for_symbol8s3  rBNrrrr%rrrrrrrr5rrrrrrrr5rr5rwr5)rSrrwr") rSrrrrrrTr5rr5rwr~) rSrrrrrrTr5rr5rwrz)rrIrEr5rFr5rSrrrrrrTr5rr5rwNone rrIr\r5r]r5r^r5r_r5rwrrSrrTr5rr5rwr5rrrrrwzlist[tuple[str, str]])r<r=r>r?rNrrrrrrrrrrArBr1rrs 1),47DI %"""!)"#.8-!$-+.-:?-FK-PT-.$.*/.5:.@E.JN.$ $!/2!7L!rBrceZdZdZd fd Zd dZ d dZ d dZ ddZddZ ddZ dfd Z xZ S) TruetypeFontsza A generic base class for all font setups that use Truetype fonts (through FT2Font). ct|||tj|j|_i|_i|_t|j}t|}||j d<||j d<y)Ndefaultregular) superrN functoolscacher_fontsfontmapr rr!)rMrrfilename default_font __class__s r1rNzTruetypeFonts.__init__Isl *,<="8 -/ D223) !- I!- IrBc||jvr|j|}ntjt|}|jj |}|yt jj|rZt|}||j|<||j|j<||j|jj<tjt|SrK) rTcastrrgetospathexistsr!rlowerr")rMrSbasename cached_fonts r1rzTruetypeFonts._get_fontUs 4<< ||D)Hvvc4(Hkkooh/  277>>(#;"8,K$/DKK !7BDKK 33 4?JDKK 3399; <vvg{++rBc^|jdk(r|jdz dz |dz |zdz zSy)NCmex10@rdHr)rr7)rMrSrprTrs r1 _get_offsetzTruetypeFonts._get_offsetds:   8 +LL2%)hqj3.>r.AB BrBctrKr)rMrrrs r1 _get_glyphzTruetypeFonts._get_glyphjrrBc |j|||\}}}|j|||j||j} d| jD\} } } } |j || ||}t | jdz | jdz | jdz | | | |z| |z| jdz |z| }t|||j||| |S)N)flagsc3&K|] }|dz  yw)rNrA).0vals r1 z*TruetypeFonts._get_info..us!As#(!Ar) r{r7r6rgrjrkrhror|)rSrTrrfrUrprV) rset_size load_charrbboxrrzlinearHoriAdvancer7r6 horiBearingYr~r)rMrrrrTrrSrUr|rprgrkrjrhrVrfs r1rzTruetypeFonts._get_infoos!__Xz3Gc7 h$s$*?*?@!Aejj!AdD$!!$x=++e3<<"$++"&&+f4   00  rBc|j|}|j|||jd}|2|j|tj dd||}|j S|ddz |dz z|dz z}|S)Npcltmathtext.defaultxxHeightgP@g(@gY@)rrget_sfnt_tablermplrcParamsro)rMrrTrrSrrfrs r1rzTruetypeFonts.get_xheights~~h' h$""6* <&&#,,'9:C3PG?? " ?T)ho>#+NrBcd|z|zdz S)Ng?gR@rArs r1rz%TruetypeFonts.get_underline_thicknesss(3.$66rBc "||k(rs||k(rn|j||||| } |j||||| } | j} | j| j| jtj dz St |||||||||| S)Nr)rrS get_kerningrUr$DEFAULTrr)rMrrrrrrrrrinfo1info2rSrs r1rzTruetypeFonts.get_kerns E>i94NN5*dIsKENN5*dIsKE::D##EIIuyy'//JRO Owz4 %z4CI IrBr)rSz str | intrwr") rSr"rpr'rTr5rr5rwr5rrrrrrrwztuple[FT2Font, int, bool]) rrrrrrrTr5rr5rwr~)rrrTr5rr5rwr5rr) r<r=r>r?rNrrrrrrr __classcell__rs@r1rrCs . ,#( "" 9"   !) > 7 I I), I47 IDI I I % I IrBr) metaclasscheZdZdZdddddddd Zd6fd Zed jZ d7d Z id gddgddgddgddgddgddgddgddgddgd d!gd"d#gd$d%gd&d'gd(d)gd*d+gd,d-gd.d/d0gd1d2gd3Z d4D] \Z Z e e e e < d8d5Z xZS)9 BakomaFontsz Use the Bakoma TrueType fonts for rendering. Symbols are strewn about a number of font files, each of which has its own proprietary 8-bit encoding. cmsy10cmr10cmtt10cmmi10cmb10cmss10cmex10)calrmttitbfsfexct|||_t| |||jj D].\}}t |}||j|<||j|<0yrK) StixFonts_stix_fallbackrrN_fontmapitemsr r)rMrrkeyrfullpathrs r1rNzBakomaFonts.__init__sj'(9;KL *,<= ++- )HC}H (DLL  (DLL  )rB \int \ointcjd}||jvr;|tvr3t|\}}|dk(xs||jv}|j|}n1t |dk(r#|dk(}|j|}| t |}||j dk7r||fS|jj|||S)Nrrrr) rr_slanted_symbolsrlenr*get_char_indexrr)rMrrrrSrrUr|s r1rzBakomaFonts._get_glyphs t|| #(>+C0MHc8+Lt7L7L0LG>>(+D X]4'G>>(+D#h   3 3C 8A =g% %&&11(JL LrB())rr)r¡)r³)rµ)rÃ)))rr)r¢)r´)r¶)r!{))rr)r©)rn)r½)rr}))rr)rª)ro)r¾)rr[))rr )r£)rrX)r"]))rr#)r¤)ri)r#z\lfloor))r¥)rj)r¹)r$z\rfloor))r¦)rk)rº)r%z\lceil))r§)rl)r»)r&z\rceil))r¨)rm)r¼)r'z\langle))r­rD)r¿)r*z\rangle))r®rE)rÀ)r+ \__sqrt__))rp)rq)rr)rsz \backslash))r²)r/)rÂ)r-rG))rrG)r±)r.)rË)r,z\widehat))r^)rb)rc)rrYz \widetilde))r~)re)rf)rg)rrXr8)rr%r=)<>) )z \leftparenr)z \rightparenr)z \leftbracer)z \rightbracer)z \leftbracketr )z \rightbracketr#)\{r)\}r)\[r )\]r#c@|jj|||fgSrK)_size_alternativesrrs r1rz-BakomaFonts.get_sized_alternatives_for_symbols"&&**3(C0ABBrBrrr)r<r=r>r?rrNsetsplitr rr\aliastargetrrrs@r1rrsH)=..01MM 9M('  8'  8' 8 '  8'  ('  ('  8' " 8#' & 8'' * 8+' . 8/' 2 83' 6 87' : 8;' > 8?' B (C' F (G' J%k2$k2M' R ( ? v%7v$>5! ?C/2C7LCrBrceZdZdZdddZd fd ZedjZ d dZ d dZ d d Z xZ 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"cPtjd}tttdj |}|r |||nd|_t |!||djD]2}tjd|z}t|}||j|<4td}t|}||jd<t|j trKddd d d d d }|jD].\} } t| } | |j| <| |j| <0yy)Nzmathtext.fallback)stixstixsanscmzcal rm tt it bf sf bfitz mathtext.rr STIXGeneralSTIXSizeOneSymSTIXSizeTwoSymSTIXSizeThreeSymSTIXSizeFourSymSTIXSizeFiveSym)rrrdr)rrr StixSansFontsrr_fallback_fontrrNr^r rr isinstancer) rMrr fallback_rcfont_clstexfontproprSstixsizedaltfontssizenamerrs r1rNzUnicodeFonts.__init__*s;ll#67 %0  #k   #+ ((9;KL04  *,<=0668 )G<< g 56DD>D$(DLL ! )h'~! T d))9 5!$$&%% !' 0557 . d#D>%- T"%- T" . 6rBr c ||fSrKrA)rMrruniindexs r1_map_virtual_fontzUnicodeFonts._map_virtual_fontOs !!rBcj t|}d}|j |||\}}|}|r|dk(rQ|dkrLt |}tj|ddk7s$tj|jd rd }|dk(xs||jv}d}|j|} | b||jvr<| jd k(r-tt!j"d } |j|}| j%|} | dk7rd}|s|j&r|d vrt)|j&t*rd }|j&j-|||} | dj} | t/t0j2j5vrd} tj7d|| | S|d vr#t)|t*r|j-d ||Stj d||||jd } d}d} |fS#t$r'td}d}tj d|Y"wxYw)NT?Fz!No TeX to Unicode mapping for %a.rrrLz GREEK CAPITALrrzfonts/ttf/cmsy10.ttf)rrzComputer ModernzSubstituting symbol %s from %szNFont %r does not have a glyph for %a [U+%x], substituting with a dummy symbol.)r2r.r*_logwarningr~chr unicodedatacategoryr{ startswithr r_cmr10_substitutions family_namer!r_get_data_pathr rsrtrrlistrrvaluesrZ) rMrrrr} found_symbol new_fontnamecharr|rS glyphindexrTfamilys r1rzUnicodeFonts._get_glyphSsG C(-HL "33 j(,(  4Hw$68}((.q1S8&++D1<<_M#'L#t+Lt7L7L0LG L>>,/D 9 99 ,,7#,,-CDFD#88BH!00: ?#'L"" 11&t':':IF#H''228ZM1))T+"6"6"="="?@@.F :CH 11&tY7??4SAA A)3:~~d+Xw&&q C3xH L LLr?rrNr]r^r r~rrrrs@r1rbrbst  !.F=..01"$'",;"='=' 9='~!/2!7L!rBrbc@eZdZUiZded<ddZ dfd ZxZS) DejaVuFontsdict[str | int, str]rct|trt|||_nt |||_t |||_tj||||jjdddddd|jjD].\}}t|}||j|<||j|<0y)Nrkrlrmrnro)rrdrrprq)rtDejaVuSerifFontsrrsrrrbakomarrNrupdaterr rrMrrrr{rs r1rNzDejaVuFonts.__init__s d, -"+,=?O"PD "/0ACS"TD !"35EF t%68HI !    ,,. *IC~H (DLL !)DLL  *rBc|dk(r|jj|||St|}|jd}|'|j |}|dk7rt |d||St ||||S)N\primerr)rrr2rr r)rMrrrr}rSrrs r1rzDejaVuFonts._get_glyphs ) ;;))(JD D)-H>>$'D!00: ? 7-dJDD7%h C@ @rBrr)r<r=r>rr@rNrrrs@r1rrs1%'H"'**AA 9AArBrc &eZdZdZddddddddd Zy ) rzv A font handling class for the DejaVu Serif fonts If a glyph is not found it will fallback to Stix Serif DejaVu SerifzDejaVu Serif:italiczDejaVu Serif:weight=boldzDejaVu Serif:italic:bold DejaVu SansDejaVu Sans MonozDejaVu Serif DisplayrrrbfitrrrrNr<r=r>r?rrArBr1rrs( #(* $ HrBrc &eZdZdZdddddddddZy ) DejaVuSansFontszt A font handling class for the DejaVu Sans fonts If a glyph is not found it will fallback to Stix Sans rzDejaVu Sans:italiczDejaVu Sans:weight=boldzDejaVu Sans:italic:boldrzDejaVu Sans DisplayrNrrArBr1rrs( "') # HrBrceZdZUdZddddddddd d d d d d Zded<dZdZddZ ddZ e j ddZ y)raa 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. rjzSTIXGeneral:italiczSTIXGeneral:weight=boldzSTIXGeneral:italic:boldSTIXNonUnicodezSTIXNonUnicode:italiczSTIXNonUnicode:weight=boldrkrlrmrnro) rrrrnonunirmnonuniitnonunibfrrrdrrprqrrNFctj||||jjD].\}}t |}||j |<||j |<0yrK)rrNrrr rrs r1rNzStixFonts.__init__s[t%68HI,,. *IC~H (DLL !)DLL  *rBcZtj|}|jr||dvr td}d}nd}t|tr ||}nt|t r|}nd}|}d}t|}||kr,||zdz} || } || dkr| }n|| dkrn | dz}||kr, d|cxkr| dkrnn|| dz | d z}| d}n|sd}tjd }|d vrtj||}|d vrd |cxkrdkr n||fSd|z}||fS#t $r|d}YwxYw)N)rrrTFrrrdrrr)rr)rrrriinonuni) rr_sansrtdictr-rr rrr) rMrrr} font_mappingdoing_sans_conversionmappinglohimidranges r1r~zStixFonts._map_virtual_font s*--h7 JJ</$::-d3L$( !$) ! lD ) -&z2 d +"GG  BWBr'"uqj eAh&Bq)qBr'Qx8/uQx/#eAh.q9 8*<<(:; | #'++Hh?H 1 1f6RF6R!! (*H!!K -&t, -sDD*)D*c&ddddddd}|j||} t|}tdDcgc]2}|j |j |d k7r |t |f4}}|d k(r|dd }|S#t$r||fgcYSwxYwcc}w) Nrrr r#u⟨u⟩)rWrXrYrZrUrVrrA)rr2r.rrr r)rMrrfixesr}r% alternativess r1rz+StixFonts.get_sized_alternatives_for_symbolBs s3s67  iiS! %(-H5:!HLq>>!,;;HEJCM*L L , ',L %sO$ $ %Ls A:7B:B  B rr)rrrrrwz-list[tuple[str, str]] | list[tuple[int, str]]) r<r=r>r?rr@rsrrNr~rrrrArBr1rrs "')$+0      &H"N E*4"$'4",;4"l__GrBrceZdZdZdZy)rrzd A font handling class for the STIX fonts (that uses sans-serif characters by default). TN)r<r=r>r?rrArBr1rrrrZs ErBrrffffff?rceZdZUdZdZded<dZded<dZded<d Zded <d Z ded <d Z ded<dZ ded<dZ ded<y)FontConstantsBasez A set of constants that controls how certain things, such as sub- and superscripts are laid out. These are all metrics that can't be reliably retrieved from the font metrics in the font itself. 皙?zT.ClassVar[float] script_spaceg?subdroprsup1333333?sub1?sub2g?delta皙? delta_slanted皙?delta_integralN) r<r=r>r?rr@rrrrrrrrArBr1rrso '+L#*"%G $"D !"D !"D ! %E $ (+M$*),N%+rBrc,eZdZdZdZdZdZdZdZdZ dZ y)ComputerModernFontConstantsg333333?rg?rN) r<r=r>rrrrrrrrrArBr1rrs*LG D D D EMNrBrc$eZdZdZdZdZdZdZdZy)STIXFontConstantsr皙?333333?rrN) r<r=r>rrrrrrrArBr1rrs L D D EMNrBrceZdZdZdZdZdZy)STIXSansFontConstantsrrrrN)r<r=r>rrrrrArBr1rrsL DMNrBrc eZdZy)DejaVuSerifFontConstantsNr<r=r>rArBr1rrrBrc eZdZy)DejaVuSansFontConstantsNrrArBr1rrrrBrrrrrrrrrrrrjrrornrmrlrk)zBitstream Vera SanszBitstream Vera ParserStatectj|jj|jj t }|tur t|jtrtS|SrK) _font_constant_mappingrfontsetrrSrrrrtrrr)state constantss r1_get_font_constant_setrsW&**  +779JLI && u}}m 4$$ rBc8eZdZdZddZd dZd dZddZd dZy) NodezA node in the TeX box model.cd|_yNrrzrMs r1rNz Node.__init__s  rBc,t|jSrK)typer<rs r1__repr__z Node.__repr__sDz"""rBcyNrrA)rMnexts r1rzNode.get_kerningsrBc.|xjdz c_y)z Shrinks one level smaller. There are only three levels of sizes, after which things will no longer get smaller. rNrrs r1shrinkz Node.shrinks Q rBcy)zRender this node.NrArMrrrts r1renderz Node.rendersrBNrwrrwrrz Node | Nonerwr5rrIrr5rtr5rwr) r<r=r>r?rNrrrrrArBr1rrs&# rBrcLeZdZdZdfd Zdfd Z ddZxZS)rvz A node with a physical location.cLt|||_||_||_yrK)rrNr6r7r8)rMr6r7r8rs r1rNz Box.__init__s#    rBct||jtkrL|xjt zc_|xj t zc_|xjt zc_yyrK)rrrzNUM_SIZE_LEVELSr6 SHRINK_FACTORr7r8rMrs r1rz Box.shrink sH  99 & JJ= (J KK= (K JJ= (J 'rBcyrKrArs r1rz Box.renders rB)r6r5r7r5r8r5rwrrr)r<r=r>r?rNrrrrs@r1rvrvs=* )  # ). 49 >B rBrvc$eZdZdZdfd ZxZS)Vboxz$A box with only height (zero width).c(t|d||yrrrN)rMr7r8rs r1rNz Vbox.__init__s VU+rB)r7r5r8r5r<r=r>r?rNrrs@r1rrs.,,rBrc$eZdZdZdfd ZxZS)Hboxz.A box with only width (zero height and depth).c(t||ddyrrrMr6rs r1rNz Hbox.__init__"s B'rBr6r5rrs@r1rrs8((rBrcXeZdZdZd fd Zd dZd dZd dZd dZddZ d fd Z xZ 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`. ct|||_|j|_|j|_|j |_|j |_|j|_|jyrK) rrNrPrrSrrTr_update_metrics)rMrPrrs r1rNz Char.__init__3s\ }} JJ ** 99 rBc d|jzS)Nz`%s`rPrs r1rz Char.__repr__?srBcx|jj|j|j|j|j |j x}|_|jdk(r|j|_ n|j|_ |j|_ |j|jz |_ y)N ) rrrSrrPrTr_metricsr{r6ror7r8rMrfs r1r zChar._update_metricsBs"&,,":": IIt txx#I I$- 66S= DJ DJoo 78 rBc.|jjSrK)rr|rs r1 is_slantedzChar.is_slantedLs}}$$$rBc p|jj|jz }d}t|tr}|j j |j|j|j|j|j|j|j|j|j }||zS)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) rr{r6rtr rrrSrrPrTr)rMrr{kerns r1rzChar.get_kerningOs--''$**4 dD !<<(( 4??DFFDMM 4??DFFDMMD~rBc |jj||||j|j|j|j |j yrK)rrrSrrPrTrrs r1rz Char.render_s; !! Aq IIt txx IrBct||jtkre|xjt zc_|xj t zc_|xjt zc_|xjt zc_yyrK) rrrzrrTrr6r7r8rs r1rz Char.shrinkdsV  99 & MM] *M JJ] *J KK] *K JJ] *J 'rB)rPrrrrr)rwrxrr) r<r=r>r?rNrr rrrrrrs@r1r r &s1  9% I ++rBr c4eZdZdZddZdfd ZddZxZS)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:|jj|j|j|j|j |j x}|_|j|jz |_ |j|jz |_ d|_yr)rrrSrrPrTrrrjrgr6rhrkr7r8rs r1r zAccent._update_metricssso"&,,":": IIt txx#I I$-\\GLL0 llW\\1  rBcBt||jyrK)rrr rs r1rz Accent.shrinkzs  rBc |jj|||jjz ||jjz|j |j |j|j|jyrK) rrrrgrkrSrrPrTrrs r1rz Accent.render~sY !! A ***A 0B0B,B IIt txx IrBrr)r<r=r>r?r rrrrs@r1rrms IrBrcLeZdZdZdfd Zdfd Z ddZd fd ZxZS) Listz0A list of nodes (either horizontal or vertical).crt|dddd|_g||_d|_d|_d|_y)Nrr)rrN shift_amountchildrenglue_set glue_sign glue_orderrMelementsrs r1rNz List.__init__s< R$#(   rBcdjt| |j|j|j |j dj|jDcgc] }t|c}Scc}w)Nz/{}[{}]z, ) formatrrr6r7r8r"joinr#repr)rMrrs r1rz List.__repr__sa@GG G   JJ JJ)) II 61tAw6 7 9 97sA<cRtfdttdddDdx|_}||_|dk7r||z |_nd|_d|_|dk(rBt|jr,tjd|t|j|yyy)Nc34K|]}|dk7s |yw)rNrA)rr%totalss r1rz!List._set_glue..s C1F1INQ Cs rrrz %s %s: %r) rrr r&r%r$ glue_ratior#rrrr<)rMrsignr/ error_typers ` r1 _set_gluezList._set_glues" Cc&k*4R40 CQH H! !9?q MDMDN DO 64==! ['d)<)r?rNrr3rrrs@r1r r s2:9D!D&*D //rBr cNeZdZdZ d dfd ZddZ d d dZxZS) HlistzA horizontal list of boxes.cnt|||r|j|j||y)N)rWr4)rrNrhpack)rMr(rWr4do_kernrs r1rNzHlist.__init__s. "  IIK Q! rBcFg}t|j}|rt|D]r}|j|}||dz kr|j|dz}nd}|j||j |}|dk7sWt |}|j|t||_yy)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. rNr)r r#rrrKern)rM new_children num_childrenr%elemrkerning_distancers r1rz Hlist.kerns 4==) <( .}}Q'|a''==Q/DD##D)#'#3#3D#9 #r) 01D ''- .)DM rBcd}d}d}dgdz}dgdz}|jD]~}t|tr<||jz }t ||j }t ||j }Pt|tr||jz }tj|j rtj|j rt|dd} t ||j | z }t ||j | z}t|tr_|j} || jz }|| jxx| jz cc<|| jxx| j z cc<^t|t"sp||jz }||_||_|dk(r||z }||_||z }|dk(rd|_d|_d|_y|dkDr|j+|d|dy|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. rrpr" additionalrNrOverfulrUnderful)r#rtr r6rir7r8rvrQisinfgetattrGlue glue_spec stretch_orderstretch shrink_orderrr=r%r&r0r3) rMrWr4rXrYr total_stretch total_shrinkrBrErIs r1r:z Hlist.hpacks0   q tax  A!T"QWW 188$177OAs#QWW xx)"((1772C>26AAqxx!|,AAqww{+AAt$KK Y__$i556):K:KK6Y334 8H8HH4At$QWW # $   FA E 7DNDO DO  r6 NN1a : NN1b, ;rB)rrCT)r(r6rWr5r4"T.Literal['additional', 'exactly']r;rxrrrC)rWr5r4rOrwr)r<r=r>r?rNrr:rrs@r1r8r8sF%>A9E!%6)2 #6B?<3?26AAqww{+AAt$QKK Y__$i556):K:KK6Y334 8H8HH4At$Q[ At$"GII% I* q5 QJADJDJ  FA E 6DNDO DO  r6 NN1a : NN1b, ;rBrP)r(r6rXr5r4rO)rXr5r4rOr0r5rwr) r<r=r>r?rNrQinfrTrrs@r1rRrRsI#>A9E6 #6BG<3G<G<$(Gr?rNrrrs@r1rYrYhs@%DD!D&+D05D:>DrBrYc&eZdZdZddfd ZxZS)Hrulez.Convenience class to create a horizontal rule.cx||j}|dzx}}t| tj|||y)Nrget_current_underline_thicknessrrNrQrW)rMr thicknessr7r8rs r1rNzHrule.__init__s<  ==?I"S( 6rBrK)rrra float | Nonerrs@r1r]r]|s877rBr]c$eZdZdZdfd ZxZS)Vrulez,Convenience class to create a vertical rule.c|j}t| |tjtj|yrKr_)rMrrars r1rNzVrule.__init__s,99;  BFFBFFE:rB)rrrrs@r1rdrds6;;rBrdc@eZdZUded<ded<ded<ded<ded<y) _GlueSpecr5r6rKrlrJrrLNrrArBr1rgrgs L N MrBrgr?rdrg)filfillfilllneg_filneg_fill neg_filllemptyssc4eZdZdZ dfd Zdfd ZxZS)rHa 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.) ct|t|trtj |}||_yt|tr |}||_yt d)Nz.glue_type must be a glue spec name or instance)rrNrtrrg_namedr.rI)rM glue_typerIrs r1rNz Glue.__init__s[  i %!((3I #  9 -!I#MN NrBct||jtkr5|j}|j |j tz|_yy)Nr6)rrrzrrI_replacer6r)rMrTrs r1rz Glue.shrinksB  99 &AZZagg .EZFDN 'rB)rtz`_GlueSpec | T.Literal['fil', 'fill', 'filll', 'neg_fil', 'neg_fill', 'neg_filll', 'empty', 'ss']r)r<r=r>r?rNrrrs@r1rHrHs$ #A #GGrBrHc$eZdZdZdfd ZxZS) HCenteredzl A convenience class to create an `Hlist` whose contents are centered within its enclosing box. cVt|tdg|tddy)NrpFr;rrNrHr's r1rNzHCentered.__init__s* $t*>rBrc@eZdZdZdZdZdfd ZddZdfd ZxZ S) r=a A `Kern` node has a width field to specify a (normally negative) amount of spacing. This spacing correction appears in horizontal lists between letters like A and V when the font designer said that it looks better to move them closer together or further apart. A kern node can also appear in a vertical list, when its *width* denotes additional spacing in the vertical direction. rc0t|||_yrK)rrNr6rs r1rNz Kern.__init__s  rBc d|jzS)Nzk%.02frvrs r1rz Kern.__repr__s$**$$rBc|t||jtkr|xjt zc_yyrK)rrrzrr6rrs r1rz Kern.shrinks,  99 & JJ- 'J 'rBr rr) r<r=r>r?r7r8rNrrrrs@r1r=r=s(F E%((rBr=c.eZdZdZ d dfd ZxZS)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||jj|j|}|jj|j|j|j }|j }||z} |D]<\} } | |_t| |} | j| jz| d|zz k\s<nd} |jdk7st|dk(rN||  j| jzz }|xj|zc_t |} || jz } t|1 g| |_ y)Nrrrr)rrrSrrTrcopyr r7r8r rrNr")rMrPr7r8ralwaysfactorrr target_totalrrrshiftrs r1rNzAutoHeightChar.__init__s!}}FF JJ --++ JJ 3 ~ ) MHc!EJU#D{{TZZ'<#-+GG   ::?c,/14~%tzz)AB NNf $NU#DTZZ'E $ !rB)FN) rPrr7r5r8r5rrrrxrrbrrs@r1rrs(?C""/;""rBrc,eZdZdZdef dfd ZxZS) 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. Fcd|jj|j|}|j}|D]&\}}||_|||} | j|k\s&n| jz } |xj | zc_||} t || g| j|_yrK)rrrSrr6rTrrN) rMrPr6rr char_classrrrrrrs r1rNzAutoWidthChar.__init__s}}FF JJ  ) MHc!EJc5)DzzU"   # & #u% $ ZZ rB) rPrr6r5rrrrxrz type[Char])r<r=r>r?r rNrrs@r1rrs$QV*. '  rBrc  |\}}dd|||jz t| ddd fd d fd t|tsJ| 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. rc"|dkrdS|dkDrdS|S)NgegeArA)values r1clampzship..clampCst|tHH5HrBc d}d}|j}|j}}}|jD]S}t|tr)|j zz|j z =t|tr|j z ]t|trt|jdk(r|j z }||jzt|tr |n t|tr |nJd||j z|t|tr|j} |j} |j } t!j"| r |j} t!j"| r |j} | dkDr'| dkDr"|| z|j zz| | || z t|t$s|j&} | j |z } |dk7r~|dk(r=| j(|k(rj|| j*z }t- |j.|z}n<| j0|k(r-|| j2z }t- |j.|z}| |z } | z Vy)Nrrunreachable coder)r&r%r#rtr rr6r=r r r"r8rRrvr7r8rQrFrHrIrJrKroundr$rLr)rLcur_gcur_gluer&r% base_line left_edgerBedge rule_height rule_depth rule_widthrIrcur_hcur_v hlist_outoff_hoff_vr vlist_outs r1rzship..hlist_outFsG^^ MM   3 $A!T" > At$ At$qzz?a'QWW$E D%6E!!U+!! #Au-!! 8&88u 177NE%EAs#hh WW WW 88K("%**K88J'!$J?zA~% 2EHHV"U]EEM'6&E#At$KK &__u4 > A~$22j@$ (9(99H$)% x0G*H$IE"//:= I$4$44 %eCLL8,C&D Ee# #g3 $rBc d}d}|j}|j}}|jz}|jD]C}t |t r|j z $t |trt|jdk(r|j|jzz i|jz ||jz}|j |_t |tr |n t |tr |nJd||jz|t |trz|j} |j} |j } tj| r |j } | | z } | dkDsF| dkDsM| z |j!zz| | ot |t"r|j$} | j |z } |dk7r~|dk(r=| j&|k(rj|| j(z }t+ |j,|z}n<| j.|k(r-|| j0z }t+ |j,|z}| |z } | z )t |t2s;t5dy)Nrrrrz1Internal mathtext error: Char node found in vlist)r&r%r7r#rtr=r6r r r8r"r8rRrvrQrFrrHrIrJrKrr$rLrr rV)rLrrr&r%rtop_edgerBsave_vrrrrIrrrrrrrrs r1rzship..vlist_outsL^^ MM   . IA!T" At$qzz?a'QXX//EQXX%E%6E"F!iiAG!!U+!! #Au-!! 8&88u"QWW,E%EAs#hh WW WW 88J'!$Jz) ?zA~[(EHHV"U]EEM'6At$KK 'oo5 > A~$22j@$ (9(99H$)% x0G*H$IE"//:= I$4$44 %eCLL8,C&D Eu$ $At$"GII[. IrB)rr5rwr5)rLr8rwr)rLrRrwr)r7rIrtr8) rLxyrErFrrrrrrrrs @@@@@@@@r1rmrm2soFB E E E OE C[FI=$=$~9I9Iv c5 !! ! cN MrBcBdfd }tj|S)z$Helper class to raise parser errors.ct||rKr)rEloctoksmsgs r1 raise_errorzError..raise_errors!!S#..rBrErrrlrrrwT.Any)rset_parse_action)rrs` r1Errorrs/ 7 # #K 00rBcdeZdZdZ ddZd dZed dZejd dZd dZ y) ra 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. cJ||_||_||_||_||_yrK)r_fontrrTr)rMrrSrrTrs r1rNzParserState.__init__s%  $  rBc,tj|SrK)rrs r1rzParserState.copysyyrBc|jSrK)rrs r1rSzParserState.fonts zzrBc(|dvr||_||_y)N)rrrr)rr)rMr{s r1rSzParserState.fonts - -"DO rBcx|jj|j|j|jS)z.Return the underline thickness for this state.)rrrSrTrrs r1r`z+ParserState.get_current_underline_thicknesss,||33 IIt}}dhh0 0rBN) rrrSrrrrTr5rr5rwrr)r{rrwr)rwr5) r<r=r>r?rNrpropertyrSsetterr`rArBr1rrsJ [[ 0rBcdfd |jddd}||k(r!|djd|Dzn|}||td|zz 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. c3Kt|tr"|jD]}|Ed{y|jr|jyy7#wrK)rtrexprs resultsName)eltexprnamess r1rzcmd..namessL c? +  ' ;&& ' __// !'s+AA$Arrrc3&K|] }d|z yw)z{%s}NrA)rr{s r1rzcmd.. sBdFTMBrz Expected )rrrwzT.Generator[str, None, None])r^r+r)rargscsnamer0rs @r1cmdrsg"ZZQ  "Ffn BGGBeDkBB B"& TEIcU"344 55rBc eZdZdZGddej ZedjZ edjZ edjZ e e ze zZ edjZ edjZed jZed jZed jZed jZed jZedjZedjZeezezZeeededdzDcgc]?}t3j4t7|jdj9Ac}}}}Zeej>Z dfdZ!dgdZ"dhdZ#dfdZ$dfdZ%didZ&djdZ'dkdZ(dkdZ)e*e+jXZ-dkdZ.dldZ/dddd d d!d"d"d#dd$d%d& Z0dkd'Z1dkd(Z2 dmd)Z3dnd*Z4id+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAd:dBd2dCd4dDd6dEd8dFd,dGdHdIdJZ5edKjZ6dkdLZ7dndMZ8dndNZ9dkdOZ:dkdPZ;dkdQZdndSZ?dkdTZ@dpdUZAdpdVZBdpdWZCdnfdX ZD dqdYZEdkdZZFdkd[ZGdkd\ZHdkd]ZIdkd^ZJdnd_ZKeKxZLZMdkd`ZNdkdaZO drdbZPdkdcZQdkddZRdkdeZSxZTScc}}}}w)sParserz 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. ceZdZdZdZdZdZy)Parser._MathStylerrrdrN)r<r=r> DISPLAYSTYLE TEXTSTYLE SCRIPTSTYLESCRIPTSCRIPTSTYLErArBr1 _MathStylers   rBru+ * - − \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 zlim liminf limsup sup max minz.\int \oint \iint \oiint \iiint \oiiint \iiiintz3rm cal it tt sf bf bfit default bb frak scr regularz arccos csc ker min arcsin deg lg Pr arctan det lim sec arg dim liminf sin cos exp limsup sinh cosh gcd ln sup cot hom log tan coth inf max tanhzn | \| / \backslash \uparrow \downarrow \updownarrow \Uparrow \Downarrow \Updownarrow . \vert \Vertz[ ( [ \{ < \lfloor \langle \lceil \lbrace \leftbrace \lbrack \leftparen \lgroup z] ) ] \} > \rfloor \rangle \rceil \rbrace \rightbrace \rbrack \rightparen \rgroup uαuωrrc:tjdCfd }dDd}td_t j d_t jDcgc]}t|jc}d_ tddjd jttjt zd j#_td d _|d j(_t-dt j(d zdz_t1d_t j4_t9_t9_t9_t9_ t9_!t9_"xj>j<zc_|xjBdtGjDdzdzzc_!xj@dtIjDdzdzzc_ tKddjdzdz_&|dgjNjPj?d z _)|d jT_+j.tGjDdzj2z_,j.tGjDdzt[z_.tKdjAdjAdz_/tKdjAdjAdz_0tKdjAdjAdz_1tKddt-j6dzdzdzt-j6dzdzdzjdzdzdzt-jdzdzjAdzjAdz_2tKdt-dtItgdjDzd zdzjAd!z_4tKd"jAd#_5tKd$jCd%jCd#z_6tKd&jCd%jCd#z_7tKd'tqdd(d)_9tKd*tuddtwtIjDtGt1d+jyz,d-_=t-j<d.tIt d/d0gj<z d1ztd2d3ztd4d3zj?d.td2d3zz_>j jLzj*zj|z_?xjDj~j:zj\zj&zzc_"tKd5dtGj~d zdz_@tKd6dtGj~d!zdz_Axj<jRj$zjVzjzjXzj^zj`zjbzjdzjlzjnzjhzjjzjrzjzjzzzc_d7j7d8td9zz }xj:d:j7d;td9zz tGj~j:z|zd<zd=zj7d>td9zz zc_tIjD_Ctqd?d(d@A_DtdBj#_EjtGjjzzt[z_F|j_Gj_Hd@_Iycc}w)ENctjD]T\}}|jdr|dvr|j|t |s:|j t |Vy)N_)token placeable auto_delim)varsrrset_namehasattrrrG)rrrBrMs r1set_names_and_parse_actionsz4Parser.__init__..set_names_and_parse_actionssd GMMO AS~~c*"FF S)tS),,WT3-?@ ArBgroupc dg}g}|D]8}|djr|j|(|j|:tdj|dj t t j||rdnddj t t j|S)Nrz<\\(?P<{group}>(?:{alpha})(?![A-Za-z]){additional}{nonalpha})|r)ralpharCnonalpha)isalpharrr*r+rPreescape)rrends_with_alphaends_with_nonalphar{s r1csnamesz Parser.__init__..csnamess O!#  48##%#**40&--d3  4 OVV((3ryy/#BC&8sb XXc"))5G&HI W rBz[-+]?([0-9]+\.?[0-9]*|\.[0-9]+)space style_literalzI[a-zA-Z0-9 +\-*/<>=:,.;!\?&'@()\[\]|\U00000080-\U0001ffff]|\\[%${}\[\]_|]z|\\(?:{})(?![A-Za-z])rrz \\[A-Za-z]+r{rSz\mathrrz\hspaceaccentz\fracrUdenz\dfracz\binomz\genfracldelimrdelimrulesizestylez \sqrt{value}r r#rootrz \overlinebodyz\overset annotationz \undersetz\textr))end_quote_charz \substackz\\)openerclosercontentpartsnucleusrrNsubsuperz'* apostrophesz'+z \operatornamez \boldsymbol\middlemdelimzExpected a delimiterz\leftleftrz\rightrightr*F)unquote_resultsz(?:(?:\\[$])|[^$])*r)rrrz Iterable[str]rwr)JtypesSimpleNamespacer float_literalr _space_widthsrrrrrr*r+rPrrrleave_whitespacer/unknown_symbol _fontnamesrSr start_groupr end_group_delimsdelimrrrnamed_placeablerequired_groupoptional_grouprrr r customspace _accent_map _wide_accentsr_function_namesfunctionrrunclosed_groupfracdfracbinomgenfracr sqrtoverlineoversetundersetrtextrrsuppresssubstackrsimple operatorname boldsymbolrmath math_stringnon_mathmain _expression_math_expression_in_subscript_or_superscript)rMrrrRrrBs` @r1rNzParser.__init__s  ! ! # A "!!CD56$"4"45g>56#'?? 3aS\ 355DF 5 &--RYY013 3   "!#  1508"64??;#H/Fvdoo/Fv/N$NORUU "3< !$,,/%Y $Y $Y$Y$Y$Y akk)#% S#6:agg#6w#??#EE S#59QWW#5g#>>DDJaoog.F(F(LM  HF 0 0F43E3EF G& ' VT%9%9: --"5*QWW"5g">>LMM,?Jqww,?,HH9;Vh 0 0 7!:J:J5:Q QRi!1!1%!81;K;KE;R!RSi!1!1%!81;K;KE;R!RS  #(177#H- - 3 %HQWW%h/ 025 6 OOJ/ 025 6 .HQ__-g6 7:= =u%  & u%  &'   S;9VC[177%:;FCCcI Jw' () q'7'7'?@    \ *Q-=-=f-E EG    \ *Q-=-=f-E EG X|CcJKO;c#/4Yqww5G/H'1'&/2J2J2L'M0NOOVXY #Xakk "9 -:yc +akk9::FGuT{=)*eDk-( )  +keDk-.HH  J 77Q]]*QVV3ajj@  HHll    -s5IZ5I&5Q/QTW/WX C"6*QXX"6w"??#EG  HHhh jj nn   gg   ff  gg gg ii ii jj ff jj ff ll  jj!  (qwwx059O3PPQ %0F*GG H:jALL069:5A B 777+e4J.KK M $AGG,&sD%H  67HHJ JJAMMAJJ$>? ?)+ M  $%66 !-2)a 4s&f cft|dd||g|_i|_ |jj |}g|_d|_ i|_tjtjt|dS#t $r(}t dtj|dzdd}~wwxYw)z Parse expression *s* using the given *fonts_object* for output, at the given *fontsize* and *dpi*. Returns the parse tree of `Node` instances. rr rNF)r _state_stack_em_width_cacher' parse_stringr r.r explainr)r reset_cacherrr8)rMrE fonts_objectrTrresultr0s r1parsez Parser.parseis  ix EGFH N%%2215F,1)!!!#vveVAY''" NTN$:$:3$BBC M NsA?? B0#B++B0c |jdS)z&Get the current `State` of the parser.r)r,rs r1 get_statezParser.get_states  $$rBc8|jjy)zPop a `State` off of the stack.N)r,poprs r1 pop_statezParser.pop_states rBcr|jj|jjy)z=Push a new `State` onto the stack, copying the current state.N)r,rr5rrs r1 push_statezParser.push_states&   !1!6!6!89rBc6t|jgSrK)r8as_listrMrs r1r&z Parser.mainsdlln%&&rBcH|jj|ddddS)NrrrT) parse_all)r(r.r=s r1r$zParser.math_strings($$11$q'!B-41PPrBcZt|j}|j|gSrK)r8r<r8)rMrhlists r1r#z Parser.maths#dlln% wrBc |djdd}|Dcgc]}t||j}}t|}|j t j d|j_|gScc}w)Nrz\$r*r)replacer r5r8r:rrrS)rMrrErPsymbolsrAs r1r%zParser.non_mathso GOOE3 '67844>>+,88g  # -? @w 9s!Bc |j|j}d|_t|dDcgc]}t ||c}}|j |gScc}w)Nrr)r:r5rSr8r r8)rMrrrPrAs r1rz Parser.textsT   tAw7!tAu~78 w8sA!c||j}|j|j|jf}|jj |}|_|j jdtjdd|j|j}|j}||j|<t||zS)Nrrr4) r5rSrTrr-rrrrrr{r=)rM percentagerrr6rfs r1 _make_spacezParser._make_spaces  zz5>>5995$$((- =mm//cll#56 +GOOE(-D  %EJ&''rBgKqU?g0Bxq?g%?g1ZGU?rrdgKqUſ) \,z \thinspacez\/z\>z\:z\;z\ rQz\enspacez\quadz\qquadz\!cN|j|d}|j|}|gSNr)rrH)rMrrUrLs r1rz Parser.spaces-  g/s#u rBc,|j|dgSrK)rHr=s r1rzParser.customspaces  g/00rBc6|d}|dk(rd} t||j}||jvrt d|d|dddDd}|j sJ||jvr?t|d|jdk(s|d h|j|jvr|gSt|jd ||jd gd gS||jvrt d |d|dddDd}t d||dzdDd}|dk(r |d k(r|dk(r|gS|dk(r#|jr|jr|gSt||jd gd gS|gS#t$r}t||d|z|d}~wwxYw)NrrIu−zUnknown symbol: %sc3,K|] }|dk7s |ywrNrArrPs r1rz Parser.symbol..CA!s(aC rrrrrTr{c3,K|] }|dk7s |ywrOrArPs r1rz Parser.symbol..rQrRc3,K|] }|dk7s |ywrOrArPs r1rz Parser.symbol..sAASaArRrrMrrK)r r5r.r_spaced_symbolsrr)_binary_operatorsr r^ _left_delims_relation_symbolsr8rH_punctuation_symbolsisdigit) rMrErrrPrr0 prev_char next_chars r1r/z Parser.symbols K 8 !A I4>>+,D $$ $C4C2CRHI11///$3 (A-?J"//?J262H2H?J2Jv t//4##//46'+,--$++ +C4C2CRHIA378A2FICx# S(8 6MCxI--/I4E4E4Gv tT%5%5c%:;TJKKv E I%a&:Q&>@EH I IsE99 FFFc(t||d|d)NzUnknown symbol: r{rrMrErrs r1rzParser.unknown_symbol s!!S,.K sC!s(!CrRrrNrrI>rrNTF)r:r5rSrtr r rrr rrr _overunder_functionsrHrr8r)r8) rMrErrr hlist_listr{rP next_char_locr\ delimiterss r1r!zParser.operatorname8 sc   !# F| %A!T"!!#!!!$As#!!$q%.1!!!$ %c$i!+ dL ) S!12 2MCQ}~%6CRH \\S#J. Z 'D555 4++D,>,>u,EFG GJ   "04D -Z  16D -Z  rBc|j|jdr$|jd|j_gSNrS)r:rr5rSr=s r1rzParser.start_group[ s5  88F $(HHV$4DNN  ! rBc>t|jdg}|gSNrr8r)rMrgrps r1rz Parser.groupb sDHHWb)*u rBc8t|jdgSr~rr=s r1r zParser.required_groupf sTXXgr*++rBc&|jgSrK)r8rs r1r zParser.end_groupk s  rBc.t|t|d)Nz Expected '}')rr r^s r1rzParser.unclosed_groupo s!!SV^<r|dd }|d }t;|t>r|j@jB|_t|d}n7t;|t>r|j@jB|_t|g}tE| }|j2}d}|jG|r |j4}|jH| z}|jH| z}|jK|r||jH| zz }||jL|| dzd z z zz }|jG|r?d|jHz|jNz |z}d|jHz|jNz|z}nd}|ztt=|tQjRtT|g}|j)|jG|r||jV| zz}n|jX| z}||_n'tt=||g}|j)|jG|r||jV| zz }n|jZ| z}| | |_ntt=||g} | j)|jG|r||jV| zz}n|j\| z}d| z||j4z | j2|z z z }!|!d kDr||!z }t7|t=||j4z | j2|z z | g}||_|jG|s"|xj&|j^| zz c_||g}"|j`r)|"|jc|jddgz }"d|_0t|"}|gS)NrrrrrzDouble subscriptzDouble superscriptrrr@rorFr{rprrI)3rrr rr5rrrSrTrrr8rr#extendr/rr:rr6rriryrrr7r8rRr"rtr=r rr{rrrrrrrrrrrrrrr)rHr)$rMrErrrr napostrophessubropargrrule_thicknessrr%vlistrr6vgaprAvltr2 last_charr>r lc_height lc_baseline superkernsubkernr shift_downshift_uprtclrspaced_nucleusrs$ r1rzParser.subsuper s((9d1g.88J+488M267  Ne!) BhSy?-.@AA$-.BCC >> JJ 3--++ JJ 3 }b <( O%%dkk!S5):L&MN O JJL KKM   W %EEMME  E5;;/ E399-!C'D !5'* E9- eT!T]34wi(E KKy ) LL !3%( E9- d1dmU34 t+gmm;,C$C C5\F8O gu %"++L< |B/6"<#3T:#/#4L(, i.&/&8&8&@&@IOL%8G'4("+"4"4"<"< WI&G+51 &&  ??9 %#//KOOg- //G+ ??9 % 72 2I )11$w|b'88: ;Iy)y.$3347@A0&5569BC  = tG}affT3&789A HHJy)(9+<+>G3{"*4=#./ ??9-!,y/@/@7/J!JJ!*'!9J^+!AGG+:0EFH8OH(QWW,J1FGH",y) GGy--7 7G'.q\  , , t//0B0B50IJK KN05D -~&xrBc |j}|j}t|jD]"} |j |j $t |g} t |g} t |j|j} | j| d| j| dt| td|dzt||td|dz| g} |jj|jtj dd|j"|j$}| j&|j(|j*zdz |dzz z }|| _t/| t1|dzgg}|s|rN|dk(rd }|dk(rd }|j3|t5j6t8t:t<zt>z||S|S) Nrorrpr=rdrrrK) r5r`rrrryrir6r:rRrr]rrrSrrrTrr7rhrkr"r8r_auto_sized_delimiterrrrrvr r)rMrrrulerrUrrrarcnumcdenr6rrfrr2s r1_genfraczParser._genfrac- s 99; u{{# A JJL JJL ##CIIsyy) 5)$ 5)$tAy3/UD)Ay3/ --++ JJ %78 ,<<',,.!3c/"##Y^ 4567 V||--f./ffT#*s:J5K5;/=.46 6 rBc<|jt|dS)Nr)rrlr=s r1rzParser.style_literalW ss4#89::rBc |j|jdd|jdd|d|jd|jj|d|dS)NrrrrrrUr)rrrrr=s r1rzParser.genfracZ sZ}} HHXr "DHHXr$:  dhhw0I0IJ Ke& &rBc |jdd|jj|jj|d|dSNrrUr)rr5r`rrr=s r1rz Parser.frac` sE}} DNN$DDF OO % %tE{DKA ArBc |jdd|jj|jj|d|dSr)rr5r`rrr=s r1rz Parser.dfrace sE}} DNN$DDF OO ( ($u+tE{D DrBc b|jddd|jj|d|dS)NrrrrUr)rrrr=s r1rz Parser.binomj s5}} a OO % %tE{DKA ArBc|d}|d}|jj}|jt|g}t|g}t |j |j } |j | d|j | d|dz} ||dzdk(r;t|td| |g} |j|jz| z| _ | St|td| |g} | S)Nrrrorrur) r5r`rryrir6r:rRrr8r7r") rMrErrrrracentered_annotation centered_bodyr6rrs r1_gensetzParser._genseto s,' F|NN$DDF ' 5!4&) '--}/B/BC!!%3E9-1} S1W: Q #E "/!4!47J7Q7Q!QTX!XE  #Q E rBcr|jd}|d}|j}|j}|j|jz |dzz}|j |jz}t d|||d}|j|jz }|j |jz}ttd|z|td|zg} tt|td| g} | j||j|jzd z zd ||st|j d zd d }n+t|}|j#|j#tt|gg} | d z| _t| t%|j d z|| g} | gS)Nrrg@rAT)rrdrj@rorrr)rr5r`r7r"r8rr8rrRr]rHrTrTrrvr6rr=) rMrrrrrar7r8check padded_body rightside root_vlistrAs r1rz Parser.sqrt sxxG} 99; t0009s?B T...|VUE$O 2 22 e000T!i-0$Q]8KLM 5<f{CD %..599"<!NN!5 * u{{S("b1D;D KKM KKME4&M?+ #)'C- zU[[L3./ "# wrBc|d}|j}|j}|j|jz |dzz}|j|jz}t t |tdt|gg}|j||j|jzdz zd|t|g}|gS)Nrrrjrro) r5r`r7r"r8rRr]rHr8rTrTr) rMrrrrar7r8rrAs r1rzParser.overline sF| 99; t0009s?B T...5<fudV}EF  %..599"<!NN!5 *yk"wrBc $|j}t|rt|Dcgc]}t|tr|j !c}}t|Dcgc]}t|tr|j !c}}d}t|D][\} } | dk(s tjt|| dz} | dk7rt| |||||| dz<n|j| || =]tjtttz|} nd}d}d}g} g} |dk7r| jt|||||| j!| |dk7r| jt|||||t#| }|Scc}wcc}w)NrrrK)rrrh)r5r rirtrr7r8 enumeraterrrremoverrvr rrr8)rMfrontmiddlebackrrr7r8ridxelrP middle_partrrAs r1rzParser._auto_sized_delimiter sq  v;FMq*Q:L!((MNF&KQ 1c8JKLEF$V, $R#sF37O4ACx*8 !65%+HsQw a(s  $&&cDj!16:KFEFK C< LLufeU6J L [! 3; LLtVUE&I Ke  ?NKsFFF /F cb|j|dd|vr|djng|dS)Nrrr)rr<r=s r1rzParser.auto_delim s;)) L%*d]DK   ! M  rBcl|j|j}g}|d}|D]}t|trH|jd}t|t rd|_|j|j|[t|t rsd|_|j|jvs|jdd|jvrd|_|j|j|j||j||jt|S)Nrrrr) r:r5rtr8r#r rSr rrP_latin_alphabets _small_greekr8)rMrrrAr{rPr,s r1r"zParser.boldsymbol s  G} A!U#JJqMa&!AF%%' QAt$CC400033qr7d///#AF%%'!!# Q Q! " U|rBc|d}|j}|j}|dDcgc] }t|}}tt d|}g}|D]1} t | g} | j |d|j| 3t|td|dzgt|zD cgc] } | D]} |  } } } | d=t| }t|gg}|Scc}wcc} } w)Nrrc|jSrKrvrs r1z!Parser.substack.. s aggrBrordr) r5r`r8rirPryr:rziprr rR)rMrrrrar,rA max_widthrrcppairrstackrr2s r1rzParser.substack s W  99; #(8,aq,,-u56  CC5!B HHY * LL   !aQ)?(@3u:(MN" """" "IEl, -"s C(8C-r) rErr1rrTr5rr5rwr8r)rrrwz list[Hlist])rrrwr)rrrwr)rGr5rwr=)rErrrlrzParseResults | dict[str, str]rwrr)rwr)rrrwrx)rrrrrrbrrrUr8rr8rwr)rrrzlist[Box | Char | str]rrrwr)Ur<r=r>r?enumEnumrr]r^rVrX_arrow_symbolsrUrYrrwrrr _ambi_delimsrW _right_delimsr rr*rr{rrrstring ascii_lettersrrNr3r5r8r:r&r$r#r% staticmethodrconvert_to_floatrrrHrrrr/rrrrrr!rrr rr rrSrrrrrrrrrrrrrrrrrr"rr)rr%rrrs0000@r1rrsVTYY  0 %'365j %uwk5(n 0 1N4(*;;nLO7==?@  57 >DDFGLRRTU33857rs#   ++++++ DD<<::??( w./,3*3&/ *(/ 8585v*@zi!CGGi!XfIES[[fIRgC-gCTA!=A!H&A,#++&AR{$k$p pfIB !,!,H"3)- 0  / */, (   )   )  ( ) ) )$'(() '!"'#&3-)0  . $ *,3,(3(D+4D+NITI.)/3)/Xc>(4(6%"U%"P E :Pn1#0#0L62WWrB