U
    ˜9%ezÛ ã                %   @  sì  U d Z ddlmZ ddlmZmZmZ ddlZddlm	Z	m
Z
mZmZmZmZmZmZ ddlmZ ddlmZ ddlmZmZmZ dd	lmZ dd
lmZ ddlmZ ddlm Z  ddl!m"Z"m#Z#m$Z$ ddl%m&Z& ddl'm(Z( ddl)m*Z*m+Z+ ddl,m-Z-m.Z. ddl'm/Z/m0Z0 ddl1m2Z2m3Z4 ddl5m6Z6m7Z7 ddl8Z8erHddl9m:Z: ddddddddddd d!d"d#d$d%d&d'd(d)d*gZ;d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDd5dEdAdFdGdHdIdJdKdLdMœ$Z<dNdOdPdQdRdSdTdUdVdWh
Z=dXdY„ dZdY„ d[dY„ d\dY„ d]dY„ d^dY„ d_dY„ d`dY„ dadY„ dbdY„ dcdY„ dddY„ dedY„ dfdY„ dgdY„ dhdY„ didY„ djdY„ dkdY„ dldY„ dmdY„ dndY„ dodY„ dpdY„ dqœZ>dre?ds< e@eƒZAe8 Bdt¡e8 Bdu¡fZCdvdvdwœdxdy„ZDG dzd{„ d{e*ƒZEdvdvdwœd|d}„ZFe+eEƒd~d„ ƒZGd€d„ ZHd‡d…d†„ZIdS )ˆzC
A Printer which converts an expression into its LaTeX equivalent.
é    )Úannotations)ÚAnyÚCallableÚTYPE_CHECKINGN)ÚAddÚFloatÚModÚMulÚNumberÚSÚSymbolÚExpr)Úgreeks)ÚTuple)ÚFunctionÚAppliedUndefÚ
Derivative)ÚAssocOp)ÚPow)Údefault_sort_key)ÚSympifyError)ÚtrueÚBooleanTrueÚBooleanFalse)Ú	NDimArray)Úprecedence_traditional)ÚPrinterÚprint_function)Úsplit_super_subÚrequires_partial)Ú
precedenceÚ
PRECEDENCE)Úprec_to_dpsÚto_str)Úhas_varietyÚsift)ÚBasisDependentZarcsinZarccosZarctanÚsinÚcosÚtanÚsinhÚcoshÚtanhÚsqrtÚlnÚlogÚsecZcscZcotZcothÚreZimÚfracÚrootÚargz
\mathrm{A}z
\mathrm{B}ú\Gammaz\Deltaz
\mathrm{E}z
\mathrm{Z}z
\mathrm{H}z\Thetaz
\mathrm{I}z
\mathrm{K}z\Lambdaz
\mathrm{M}z
\mathrm{N}z\XiÚoz
\mathrm{O}z\Piz
\mathrm{P}z\Sigmaz
\mathrm{T}z\Upsilonz\Phiz
\mathrm{X}z\Psiz\Omegaz\lambdaz\chiz\varepsilonz	\varkappaz\varphiz\varpiz\varrhoz	\varsigmaz	\vartheta)$ÚAlphaÚBetaÚGammaÚDeltaÚEpsilonÚZetaÚEtaÚThetaÚIotaÚKappaÚLambdaÚMuÚNuÚXiÚomicronÚOmicronÚPiÚRhoÚSigmaÚTauÚUpsilonÚPhiÚChiÚPsiÚOmegaÚlamdaZLamdaZkhiZKhiZ
varepsilonZvarkappaZvarphiZvarpiZvarrhoZvarsigmaZvarthetaZalephZbethZdalethZgimelZellÚethZhbarZhslashZmhoZwpc                 C  s   d|  d S )Nz
\mathring{Ú}© ©ÚsrS   rS   úS/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/sympy/printing/latex.pyÚ<lambda>Z   ó    rW   c                 C  s   d|  d S )Nz\ddddot{rR   rS   rT   rS   rS   rV   rW   [   rX   c                 C  s   d|  d S )Nz\dddot{rR   rS   rT   rS   rS   rV   rW   \   rX   c                 C  s   d|  d S )Nz\ddot{rR   rS   rT   rS   rS   rV   rW   ]   rX   c                 C  s   d|  d S )Nz\dot{rR   rS   rT   rS   rS   rV   rW   ^   rX   c                 C  s   d|  d S )Nz\check{rR   rS   rT   rS   rS   rV   rW   _   rX   c                 C  s   d|  d S )Nz\breve{rR   rS   rT   rS   rS   rV   rW   `   rX   c                 C  s   d|  d S )Nz\acute{rR   rS   rT   rS   rS   rV   rW   a   rX   c                 C  s   d|  d S )Nz\grave{rR   rS   rT   rS   rS   rV   rW   b   rX   c                 C  s   d|  d S )Nz\tilde{rR   rS   rT   rS   rS   rV   rW   c   rX   c                 C  s   d|  d S )Nz\hat{rR   rS   rT   rS   rS   rV   rW   d   rX   c                 C  s   d|  d S )Nz\bar{rR   rS   rT   rS   rS   rV   rW   e   rX   c                 C  s   d|  d S )Nz\vec{rR   rS   rT   rS   rS   rV   rW   f   rX   c                 C  s   d|  d S ©NÚ{z}'rS   rT   rS   rS   rV   rW   g   rX   c                 C  s   d|  d S rY   rS   rT   rS   rS   rV   rW   h   rX   c                 C  s   d|  d S ©Nz\boldsymbol{rR   rS   rT   rS   rS   rV   rW   j   rX   c                 C  s   d|  d S r[   rS   rT   rS   rS   rV   rW   k   rX   c                 C  s   d|  d S )Nz	\mathcal{rR   rS   rT   rS   rS   rV   rW   l   rX   c                 C  s   d|  d S )Nz	\mathscr{rR   rS   rT   rS   rS   rV   rW   m   rX   c                 C  s   d|  d S )Nz
\mathfrak{rR   rS   rT   rS   rS   rV   rW   n   rX   c                 C  s   d|  d S )Nz\left\|{z	}\right\|rS   rT   rS   rS   rV   rW   p   rX   c                 C  s   d|  d S )Nz\left\langle{z}\right\ranglerS   rT   rS   rS   rV   rW   q   rX   c                 C  s   d|  d S ©Nz\left|{z}\right|rS   rT   rS   rS   rV   rW   r   rX   c                 C  s   d|  d S r\   rS   rT   rS   rS   rV   rW   s   rX   )ZmathringZddddotZdddotZddotÚdotÚcheckZbreveÚacuteZgraveÚtildeZhatÚbarÚvecÚprimeZprmÚboldÚbmÚcalZscrZfrakZnormÚavgÚabsÚmagzdict[str, Callable[[str], str]]Úmodifier_dictz[0-9][} ]*$z[0-9]Ústr)rU   Úreturnc                 C  sB   |   dd¡} dD ]}|   |d| ¡} q|   dd¡} |   dd¡} | S )zÉ
    Escape a string such that latex interprets it as plaintext.

    We cannot use verbatim easily with mathjax, so escaping is easier.
    Rules from https://tex.stackexchange.com/a/34586/41112.
    ú\z\textbackslashz&%$#_{}ú~z\textasciitildeú^z\textasciicircum)Úreplace)rU   ÚcrS   rS   rV   Úlatex_escape~   s    rr   c                      s  e Zd ZU dZdddddddddddddi ddddd	ddddd
dœZded< dwdd„Zddœdd„Zddœdd„Zdxddœdd„Z	dd„ Z
ddœdd„Zddœdd„Zddœdd „Zdyddœd!d"„Zddœd#d$„Zddœd%d&„Zddœd'd(„Zdd)œd*d+„Zd,d-„ Zd.d/œd0d1„ZeZeZd2d3„ Zdzd4d5„Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Zd>d?„ Zd@dA„ ZdBdC„ ZdDdE„ Z dFdG„ Z!dHdI„ Z"dJd)œdKdL„Z#dMdN„ Z$dOdP„ Z%dQd)œdRdS„Z&dddTœdUdV„Z'dWdX„ Z(dYdZ„ Z)d[d\„ Z*d]d)œd^d_„Z+d`da„ Z,dbdc„ Z-ddde„ Z.dfdg„ Z/dhdi„ Z0djdk„ Z1dldm„ Z2dddnœdodp„Z3d{dqddrœdsdt„Z4dudv„ Z5dwdx„ Z6e7dydz„ ƒZ8d{d|„ Z9d}d~„ Z:dd€„ Z;d|ddœdd‚„Z<e< Z=Z>d}dƒd„„Z?d~d…d†„Z@dd‡dˆ„ZAd€d‰dŠ„ZBdd‹dŒ„ZCd‚ddŽ„ZDdd„ ZEd‘d’„ ZFd“d”„ ZGd•d–„ ZHd—d˜„ ZIdƒd™dš„ZJd„d›dœ„ZKd…ddž„ZLd†dŸd „ZMd‡d¡d¢„ZNdˆd£d¤„ZOd‰d¥d¦„ZPdŠd§d¨„ZQd‹d©dª„ZRdŒd«d¬„ZSdd­d®„ZTdŽd°d±„ZUdd²d³„ZVdd´dµ„ZWd‘d¶d·„ZXd’ddœd¸d¹„ZYeYZZd“dºd»„Z[d”d¼d½„Z\d•d¾d¿„Z]d–dÀdÁ„Z^d—dÂdÃ„Z_d˜dÄdÅ„Z`d™dÆdÇ„ZadšdÈdÉ„Zbd›dÊdË„ZcdœdÌdÍ„ZddddÎœdÏdÐ„ZeddœdÑdÒ„ZfddÓdÔ„ZgdždÕdÖ„ZhdŸd×dØ„Zid dÙdÚ„Zjd¡dÛdÜ„Zkd¢dÝdÞ„Zld£dßdà„Zmd¤dádâ„Znd¥dãdä„Zod¦dådæ„Zpd§ddœdèdé„Zqd¨ddœdêdë„Zrd©dìdí„Zsdªdîdï„Ztd«dðdñ„Zud¬dòdó„Zvd­dôdõ„Zwd®död÷„Zxd¯dødù„Zyd°dúdû„Zzd±düdý„Z{d²dþdÿ„Z|d³d d„Z}d´dd„Z~dµdd„Zd¶dd„Z€d·dd	„Zd¸d
d„Z‚d¹dd„Zƒdºdd„Z„d»dd„Z…d¼dd„Z†d½dd„Z‡d¾dd„Zˆd¿dd„Z‰dÀdd„ZŠdÁdd„Z‹dÂdd„ZŒdÃd d!„Zd"d#„ ZŽd$d%„ ZdÄd&d)œd'd(„ZeZ‘dÅddd)œd*d+„Z’d,d-„ Z“d.d/„ Z”d0d1„ Z•d2d3„ Z–d4d5„ Z—d6d7„ Z˜d8d9„ Z™d:d;„ Zšd<d=„ Z›d>d?„ Zœd@dA„ ZdBdC„ ZždÆdDdE„ZŸdFdG„ Z dHdI„ Z¡dJdK„ Z¢dLdM„ Z£dNdO„ Z¤dPdQ„ Z¥dRdS„ Z¦dTdU„ Z§dVdW„ Z¨dXd)œdYdZ„Z©d[d\œd]d^„Zªd_d`„ Z«dadb„ Z¬dcdd„ Z­dedf„ Z®dgdh„ Z¯didj„ Z°dkdl„ Z±dmdn„ Z²dodp„ Z³dÇdqdr„Z´dsdt„ Zµdudv„ Z¶dwdx„ Z·dydz„ Z¸d{d|„ Z¹d}d~„ Zºdd€„ Z»dÈdd‚„Z¼dÉdƒd„„Z½dÊd…d†„Z¾dËd‡dˆ„Z¿dÌd‰dŠ„ZÀd‹dŒ„ ZÁddŽ„ ZÂdd„ ZÃeÃZÄd‘d’„ ZÅdÍd“d”„ZÆdÎd•d–„ZÇdÏd—d˜„ZÈdÐd™dš„ZÉdÑd›dœ„ZÊdÒddž„ZËdÓdŸd „ZÌd¡d¢„ ZÍeÍZÎeÍZÏeÍ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Ý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ê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ídî„ZödÕdïdð„Z÷dÖ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dd„ Zd×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d'd(„ Zd)d*„ ZeZd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;d<„ Zd=d>„ Zd?d@„ Z dAdB„ Z!dCdD„ Z"dEdF„ Z#dGdH„ Z$dIdJ„ Z%dKdL„ Z&dMdN„ Z'dOdP„ Z(dQdR„ Z)dSdT„ Z*dUdV„ Z+dWdX„ Z,dYdZ„ Z-dØd[d\„Z.dÙd]d^„Z/dÚd_d`„Z0dÛdadb„Z1dÜdcdd„Z2dÝdedf„Z3dgdh„ Z4didj„ Z5dkdl„ Z6dmdn„ Z7dodp„ Z8dqdr„ Z9dsdt„ Z:‡ fdudv„Z;‡  Z<S (Þ  ÚLatexPrinterZ_latexFNÚabbreviatedú[ÚplainTÚiÚperiodÚd)Ú	full_precÚfold_frac_powersÚfold_func_bracketsÚfold_short_fracÚinv_trig_styleÚitexÚln_notationÚlong_frac_ratioÚ	mat_delimÚmat_strÚmodeÚ
mul_symbolÚorderÚsymbol_namesÚroot_notationÚmat_symbol_styleÚimaginary_unitÚgothic_re_imÚdecimal_separatorÚperm_cyclicÚparenthesize_superÚminÚmaxÚdiff_operatorzdict[str, Any]Ú_default_settingsc                 C  sz  t  | |¡ d| jkr8ddddg}| jd |kr8tdƒ‚| jd d kr^| jd dkr^d| jd< d	d
dddœ}z|| jd  | jd< W n$ tk
r¨   | jd | jd< Y nX z|| jd pºd | jd< W nH tk
r   | jd  ¡ dkrú|d | jd< n| jd | jd< Y nX dddœ| _ddddddddœ}| jd }| ||¡| jd< ddd d!d"œ}| jd# }| ||¡| jd$< d S )%Nr„   Úinlinerv   Zequationz	equation*zB'mode' must be one of 'inline', 'plain', 'equation' or 'equation*'r}   Tú z \,.\, z \cdot ú \times )NZldotr]   Útimesr…   Úmul_symbol_latexr]   Úmul_symbol_latex_numbers)Ú r”   rm   z\,z\:ú\;z\quadú)ú])ú(ru   rw   z
\mathrm{i}z\text{i}Újz
\mathrm{j}z\text{j})Nrw   ÚriÚtirž   ZrjZtjrŠ   Zimaginary_unit_latexry   z
\mathrm{d}z\text{d})Nry   ÚrdÚtdr‘   Údiff_operator_latex)r   Ú__init__Ú	_settingsÚ
ValueErrorÚKeyErrorÚstripÚ_delim_dictÚget)ÚselfÚsettingsZvalid_modesZmul_symbol_tableZimaginary_unit_tableZ	imag_unitZdiff_operator_tabler‘   rS   rS   rV   r¤   «   sf    
ÿÿ
üÿÿÿÿÿ
ÿù	
ü
zLatexPrinter.__init__rk   ©rl   c                 C  s
   d  |¡S )Nz\left({}\right)©Úformat©r«   rU   rS   rS   rV   Ú_add_parensè   s    zLatexPrinter._add_parensc                 C  s
   d  |¡S )Nz\left( {}\right)r®   r°   rS   rS   rV   Ú_add_parens_lspaceì   s    zLatexPrinter._add_parens_lspacec                 C  sR   t |ƒ}|r |r |  |  |¡¡S ||k s4|sD||krD|  |  |¡¡S |  |¡S d S ©N)r   r±   Ú_print)r«   ÚitemÚlevelÚis_negÚstrictZprec_valrS   rS   rV   Úparenthesizeï   s    zLatexPrinter.parenthesizec                 C  s*   d|kr&| j d r|  |¡S d |¡S |S )z”
        Protect superscripts in s

        If the parenthesize_super option is set, protect with parentheses, else
        wrap in braces.
        ro   rŽ   z{{{}}})r¥   r±   r¯   r°   rS   rS   rV   rŽ   ù   s
    


zLatexPrinter.parenthesize_superc                 C  sb   t  | |¡}| jd dkr|S | jd dkr4d| S | jd rFd| S | jd }d|||f S d S )Nr„   rv   r“   z$%s$r   z$$%s$$z\begin{%s}%s\end{%s})r   Údoprintr¥   )r«   ÚexprÚtexZenv_strrS   rS   rV   rº     s    

zLatexPrinter.doprintÚboolc                 C  s(   |j r|jp$|jo$|tjk	o$|jdk S )zÁ
        Returns True if the expression needs to be wrapped in brackets when
        printed, False otherwise. For example: a + b => True; a => False;
        10 => False; -10 => True.
        F)Z
is_IntegerZis_nonnegativeÚis_Atomr   ÚNegativeOneÚis_Rational©r«   r»   rS   rS   rV   Ú_needs_brackets  s    þzLatexPrinter._needs_bracketsc                 C  sN   |   |¡sdS |jr"|  |¡s"dS |jr6|  |¡s6dS |jsB|jrFdS dS dS )aˆ  
        Returns True if the expression needs to be wrapped in brackets when
        passed as an argument to a function, False otherwise. This is a more
        liberal version of _needs_brackets, in that many expressions which need
        to be wrapped in brackets when added/subtracted/raised to a power do
        not need them when passed to a function. Such an example is a*b.
        FTN)rÂ   Úis_MulÚ_mul_is_cleanZis_PowÚ_pow_is_cleanÚis_AddÚis_FunctionrÁ   rS   rS   rV   Ú_needs_function_brackets  s    
z%LatexPrinter._needs_function_bracketsc                   s¨   ddl m} ddlm} ddlm} ˆ jr<|sZˆ  ¡ rZdS ntˆ ƒt	d k rPdS ˆ j
rZdS ˆ jrddS t‡ fdd„tfD ƒƒr€dS |s¤t‡ fd	d„|||fD ƒƒr¤dS d
S )aÇ  
        Returns True if the expression needs to be wrapped in brackets when
        printed as part of a Mul, False otherwise. This is True for Add,
        but also for some container objects that would not need brackets
        when appearing last in a Mul, e.g. an Integral. ``last=True``
        specifies that this expr is the last to appear in a Mul.
        ``first=True`` specifies that this expr is the first to appear in
        a Mul.
        r   )ÚProduct)ÚSum)ÚIntegralTr	   c                 3  s   | ]}ˆ   |¡V  qd S r³   ©Úhas©Ú.0Úx©r»   rS   rV   Ú	<genexpr>L  s     z3LatexPrinter._needs_mul_brackets.<locals>.<genexpr>c                 3  s   | ]}ˆ   |¡V  qd S r³   rÌ   rÎ   rÑ   rS   rV   rÒ   O  s     F)Zsympy.concrete.productsrÉ   Zsympy.concrete.summationsrÊ   Zsympy.integrals.integralsrË   rÃ   Úcould_extract_minus_signr   r!   Úis_RelationalZis_PiecewiseÚanyr   )r«   r»   ÚfirstÚlastrÉ   rÊ   rË   rS   rÑ   rV   Ú_needs_mul_brackets5  s&    
ÿz LatexPrinter._needs_mul_bracketsc                   s4   ˆ j r
dS t‡ fdd„tfD ƒƒr&dS ˆ jr0dS dS )z±
        Returns True if the expression needs to be wrapped in brackets when
        printed as part of an Add, False otherwise.  This is False for most
        things.
        Tc                 3  s   | ]}ˆ   |¡V  qd S r³   rÌ   rÎ   rÑ   rS   rV   rÒ   \  s     z3LatexPrinter._needs_add_brackets.<locals>.<genexpr>F)rÔ   rÕ   r   rÆ   rÁ   rS   rÑ   rV   Ú_needs_add_bracketsT  s    z LatexPrinter._needs_add_bracketsc                 C  s   |j D ]}|jr dS qdS )NFT)ÚargsrÇ   )r«   r»   r4   rS   rS   rV   rÄ   b  s    
zLatexPrinter._mul_is_cleanc                 C  s   |   |j¡ S r³   )rÂ   ÚbaserÁ   rS   rS   rV   rÅ   h  s    zLatexPrinter._pow_is_cleanrÑ   c                 C  s   |d k	rd||f S |S d S )Nú\left(%s\right)^{%s}rS   ©r«   r»   ÚexprS   rS   rV   Ú_do_exponentk  s    zLatexPrinter._do_exponentc                   sL   ˆ   |jj¡}|jr>‡ fdd„|jD ƒ}d}| |d |¡¡S d |¡S d S )Nc                   s   g | ]}ˆ   |¡‘qS rS   ©r´   )rÏ   r6   ©r«   rS   rV   Ú
<listcomp>t  s     z-LatexPrinter._print_Basic.<locals>.<listcomp>z"\operatorname{{{}}}\left({}\right)ú, z\text{{{}}})Ú_deal_with_super_subÚ	__class__Ú__name__rÚ   r¯   Újoin)r«   r»   ÚnameZlsrU   rS   rá   rV   Ú_print_Basicq  s    zLatexPrinter._print_Basicz!bool | BooleanTrue | BooleanFalse)Úec                 C  s   d| S ©Nú	\text{%s}rS   ©r«   rê   rS   rS   rV   Ú_print_boolz  s    zLatexPrinter._print_boolc                 C  s   d| S rë   rS   rí   rS   rS   rV   Ú_print_NoneType€  s    zLatexPrinter._print_NoneTypec                 C  sv   | j ||d}d}t|ƒD ]V\}}|dkr,n | ¡ rD|d7 }| }n|d7 }|  |¡}|  |¡rhd| }||7 }q|S )N)r†   r™   r   ú - ú + ú\left(%s\right))Z_as_ordered_termsÚ	enumeraterÓ   r´   rÙ   )r«   r»   r†   Útermsr¼   rw   ÚtermÚterm_texrS   rS   rV   Ú
_print_Addƒ  s    


zLatexPrinter._print_Addc                 C  sŽ   ddl m} |jdkrdS ||ƒ}|j}|j}|jd |d krP||d gg }d}|D ]}|t|ƒ dd¡7 }qX| d	d
¡}| dd¡}|S )Nr   ©ÚPermutationú\left( \right)éÿÿÿÿé   r™   ú,rš   ru   z\left( rœ   ú\right))Ú sympy.combinatorics.permutationsrù   ÚsizeZcyclic_formÚ
array_formrk   rp   )r«   r»   rù   Z	expr_permZsizrö   rw   rS   rS   rV   Ú_print_Cycle–  s    
zLatexPrinter._print_Cyclec           
        sÂ   ddl m} ddlm} |j}|d k	r@|d|› ddddd	 nˆ j d
d¡}|r\ˆ  |¡S |jdkrjdS ‡ fdd„|j	D ƒ}‡ fdd„t
t|ƒƒD ƒ}d |¡}d |¡}d ||f¡}	d|	 S )Nr   rø   )Úsympy_deprecation_warningzw
                Setting Permutation.print_cyclic is deprecated. Instead use
                init_printing(perm_cyclic=z).
                z1.6z#deprecated-permutation-print_cyclicé   )Zdeprecated_since_versionZactive_deprecations_targetÚ
stacklevelr   Trú   c                   s   g | ]}ˆ   |¡‘qS rS   rà   ©rÏ   r4   rá   rS   rV   râ   ¾  s     z3LatexPrinter._print_Permutation.<locals>.<listcomp>c                   s   g | ]}ˆ   |¡‘qS rS   rà   r  rá   rS   rV   râ   ¿  s     ú & z \\ z \begin{pmatrix} %s \end{pmatrix})rÿ   rù   Zsympy.utilities.exceptionsr  Zprint_cyclicr¥   rª   r  r   r  ÚrangeÚlenrç   )
r«   r»   rù   r  r   ÚlowerÚupperZrow1Zrow2ÚmatrS   rá   rV   Ú_print_Permutation¦  s.    þù




zLatexPrinter._print_Permutationc                 C  s"   |j \}}d|  |¡|  |¡f S )Nz\sigma_{%s}(%s))rÚ   r´   )r«   r»   ÚpermÚvarrS   rS   rV   Ú_print_AppliedPermutationÇ  s    
z&LatexPrinter._print_AppliedPermutationc           
      C  sú   t |jƒ}| jd rdnd}d| jkr0| jd nd }d| jkrH| jd nd }t|j||||d}| jd }d|krÀ| d¡\}}	|	d	 d
kr˜|	dd … }	| jd dkr²| dd¡}d|||	f S |dkrÌdS |dkrØdS | jd dkrò| dd¡}|S d S )Nrz   FTr   r   )Zstrip_zerosZ	min_fixedZ	max_fixedr˜   rê   r   ú+rü   rŒ   ÚcommaÚ.z{,}z%s%s10^{%s}z+infz\inftyz-infz- \infty)r"   Z_precr¥   Úmlib_to_strZ_mpf_Úsplitrp   )
r«   r»   Zdpsr¨   ÚlowÚhighZstr_realÚ	separatorZmantrÞ   rS   rS   rV   Ú_print_FloatË  s(    

zLatexPrinter._print_Floatc                 C  s0   |j }|j}d|  |td ¡|  |td ¡f S )Nz%s \times %sr	   ©Z_expr1Z_expr2r¹   r!   ©r«   r»   Zvec1Zvec2rS   rS   rV   Ú_print_Crossé  s
    ÿzLatexPrinter._print_Crossc                 C  s   |j }d|  |td ¡ S )Nz\nabla\times %sr	   ©Z_exprr¹   r!   ©r«   r»   rb   rS   rS   rV   Ú_print_Curlï  s    zLatexPrinter._print_Curlc                 C  s   |j }d|  |td ¡ S )Nz\nabla\cdot %sr	   r  r  rS   rS   rV   Ú_print_Divergenceó  s    zLatexPrinter._print_Divergencec                 C  s0   |j }|j}d|  |td ¡|  |td ¡f S )Nz%s \cdot %sr	   r  r  rS   rS   rV   Ú
_print_Dot÷  s
    ÿzLatexPrinter._print_Dotc                 C  s   |j }d|  |td ¡ S )Nz	\nabla %sr	   r  ©r«   r»   ÚfuncrS   rS   rV   Ú_print_Gradientý  s    zLatexPrinter._print_Gradientc                 C  s   |j }d|  |td ¡ S )Nz	\Delta %sr	   r  r"  rS   rS   rV   Ú_print_Laplacian  s    zLatexPrinter._print_Laplacianr   c                   sº  ddl m} ˆjd ‰ˆjd ‰ddœ‡ ‡fdd„}ddœ‡‡‡fd	d
„‰ t|tƒrŠ|j}|d tjks‚tdd„ |dd … D ƒƒrŠˆ |ƒS d}| 	¡ r´| }d}|j
r¸|d7 }d}nd}||dd\}}|tjkrötdddd|jkrö|||ƒ7 }n²||ƒ}	||ƒ}
t|
 ¡ ƒ}ˆjd }ˆjd rr|dkrrd|
krrˆj|ddr^|d|	|
f 7 }n|d|	|
f 7 }n6|d k	r˜t|	 ¡ ƒ|| kr˜ˆj|ddr¶|d|
ˆ|	f 7 }nà|jr„tj}tj}|jD ]f}ˆj|dds"t||| ƒ ¡ ƒ|| ks"|j|j  krdkr,n n
||9 }n||9 }qÐˆj|ddrf|d||ƒ|
ˆ||ƒf 7 }n|d||ƒ|
ˆ||ƒf 7 }n|d |
ˆ|	f 7 }n|d!|	|
f 7 }|r¶|d"7 }|S )#Nr   )Úfractionr—   r˜   rk   r­   c                   sr   | j stˆ | ¡ƒS ˆjdkr(|  ¡ }n
t| jƒ}t|dd„ dd\}}t|dd„ dd\}}ˆ || | ƒS d S )N)ÚoldÚnonec                 S  s*   t | dƒp(t | dƒp(t| tƒo(t | jdƒS )NÚ_scale_factorÚis_physical_constant)ÚhasattrÚ
isinstancer   rÛ   ©rÐ   rS   rS   rV   rW     s   
z:LatexPrinter._print_Mul.<locals>.convert.<locals>.<lambda>T)Úbinaryc                 S  s
   t | dƒS )Nr)  )r+  r-  rS   rS   rV   rW     rX   )rÃ   rk   r´   r†   Úas_ordered_factorsÚlistrÚ   r%   )r»   rÚ   ZunitsZnonunitsÚprefixes)Úconvert_argsr«   rS   rV   Úconvert
  s    



þ
z(LatexPrinter._print_Mul.<locals>.convertc                   s´   d }}t | ƒD ]ž\}}ˆ |¡}t|dƒs–t|dƒs–ˆj||dk|t| ƒd kdr^d| }td  |¡rˆtd  t|ƒ¡rˆ|ˆ 7 }q¢|r¢|ˆ7 }n|r¢|ˆ7 }||7 }|}q|S )Nr™   r)  r*  r   rü   )rÖ   r×   rò   )	ró   r´   r+  rØ   r	  Ú_between_two_numbers_pÚsearchÚmatchrk   )rÚ   Z_texZlast_term_texrw   rõ   rö   )Ú	numbersepr«   r  rS   rV   r2    s&    
ÿÿ

z-LatexPrinter._print_Mul.<locals>.convert_argsc                 s  s   | ]}t |tƒV  qd S r³   )r,  r
   r  rS   rS   rV   rÒ   8  s     z*LatexPrinter._print_Mul.<locals>.<genexpr>rü   Fú- r   Tr™   )Úexactrû   )Úevaluater   r}   é   ro   )r×   z\left(%s\right) / %sz%s / %sz\frac{1}{%s}%s\left(%s\right)z\frac{%s}{%s}%s\left(%s\right)z\frac{%s}{%s}%s%sz\frac{1}{%s}%s%sú\frac{%s}{%s}r›   )Zsympy.simplifyr&  r¥   r,  r	   rÚ   r   ÚOnerÕ   rÓ   rÆ   r   r	  r  rØ   rÃ   Úis_commutative)r«   r»   r&  r3  rÚ   Zinclude_parensr¼   ÚnumerÚdenomZsnumerZsdenomZldenomÚratioÚaÚbrÐ   rS   )r2  r7  r«   r  rV   Ú
_print_Mul  s~    


(
ÿ
ÿÿ
ÿ þ
þ
ÿÿzLatexPrinter._print_Mulc                 C  s*   |j r|  | ¡  ¡ ¡S |  | ¡ ¡S d S r³   )Z
is_aliasedr´   Zas_polyÚas_exprrÁ   rS   rS   rV   Ú_print_AlgebraicNumberx  s    z#LatexPrinter._print_AlgebraicNumberc                 C  s@   |   |j¡}|jrd|› dS |   |j ¡ ¡}d|› d|› dS )Nú\left(rþ   rã   )r´   ÚpZis_inertÚalpharE  )r«   r»   rH  rI  rS   rS   rV   Ú_print_PrimeIdeal~  s
    zLatexPrinter._print_PrimeIdealr   c                 C  s¸  |j jr†|j j}|j j}t|ƒdkr|dkr| jd r|  |j¡}|dkrVd| }n$| jd rnd||f }nd||f }|j jrŠd| S |S nö| jd	 rô|dkrô|  	|jt
d
 ¡}|jjrÆ|  |¡}|jjræ| j|jd||f dS d|||f S |j jr†|jjr†|jdkr$d|j|j f S |jjr||jj}|jj}|| t|ƒkr||j dkrhd||f S d||t|j ƒf S |  |¡S |jjr¨| j|j|  |j ¡dS d}|  ||¡S )Nrü   rˆ   r;  z	\sqrt{%s}r   z\root{%d}{%s}z\sqrt[%d]{%s}z\frac{1}{%s}r{   r   z%s/%s©rÞ   z
%s^{%s/%s}ú%s^{%s}rû   z\frac{1}{\frac{%s}{%s}}z\frac{1}{(\frac{%s}{%s})^{%s}})rÞ   rÀ   rH  Úqrh   r¥   r´   rÛ   Zis_negativer¹   r!   Ú	is_SymbolrŽ   rÇ   r>  rD  Ú_helper_print_standard_power)r«   r»   rH  rM  rÛ   r¼   Zbase_pZbase_qrS   rS   rV   Ú
_print_Pow…  sF    






zLatexPrinter._print_Pow)Útemplaterl   c                 C  sv   |   |j¡}|  |jtd ¡}|jjr2|  |¡}n8t|jtƒrj| 	d¡rjt
 d|¡rj| d¡rj|dd… }|||f S )Nr   rG  z\\left\(\\d?d?dotrþ   é   iùÿÿÿ)r´   rÞ   r¹   rÛ   r!   rN  rŽ   r,  r   Ú
startswithr1   r6  Úendswith)r«   r»   rQ  rÞ   rÛ   rS   rS   rV   rO  ²  s    ÿ
þýz)LatexPrinter._helper_print_standard_powerc                 C  s   |   |jd ¡S ©Nr   ©r´   rÚ   rÁ   rS   rS   rV   Ú_print_UnevaluatedExprÁ  s    z#LatexPrinter._print_UnevaluatedExprc                   s’   t |jƒdkr0dt‡fdd„|jd D ƒƒ }n,‡fdd„‰ dt d	‡ fd
d„|jD ƒ¡ }t|jtƒr~|dˆ |j¡ 7 }n|ˆ |j¡7 }|S )Nrü   z\sum_{%s=%s}^{%s} c                   s   g | ]}ˆ   |¡‘qS rS   rà   ©rÏ   rw   rá   rS   rV   râ   Ç  s     z+LatexPrinter._print_Sum.<locals>.<listcomp>r   c                   s,   dt ‡ fdd„| d | d | d fD ƒƒ S )Nú%s \leq %s \leq %sc                   s   g | ]}ˆ   |¡‘qS rS   rà   ©rÏ   rU   rá   rS   rV   râ   Ë  s     zALatexPrinter._print_Sum.<locals>._format_ineq.<locals>.<listcomp>rü   r   r;  ©Útuple©Úlrá   rS   rV   Ú_format_ineqÉ  s    &ÿz-LatexPrinter._print_Sum.<locals>._format_ineqz\sum_{\substack{%s}} ú\\c                   s   g | ]}ˆ |ƒ‘qS rS   rS   ©rÏ   r^  ©r_  rS   rV   râ   Î  s     rò   ©	r	  Úlimitsr\  rk   rç   r,  Úfunctionr   r´   ©r«   r»   r¼   rS   ©r_  r«   rV   Ú
_print_SumÄ  s    ÿÿzLatexPrinter._print_Sumc                   s’   t |jƒdkr0dt‡fdd„|jd D ƒƒ }n,‡fdd„‰ dt d	‡ fd
d„|jD ƒ¡ }t|jtƒr~|dˆ |j¡ 7 }n|ˆ |j¡7 }|S )Nrü   z\prod_{%s=%s}^{%s} c                   s   g | ]}ˆ   |¡‘qS rS   rà   rX  rá   rS   rV   râ   Ú  s     z/LatexPrinter._print_Product.<locals>.<listcomp>r   c                   s,   dt ‡ fdd„| d | d | d fD ƒƒ S )NrY  c                   s   g | ]}ˆ   |¡‘qS rS   rà   rZ  rá   rS   rV   râ   Þ  s     zELatexPrinter._print_Product.<locals>._format_ineq.<locals>.<listcomp>rü   r   r;  r[  r]  rá   rS   rV   r_  Ü  s    &ÿz1LatexPrinter._print_Product.<locals>._format_ineqz\prod_{\substack{%s}} r`  c                   s   g | ]}ˆ |ƒ‘qS rS   rS   ra  rb  rS   rV   râ   á  s     rò   rc  rf  rS   rg  rV   Ú_print_Product×  s    ÿÿzLatexPrinter._print_Productz'BasisDependent'c                 C  s  ddl m} g }||jkr"|jjS t||ƒr:| ¡  ¡ }n
d|fg}|D ]Ž\}}t|j ¡ ƒ}|j	dd„ d |D ]b\}}	|	dkr”| 
d|j ¡ qr|	dkr®| 
d	|j ¡ qrd
|  |	¡ d }
| 
d|
 |j ¡ qrqHd |¡}|d dkrü|dd … }n|dd … }|S )Nr   )ÚVectorc                 S  s   | d   ¡ S rU  )Ú__str__r-  rS   rS   rV   rW   ÷  rX   z4LatexPrinter._print_BasisDependent.<locals>.<lambda>©Úkeyrü   rñ   rû   rð   rG  rþ   r™   ú-é   )Zsympy.vectorrj  ÚzeroZ_latex_formr,  ZseparateÚitemsr0  Ú
componentsÚsortÚappendr´   rç   )r«   r»   rj  Zo1rq  ÚsystemZvectZ
inneritemsÚkÚvZarg_strZoutstrrS   rS   rV   Ú_print_BasisDependentê  s,    



z"LatexPrinter._print_BasisDependentc                 C  s4   |   |j¡}d| d dd t| j |jƒ¡  }|S )NrZ   rR   ú_{%s}rý   )r´   rÛ   rç   ÚmapÚindices)r«   r»   Ztex_baser¼   rS   rS   rV   Ú_print_Indexed  s
    ÿzLatexPrinter._print_Indexedc                 C  s   |   |j¡S r³   )r´   ÚlabelrÁ   rS   rS   rV   Ú_print_IndexedBase  s    zLatexPrinter._print_IndexedBasec                 C  sf   |   |j¡}|jd k	rb|   |j¡}|jd k	r:|   |j¡}n|   tj¡}dj||d}dj||dS |S )Nz%{lower}\mathrel{{..}}\nobreak {upper})r
  r  z{{{label}}}_{{{interval}}})r}  Úinterval)r´   r}  r  r
  r   ÚZeror¯   )r«   r»   r}  r  r
  r  rS   rS   rV   Ú
_print_Idx  s    

 ÿ ÿzLatexPrinter._print_Idxc              	   C  s   t |jƒrd}n
| jd }d}d}t|jƒD ]T\}}||7 }|dkr\|d||  |¡f 7 }q,|d||  |  |¡¡|  |¡f 7 }q,|dkr˜d||f }nd	||  |¡|f }td
d„ |jD ƒƒràd|| j	|jt
d dddf S d|| j	|jt
d dddf S )Nz\partialr£   r™   r   rü   ú%s %sz
%s %s^{%s}r<  z\frac{%s^{%s}}{%s}c                 s  s   | ]}|  ¡ V  qd S r³   ©rÓ   rX  rS   rS   rV   rÒ   6  s     z1LatexPrinter._print_Derivative.<locals>.<genexpr>r	   T©r·   r¸   F)r   r»   r¥   ÚreversedZvariable_countr´   rŽ   rÕ   rÚ   r¹   r!   )r«   r»   Údiff_symbolr¼   ÚdimrÐ   ÚnumrS   rS   rV   Ú_print_Derivative   s6    

þ
ý
ýzLatexPrinter._print_Derivativec           	        s`   |j \}}}ˆ  |¡}‡ fdd„|D ƒ}‡ fdd„|D ƒ}d dd„ t||ƒD ƒ¡}d||f S )Nc                 3  s   | ]}ˆ   |¡V  qd S r³   rà   ©rÏ   rê   rá   rS   rV   rÒ   D  s     z+LatexPrinter._print_Subs.<locals>.<genexpr>c                 3  s   | ]}ˆ   |¡V  qd S r³   rà   rŠ  rá   rS   rV   rÒ   E  s     z\\ c                 s  s"   | ]}|d  d |d  V  qdS )r   ú=rü   NrS   rŠ  rS   rS   rV   rÒ   F  s    z#\left. %s \right|_{\substack{ %s }})rÚ   r´   rç   Úzip)	r«   Úsubsr»   r'  ÚnewZ
latex_exprZ	latex_oldZ	latex_newZ
latex_subsrS   rá   rV   Ú_print_SubsA  s    

ÿÿzLatexPrinter._print_Subsc              	     s\  dg  }}ˆj d ‰ t|jƒdkrhtdd„ |jD ƒƒrhddt|jƒd   d	 }‡ ‡fd
d„|jD ƒ}n¼t|jƒD ]°}|d }|d7 }t|ƒdkrˆj d dkr´ˆj d s´|d7 }t|ƒdkrä|dˆ |d ¡ˆ |d ¡f 7 }t|ƒdkr|dˆ |d ¡ 7 }| ddˆ ˆ |¡f ¡ qrd|ˆj|jt	d t
dd„ |jD ƒƒddd |¡f S )Nr™   r£   é   c                 s  s   | ]}t |ƒd kV  qdS )rü   N)r	  )rÏ   ÚlimrS   rS   rV   rÒ   P  s     z/LatexPrinter._print_Integral.<locals>.<genexpr>z\irw   rü   Úntc                   s"   g | ]}d ˆ ˆ  |d ¡f ‘qS )ú\, %s%sr   rà   ©rÏ   Úsymbol©r†  r«   rS   rV   râ   T  s   ÿz0LatexPrinter._print_Integral.<locals>.<listcomp>r   z\intr„   r“   r   z\limitsro  z
_{%s}^{%s}r;  ú^{%s}r“  z%s %s%sr	   c                 s  s   | ]}|  ¡ V  qd S r³   rƒ  rX  rS   rS   rV   rÒ   k  s     Tr„  )r¥   r	  rd  Úallr…  r´   Úinsertr¹   re  r!   rÕ   rÚ   rç   )r«   r»   r¼   Úsymbolsr‘  r•  rS   r–  rV   Ú_print_IntegralK  s:    

"ÿÿÿýüzLatexPrinter._print_Integralc                 C  sš   |j \}}}}d|  |¡ }t|ƒdks8|tjtjfkrL|d|  |¡ 7 }n|d|  |¡|  |¡f 7 }t|tƒr„d||  |¡f S d||  |¡f S d S )Nz\lim_{%s \to z+-z%s}z%s^%s}ú%s\left(%s\right)r‚  )rÚ   r´   rk   r   ÚInfinityÚNegativeInfinityr,  r   )r«   r»   rê   ÚzZz0Údirr¼   rS   rS   rV   Ú_print_Limito  s    
zLatexPrinter._print_Limit)r#  rl   c                 C  sî   |   |¡}| d¡}| d¡}|tkr0d| }nºt|ƒdksV| d¡sV|dksV|dkr\|}nŽ|dkr–|dkr–d|dt||ƒ… |t||ƒd… f }nT|dkr¼d|d|… ||d… f }n.|dkrâd|d|… ||d… f }nd	| }|S )
ak  
        Logic to decide how to render a function to latex
          - if it is a recognized latex name, use the appropriate latex command
          - if it is a single letter, excluding sub- and superscripts, just use that letter
          - if it is a longer name, then put \operatorname{} around it and be
            mindful of undercores in the name
        ro   Ú_z\%srü   rm   r   z\operatorname{%s}%sNz\operatorname{%s})rä   ÚfindÚaccepted_latex_functionsr	  rS  r   )r«   r#  ZsuperscriptidxZsubscriptidxrè   rS   rS   rV   Ú_hprint_Function}  s0    



&þ

þ

þzLatexPrinter._hprint_Functionr   )r»   rl   c                   s®  |j j}tˆ d| ƒr4t|tƒs4tˆ d| ƒ||ƒS ‡ fdd„|jD ƒ}ˆ jd }d}ˆ jd o|t|ƒdko|ˆ  	|jd ¡ }d	d
ddddddddddg}||krú|dkr¬nN|dkrÖ|d dkrÄdnd|dd…  }n$|dkrú|dd… }d}|dk	rúd}|r|t
krd| }	nd| }	n6|dk	rJˆ  |¡}
ˆ  |
¡}
d |
|f }	n
ˆ  |¡}	|rx|t
krn|	d!7 }	n|	d"7 }	n|	d#7 }	|rœ|dk	rœ|	d$| 7 }	|	d% |¡ S dS )&a#  
        Render functions to LaTeX, handling functions that LaTeX knows about
        e.g., sin, cos, ... by using the proper LaTeX command (\sin, \cos, ...).
        For single-letter function names, render them as regular LaTeX math
        symbols. For multi-letter function names that LaTeX does not know
        about, (e.g., Li, sech) use \operatorname{} so that the function name
        is rendered in Roman font and LaTeX handles spacing properly.

        expr is the expression involving the function
        exp is an exponent
        Z_print_c                   s   g | ]}t ˆ  |¡ƒ‘qS rS   )rk   r´   r  rá   rS   rV   râ   ®  s     z0LatexPrinter._print_Function.<locals>.<listcomp>r~   Fr|   rü   r   ÚasinÚacosÚatanZacscZasecZacotÚasinhÚacoshÚatanhZacschZasechZacothrt   Úfullrû   ÚhÚarÚarcNÚpowerTz\%s^{-1}z\operatorname{%s}^{-1}rL  z {%s}ú%sú{\left(%s \right)}r—  rý   )r#  ræ   r+  r,  r   ÚgetattrrÚ   r¥   r	  rÈ   r¤  r¥  rŽ   rç   )r«   r»   rÞ   r#  rÚ   r~   Zinv_trig_power_caseZcan_fold_bracketsZinv_trig_tablerè   Zfunc_texrS   rá   rV   Ú_print_Function  sj    ÿ


ÿþ        ü"









zLatexPrinter._print_Functionc                 C  s   |   t|ƒ¡S r³   )r¥  rk   rÁ   rS   rS   rV   Ú_print_UndefinedFunctioné  s    z%LatexPrinter._print_UndefinedFunctionc                 C  s   d|   |j¡|   |j¡f S )Nz{%s}_{\circ}\left({%s}\right))r´   re  r»   rÁ   rS   rS   rV   Ú_print_ElementwiseApplyFunctionì  s    

þz,LatexPrinter._print_ElementwiseApplyFunctionc                 C  s\   ddl m} ddlm}m} ddlm} ddlm} ddl	m
} |d|d|d	|d
|d|diS )Nr   )ÚKroneckerDelta)ÚgammaÚ
lowergamma)Úbeta)Ú
DiracDelta)rM   z\deltar5   z\gammaz\operatorname{B}z\operatorname{Chi})Z(sympy.functions.special.tensor_functionsr·  Z'sympy.functions.special.gamma_functionsr¸  r¹  Z&sympy.functions.special.beta_functionsrº  Z'sympy.functions.special.delta_functionsr»  Z'sympy.functions.special.error_functionsrM   )r«   r·  r¸  r¹  rº  r»  rM   rS   rS   rV   Ú_special_function_classesò  s"         ûz&LatexPrinter._special_function_classesc                 C  s>   | j D ](}t||ƒr|j|jkr| j |   S q|  t|ƒ¡S r³   )r¼  Ú
issubclassræ   r¥  rk   )r«   r»   ÚclsrS   rS   rV   Ú_print_FunctionClass   s    
z!LatexPrinter._print_FunctionClassc                 C  sJ   |j \}}t|ƒdkr&|  |d ¡}n|  t|ƒ¡}d||  |¡f }|S )Nrü   r   z\left( %s \mapsto %s \right))rÚ   r	  r´   r\  )r«   r»   rš  r¼   rS   rS   rV   Ú_print_Lambda  s    
zLatexPrinter._print_Lambdac                 C  s   dS )Nz\left( x \mapsto x \right)rS   rÁ   rS   rS   rV   Ú_print_IdentityFunction  s    z$LatexPrinter._print_IdentityFunctionc                   sX   t |jtd}‡ fdd„|D ƒ}dt|jƒ ¡ d |¡f }|d k	rPd||f S |S d S )Nrl  c                   s   g | ]}d ˆ   |¡ ‘qS )r±  rà   r”  rá   rS   rV   râ     s     z:LatexPrinter._hprint_variadic_function.<locals>.<listcomp>z\%s\left(%s\right)rã   rL  )ÚsortedrÚ   r   rk   r#  r
  rç   )r«   r»   rÞ   rÚ   Ztexargsr¼   rS   rá   rV   Ú_hprint_variadic_function  s    ÿz&LatexPrinter._hprint_variadic_functionc                 C  s0   d|   |jd ¡ }|d k	r(d||f S |S d S )Nz\left\lfloor{%s}\right\rfloorr   rL  rV  ©r«   r»   rÞ   r¼   rS   rS   rV   Ú_print_floor!  s    zLatexPrinter._print_floorc                 C  s0   d|   |jd ¡ }|d k	r(d||f S |S d S )Nz\left\lceil{%s}\right\rceilr   rL  rV  rÄ  rS   rS   rV   Ú_print_ceiling)  s    zLatexPrinter._print_ceilingc                 C  sP   | j d s d|  |jd ¡ }nd|  |jd ¡ }|d k	rHd||f S |S d S )Nr€   z\log{\left(%s \right)}r   z\ln{\left(%s \right)}rL  )r¥   r´   rÚ   rÄ  rS   rS   rV   Ú
_print_log1  s    
zLatexPrinter._print_logc                 C  s0   d|   |jd ¡ }|d k	r(d||f S |S d S )Nú\left|{%s}\right|r   rL  rV  rÄ  rS   rS   rV   Ú
_print_Abs<  s    zLatexPrinter._print_Absc                 C  sN   | j d r&d|  |jd td ¡ }nd |  |jd td ¡¡}|  ||¡S )Nr‹   z\Re{%s}r   ÚAtomz\operatorname{{re}}{{{}}}©r¥   r¹   rÚ   r!   r¯   rß   rÄ  rS   rS   rV   Ú	_print_reD  s    
zLatexPrinter._print_rec                 C  sN   | j d r&d|  |jd td ¡ }nd |  |jd td ¡¡}|  ||¡S )Nr‹   z\Im{%s}r   rÊ  z\operatorname{{im}}{{{}}}rË  rÄ  rS   rS   rV   Ú	_print_imL  s    
zLatexPrinter._print_imc                 C  sŒ   ddl m}m} t|jd |ƒr2|  |jd d¡S t|jd |ƒrT|  |jd d¡S |jd jrtd|  |jd ¡ S d|  |jd ¡ S d S )Nr   )Ú
EquivalentÚImpliesz\not\Leftrightarrowz\not\Rightarrowz\neg \left(%s\right)z\neg %s)	Úsympy.logic.boolalgrÎ  rÏ  r,  rÚ   Ú_print_EquivalentÚ_print_ImpliesÚ
is_Booleanr´   )r«   rê   rÎ  rÏ  rS   rS   rV   Ú
_print_NotT  s    zLatexPrinter._print_Notc                 C  s‚   |d }|j r$|js$d|  |¡ }nd|  |¡ }|dd … D ]>}|j rf|jsf|d||  |¡f 7 }q>|d||  |¡f 7 }q>|S )Nr   rò   r±  rü   z %s \left(%s\right)z %s %s)rÓ  Zis_Notr´   )r«   rÚ   Úcharr4   r¼   rS   rS   rV   Ú_print_LogOp_  s    zLatexPrinter._print_LogOpc                 C  s   t |jtd}|  |d¡S )Nrl  z\wedge©rÂ  rÚ   r   rÖ  ©r«   rê   rÚ   rS   rS   rV   Ú
_print_Andn  s    zLatexPrinter._print_Andc                 C  s   t |jtd}|  |d¡S )Nrl  z\veer×  rØ  rS   rS   rV   Ú	_print_Orr  s    zLatexPrinter._print_Orc                 C  s   t |jtd}|  |d¡S )Nrl  z\veebarr×  rØ  rS   rS   rV   Ú
_print_Xorv  s    zLatexPrinter._print_Xorc                 C  s   |   |j|pd¡S )Nz\Rightarrow)rÖ  rÚ   )r«   rê   ÚaltcharrS   rS   rV   rÒ  z  s    zLatexPrinter._print_Impliesc                 C  s   t |jtd}|  ||pd¡S )Nrl  z\Leftrightarrowr×  )r«   rê   rÜ  rÚ   rS   rS   rV   rÑ  }  s    zLatexPrinter._print_Equivalentc                 C  s0   d|   |jd ¡ }|d k	r(d||f S |S d S )Nz\overline{%s}r   rL  rV  rÄ  rS   rS   rV   Ú_print_conjugate  s    zLatexPrinter._print_conjugatec                 C  s>   d}d|   |jd ¡ }|d k	r.d|||f S d||f S d S )Nz\operatorname{polar\_lift}r²  r   ú	%s^{%s}%sú%s%srV  )r«   r»   rÞ   r#  r4   rS   rS   rV   Ú_print_polar_lift‰  s
    zLatexPrinter._print_polar_liftc                 C  s    d|   |jd ¡ }|  ||¡S )Nze^{%s}r   )r´   rÚ   rß   rÄ  rS   rS   rV   Ú_print_ExpBase’  s    zLatexPrinter._print_ExpBasec                 C  s   dS )Nrê   rS   rÝ   rS   rS   rV   Ú_print_Exp1˜  s    zLatexPrinter._print_Exp1c                 C  s4   d|   |jd ¡ }|d k	r(d||f S d| S d S )Nrò   r   zK^{%s}%szK%srV  rÄ  rS   rS   rV   Ú_print_elliptic_k›  s    zLatexPrinter._print_elliptic_kc                 C  sD   d|   |jd ¡|   |jd ¡f }|d k	r8d||f S d| S d S )Nú\left(%s\middle| %s\right)r   rü   zF^{%s}%szF%srV  rÄ  rS   rS   rV   Ú_print_elliptic_f¢  s    ÿzLatexPrinter._print_elliptic_fc                 C  sh   t |jƒdkr4d|  |jd ¡|  |jd ¡f }nd|  |jd ¡ }|d k	r\d||f S d| S d S )Nr;  rä  r   rü   rò   zE^{%s}%szE%s©r	  rÚ   r´   rÄ  rS   rS   rV   Ú_print_elliptic_eª  s    ÿzLatexPrinter._print_elliptic_ec                 C  s†   t |jƒdkrBd|  |jd ¡|  |jd ¡|  |jd ¡f }n$d|  |jd ¡|  |jd ¡f }|d k	rzd||f S d| S d S )	Nro  z\left(%s; %s\middle| %s\right)r   rü   r;  rä  z
\Pi^{%s}%sz\Pi%sræ  rÄ  rS   rS   rV   Ú_print_elliptic_piµ  s    ÿÿÿzLatexPrinter._print_elliptic_pic                 C  s^   |j d }t|j ƒdkr"|j d n|j d }d|› d|› d}|d k	rRd||f S d| S d S )Nr   rü   rG  rã   rþ   z\operatorname{B}^{%s}%sz\operatorname{B}%s)rÚ   r	  )r«   r»   rÞ   rÐ   Úyr¼   rS   rS   rV   Ú_print_betaÂ  s    
"zLatexPrinter._print_betaÚBc                   sf   ‡ fdd„|j D ƒ}d|d |d f }|d k	rJd||d |d ||f S d	||d |d |f S d S )
Nc                   s   g | ]}ˆ   |¡‘qS rS   rà   r  rá   rS   rV   râ   Î  s     z/LatexPrinter._print_betainc.<locals>.<listcomp>ú\left(%s, %s\right)r   rü   z#\operatorname{%s}_{(%s, %s)}^{%s}%sr;  ro  z\operatorname{%s}_{(%s, %s)}%s)rÚ   )r«   r»   rÞ   ÚoperatorÚlargsr¼   rS   rá   rV   Ú_print_betaincÍ  s
    zLatexPrinter._print_betaincc                 C  s   | j ||ddS )NÚI)rí  )rï  rÝ   rS   rS   rV   Ú_print_betainc_regularizedÖ  s    z'LatexPrinter._print_betainc_regularizedc                 C  sD   d|   |jd ¡|   |jd ¡f }|d k	r8d||f S d| S d S )Nrì  r   rü   z\Gamma^{%s}%sz\Gamma%srV  rÄ  rS   rS   rV   Ú_print_uppergammaÙ  s    ÿzLatexPrinter._print_uppergammac                 C  sD   d|   |jd ¡|   |jd ¡f }|d k	r8d||f S d| S d S )Nrì  r   rü   z\gamma^{%s}%sú\gamma%srV  rÄ  rS   rS   rV   Ú_print_lowergammaâ  s    ÿzLatexPrinter._print_lowergammac                 C  sJ   d|   |jd ¡ }|d k	r2d|   |j¡||f S d|   |j¡|f S d S ©Nrò   r   rÞ  rß  )r´   rÚ   r#  rÄ  rS   rS   rV   Ú_hprint_one_arg_funcë  s    z!LatexPrinter._hprint_one_arg_funcc                 C  s4   d|   |jd ¡ }|d k	r(d||f S d| S d S )Nrò   r   z\operatorname{Chi}^{%s}%sz\operatorname{Chi}%srV  rÄ  rS   rS   rV   Ú
_print_Chiõ  s    zLatexPrinter._print_Chic                 C  sJ   d|   |jd ¡ }|   |jd ¡}|d k	r:d|||f S d||f S d S )Nrò   rü   r   z\operatorname{E}_{%s}^{%s}%sz\operatorname{E}_{%s}%srV  )r«   r»   rÞ   r¼   ÚnurS   rS   rV   Ú_print_expintý  s
    zLatexPrinter._print_expintc                 C  s4   d|   |jd ¡ }|d k	r(d||f S d| S d S )Nrò   r   zS^{%s}%szS%srV  rÄ  rS   rS   rV   Ú_print_fresnels  s    zLatexPrinter._print_fresnelsc                 C  s4   d|   |jd ¡ }|d k	r(d||f S d| S d S )Nrò   r   zC^{%s}%szC%srV  rÄ  rS   rS   rV   Ú_print_fresnelc  s    zLatexPrinter._print_fresnelcc                 C  s6   d|   |jd td ¡ }|d k	r.d||f S |S d S )Nz!%sr   ÚFuncrÜ   ©r¹   rÚ   r!   rÄ  rS   rS   rV   Ú_print_subfactorial  s    z LatexPrinter._print_subfactorialc                 C  s6   d|   |jd td ¡ }|d k	r.d||f S |S d S )Nz%s!r   rü  rL  rý  rÄ  rS   rS   rV   Ú_print_factorial  s    zLatexPrinter._print_factorialc                 C  s6   d|   |jd td ¡ }|d k	r.d||f S |S d S )Nz%s!!r   rü  rL  rý  rÄ  rS   rS   rV   Ú_print_factorial2&  s    zLatexPrinter._print_factorial2c                 C  s@   d|   |jd ¡|   |jd ¡f }|d k	r8d||f S |S d S )Nz{\binom{%s}{%s}}r   rü   rL  rV  rÄ  rS   rS   rV   Ú_print_binomial.  s    ÿzLatexPrinter._print_binomialc                 C  s<   |j \}}d|  |td ¡ }d||  |¡f }|  ||¡S )Nr±  rü  z{%s}^{\left(%s\right)}©rÚ   r¹   r!   r´   rß   )r«   r»   rÞ   Únrv  rÛ   r¼   rS   rS   rV   Ú_print_RisingFactorial7  s    
z#LatexPrinter._print_RisingFactorialc                 C  s<   |j \}}d|  |td ¡ }d|  |¡|f }|  ||¡S )Nr±  rü  z{\left(%s\right)}_{%s}r  )r«   r»   rÞ   r  rv  Úsubr¼   rS   rS   rV   Ú_print_FallingFactorial?  s    
z$LatexPrinter._print_FallingFactorial)Úsymrl   c                 C  sf   d| }d}|d k	r4|  d¡dkr0d||f }nd}d||  |j¡|  |j¡f }|rb|  ||¡}|S )Nr±  Fro   rû   rL  Tú%s_{%s}\left(%s\right))r£  r´   r†   Úargumentrß   )r«   r»   rÞ   r  r¼   Zneed_exprS   rS   rV   Ú_hprint_BesselBaseG  s    
ÿzLatexPrinter._hprint_BesselBasec                 C  sF   |sdS d}|d d… D ]}|d|   |¡ 7 }q||   |d ¡7 }|S )Nr™   rû   z%s, rà   )r«   rb   rU   rw   rS   rS   rV   Ú_hprint_vecX  s    zLatexPrinter._hprint_vecc                 C  s   |   ||d¡S )NÚJ©r
  rÝ   rS   rS   rV   Ú_print_besselja  s    zLatexPrinter._print_besseljc                 C  s   |   ||d¡S )Nrð  r  rÝ   rS   rS   rV   Ú_print_besselid  s    zLatexPrinter._print_besselic                 C  s   |   ||d¡S )NÚKr  rÝ   rS   rS   rV   Ú_print_besselkg  s    zLatexPrinter._print_besselkc                 C  s   |   ||d¡S )NÚYr  rÝ   rS   rS   rV   Ú_print_besselyj  s    zLatexPrinter._print_besselyc                 C  s   |   ||d¡S )Nré  r  rÝ   rS   rS   rV   Ú	_print_ynm  s    zLatexPrinter._print_ync                 C  s   |   ||d¡S )Nrž   r  rÝ   rS   rS   rV   Ú	_print_jnp  s    zLatexPrinter._print_jnc                 C  s   |   ||d¡S )NzH^{(1)}r  rÝ   rS   rS   rV   Ú_print_hankel1s  s    zLatexPrinter._print_hankel1c                 C  s   |   ||d¡S )NzH^{(2)}r  rÝ   rS   rS   rV   Ú_print_hankel2v  s    zLatexPrinter._print_hankel2c                 C  s   |   ||d¡S )Nzh^{(1)}r  rÝ   rS   rS   rV   Ú
_print_hn1y  s    zLatexPrinter._print_hn1c                 C  s   |   ||d¡S )Nzh^{(2)}r  rÝ   rS   rS   rV   Ú
_print_hn2|  s    zLatexPrinter._print_hn2r™   c                 C  s:   d|   |jd ¡ }|d k	r*d|||f S d||f S d S rõ  rV  ©r«   r»   rÞ   Únotationr¼   rS   rS   rV   Ú_hprint_airy  s    zLatexPrinter._hprint_airyc                 C  s:   d|   |jd ¡ }|d k	r*d|||f S d||f S d S )Nrò   r   z{%s^\prime}^{%s}%sz%s^\prime%srV  r  rS   rS   rV   Ú_hprint_airy_prime‡  s    zLatexPrinter._hprint_airy_primec                 C  s   |   ||d¡S ©NZAi©r  rÝ   rS   rS   rV   Ú_print_airyai  s    zLatexPrinter._print_airyaic                 C  s   |   ||d¡S ©NZBir  rÝ   rS   rS   rV   Ú_print_airybi’  s    zLatexPrinter._print_airybic                 C  s   |   ||d¡S r  ©r  rÝ   rS   rS   rV   Ú_print_airyaiprime•  s    zLatexPrinter._print_airyaiprimec                 C  s   |   ||d¡S r!  r#  rÝ   rS   rS   rV   Ú_print_airybiprime˜  s    zLatexPrinter._print_airybiprimec                 C  sZ   d|   t|jƒ¡|   t|jƒ¡|  |j¡|  |j¡|   |j¡f }|d k	rVd||f }|S )NzN{{}_{%s}F_{%s}\left(\begin{matrix} %s \\ %s \end{matrix}\middle| {%s} \right)}ú	{%s}^{%s})r´   r	  ÚapÚbqr  r	  rÄ  rS   rS   rV   Ú_print_hyper›  s    
 

þþzLatexPrinter._print_hyperc                 C  sŠ   d|   t|jƒ¡|   t|jƒ¡|   t|jƒ¡|   t|jƒ¡|  |j¡|  |j¡|  |j¡|  |j¡|   |j	¡f	 }|d k	r†d||f }|S )Nz^{G_{%s, %s}^{%s, %s}\left(\begin{matrix} %s & %s \\%s & %s \end{matrix} \middle| {%s} \right)}r&  )
r´   r	  r'  r(  re   Úanr  ZaotherZbotherr	  rÄ  rS   rS   rV   Ú_print_meijerg¦  s     
 

 

üþzLatexPrinter._print_meijergc                 C  s0   d|   |jd ¡ }|d k	r(d||f S d| S )Nrò   r   z\eta^{%s}%sz\eta%srV  rÄ  rS   rS   rV   Ú_print_dirichlet_eta³  s    z!LatexPrinter._print_dirichlet_etac                 C  sV   t |jƒdkr&dtt| j|jƒƒ }nd|  |jd ¡ }|d k	rNd||f S d| S )Nr;  rì  rò   r   z\zeta^{%s}%sz\zeta%s©r	  rÚ   r\  rz  r´   rÄ  rS   rS   rV   Ú_print_zeta¹  s    zLatexPrinter._print_zetac                 C  sV   t |jƒdkr&dtt| j|jƒƒ }nd|  |jd ¡ }|d k	rNd||f S d| S )Nr;  z_{%s}\left(%s\right)ry  r   z\gamma%s^{%s}ró  r-  rÄ  rS   rS   rV   Ú_print_stieltjesÂ  s    zLatexPrinter._print_stieltjesc                 C  s2   dt t| j|jƒƒ }|d kr&d| S d||f S )Nz\left(%s, %s, %s\right)z\Phi%sz\Phi^{%s}%s)r\  rz  r´   rÚ   rÄ  rS   rS   rV   Ú_print_lerchphiË  s    zLatexPrinter._print_lerchphic                 C  s<   t | j|jƒ\}}d| }|d kr.d||f S d|||f S )Nrò   z\operatorname{Li}_{%s}%sz\operatorname{Li}_{%s}^{%s}%s©rz  r´   rÚ   )r«   r»   rÞ   rU   rŸ  r¼   rS   rS   rV   Ú_print_polylogÑ  s
    zLatexPrinter._print_polylogc                 C  sB   t | j|jƒ\}}}}d||||f }|d k	r>d| d|  }|S )Nz*P_{%s}^{\left(%s,%s\right)}\left(%s\right)rG  ú\right)^{%s}r1  )r«   r»   rÞ   r  rB  rC  rÐ   r¼   rS   rS   rV   Ú_print_jacobiØ  s
    zLatexPrinter._print_jacobic                 C  s>   t | j|jƒ\}}}d|||f }|d k	r:d| d|  }|S )Nz'C_{%s}^{\left(%s\right)}\left(%s\right)rG  r3  r1  ©r«   r»   rÞ   r  rB  rÐ   r¼   rS   rS   rV   Ú_print_gegenbauerß  s
    zLatexPrinter._print_gegenbauerc                 C  s:   t | j|jƒ\}}d||f }|d k	r6d| d|  }|S )NzT_{%s}\left(%s\right)rG  r3  r1  ©r«   r»   rÞ   r  rÐ   r¼   rS   rS   rV   Ú_print_chebyshevtæ  s
    zLatexPrinter._print_chebyshevtc                 C  s:   t | j|jƒ\}}d||f }|d k	r6d| d|  }|S )NzU_{%s}\left(%s\right)rG  r3  r1  r7  rS   rS   rV   Ú_print_chebyshevuí  s
    zLatexPrinter._print_chebyshevuc                 C  s:   t | j|jƒ\}}d||f }|d k	r6d| d|  }|S )NzP_{%s}\left(%s\right)rG  r3  r1  r7  rS   rS   rV   Ú_print_legendreô  s
    zLatexPrinter._print_legendrec                 C  s>   t | j|jƒ\}}}d|||f }|d k	r:d| d|  }|S )Nz'P_{%s}^{\left(%s\right)}\left(%s\right)rG  r3  r1  r5  rS   rS   rV   Ú_print_assoc_legendreû  s
    z"LatexPrinter._print_assoc_legendrec                 C  s:   t | j|jƒ\}}d||f }|d k	r6d| d|  }|S )NzH_{%s}\left(%s\right)rG  r3  r1  r7  rS   rS   rV   Ú_print_hermite  s
    zLatexPrinter._print_hermitec                 C  s:   t | j|jƒ\}}d||f }|d k	r6d| d|  }|S )NzL_{%s}\left(%s\right)rG  r3  r1  r7  rS   rS   rV   Ú_print_laguerre	  s
    zLatexPrinter._print_laguerrec                 C  s>   t | j|jƒ\}}}d|||f }|d k	r:d| d|  }|S )Nz'L_{%s}^{\left(%s\right)}\left(%s\right)rG  r3  r1  r5  rS   rS   rV   Ú_print_assoc_laguerre  s
    z"LatexPrinter._print_assoc_laguerrec                 C  sB   t | j|jƒ\}}}}d||||f }|d k	r>d| d|  }|S )NzY_{%s}^{%s}\left(%s,%s\right)rG  r3  r1  ©r«   r»   rÞ   r  ÚmÚthetaÚphir¼   rS   rS   rV   Ú
_print_Ynm  s
    zLatexPrinter._print_Ynmc                 C  sB   t | j|jƒ\}}}}d||||f }|d k	r>d| d|  }|S )NzZ_{%s}^{%s}\left(%s,%s\right)rG  r3  r1  r?  rS   rS   rV   Ú
_print_Znm  s
    zLatexPrinter._print_Znmc           	      C  sB   t | j|ƒ\}}}|rdnd}|s&dnd| }d||||||f S )Nz	^{\prime}r™   r—  z%s%s\left(%s, %s, %s\right)%s)rz  r´   )	r«   Ú	characterrÚ   rc   rÞ   rB  rM  rŸ  ÚsuprS   rS   rV   Z__print_mathieu_functions%  s    z&LatexPrinter.__print_mathieu_functionsc                 C  s   | j d|j|dS )NÚCrK  ©Ú&_LatexPrinter__print_mathieu_functionsrÚ   rÝ   rS   rS   rV   Ú_print_mathieuc+  s    zLatexPrinter._print_mathieucc                 C  s   | j d|j|dS )Nr   rK  rH  rÝ   rS   rS   rV   Ú_print_mathieus.  s    zLatexPrinter._print_mathieusc                 C  s   | j d|jd|dS )NrG  T©rc   rÞ   rH  rÝ   rS   rS   rV   Ú_print_mathieucprime1  s    z!LatexPrinter._print_mathieucprimec                 C  s   | j d|jd|dS )Nr   TrL  rH  rÝ   rS   rS   rV   Ú_print_mathieusprime4  s    z!LatexPrinter._print_mathieusprimec                 C  sb   |j dkrRd}|j}|jdk r(d}| }| jd rBd|||j f S d|||j f S |  |j¡S d S )Nrü   r™   r   r8  r}   z	%s%d / %dz%s\frac{%d}{%d})rM  rH  r¥   r´   )r«   r»   ÚsignrH  rS   rS   rV   Ú_print_Rational7  s    


zLatexPrinter._print_Rationalc                 C  sº   |   |j¡}|jr&tdd„ |jD ƒƒs4t|jƒdkr²|d7 }t|jƒdkr\||   |j¡7 }n|jrv||   |jd ¡7 }|d7 }t|jƒdkrž||   |j¡7 }n||   |jd ¡7 }d| S )Nc                 s  s   | ]}|t jkV  qd S r³   )r   r€  )rÏ   rH  rS   rS   rV   rÒ   F  s     z,LatexPrinter._print_Order.<locals>.<genexpr>rü   ú; r   z\rightarrow zO\left(%s\right))r´   r»   ÚpointrÕ   r	  Ú	variables©r«   r»   rU   rS   rS   rV   Ú_print_OrderD  s    ÿzLatexPrinter._print_Orderr   c                 C  s,   | j d  |¡}|d k	r|S | j|j|dS )Nr‡   ©Ústyle)r¥   rª   rä   rè   )r«   r»   rW  rè   rS   rS   rV   Ú_print_SymbolT  s    zLatexPrinter._print_Symbol)Ústringrl   c                 C  sŽ   d|kr|g g   }}}n2t |ƒ\}}}t|ƒ}dd„ |D ƒ}dd„ |D ƒ}|dkr^d |¡}|rt|dd |¡ 7 }|rŠ|d	d |¡ 7 }|S )
NrZ   c                 S  s   g | ]}t |ƒ‘qS rS   ©Ú	translate©rÏ   rF  rS   rS   rV   râ   d  s     z5LatexPrinter._deal_with_super_sub.<locals>.<listcomp>c                 S  s   g | ]}t |ƒ‘qS rS   rZ  ©rÏ   r  rS   rS   rV   râ   e  s     rd   ú\mathbf{{{}}}r—  r”   ry  )r   r[  r¯   rç   )r«   rY  rW  rè   Úsupersr  rS   rS   rV   rä   ]  s    
z!LatexPrinter._deal_with_super_subc                 C  sR   | j d rd}d}nd}d}d||ddd	d
œ}d|  |j¡||j |  |j¡f S )Nr   z\gtz\ltú>ú<r‹  z\geqz\leqz\neq)z==r`  ra  z>=z<=z!=z%s %s %s)r¥   r´   ÚlhsZrel_opÚrhs)r«   r»   ÚgtÚltÚcharmaprS   rS   rV   Ú_print_Relationals  s     
ú	 
ÿzLatexPrinter._print_Relationalc                   sŠ   ‡ fdd„|j d d… D ƒ}|j d jtkrJ| dˆ  |j d j¡ ¡ n.| dˆ  |j d j¡ˆ  |j d j¡f ¡ d}|d |¡ S )Nc                   s(   g | ] \}}d ˆ   |¡ˆ   |¡f ‘qS )ú%s & \text{for}\: %srà   )rÏ   rê   rq   rá   rS   rV   râ   ˆ  s   ÿz1LatexPrinter._print_Piecewise.<locals>.<listcomp>rû   z%s & \text{otherwise}rh  z\begin{cases} %s \end{cases}z \\)rÚ   Zcondr   rt  r´   r»   rç   )r«   r»   Zecpairsr¼   rS   rá   rV   Ú_print_Piecewise‡  s    
ÿÿÿÿzLatexPrinter._print_Piecewisec              
     s¼   g }t |jƒD ].}| d ‡ fdd„||d d …f D ƒ¡¡ qˆ jd }|d kr|ˆ jd dkrdd}n|jdkd	krxd
}nd}d}| d|¡}|dkr®| ddd|j  d ¡}|d |¡ S )Nr  c                   s   g | ]}ˆ   |¡‘qS rS   rà   rX  rá   rS   rV   râ   ˜  s     z7LatexPrinter._print_matrix_contents.<locals>.<listcomp>rƒ   r„   r“   Úsmallmatrixé
   TÚmatrixÚarrayú \begin{%MATSTR%}%s\end{%MATSTR%}ú%MATSTR%r±  rZ   rq   z}%sr`  )r  Úrowsrt  rç   r¥   Úcolsrp   )r«   r»   ÚlinesÚlinerƒ   Úout_strrS   rá   rV   Ú_print_matrix_contents”  s    ,
z#LatexPrinter._print_matrix_contentsc                 C  s@   |   |¡}| jd r<| jd }| j| }d| | d | }|S )Nr‚   ú\leftú\right)ru  r¥   r©   )r«   r»   rt  Ú
left_delimÚright_delimrS   rS   rV   Ú_print_MatrixBaseª  s    




ÿÿzLatexPrinter._print_MatrixBasec                 C  s2   | j |jtd ddd|  |j¡|  |j¡f  S )NrÊ  T©r¸   z	_{%s, %s})r¹   Úparentr!   r´   rw   rž   rÁ   rS   rS   rV   Ú_print_MatrixElement³  s    ÿz!LatexPrinter._print_MatrixElementc                   sN   ‡ fdd„}ˆ j |jtd ddd ||j|jjƒ d ||j|jjƒ d S )	Nc                   sZ   t | ƒ} | d dkr| d= | d dkr.d | d< | d |krBd | d< d ‡ fdd„| D ƒ¡S )Nr;  rü   r   ú:c                 3  s$   | ]}|d k	rˆ   |¡ndV  qd S )Nr™   rà   )rÏ   Úxirá   rS   rV   rÒ   À  s     zFLatexPrinter._print_MatrixSlice.<locals>.latexslice.<locals>.<genexpr>)r0  rç   )rÐ   r‡  rá   rS   rV   Ú
latexslice¸  s    z3LatexPrinter._print_MatrixSlice.<locals>.latexslicerÊ  Tr{  ú\left[rã   ú\right])r¹   r|  r!   Zrowslicerp  Zcolslicerq  )r«   r»   r€  rS   rá   rV   Ú_print_MatrixSlice·  s    	ÿÿþþzLatexPrinter._print_MatrixSlicec                 C  s   |   |j¡S r³   )r´   ÚblocksrÁ   rS   rS   rV   Ú_print_BlockMatrixÅ  s    zLatexPrinter._print_BlockMatrixc                 C  sl   |j }ddlm}m} t||ƒs>t||ƒs>|jr>d|  |¡ S |  |t|ƒd¡}d|kr`d| S d| S d S )Nr   ©ÚMatrixSymbolÚBlockMatrixz\left(%s\right)^{T}Tro   z%s^{T}©	r4   Úsympy.matricesr‡  rˆ  r,  Úis_MatrixExprr´   r¹   r   ©r«   r»   r  r‡  rˆ  rU   rS   rS   rV   Ú_print_TransposeÈ  s    
ÿÿzLatexPrinter._print_Transposec                 C  s   |j }d|  |¡ S )Nz!\operatorname{tr}\left(%s \right))r4   r´   ©r«   r»   r  rS   rS   rV   Ú_print_TraceÕ  s    zLatexPrinter._print_Tracec                 C  sl   |j }ddlm}m} t||ƒs>t||ƒs>|jr>d|  |¡ S |  |t|ƒd¡}d|kr`d| S d| S d S )Nr   r†  z\left(%s\right)^{\dagger}Tro   z%s^{\dagger}r‰  rŒ  rS   rS   rV   Ú_print_AdjointÙ  s    
ÿÿzLatexPrinter._print_Adjointc                   s~   ddl m‰  ‡ ‡‡fdd„}tˆjƒ}ˆ ¡ rj|d dkrH|dd … }n|d  |d< dd t||ƒ¡ S d t||ƒ¡S d S )	Nr   )ÚMatMulc                   s0   t | tƒrt | ˆ ƒsˆ | ¡S ˆ | tˆƒd¡S ©NF)r,  r	   r´   r¹   r   r-  ©r‘  r»   r«   rS   rV   rW   ê  s   z,LatexPrinter._print_MatMul.<locals>.<lambda>rû   rü   r8  r”   )Zsympyr‘  r0  rÚ   rÓ   rç   rz  )r«   r»   ÚparensrÚ   rS   r“  rV   Ú_print_MatMulæ  s    
zLatexPrinter._print_MatMulc                 C  sN   |j }|jr@ddlm} t||ƒr2d|  |j¡ S d|  |¡ S d|  |¡ S )Nr   )rˆ  rÈ  )r4   r‹  Z&sympy.matrices.expressions.blockmatrixrˆ  r,  ru  r„  r´   )r«   r»   r  rˆ  rS   rS   rV   Ú_print_Determinant÷  s    
zLatexPrinter._print_Determinantc                 C  sz   |d k	rBd| j |jd td dd| j |jd td dd|f S d| j |jd td dd| j |jd td ddf S )Nz\left(%s \bmod %s\right)^{%s}r   r	   Tr{  rü   z%s \bmod %srý  rÝ   rS   rS   rV   Ú
_print_Mod  s(    ÿÿüÿþþýzLatexPrinter._print_Modc                   s.   |j }td ‰| j‰ d ‡ ‡fdd„|D ƒ¡S )Nr   z \circ c                 3  s   | ]}ˆ |ˆd dV  qdS ©Tr{  NrS   r  ©r”  ÚprecrS   rV   rÒ     s     z6LatexPrinter._print_HadamardProduct.<locals>.<genexpr>©rÚ   r!   r¹   rç   ©r«   r»   rÚ   rS   r™  rV   Ú_print_HadamardProduct  s    ÿz#LatexPrinter._print_HadamardProductc                 C  s(   t |jƒtd k rd}nd}|  ||¡S )Nr	   z%s^{\circ \left({%s}\right)}z%s^{\circ {%s}})r   rÞ   r!   rO  )r«   r»   rQ  rS   rS   rV   Ú_print_HadamardPower  s    z!LatexPrinter._print_HadamardPowerc                   s.   |j }td ‰| j‰ d ‡ ‡fdd„|D ƒ¡S )Nr   ú	 \otimes c                 3  s   | ]}ˆ |ˆd dV  qdS r˜  rS   r  r™  rS   rV   rÒ   %  s     z7LatexPrinter._print_KroneckerProduct.<locals>.<genexpr>r›  rœ  rS   r™  rV   Ú_print_KroneckerProduct  s    ÿz$LatexPrinter._print_KroneckerProductc                 C  s|   |j |j }}ddlm} t||ƒsB|jrBd|  |¡|  |¡f S |  |¡}d|krfd||  |¡f S d||  |¡f S d S )Nr   )r‡  rÜ   ro   rL  )rÛ   rÞ   rŠ  r‡  r,  r‹  r´   )r«   r»   rÛ   rÞ   r‡  Zbase_strrS   rS   rV   Ú_print_MatPow'  s    
ÿ
zLatexPrinter._print_MatPowc                 C  s   | j || jd dS )Nr‰   rV  )rX  r¥   rÁ   rS   rS   rV   Ú_print_MatrixSymbol4  s    
ÿz LatexPrinter._print_MatrixSymbolc                 C  s   | j d dkrdS dS )Nr‰   rv   Ú0z
\mathbf{0}©r¥   )r«   ÚZrS   rS   rV   Ú_print_ZeroMatrix8  s    ÿÿÿzLatexPrinter._print_ZeroMatrixc                 C  s   | j d dkrdS dS )Nr‰   rv   Ú1z
\mathbf{1}r¤  )r«   ÚOrS   rS   rV   Ú_print_OneMatrix<  s    ÿÿÿzLatexPrinter._print_OneMatrixc                 C  s   | j d dkrdS dS )Nr‰   rv   z
\mathbb{I}z
\mathbf{I}r¤  )r«   rð  rS   rS   rV   Ú_print_Identity@  s    ÿÿÿzLatexPrinter._print_Identityc                 C  s   |   |jd ¡}d| S )Nr   zP_{%s}rV  )r«   ÚPZperm_strrS   rS   rV   Ú_print_PermutationMatrixD  s    z%LatexPrinter._print_PermutationMatrixr   c              
   C  s  |  ¡ dkr|  |d ¡S | jd }|d krd| jd dkr@d}n$|  ¡ dksZ|jd dkr`d	}nd
}d}| d|¡}|d
krˆ| dd¡}| jd rº| jd }| j| }d| | d | }|  ¡ dkrÎ|d S dd„ t|  ¡ d ƒD ƒ}dd„ |jD ƒ}tj|Ž D ]è}|d  	|  || ¡¡ d}	t|  ¡ d ddƒD ]°}
t
||
d  ƒ|j|
 k r\ q|	r€||
  	d ||
d  ¡¡ nR||
  	|d ||
d  ¡ ¡ t
||
d  ƒdkrÒd||
 d  d ||
 d< |	 }	g ||
d < q6q|d d }|  ¡ d dkr|| }|S )Nr   rS   rƒ   r„   r“   rj  rû   rk  rl  rm  rn  ro  r±  z{}%sr‚   rv  rw  r™   c                 S  s   g | ]}g ‘qS rS   rS   rX  rS   rS   rV   râ   c  s     z1LatexPrinter._print_NDimArray.<locals>.<listcomp>rü   c                 S  s   g | ]}t t|ƒƒ‘qS rS   )r0  r  rX  rS   rS   rV   râ   d  s     Tr  r`  r  r‚  r;  )Úrankr´   r¥   Úshaperp   r©   r  Ú	itertoolsÚproductrt  r	  rç   )r«   r»   rƒ   Z	block_strrx  ry  Z	level_strZshape_rangesZouter_iZevenZback_outer_irt  rS   rS   rV   Ú_print_NDimArrayH  sd    




ÿÿÿÿ
ÿÿzLatexPrinter._print_NDimArrayÚdict)Ú	index_mapc           	      C  sÆ   |   |¡}d }d }|D ]š}|j}||ks,|r<||kr<|d7 }||krl|d k	rT|d7 }|jrd|d7 }n|d7 }||   |jd ¡7 }||kr¨|d7 }||   || ¡7 }d}nd}|}q|d k	rÂ|d7 }|S )	Nrý   rR   z{}^{z{}_{r   r‹  TF)r´   Úis_uprÚ   )	r«   rè   r{  r³  rt  Zlast_valenceZprev_mapÚindexZnew_valencerS   rS   rV   Ú_printer_tensor_indices~  s2    
ÿ
z$LatexPrinter._printer_tensor_indicesc                 C  s&   |j d j d }| ¡ }|  ||i ¡S rU  )rÚ   Úget_indicesr¶  )r«   r»   rè   r{  rS   rS   rV   Ú_print_Tensorš  s    zLatexPrinter._print_Tensorc                 C  s0   |j jd jd }|j  ¡ }|j}|  |||¡S rU  )r»   rÚ   r·  r³  r¶  )r«   r»   rè   r{  r³  rS   rS   rV   Ú_print_TensorElementŸ  s    
z!LatexPrinter._print_TensorElementc                   s*   ˆ   ¡ \}}|d ‡ ‡fdd„|D ƒ¡ S )Nr™   c                   s   g | ]}ˆ  |tˆ ƒ¡‘qS rS   )r¹   r    r  ©r»   r«   rS   rV   râ   ©  s     z/LatexPrinter._print_TensMul.<locals>.<listcomp>)Z!_get_args_for_traditional_printerrç   )r«   r»   rO  rÚ   rS   rº  rV   Ú_print_TensMul¥  s    ÿzLatexPrinter._print_TensMulc                 C  sL   g }|j }|D ]}| |  |t|ƒ¡¡ q| ¡  d |¡}| dd¡}|S )Nrñ   z+ -r8  )rÚ   rt  r¹   r    rs  rç   rp   )r«   r»   rB  rÚ   rÐ   rU   rS   rS   rV   Ú_print_TensAdd¬  s    
zLatexPrinter._print_TensAddc                 C  s"   d|j rdnd|  |jd ¡f S )Nz{}%s{%s}ro   r¢  r   )r´  r´   rÚ   rÁ   rS   rS   rV   Ú_print_TensorIndex¶  s    þzLatexPrinter._print_TensorIndexc                   st   t |jƒdkr6dˆ  |jd ¡ˆ  |jtd d¡f S dt |jƒd ‡ fdd	„|jD ƒ¡ˆ  |jtd d¡f S d S )
Nrü   z"\frac{\partial}{\partial {%s}}{%s}r   r	   Fz\frac{\partial^{%s}}{%s}{%s}r”   c                   s   g | ]}d ˆ   |¡ ‘qS )z\partial {%s}rà   rX  rá   rS   rV   râ   Å  s     z9LatexPrinter._print_PartialDerivative.<locals>.<listcomp>)r	  rS  r´   r¹   r»   r!   rç   rÁ   rS   rá   rV   Ú_print_PartialDerivative¼  s    þýz%LatexPrinter._print_PartialDerivativec                 C  s   |   |j¡S r³   )r´   rè   rÁ   rS   rS   rV   Ú_print_ArraySymbolÉ  s    zLatexPrinter._print_ArraySymbolc                   s2   dˆ   |jtd d¡d ‡ fdd„|jD ƒ¡f S )Nz{{%s}_{%s}}rü  Trã   c                   s   g | ]}ˆ   |¡› ‘qS rS   rà   rX  rá   rS   rV   râ   Ï  s     z4LatexPrinter._print_ArrayElement.<locals>.<listcomp>)r¹   rè   r!   rç   r{  rÁ   rS   rá   rV   Ú_print_ArrayElementÌ  s    þz LatexPrinter._print_ArrayElementc                 C  s   dS )Nz
\mathbb{U}rS   rÁ   rS   rS   rV   Ú_print_UniversalSetÑ  s    z LatexPrinter._print_UniversalSetc                 C  s8   |d krd|   |jd ¡ S d|   |jd ¡|f S d S )Nz$\operatorname{frac}{\left(%s\right)}r   z)\operatorname{frac}{\left(%s\right)}^{%s}rV  rÝ   rS   rS   rV   Ú_print_fracÔ  s     ÿzLatexPrinter._print_fracc                   sz   ˆ j d dkrd}nˆ j d dkr(d}ntdƒ‚t|ƒdkrTˆ  ˆ  |d ¡| ¡S ˆ  |d	  ‡ fd
d„|D ƒ¡¡S d S )NrŒ   r  ú;rx   rý   úUnknown Decimal Separatorrü   r   z \  c                   s   g | ]}ˆ   |¡‘qS rS   rà   rX  rá   rS   rV   râ   è  s     z-LatexPrinter._print_tuple.<locals>.<listcomp>)r¥   r¦   r	  r²   r´   rç   )r«   r»   ÚseprS   rá   rV   Ú_print_tupleÛ  s    ÿzLatexPrinter._print_tuplec                   s   ‡ fdd„|j D ƒ}d |¡S )Nc                   s   g | ]}ˆ   |¡‘qS rS   rà   ©rÏ   rB  rá   rS   rV   râ   ë  s     z5LatexPrinter._print_TensorProduct.<locals>.<listcomp>rŸ  ©rÚ   rç   ©r«   r»   ÚelementsrS   rá   rV   Ú_print_TensorProductê  s    z!LatexPrinter._print_TensorProductc                   s   ‡ fdd„|j D ƒ}d |¡S )Nc                   s   g | ]}ˆ   |¡‘qS rS   rà   rÇ  rá   rS   rV   râ   ï  s     z4LatexPrinter._print_WedgeProduct.<locals>.<listcomp>z \wedge rÈ  rÉ  rS   rá   rV   Ú_print_WedgeProductî  s    z LatexPrinter._print_WedgeProductc                 C  s
   |   |¡S r³   )rÆ  rÁ   rS   rS   rV   Ú_print_Tupleò  s    zLatexPrinter._print_Tuplec                   s`   ˆ j d dkr*dd ‡ fdd„|D ƒ¡ S ˆ j d dkrTdd ‡ fd	d„|D ƒ¡ S td
ƒ‚d S )NrŒ   r  z\left[ %s\right]z; \  c                   s   g | ]}ˆ   |¡‘qS rS   rà   rX  rá   rS   rV   râ   ø  s     z,LatexPrinter._print_list.<locals>.<listcomp>rx   ú, \  c                   s   g | ]}ˆ   |¡‘qS rS   rà   rX  rá   rS   rV   râ   û  s     rÄ  )r¥   rç   r¦   rÁ   rS   rá   rV   Ú_print_listõ  s    ÿÿzLatexPrinter._print_listc                 C  sR   t | ¡ td}g }|D ]*}|| }| d|  |¡|  |¡f ¡ qdd |¡ S )Nrl  z%s : %sz\left\{ %s\right\}rÎ  )rÂ  Úkeysr   rt  r´   rç   )r«   ry   rÐ  rq  rm  ÚvalrS   rS   rV   Ú_print_dict   s     zLatexPrinter._print_dictc                 C  s
   |   |¡S r³   )rÒ  rÁ   rS   rS   rV   Ú_print_Dict
  s    zLatexPrinter._print_Dictc                 C  sj   t |jƒdks|jd dkr2d|  |jd ¡ }n$d|  |jd ¡|  |jd ¡f }|rfd||f }|S )Nrü   r   z\delta\left(%s\right)z+\delta^{\left( %s \right)}\left( %s \right)rÜ   ræ  rÄ  rS   rS   rV   Ú_print_DiracDelta  s     ÿzLatexPrinter._print_DiracDeltac                 C  sP   |   |jd |jd  ¡}|   |jd ¡}d||f }|d k	rLd|||f }|S )Nr   rü   r;  z${\left\langle %s \right\rangle}^{%s}z-{\left({\langle %s \rangle}^{%s}\right)}^{%s}rV  )r«   r»   rÞ   Úshiftr°  r¼   rS   rS   rV   Ú_print_SingularityFunction  s    z'LatexPrinter._print_SingularityFunctionc                   s6   d  ‡ fdd„|jD ƒ¡}d| }|r2d||f }|S )Nrã   c                 3  s   | ]}ˆ   |¡V  qd S r³   rà   r  rá   rS   rV   rÒ      s     z0LatexPrinter._print_Heaviside.<locals>.<genexpr>z\theta\left(%s\right)rÜ   )rç   Úpargs)r«   r»   rÞ   r×  r¼   rS   rá   rV   Ú_print_Heaviside  s
    zLatexPrinter._print_Heavisidec                 C  sj   |   |jd ¡}|   |jd ¡}|jd jrF|jd jrFd||f }nd||f }|d k	rfd||f }|S )Nr   rü   z\delta_{%s %s}z\delta_{%s, %s}rÜ   )r´   rÚ   r¾   )r«   r»   rÞ   rw   rž   r¼   rS   rS   rV   Ú_print_KroneckerDelta&  s    z"LatexPrinter._print_KroneckerDeltac                 C  sT   t | j|jƒ}tdd„ |jD ƒƒr2dd |¡ }ndd |¡ }|rPd||f }|S )Nc                 s  s   | ]}|j V  qd S r³   )r¾   rÎ   rS   rS   rV   rÒ   3  s     z1LatexPrinter._print_LeviCivita.<locals>.<genexpr>z\varepsilon_{%s}r”   rã   rÜ   )rz  r´   rÚ   r˜  rç   )r«   r»   rÞ   r{  r¼   rS   rS   rV   Ú_print_LeviCivita1  s    zLatexPrinter._print_LeviCivitac                 C  sn   t |dƒrd|  | ¡ ¡ S t |dƒrFd|  |j¡ d |  |j¡ S t |dƒr`d|  |j¡ S |  d ¡S d S )NÚ
as_booleanz\text{Domain: }Úsetz \in rš  z\text{Domain on })r+  r´   rÛ  rš  rÜ  )r«   ry   rS   rS   rV   Ú_print_RandomDomain;  s    


ÿ
z LatexPrinter._print_RandomDomainc                 C  s   t |jtd}|  |¡S )Nrl  )rÂ  rÚ   r   Ú
_print_set©r«   rU   rq  rS   rS   rV   Ú_print_FiniteSetF  s    zLatexPrinter._print_FiniteSetc                 C  s`   t |td}| jd dkr.d t| j|ƒ¡}n*| jd dkrPd t| j|ƒ¡}ntdƒ‚d| S )	Nrl  rŒ   r  rQ  rx   rã   rÄ  ú\left\{%s\right\})rÂ  r   r¥   rç   rz  r´   r¦   rß  rS   rS   rV   rÞ  J  s    zLatexPrinter._print_setc                   s  ‡‡fdd„}t ƒ ‰ ˆjjrLˆjjrLˆjjr<ˆ dddˆ f}qêˆ dddˆ f}nžˆjjrnˆ ˆd ˆj ˆd f}n|ˆjjr’tˆƒ}t|ƒt|ƒˆ f}nXˆjd k	räˆj	dk dkr´t
ˆƒ}qêˆjrÜtˆƒ}t|ƒt|ƒˆ ˆd f}qê|ƒ S n|ƒ S dd	 ‡ ‡fd
d„|D ƒ¡ d S )Nc                    s¢   ˆ j d dkrJˆ j d dkr.ˆ ˆ j d ¡} q–d ‡fdd„ˆ j D ƒ¡} nLˆ j d dkr|d ‡fdd„ˆ j d d… D ƒ¡} nd ‡fdd„ˆ j D ƒ¡} d	| › d
S )Nr   r;  rü   rã   c                 3  s   | ]}ˆ   |¡V  qd S r³   rà   r  rá   rS   rV   rÒ   ^  s     zKLatexPrinter._print_Range.<locals>._print_symbolic_range.<locals>.<genexpr>c                 3  s   | ]}ˆ   |¡V  qd S r³   rà   r  rá   rS   rV   rÒ   a  s     c                 3  s   | ]}ˆ   |¡V  qd S r³   rà   r  rá   rS   rV   rÒ   c  s     z\text{Range}\left(rþ   )rÚ   r´   rç   )Úcont)rU   r«   rS   rV   Ú_print_symbolic_rangeX  s    $z8LatexPrinter._print_Range.<locals>._print_symbolic_rangerû   r   rü   r  Tz\left\{rã   c                 3  s$   | ]}|ˆ k	rˆ  |¡nd V  qdS ©z\ldotsNrà   ©rÏ   Úel©Údotsr«   rS   rV   rÒ   ~  s     z,LatexPrinter._print_Range.<locals>.<genexpr>z\right\})ÚobjectÚstartÚis_infiniteÚstopÚstepZis_positiveÚiterÚnextZis_emptyr   r\  Úis_iterablerç   )r«   rU   rã  ÚprintsetÚitrS   )rè  rU   r«   rV   Ú_print_RangeW  s0    

ÿþzLatexPrinter._print_Rangec                 C  s”   t |jƒdkrd|d k	r>d||  |jd ¡||  |jd ¡f S d||  |jd ¡|  |jd ¡f S d||  |jd ¡f }|d k	rd||f }|S )Nr;  z%s_{%s}^{%s}\left(%s\right)r   rü   r  z%s_{%s}rL  ræ  )r«   r»   ÚletterrÞ   r¼   rS   rS   rV   Z__print_number_polynomial  s     þ ÿz&LatexPrinter.__print_number_polynomialc                 C  s   |   |d|¡S )Nrë  ©Ú&_LatexPrinter__print_number_polynomialrÝ   rS   rS   rV   Ú_print_bernoulli  s    zLatexPrinter._print_bernoullic                 C  s   |   |d|¡S )NÚGrõ  rÝ   rS   rS   rV   Ú_print_genocchi’  s    zLatexPrinter._print_genocchic                   s†   t |jƒdkrxdˆ  |jd ¡ˆ  |jd ¡f }dd ‡ fdd„|jd	 D ƒ¡ }|d k	rld
|||f }n|| }|S ˆ  |d|¡S )Nro  z
B_{%s, %s}r   rü   rò   rã   c                 3  s   | ]}ˆ   |¡V  qd S r³   rà   rå  rá   rS   rV   rÒ   ™  s   ÿz+LatexPrinter._print_bell.<locals>.<genexpr>r;  rÞ  rë  )r	  rÚ   r´   rç   rö  )r«   r»   rÞ   Ztex1Ztex2r¼   rS   rá   rV   Ú_print_bell•  s    ÿÿ
zLatexPrinter._print_bellc                 C  s   |   |d|¡S ©NÚFrõ  rÝ   rS   rS   rV   Ú_print_fibonacci¢  s    zLatexPrinter._print_fibonaccic                 C  s,   d|   |jd ¡ }|d k	r(d||f }|S )NzL_{%s}r   rL  rV  rÄ  rS   rS   rV   Ú_print_lucas¥  s    zLatexPrinter._print_lucasc                 C  s   |   |d|¡S )NÚTrõ  rÝ   rS   rS   rV   Ú_print_tribonacci«  s    zLatexPrinter._print_tribonaccic                   sø   t ƒ ‰ t|jjƒdks&t|jjƒdkrZdˆ |j¡ˆ |jd ¡ˆ |j¡ˆ |j¡f S |jtj	kr |j}ˆ | 
|d ¡| 
|d ¡| 
|d ¡| 
|¡f}n6|jtjks¶|jdkrÎ|d d… }| ˆ ¡ nt|ƒ}dd ‡ ‡fd	d
„|D ƒ¡ d S )Nr   z\left\{%s\right\}_{%s=%s}^{%s}ro  r;  rü   r  r  rã   c                 3  s$   | ]}|ˆ k	rˆ  |¡nd V  qdS rä  rà   rå  rç  rS   rV   rÒ   Â  s     z1LatexPrinter._print_SeqFormula.<locals>.<genexpr>r‚  )ré  r	  rê  Zfree_symbolsrì  r´   ÚformularS  r   rž  Úcoeffr  Úlengthrt  r\  rç   )r«   rU   rì  rñ  rS   rç  rV   Ú_print_SeqFormula®  s.     


ü ÿÿþzLatexPrinter._print_SeqFormulac                 C  s`   |j |jkrd|  |j ¡ S |jr(d}nd}|jr8d}nd}d||  |j ¡|  |j¡|f S d S )Nrá  r   ru   r›   rœ   z\left%s%s, %s\right%s)rê  Úendr´   Z	left_openZ
right_open)r«   rw   ÚleftÚrightrS   rS   rV   Ú_print_IntervalÉ  s    ÿzLatexPrinter._print_Intervalc                 C  s   d|   |j¡|   |j¡f S )Nz \left\langle %s, %s\right\rangle)r´   r   r   ©r«   rw   rS   rS   rV   Ú_print_AccumulationBoundsÛ  s    ÿz&LatexPrinter._print_AccumulationBoundsc                   s(   t |ƒ‰ ‡ ‡fdd„|jD ƒ}d |¡S )Nc                   s   g | ]}ˆ  |ˆ ¡‘qS rS   ©r¹   rX  ©rš  r«   rS   rV   râ   á  s     z-LatexPrinter._print_Union.<locals>.<listcomp>z \cup ©r   rÚ   rç   ©r«   ÚuÚargs_strrS   r  rV   Ú_print_Unionß  s    zLatexPrinter._print_Unionc                   s(   t |ƒ‰ ‡ ‡fdd„|jD ƒ}d |¡S )Nc                   s   g | ]}ˆ  |ˆ ¡‘qS rS   r  rX  r  rS   rV   râ   æ  s     z2LatexPrinter._print_Complement.<locals>.<listcomp>z \setminus r  r  rS   r  rV   Ú_print_Complementä  s    zLatexPrinter._print_Complementc                   s(   t |ƒ‰ ‡ ‡fdd„|jD ƒ}d |¡S )Nc                   s   g | ]}ˆ  |ˆ ¡‘qS rS   r  rX  r  rS   rV   râ   ë  s     z4LatexPrinter._print_Intersection.<locals>.<listcomp>z \cap r  r  rS   r  rV   Ú_print_Intersectioné  s    z LatexPrinter._print_Intersectionc                   s(   t |ƒ‰ ‡ ‡fdd„|jD ƒ}d |¡S )Nc                   s   g | ]}ˆ  |ˆ ¡‘qS rS   r  rX  r  rS   rV   râ   ð  s     z;LatexPrinter._print_SymmetricDifference.<locals>.<listcomp>z \triangle r  r  rS   r  rV   Ú_print_SymmetricDifferenceî  s    z'LatexPrinter._print_SymmetricDifferencec                   s\   t |ƒ‰ t|jƒdkr@t|jƒs@ˆ |jd ˆ ¡dt|jƒ  S d ‡ ‡fdd„|jD ƒ¡S )Nrü   r   z^{%d}r•   c                 3  s   | ]}ˆ  |ˆ ¡V  qd S r³   r  )rÏ   rÜ  r  rS   rV   rÒ   ÷  s    z1LatexPrinter._print_ProductSet.<locals>.<genexpr>)r   r	  Úsetsr$   r¹   rç   ©r«   rH  rS   r  rV   Ú_print_ProductSetó  s     ÿzLatexPrinter._print_ProductSetc                 C  s   dS )Nz	\emptysetrS   rí   rS   rS   rV   Ú_print_EmptySetú  s    zLatexPrinter._print_EmptySetc                 C  s   dS )Nz
\mathbb{N}rS   ©r«   r  rS   rS   rV   Ú_print_Naturalsý  s    zLatexPrinter._print_Naturalsc                 C  s   dS )Nz\mathbb{N}_0rS   r  rS   rS   rV   Ú_print_Naturals0 	  s    zLatexPrinter._print_Naturals0c                 C  s   dS ©Nz
\mathbb{Z}rS   r	  rS   rS   rV   Ú_print_Integers	  s    zLatexPrinter._print_Integersc                 C  s   dS ©Nz
\mathbb{Q}rS   r	  rS   rS   rV   Ú_print_Rationals	  s    zLatexPrinter._print_Rationalsc                 C  s   dS ©Nz
\mathbb{R}rS   r	  rS   rS   rV   Ú_print_Reals		  s    zLatexPrinter._print_Realsc                 C  s   dS ©Nz
\mathbb{C}rS   r	  rS   rS   rV   Ú_print_Complexes	  s    zLatexPrinter._print_Complexesc                   sP   |j j}|j j}‡ fdd„t||jƒD ƒ}d dd„ |D ƒ¡}dˆ  |¡|f S )Nc                 3  s&   | ]\}}ˆ   |¡ˆ   |¡fV  qd S r³   rà   )rÏ   rÐ   ré  rá   rS   rV   rÒ   	  s     z/LatexPrinter._print_ImageSet.<locals>.<genexpr>rã   c                 s  s   | ]}d | V  qdS )ú	%s \in %sNrS   )rÏ   ZxyrS   rS   rV   rÒ   	  s     z!\left\{%s\; \middle|\; %s\right\})rP   r»   Ú	signaturerŒ  Z	base_setsrç   r´   )r«   rU   r»   ÚsigZxysZxinysrS   rá   rV   Ú_print_ImageSet	  s
    zLatexPrinter._print_ImageSetc                   s^   d  ‡ fdd„t|jƒD ƒ¡}|jtjkr>d|ˆ  |j¡f S d||ˆ  |j¡ˆ  |j¡f S )Nrã   c                   s   g | ]}ˆ   |¡‘qS rS   rà   ©rÏ   r  rá   rS   rV   râ   	  s     z4LatexPrinter._print_ConditionSet.<locals>.<listcomp>z"\left\{%s\; \middle|\; %s \right\}z3\left\{%s\; \middle|\; %s \in %s \wedge %s \right\})rç   r   r  Zbase_setr   ZUniversalSetr´   Ú	condition©r«   rU   Z
vars_printrS   rá   rV   Ú_print_ConditionSet	  s    ÿ

üz LatexPrinter._print_ConditionSetc                 C  s   |   |jd ¡}d |¡S )Nr   z\mathcal{{P}}\left({}\right)©r´   rÚ   r¯   )r«   r»   Z	arg_printrS   rS   rV   Ú_print_PowerSet"	  s    zLatexPrinter._print_PowerSetc                   s8   d  ‡ fdd„|jD ƒ¡}dˆ  |j¡|ˆ  |j¡f S )Nrã   c                   s   g | ]}ˆ   |¡‘qS rS   rà   r(  rá   rS   rV   râ   '	  s     z5LatexPrinter._print_ComplexRegion.<locals>.<listcomp>z)\left\{%s\; \middle|\; %s \in %s \right\})rç   rS  r´   r»   r  r*  rS   rá   rV   Ú_print_ComplexRegion&	  s    

ýz!LatexPrinter._print_ComplexRegionc                   s   dt ‡ fdd„|jD ƒƒ S )Nr$  c                 3  s   | ]}ˆ   |¡V  qd S r³   rà   rÇ  rá   rS   rV   rÒ   .	  s     z/LatexPrinter._print_Contains.<locals>.<genexpr>)r\  rÚ   rí   rS   rá   rV   Ú_print_Contains-	  s    zLatexPrinter._print_Containsc                 C  s:   |j jtjkr(|jjtjkr(|  |j¡S |  | ¡ ¡d S )Nz	 + \ldots)	r*  r  r   r€  Zbnr´   Za0r÷   Útruncater°   rS   rS   rV   Ú_print_FourierSeries0	  s    z!LatexPrinter._print_FourierSeriesc                 C  s   |   |j¡S r³   )r÷   Zinfiniter°   rS   rS   rV   Ú_print_FormalPowerSeries5	  s    z%LatexPrinter._print_FormalPowerSeriesc                 C  s
   d|j  S )Nz\mathbb{F}_{%s})ÚmodrÁ   rS   rS   rV   Ú_print_FiniteField8	  s    zLatexPrinter._print_FiniteFieldc                 C  s   dS r  rS   rÁ   rS   rS   rV   Ú_print_IntegerRing;	  s    zLatexPrinter._print_IntegerRingc                 C  s   dS r  rS   rÁ   rS   rS   rV   Ú_print_RationalField>	  s    z!LatexPrinter._print_RationalFieldc                 C  s   dS r   rS   rÁ   rS   rS   rV   Ú_print_RealFieldA	  s    zLatexPrinter._print_RealFieldc                 C  s   dS r"  rS   rÁ   rS   rS   rV   Ú_print_ComplexFieldD	  s    z LatexPrinter._print_ComplexFieldc                 C  s,   |   |j¡}d t| j |jƒ¡}d||f S )Nrã   z%s\left[%s\right]©r´   Údomainrç   rz  rš  ©r«   r»   r:  rš  rS   rS   rV   Ú_print_PolynomialRingG	  s    z"LatexPrinter._print_PolynomialRingc                 C  s,   |   |j¡}d t| j |jƒ¡}d||f S )Nrã   rœ  r9  r;  rS   rS   rV   Ú_print_FractionFieldL	  s    z!LatexPrinter._print_FractionFieldc                 C  s<   |   |j¡}d t| j |jƒ¡}d}|js.d}d|||f S )Nrã   r™   zS_<^{-1}z%s%s\left[%s\right])r´   r:  rç   rz  rš  Zis_Poly)r«   r»   r:  rš  ÚinvrS   rS   rV   Ú_print_PolynomialRingBaseQ	  s    z&LatexPrinter._print_PolynomialRingBasec                 C  sÄ  |j j}g }| ¡ D ]\}}d}t|ƒD ]H\}}|dkr*|dkrX||  |j| ¡7 }q*||  t|j| |ƒ¡7 }q*|jrš|rŽd|  |¡ }	qÜ|  |¡}	nB|rÒ|tj	kr¸| 
d|g¡ q|tjkrÒ| 
d|g¡ q|  |¡}	|sæ|	}
n|	d | }
|
 d¡r| 
d|
dd … g¡ q| 
d|
g¡ q|d dkrX| d¡}|dkrXd|d  |d< d |¡}tt| j|jƒƒ}d	|  | ¡ ¡ }d
 |g| |g ¡}|tkr´d||f }nd||f }|S )Nr™   r   rü   rò   r  rn  r”   )rn  r  z	domain=%srã   z\%s {\left(%s \right)}z$\operatorname{%s}{\left( %s \right)})rå   ræ   rô   ró   r´   ÚgensÚpowrÆ   r   r=  Úextendr¿   rS  Úpoprç   r0  rz  Z
get_domainr¤  )r«   Úpolyr¾  rô   Zmonomr  Zs_monomrw   rÞ   Zs_coeffZs_termÚmodifierr»   r@  r:  rÚ   r¼   rS   rS   rV   Ú_print_PolyY	  sN    






zLatexPrinter._print_Polyc                 C  sN   |j j}|dkrd}|  |j¡}|j}|tkr<d|||f S d|||f S d S )NZComplexRootOfZCRootOfz\%s {\left(%s, %d\right)}z'\operatorname{%s} {\left(%s, %d\right)})rå   ræ   r´   r»   rµ  r¤  )r«   r3   r¾  r»   rµ  rS   rS   rV   Ú_print_ComplexRootOf’	  s    ÿz!LatexPrinter._print_ComplexRootOfc                 C  sd   |j j}|  |j¡g}|jtjk	r4| |  |j¡¡ |tkrNd|d 	|¡f S d|d 	|¡f S d S )Nz\%s {\left(%s\right)}rã   z#\operatorname{%s} {\left(%s\right)})
rå   ræ   r´   r»   Zfunr   ZIdentityFunctionrt  r¤  rç   )r«   r»   r¾  rÚ   rS   rS   rV   Ú_print_RootSumž	  s    ÿzLatexPrinter._print_RootSumc                 C  s   dS )Nú\omegarS   rÁ   rS   rS   rV   Ú_print_OrdinalOmega«	  s    z LatexPrinter._print_OrdinalOmegac                 C  sL   |j \}}|dkr2|dkr&d ||¡S d |¡S n|dkrDd |¡S dS d S )Nrü   z{} \omega^{{{}}}z	{} \omegaz\omega^{{{}}}rI  )rÚ   r¯   )r«   r»   rÞ   ÚmulrS   rS   rV   Ú_print_OmegaPower®	  s    

zLatexPrinter._print_OmegaPowerc                   s   d  ‡ fdd„|jD ƒ¡S )Nrñ   c                   s   g | ]}ˆ   |¡‘qS rS   rà   r  rá   rS   rV   râ   ¼	  s     z/LatexPrinter._print_Ordinal.<locals>.<listcomp>)rç   rÚ   rÁ   rS   rá   rV   Ú_print_Ordinal»	  s    zLatexPrinter._print_Ordinalc                 C  s   | j d }| | td|¡S )Nr—   z	{%s}^{%d})r¥   rk   r!   )r«   rD  r…   rS   rS   rV   Ú_print_PolyElement¾	  s    
zLatexPrinter._print_PolyElementc                 C  s>   |j dkr|  |j¡S |  |j¡}|  |j ¡}d||f S d S )Nrü   r<  )r@  r´   r?  )r«   r2   r?  r@  rS   rS   rV   Ú_print_FracElementÂ	  s
    
zLatexPrinter._print_FracElementc                 C  sf   t |jƒdkr|jd d fn|j\}}d|  |¡ }|d k	rHd||f }|d k	rbd||  |¡f }|S )Nrü   r   zE_{%s}rL  rœ  ræ  )r«   r»   rÞ   r@  rÐ   r¼   rS   rS   rV   Ú_print_eulerÊ	  s    &zLatexPrinter._print_eulerc                 C  s,   d|   |jd ¡ }|d k	r(d||f }|S )NzC_{%s}r   rL  rV  rÄ  rS   rS   rV   Ú_print_catalanÓ	  s    zLatexPrinter._print_catalanc              
   C  s>   d  ||rdnd|  |jd ¡|  |jd ¡|  |jd ¡¡S )Nz5\mathcal{{{}}}{}_{{{}}}\left[{}\right]\left({}\right)z^{-1}r™   rü   r   r;  ©r¯   r´   rÚ   )r«   r»   rU   ZinverserS   rS   rV   Ú_print_UnifiedTransformÙ	  s    z$LatexPrinter._print_UnifiedTransformc                 C  s   |   |d¡S )NÚM©rS  rÁ   rS   rS   rV   Ú_print_MellinTransformÜ	  s    z#LatexPrinter._print_MellinTransformc                 C  s   |   |dd¡S )NrT  TrU  rÁ   rS   rS   rV   Ú_print_InverseMellinTransformß	  s    z*LatexPrinter._print_InverseMellinTransformc                 C  s   |   |d¡S )NÚLrU  rÁ   rS   rS   rV   Ú_print_LaplaceTransformâ	  s    z$LatexPrinter._print_LaplaceTransformc                 C  s   |   |dd¡S )NrX  TrU  rÁ   rS   rS   rV   Ú_print_InverseLaplaceTransformå	  s    z+LatexPrinter._print_InverseLaplaceTransformc                 C  s   |   |d¡S rû  rU  rÁ   rS   rS   rV   Ú_print_FourierTransformè	  s    z$LatexPrinter._print_FourierTransformc                 C  s   |   |dd¡S )Nrü  TrU  rÁ   rS   rS   rV   Ú_print_InverseFourierTransformë	  s    z+LatexPrinter._print_InverseFourierTransformc                 C  s   |   |d¡S )NÚSINrU  rÁ   rS   rS   rV   Ú_print_SineTransformî	  s    z!LatexPrinter._print_SineTransformc                 C  s   |   |dd¡S )Nr]  TrU  rÁ   rS   rS   rV   Ú_print_InverseSineTransformñ	  s    z(LatexPrinter._print_InverseSineTransformc                 C  s   |   |d¡S )NÚCOSrU  rÁ   rS   rS   rV   Ú_print_CosineTransformô	  s    z#LatexPrinter._print_CosineTransformc                 C  s   |   |dd¡S )Nr`  TrU  rÁ   rS   rS   rV   Ú_print_InverseCosineTransform÷	  s    z*LatexPrinter._print_InverseCosineTransformc                 C  sF   z"|j d k	r |  |j  |¡¡W S W n tk
r6   Y nX |  t|ƒ¡S r³   )Úringr´   Zto_sympyr   Úreprr  rS   rS   rV   Ú
_print_DMPú	  s    
zLatexPrinter._print_DMPc                 C  s
   |   |¡S r³   )re  r  rS   rS   rV   Ú
_print_DMF
  s    zLatexPrinter._print_DMFc                 C  s   |   t|jƒ¡S r³   ©r´   r   rè   )r«   ré  rS   rS   rV   Ú_print_Object
  s    zLatexPrinter._print_Objectc                 C  sd   |   |jd ¡}|d k	r"d|f nd}t|jƒdkrBd||f }n|   |jd ¡}d |||¡}|S )Nr   r—  r™   rü   zW%s\left(%s\right)zW{0}_{{{1}}}\left({2}\right))r´   rÚ   r	  r¯   )r«   r»   rÞ   Zarg0ÚresultZarg1rS   rS   rV   Ú_print_LambertW	
  s    zLatexPrinter._print_LambertWc                 C  s   d  |  |jd ¡¡S )Nz!\operatorname{{E}}\left[{}\right]r   rR  rÁ   rS   rS   rV   Ú_print_Expectation
  s    zLatexPrinter._print_Expectationc                 C  s   d  |  |jd ¡¡S )Nz#\operatorname{{Var}}\left({}\right)r   rR  rÁ   rS   rS   rV   Ú_print_Variance
  s    zLatexPrinter._print_Variancec                   s    d  d ‡ fdd„|jD ƒ¡¡S )Nz#\operatorname{{Cov}}\left({}\right)rã   c                 3  s   | ]}ˆ   |¡V  qd S r³   rà   r  rá   rS   rV   rÒ   
  s     z1LatexPrinter._print_Covariance.<locals>.<genexpr>)r¯   rç   rÚ   rÁ   rS   rá   rV   Ú_print_Covariance
  s    zLatexPrinter._print_Covariancec                 C  s   d  |  |jd ¡¡S )Nz!\operatorname{{P}}\left({}\right)r   rR  rÁ   rS   rS   rV   Ú_print_Probability
  s    zLatexPrinter._print_Probabilityc                 C  s$   |   |j¡}|   |j¡}d||f S )Nz%s\rightarrow %s)r´   r:  Úcodomain)r«   Úmorphismr:  ro  rS   rS   rV   Ú_print_Morphism
  s    zLatexPrinter._print_Morphismc                 C  s&   |   |j¡|   |j¡ }}d||f S )Nr<  )r´   rˆ  Úden)r«   r»   rˆ  rr  rS   rS   rV   Ú_print_TransferFunction$
  s    z$LatexPrinter._print_TransferFunctionc                   s(   t ˆ jƒ}‡ ‡fdd„}d t||ƒ¡S )Nc                   s   ˆ  | tˆ ƒd¡S r’  )r¹   r   r-  rº  rS   rV   rW   *
  s   ÿz,LatexPrinter._print_Series.<locals>.<lambda>r”   )r0  rÚ   rç   rz  ©r«   r»   rÚ   r”  rS   rº  rV   Ú_print_Series(
  s    
zLatexPrinter._print_Seriesc                   s@   ddl m‰  tˆjƒd d d… }‡ ‡‡fdd„}d t||ƒ¡S )Nr   )ÚMIMOParallelrû   c                   s&   t | ˆ ƒrˆ | tˆƒd¡S ˆ | ¡S r’  )r,  r¹   r   r´   r-  ©rv  r»   r«   rS   rV   rW   1
  s
    ÿÿz0LatexPrinter._print_MIMOSeries.<locals>.<lambda>z\cdot)Zsympy.physics.control.ltirv  r0  rÚ   rç   rz  rt  rS   rw  rV   Ú_print_MIMOSeries.
  s    zLatexPrinter._print_MIMOSeriesc                 C  s   d  t| j|jƒ¡S ©Nrñ   ©rç   rz  r´   rÚ   rÁ   rS   rS   rV   Ú_print_Parallel5
  s    zLatexPrinter._print_Parallelc                 C  s   d  t| j|jƒ¡S ry  rz  rÁ   rS   rS   rV   Ú_print_MIMOParallel8
  s    z LatexPrinter._print_MIMOParallelc                 C  s|  ddl m}m} |j|dd|jƒ }}t||ƒr:t|jƒn|g}t|j|ƒrXt|jjƒn|jg}|}t||ƒrˆt|j|ƒrˆ|||žŽ }	n²t||ƒrÈt|j|ƒrÈ|j|kr²||Ž }	n||||jfžŽ f}	nrt||ƒrt|j|ƒr||krô||Ž }	n||f|žŽ }	n6||kr||Ž }	n"|j|kr.||Ž }	n|||žŽ }	|  	|¡}
|  	|¡}|  	|	¡}|j
dkrhdnd}d|
|||f S )Nr   )ÚTransferFunctionÚSeriesrü   rû   r  rn  z\frac{%s}{%s %s %s})Úsympy.physics.controlr}  r~  Úsys1r  r,  r0  rÚ   Úsys2r´   rO  )r«   r»   r}  r~  rˆ  ÚtfZnum_arg_listZden_arg_listZ
den_term_1Z
den_term_2r?  Zdenom_1Zdenom_2Ú_signrS   rS   rV   Ú_print_Feedback;
  s8    
ÿÿ








zLatexPrinter._print_Feedbackc                 C  sL   ddl m} |  ||j|jƒ¡}|  |j¡}|jdkr:dnd}d|||f S )Nr   )Ú
MIMOSeriesrû   r  rn  z)\left(I_{\tau} %s %s\right)^{-1} \cdot %s)r  r…  r´   r  r€  rO  )r«   r»   r…  Zinv_matr€  rƒ  rS   rS   rV   Ú_print_MIMOFeedback_
  s
    z LatexPrinter._print_MIMOFeedbackc                 C  s   |   |j¡}d| S )Nz%s_\tau)r´   Z	_expr_matrŽ  rS   rS   rV   Ú_print_TransferFunctionMatrixf
  s    z*LatexPrinter._print_TransferFunctionMatrixc                 C  s   d  |jj|j¡S )Nz\text{{{}}}_{{{}}})r¯   rå   ræ   r  rÁ   rS   rS   rV   Ú
_print_DFTj
  s    zLatexPrinter._print_DFTc                 C  s&   |   t|jƒ¡}|  |¡}d||f S )Nz%s:%s)r´   r   rè   rq  )r«   rp  Úpretty_nameÚpretty_morphismrS   rS   rV   Ú_print_NamedMorphismn
  s    
z!LatexPrinter._print_NamedMorphismc                 C  s"   ddl m} |  ||j|jdƒ¡S )Nr   )ÚNamedMorphismÚid)Zsympy.categoriesrŒ  r‹  r:  ro  )r«   rp  rŒ  rS   rS   rV   Ú_print_IdentityMorphisms
  s      ÿz$LatexPrinter._print_IdentityMorphismc                   s<   ‡ fdd„|j D ƒ}| ¡  d |¡d }ˆ  |¡}|| S )Nc                   s   g | ]}ˆ   t|jƒ¡‘qS rS   rg  )rÏ   Ú	componentrá   rS   rV   râ   {
  s   ÿz9LatexPrinter._print_CompositeMorphism.<locals>.<listcomp>z\circ r~  )rr  Úreverserç   rq  )r«   rp  Zcomponent_names_listZcomponent_namesrŠ  rS   rá   rV   Ú_print_CompositeMorphismx
  s    
ÿ
z%LatexPrinter._print_CompositeMorphismc                 C  s   d  |  t|jƒ¡¡S ©Nr^  )r¯   r´   r   rè   )r«   rp  rS   rS   rV   Ú_print_Categoryƒ
  s    zLatexPrinter._print_Categoryc                 C  s<   |j s|  tj¡S |  |j ¡}|jr8|d|  |j¡ 7 }|S )Nz\Longrightarrow %s)Zpremisesr´   r   ZEmptySetZconclusions)r«   ÚdiagramÚlatex_resultrS   rS   rV   Ú_print_Diagram†
  s    
ÿzLatexPrinter._print_Diagramc                 C  s–   dd|j   }t|jƒD ]p}t|j ƒD ]B}|||f rJ|t|||f ƒ7 }|d7 }||j d kr&|d7 }q&||jd kr€|d7 }|d7 }q|d7 }|S )	Nz\begin{array}{%s}
rq   r”   rü   ú& r`  Ú
z\end{array}
)Úwidthr  ÚheightÚlatex)r«   Úgridr•  rw   rž   rS   rS   rV   Ú_print_DiagramGrid’
  s    

zLatexPrinter._print_DiagramGridc                 C  s   d  |  |j¡|  |j¡¡S )Nz{{{}}}^{{{}}})r¯   r´   rc  r­  ©r«   rT  rS   rS   rV   Ú_print_FreeModule¤
  s    zLatexPrinter._print_FreeModulec                   s   d  d ‡ fdd„|D ƒ¡¡S )Nz\left[ {} \right]rý   c                 3  s    | ]}d ˆ   |¡ d V  qdS ©rZ   rR   Nrà   rÎ   rá   rS   rV   rÒ   ©
  s    z8LatexPrinter._print_FreeModuleElement.<locals>.<genexpr>)r¯   rç   ©r«   r@  rS   rá   rV   Ú_print_FreeModuleElement§
  s    ÿz%LatexPrinter._print_FreeModuleElementc                   s    d  d ‡ fdd„|jD ƒ¡¡S )Nú\left\langle {} \right\ranglerý   c                 3  s    | ]}d ˆ   |¡ d V  qdS r   rà   rÎ   rá   rS   rV   rÒ   ­
  s    z0LatexPrinter._print_SubModule.<locals>.<genexpr>)r¯   rç   r@  r¡  rS   rá   rV   Ú_print_SubModule¬
  s    ÿzLatexPrinter._print_SubModulec                   s"   d  d ‡ fdd„|jjD ƒ¡¡S )Nr£  rý   c                 3  s"   | ]\}d ˆ   |¡ d V  qdS r   rà   rÎ   rá   rS   rV   rÒ   ±
  s    z=LatexPrinter._print_ModuleImplementedIdeal.<locals>.<genexpr>)r¯   rç   Ú_moduler@  r¡  rS   rá   rV   Ú_print_ModuleImplementedIdeal°
  s    ÿz*LatexPrinter._print_ModuleImplementedIdealc                   sD   ‡ fdd„|j D ƒ}|d gdd„ t|dd … dƒD ƒ }d |¡S )Nc                   s    g | ]}ˆ j |td  dd‘qS )r	   Tr{  )r¹   r!   rX  rá   rS   rV   râ   ·
  s   ÿz2LatexPrinter._print_Quaternion.<locals>.<listcomp>r   c                 S  s   g | ]\}}|d  | ‘qS )r”   rS   )rÏ   rw   rž   rS   rS   rV   râ   ¹
  s     rü   Zijkrñ   )rÚ   rŒ  rç   )r«   r»   rU   rB  rS   rá   rV   Ú_print_Quaternion´
  s
    
ÿ&zLatexPrinter._print_Quaternionc                 C  s   d  |  |j¡|  |j¡¡S ©Nz\frac{{{}}}{{{}}})r¯   r´   rc  Ú
base_ideal)r«   ÚRrS   rS   rV   Ú_print_QuotientRing¼
  s    
ÿz LatexPrinter._print_QuotientRingc                 C  s   d  |  |j¡|  |jj¡¡S ©Nz{{{}}} + {{{}}})r¯   r´   Údatarc  r©  )r«   rÐ   rS   rS   rV   Ú_print_QuotientRingElementÁ
  s    ÿz'LatexPrinter._print_QuotientRingElementc                 C  s   d  |  |j¡|  |jj¡¡S r¬  )r¯   r´   r­  ÚmoduleÚkilled_moduler¡  rS   rS   rV   Ú_print_QuotientModuleElementÅ
  s    ÿz)LatexPrinter._print_QuotientModuleElementc                 C  s   d  |  |j¡|  |j¡¡S r¨  )r¯   r´   rÛ   r°  rž  rS   rS   rV   Ú_print_QuotientModuleÉ
  s    
ÿz"LatexPrinter._print_QuotientModulec                 C  s(   d  |  | ¡ ¡|  |j¡|  |j¡¡S )Nz{{{}}} : {{{}}} \to {{{}}})r¯   r´   Z_sympy_matrixr:  ro  )r«   r­  rS   rS   rV   Ú_print_MatrixHomomorphismÎ
  s    
 
ÿz&LatexPrinter._print_MatrixHomomorphismc                 C  sŒ   |j j }d|kr"|g g   }}}n2t|ƒ\}}}t|ƒ}dd„ |D ƒ}dd„ |D ƒ}d| }|rr|dd |¡ 7 }|rˆ|dd |¡ 7 }|S )	NrZ   c                 S  s   g | ]}t |ƒ‘qS rS   rZ  r\  rS   rS   rV   râ   Ú
  s     z0LatexPrinter._print_Manifold.<locals>.<listcomp>c                 S  s   g | ]}t |ƒ‘qS rS   rZ  r]  rS   rS   rV   râ   Û
  s     rì   r—  r”   ry  )rè   r   r[  rç   )r«   ÚmanifoldrY  rè   r_  r  rS   rS   rV   Ú_print_ManifoldÒ
  s    zLatexPrinter._print_Manifoldc                 C  s   d|   |j¡|   |j¡f S )Nz\text{%s}_{%s})r´   rè   r´  )r«   ÚpatchrS   rS   rV   Ú_print_Patchå
  s    zLatexPrinter._print_Patchc                 C  s(   d|   |j¡|   |jj¡|   |j¡f S )Nz\text{%s}^{\text{%s}}_{%s})r´   rè   r¶  r´  )r«   ZcoordsysrS   rS   rV   Ú_print_CoordSystemè
  s
    
  
ÿzLatexPrinter._print_CoordSystemc                 C  s   d|   |j¡ S )Nz\mathbb{\nabla}_{%s})r´   Z_wrt)r«   ZcvdrS   rS   rV   Ú_print_CovarDerivativeOpí
  s    z%LatexPrinter._print_CovarDerivativeOpc                 C  s$   |j j|j j}d |  t|ƒ¡¡S r’  ©Ú
_coord_sysrš  Ú_indexrè   r¯   r´   r   ©r«   ÚfieldrY  rS   rS   rV   Ú_print_BaseScalarFieldð
  s    z#LatexPrinter._print_BaseScalarFieldc                 C  s$   |j j|j j}d |  t|ƒ¡¡S )Nz\partial_{{{}}}rº  r½  rS   rS   rV   Ú_print_BaseVectorFieldô
  s    z#LatexPrinter._print_BaseVectorFieldc                 C  sL   |j }t|dƒr4|jj|j j}d |  t|ƒ¡¡S |  |¡}d |¡S d S )Nr»  z\operatorname{{d}}{}z!\operatorname{{d}}\left({}\right))	Z_form_fieldr+  r»  rš  r¼  rè   r¯   r´   r   )r«   Údiffr¾  rY  rS   rS   rV   Ú_print_Differentialø
  s    

z LatexPrinter._print_Differentialc                 C  s   |   |jd ¡}d |¡S )Nr   z"\operatorname{{tr}}\left({}\right)r,  )r«   rH  ÚcontentsrS   rS   rV   Ú	_print_Tr  s    zLatexPrinter._print_Trc                 C  s4   |d k	r d|   |jd ¡|f S d|   |jd ¡ S )Nz%\left(\phi\left(%s\right)\right)^{%s}r   z\phi\left(%s\right)rV  rÝ   rS   rS   rV   Ú_print_totient  s
    ÿzLatexPrinter._print_totientc                 C  s4   |d k	r d|   |jd ¡|f S d|   |jd ¡ S )Nz(\left(\lambda\left(%s\right)\right)^{%s}r   z\lambda\left(%s\right)rV  rÝ   rS   rS   rV   Ú_print_reduced_totient  s
    ÿz#LatexPrinter._print_reduced_totientc                 C  sd   t |jƒdkr4dtt| j|jd |jd fƒƒ }nd|  |jd ¡ }|d k	r\d||f S d| S )Nr;  ú_%s\left(%s\right)rü   r   rò   z\sigma^{%s}%sz\sigma%sr-  rÄ  rS   rS   rV   Ú_print_divisor_sigma  s    
ÿ
z!LatexPrinter._print_divisor_sigmac                 C  sd   t |jƒdkr4dtt| j|jd |jd fƒƒ }nd|  |jd ¡ }|d k	r\d||f S d| S )Nr;  rÇ  rü   r   rò   z\sigma^*^{%s}%sz
\sigma^*%sr-  rÄ  rS   rS   rV   Ú_print_udivisor_sigma  s    
ÿ
z"LatexPrinter._print_udivisor_sigmac                 C  s4   |d k	r d|   |jd ¡|f S d|   |jd ¡ S )Nz$\left(\nu\left(%s\right)\right)^{%s}r   z\nu\left(%s\right)rV  rÝ   rS   rS   rV   Ú_print_primenu&  s
    ÿzLatexPrinter._print_primenuc                 C  s4   |d k	r d|   |jd ¡|f S d|   |jd ¡ S )Nz'\left(\Omega\left(%s\right)\right)^{%s}r   z\Omega\left(%s\right)rV  rÝ   rS   rS   rV   Ú_print_primeomega,  s
    ÿzLatexPrinter._print_primeomegac                 C  s
   t |jƒS r³   )rk   rè   r°   rS   rS   rV   Ú
_print_Str2  s    zLatexPrinter._print_Strc                 C  s   |   t|ƒ¡S r³   )r´   r   rÁ   rS   rS   rV   Ú_print_float5  s    zLatexPrinter._print_floatc                 C  s   t |ƒS r³   ©rk   rÁ   rS   rS   rV   Ú
_print_int8  s    zLatexPrinter._print_intc                 C  s   t |ƒS r³   rÎ  rÁ   rS   rS   rV   Ú
_print_mpz;  s    zLatexPrinter._print_mpzc                 C  s   t |ƒS r³   rÎ  rÁ   rS   rS   rV   Ú
_print_mpq>  s    zLatexPrinter._print_mpqc                 C  s   d  tt|jƒƒ¡S )Nz"\operatorname{{Q}}_{{\text{{{}}}}})r¯   rr   rk   rè   rÁ   rS   rS   rV   Ú_print_PredicateA  s    zLatexPrinter._print_Predicatec                   s:   |j }|j}ˆ  |¡}d ‡ fdd„|D ƒ¡}d||f S )Nrã   c                   s   g | ]}ˆ   |¡‘qS rS   rà   rÇ  rá   rS   rV   râ   H  s     z8LatexPrinter._print_AppliedPredicate.<locals>.<listcomp>z%s(%s))re  Ú	argumentsr´   rç   )r«   r»   ÚpredrÚ   Z
pred_latexZ
args_latexrS   rá   rV   Ú_print_AppliedPredicateD  s
    
z$LatexPrinter._print_AppliedPredicatec                   s   t ƒ  |¡}dt|ƒ S )Nz\mathtt{\text{%s}})ÚsuperÚemptyPrinterrr   rT  ©rå   rS   rV   r×  K  s    zLatexPrinter.emptyPrinter)N)FF)FF)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)Nrë  )N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)Nr™   )Nr™   )N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)FN)N)N)N)N)rv   )rv   )N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)N)F)N)N)N)N)N)N)N(=  ræ   Ú
__module__Ú__qualname__Zprintmethodr’   Ú__annotations__r¤   r±   r²   r¹   rŽ   rº   rÂ   rÈ   rØ   rÙ   rÄ   rÅ   rß   ré   rî   Z_print_BooleanTrueZ_print_BooleanFalserï   r÷   r  r  r  r  r  r  r   r!  r$  r%  rD  rF  rJ  rP  rO  rW  rh  ri  rx  r|  r~  r  r‰  r  r›  r¡  r¥  r´  rµ  r¶  Úpropertyr¼  r¿  rÀ  rÁ  rÃ  Z
_print_MinZ
_print_MaxrÅ  rÆ  rÇ  rÉ  rÌ  rÍ  rÔ  rÖ  rÙ  rÚ  rÛ  rÒ  rÑ  rÝ  rà  rá  râ  rã  rå  rç  rè  rê  rï  rñ  rò  rô  rö  Z_print_gammar÷  rù  rú  rû  rþ  rÿ  r   r  r  r  r
  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r"  r$  r%  r)  r+  r,  r.  r/  r0  r2  r4  r6  r8  r9  r:  r;  r<  r=  r>  rC  rD  rI  rJ  rK  rM  rN  rP  rU  rX  Z_print_RandomSymbolrä   rg  ri  ru  rz  r}  rƒ  r…  r  r  r  r•  r–  r—  r  rž  r   r¡  r¢  r¦  r©  rª  r¬  r±  r¶  r¸  r¹  r»  r¼  r½  r¾  r¿  rÀ  rÁ  rÂ  rÆ  rË  rÌ  rÍ  rÏ  rÒ  rÓ  rÔ  rÖ  rØ  rÙ  rÚ  rÝ  rà  rÞ  Z_print_frozensetró  rö  r÷  rù  rú  rý  rþ  r   r  Z_print_SeqPerZ_print_SeqAddZ_print_SeqMulr  r
  r  r  r  r  r  r  r  r  r  r  r!  r#  r'  r+  r-  r.  r/  r1  r2  r4  r5  r6  r7  r8  r<  r=  r?  rF  rG  rH  rJ  rL  rM  rN  rO  rP  rQ  rS  rV  rW  rY  rZ  r[  r\  r^  r_  ra  rb  re  rf  rh  rj  rk  rl  rm  rn  rq  rs  ru  rx  r{  r|  r„  r†  r‡  rˆ  Z_print_IDFTr‹  rŽ  r‘  r“  r–  r  rŸ  r¢  r¤  r¦  r§  r«  r®  r±  r²  r³  rµ  r·  r¸  r¹  r¿  rÀ  rÂ  rÄ  rÅ  rÆ  rÈ  rÉ  rÊ  rË  rÌ  rÍ  rÏ  rÐ  rÑ  rÒ  rÕ  r×  Ú__classcell__rS   rS   rØ  rV   rs      sž  
è=

	!s-!
$ L

										
6



*9		
$	

rs   c                 C  sš   t  | ¡}|r|S |  ¡ tkr*d|  ¡  S | tkr:d|  S tt ¡ tddD ]D}|  ¡  	|¡rLt| ƒt|ƒkrLt| t
| dt|ƒ … ƒƒ  S qL| S dS )aŽ  
    Check for a modifier ending the string.  If present, convert the
    modifier to latex and translate the rest recursively.

    Given a description of a Greek letter or other special character,
    return the appropriate latex.

    Let everything else pass as given.

    >>> from sympy.printing.latex import translate
    >>> translate('alphahatdotprime')
    "{\\dot{\\hat{\\alpha}}}'"
    rm   T)rm  r  N)Útex_greek_dictionaryrª   r
  Úgreek_letters_setÚother_symbolsrÂ  rj   rÐ  r	  rT  r[  )rU   r¼   rm  rS   rS   rV   r[  R  s    
$r[  c                 K  s   t |ƒ | ¡S )a %  Convert the given expression to LaTeX string representation.

    Parameters
    ==========
    full_prec: boolean, optional
        If set to True, a floating point number is printed with full precision.
    fold_frac_powers : boolean, optional
        Emit ``^{p/q}`` instead of ``^{\frac{p}{q}}`` for fractional powers.
    fold_func_brackets : boolean, optional
        Fold function brackets where applicable.
    fold_short_frac : boolean, optional
        Emit ``p / q`` instead of ``\frac{p}{q}`` when the denominator is
        simple enough (at most two terms and no powers). The default value is
        ``True`` for inline mode, ``False`` otherwise.
    inv_trig_style : string, optional
        How inverse trig functions should be displayed. Can be one of
        ``'abbreviated'``, ``'full'``, or ``'power'``. Defaults to
        ``'abbreviated'``.
    itex : boolean, optional
        Specifies if itex-specific syntax is used, including emitting
        ``$$...$$``.
    ln_notation : boolean, optional
        If set to ``True``, ``\ln`` is used instead of default ``\log``.
    long_frac_ratio : float or None, optional
        The allowed ratio of the width of the numerator to the width of the
        denominator before the printer breaks off long fractions. If ``None``
        (the default value), long fractions are not broken up.
    mat_delim : string, optional
        The delimiter to wrap around matrices. Can be one of ``'['``, ``'('``,
        or the empty string ``''``. Defaults to ``'['``.
    mat_str : string, optional
        Which matrix environment string to emit. ``'smallmatrix'``,
        ``'matrix'``, ``'array'``, etc. Defaults to ``'smallmatrix'`` for
        inline mode, ``'matrix'`` for matrices of no more than 10 columns, and
        ``'array'`` otherwise.
    mode: string, optional
        Specifies how the generated code will be delimited. ``mode`` can be one
        of ``'plain'``, ``'inline'``, ``'equation'`` or ``'equation*'``.  If
        ``mode`` is set to ``'plain'``, then the resulting code will not be
        delimited at all (this is the default). If ``mode`` is set to
        ``'inline'`` then inline LaTeX ``$...$`` will be used. If ``mode`` is
        set to ``'equation'`` or ``'equation*'``, the resulting code will be
        enclosed in the ``equation`` or ``equation*`` environment (remember to
        import ``amsmath`` for ``equation*``), unless the ``itex`` option is
        set. In the latter case, the ``$$...$$`` syntax is used.
    mul_symbol : string or None, optional
        The symbol to use for multiplication. Can be one of ``None``,
        ``'ldot'``, ``'dot'``, or ``'times'``.
    order: string, optional
        Any of the supported monomial orderings (currently ``'lex'``,
        ``'grlex'``, or ``'grevlex'``), ``'old'``, and ``'none'``. This
        parameter does nothing for `~.Mul` objects. Setting order to ``'old'``
        uses the compatibility ordering for ``~.Add`` defined in Printer. For
        very large expressions, set the ``order`` keyword to ``'none'`` if
        speed is a concern.
    symbol_names : dictionary of strings mapped to symbols, optional
        Dictionary of symbols and the custom strings they should be emitted as.
    root_notation : boolean, optional
        If set to ``False``, exponents of the form 1/n are printed in fractonal
        form. Default is ``True``, to print exponent in root form.
    mat_symbol_style : string, optional
        Can be either ``'plain'`` (default) or ``'bold'``. If set to
        ``'bold'``, a `~.MatrixSymbol` A will be printed as ``\mathbf{A}``,
        otherwise as ``A``.
    imaginary_unit : string, optional
        String to use for the imaginary unit. Defined options are ``'i'``
        (default) and ``'j'``. Adding ``r`` or ``t`` in front gives ``\mathrm``
        or ``\text``, so ``'ri'`` leads to ``\mathrm{i}`` which gives
        `\mathrm{i}`.
    gothic_re_im : boolean, optional
        If set to ``True``, `\Re` and `\Im` is used for ``re`` and ``im``, respectively.
        The default is ``False`` leading to `\operatorname{re}` and `\operatorname{im}`.
    decimal_separator : string, optional
        Specifies what separator to use to separate the whole and fractional parts of a
        floating point number as in `2.5` for the default, ``period`` or `2{,}5`
        when ``comma`` is specified. Lists, sets, and tuple are printed with semicolon
        separating the elements when ``comma`` is chosen. For example, [1; 2; 3] when
        ``comma`` is chosen and [1,2,3] for when ``period`` is chosen.
    parenthesize_super : boolean, optional
        If set to ``False``, superscripted expressions will not be parenthesized when
        powered. Default is ``True``, which parenthesizes the expression when powered.
    min: Integer or None, optional
        Sets the lower bound for the exponent to print floating point numbers in
        fixed-point format.
    max: Integer or None, optional
        Sets the upper bound for the exponent to print floating point numbers in
        fixed-point format.
    diff_operator: string, optional
        String to use for differential operator. Default is ``'d'``, to print in italic
        form. ``'rd'``, ``'td'`` are shortcuts for ``\mathrm{d}`` and ``\text{d}``.

    Notes
    =====

    Not using a print statement for printing, results in double backslashes for
    latex commands since that's the way Python escapes backslashes in strings.

    >>> from sympy import latex, Rational
    >>> from sympy.abc import tau
    >>> latex((2*tau)**Rational(7,2))
    '8 \\sqrt{2} \\tau^{\\frac{7}{2}}'
    >>> print(latex((2*tau)**Rational(7,2)))
    8 \sqrt{2} \tau^{\frac{7}{2}}

    Examples
    ========

    >>> from sympy import latex, pi, sin, asin, Integral, Matrix, Rational, log
    >>> from sympy.abc import x, y, mu, r, tau

    Basic usage:

    >>> print(latex((2*tau)**Rational(7,2)))
    8 \sqrt{2} \tau^{\frac{7}{2}}

    ``mode`` and ``itex`` options:

    >>> print(latex((2*mu)**Rational(7,2), mode='plain'))
    8 \sqrt{2} \mu^{\frac{7}{2}}
    >>> print(latex((2*tau)**Rational(7,2), mode='inline'))
    $8 \sqrt{2} \tau^{7 / 2}$
    >>> print(latex((2*mu)**Rational(7,2), mode='equation*'))
    \begin{equation*}8 \sqrt{2} \mu^{\frac{7}{2}}\end{equation*}
    >>> print(latex((2*mu)**Rational(7,2), mode='equation'))
    \begin{equation}8 \sqrt{2} \mu^{\frac{7}{2}}\end{equation}
    >>> print(latex((2*mu)**Rational(7,2), mode='equation', itex=True))
    $$8 \sqrt{2} \mu^{\frac{7}{2}}$$
    >>> print(latex((2*mu)**Rational(7,2), mode='plain'))
    8 \sqrt{2} \mu^{\frac{7}{2}}
    >>> print(latex((2*tau)**Rational(7,2), mode='inline'))
    $8 \sqrt{2} \tau^{7 / 2}$
    >>> print(latex((2*mu)**Rational(7,2), mode='equation*'))
    \begin{equation*}8 \sqrt{2} \mu^{\frac{7}{2}}\end{equation*}
    >>> print(latex((2*mu)**Rational(7,2), mode='equation'))
    \begin{equation}8 \sqrt{2} \mu^{\frac{7}{2}}\end{equation}
    >>> print(latex((2*mu)**Rational(7,2), mode='equation', itex=True))
    $$8 \sqrt{2} \mu^{\frac{7}{2}}$$

    Fraction options:

    >>> print(latex((2*tau)**Rational(7,2), fold_frac_powers=True))
    8 \sqrt{2} \tau^{7/2}
    >>> print(latex((2*tau)**sin(Rational(7,2))))
    \left(2 \tau\right)^{\sin{\left(\frac{7}{2} \right)}}
    >>> print(latex((2*tau)**sin(Rational(7,2)), fold_func_brackets=True))
    \left(2 \tau\right)^{\sin {\frac{7}{2}}}
    >>> print(latex(3*x**2/y))
    \frac{3 x^{2}}{y}
    >>> print(latex(3*x**2/y, fold_short_frac=True))
    3 x^{2} / y
    >>> print(latex(Integral(r, r)/2/pi, long_frac_ratio=2))
    \frac{\int r\, dr}{2 \pi}
    >>> print(latex(Integral(r, r)/2/pi, long_frac_ratio=0))
    \frac{1}{2 \pi} \int r\, dr

    Multiplication options:

    >>> print(latex((2*tau)**sin(Rational(7,2)), mul_symbol="times"))
    \left(2 \times \tau\right)^{\sin{\left(\frac{7}{2} \right)}}

    Trig options:

    >>> print(latex(asin(Rational(7,2))))
    \operatorname{asin}{\left(\frac{7}{2} \right)}
    >>> print(latex(asin(Rational(7,2)), inv_trig_style="full"))
    \arcsin{\left(\frac{7}{2} \right)}
    >>> print(latex(asin(Rational(7,2)), inv_trig_style="power"))
    \sin^{-1}{\left(\frac{7}{2} \right)}

    Matrix options:

    >>> print(latex(Matrix(2, 1, [x, y])))
    \left[\begin{matrix}x\\y\end{matrix}\right]
    >>> print(latex(Matrix(2, 1, [x, y]), mat_str = "array"))
    \left[\begin{array}{c}x\\y\end{array}\right]
    >>> print(latex(Matrix(2, 1, [x, y]), mat_delim="("))
    \left(\begin{matrix}x\\y\end{matrix}\right)

    Custom printing of symbols:

    >>> print(latex(x**2, symbol_names={x: 'x_i'}))
    x_i^{2}

    Logarithms:

    >>> print(latex(log(10)))
    \log{\left(10 \right)}
    >>> print(latex(log(10), ln_notation=True))
    \ln{\left(10 \right)}

    ``latex()`` also supports the builtin container types :class:`list`,
    :class:`tuple`, and :class:`dict`:

    >>> print(latex([2/x, y], mode='inline'))
    $\left[ 2 / x, \  y\right]$

    Unsupported types are rendered as monospaced plaintext:

    >>> print(latex(int))
    \mathtt{\text{<class 'int'>}}
    >>> print(latex("plain % text"))
    \mathtt{\text{plain \% text}}

    See :ref:`printer_method_example` for an example of how to override
    this behavior for your own types by implementing ``_latex``.

    .. versionchanged:: 1.7.0
        Unsupported types no longer have their ``str`` representation treated as valid latex.

    )rs   rº   ©r»   r¬   rS   rS   rV   r›  q  s     Ur›  c                 K  s   t t| f|Žƒ dS )z`Prints LaTeX representation of the given expression. Takes the same
    settings as ``latex()``.N)Úprintr›  rá  rS   rS   rV   Úprint_latexH  s    rã  rü   úalign*Fc              
   K  s€  t f |Ž}|dkr(d}d}d}	d}
d}nJ|dkrFd}d}d}	d	}
d}n,|d
krdd}d}d}	d}
d}ntd |¡ƒ‚d}|r~d}| ¡ }t|ƒ}d}t|ƒD ]Ø}|| }d}d}d}||krÌ|rÄd}nd}d}||krö||d k rò||	 d d }nd}| ¡ d dkrd| }d}|dkrP|dkr,d}|d | | ¡||| |¡|¡7 }n|d ||| |¡|¡7 }|d7 }qš||
7 }|S )a¦  
    This function generates a LaTeX equation with a multiline right-hand side
    in an ``align*``, ``eqnarray`` or ``IEEEeqnarray`` environment.

    Parameters
    ==========

    lhs : Expr
        Left-hand side of equation

    rhs : Expr
        Right-hand side of equation

    terms_per_line : integer, optional
        Number of terms per line to print. Default is 1.

    environment : "string", optional
        Which LaTeX wnvironment to use for the output. Options are "align*"
        (default), "eqnarray", and "IEEEeqnarray".

    use_dots : boolean, optional
        If ``True``, ``\\dots`` is added to the end of each line. Default is ``False``.

    Examples
    ========

    >>> from sympy import multiline_latex, symbols, sin, cos, exp, log, I
    >>> x, y, alpha = symbols('x y alpha')
    >>> expr = sin(alpha*y) + exp(I*alpha) - cos(log(y))
    >>> print(multiline_latex(x, expr))
    \begin{align*}
    x = & e^{i \alpha} \\
    & + \sin{\left(\alpha y \right)} \\
    & - \cos{\left(\log{\left(y \right)} \right)}
    \end{align*}

    Using at most two terms per line:
    >>> print(multiline_latex(x, expr, 2))
    \begin{align*}
    x = & e^{i \alpha} + \sin{\left(\alpha y \right)} \\
    & - \cos{\left(\log{\left(y \right)} \right)}
    \end{align*}

    Using ``eqnarray`` and dots:
    >>> print(multiline_latex(x, expr, terms_per_line=2, environment="eqnarray", use_dots=True))
    \begin{eqnarray}
    x & = & e^{i \alpha} + \sin{\left(\alpha y \right)} \dots\nonumber\\
    & & - \cos{\left(\log{\left(y \right)} \right)}
    \end{eqnarray}

    Using ``IEEEeqnarray``:
    >>> print(multiline_latex(x, expr, environment="IEEEeqnarray"))
    \begin{IEEEeqnarray}{rCl}
    x & = & e^{i \alpha} \nonumber\\
    & & + \sin{\left(\alpha y \right)} \nonumber\\
    & & - \cos{\left(\log{\left(y \right)} \right)}
    \end{IEEEeqnarray}

    Notes
    =====

    All optional parameters from ``latex`` can also be used.

    Zeqnarrayz\begin{eqnarray}
z& = &z	\nonumberz
\end{eqnarray}TZIEEEeqnarrayz\begin{IEEEeqnarray}{rCl}
z
\end{IEEEeqnarray}rä  z\begin{align*}
z= &r™   z
\end{align*}FzUnknown environment: {}z\dotsrü   r  z& & r—  r`  r˜  r   rû   rn  z{:s} {:s}{:s} {:s} {:s}z{:s}{:s} {:s} {:s})rs   r¦   r¯   Zas_ordered_termsr	  r  r/  rº   )rb  rc  Zterms_per_lineÚenvironmentZuse_dotsr¬   r^  ri  Z
first_termZnonumberZend_termZdoubleetrè  rô   Zn_termsZ
term_countrw   rõ   Z
term_startZterm_endrO  rS   rS   rV   Úmultiline_latexO  sv    C


   ÿ
 ÿ
ræ  )rü   rä  F)JÚ__doc__Ú
__future__r   Útypingr   r   r   r¯  Z
sympy.corer   r   r   r	   r
   r   r   r   Zsympy.core.alphabetsr   Zsympy.core.containersr   Zsympy.core.functionr   r   r   Zsympy.core.operationsr   Zsympy.core.powerr   Zsympy.core.sortingr   Zsympy.core.sympifyr   rÐ  r   r   r   Zsympy.tensor.arrayr   Zsympy.printing.precedencer   Zsympy.printing.printerr   r   Zsympy.printing.conventionsr   r   r    r!   Zmpmath.libmp.libmpfr"   r#   r  Zsympy.utilities.iterablesr$   r%   r1   Zsympy.vector.basisdependentr&   r¤  rÞ  rà  rj   rÛ  Ú	frozensetrß  Úcompiler4  rr   rs   r[  r›  rã  ræ  rS   rS   rS   rV   Ú<module>   s  (            ýÜ'  ÿåþ                     Z
 W