U
    ZÊ¹jèá ã                %   @  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(m)Z) ddl*m+Z+m,Z, ddl%m-Z-m.Z. ddl/m0Z0m1Z2 ddl3m4Z4m5Z5 ddl6Z6e�rHddl7m8Z8 d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ƒZAe6 Bdt¡e6 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)Úprecedence_traditional)ÚPrinterÚprint_function)Úsplit_super_subÚrequires_partial)Ú
precedenceÚ
PRECEDENCE)Úprec_to_dpsÚto_str)Úhas_varietyÚsift)Ú	NDimArray)Ú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/bwave/python/venv/lib/python3.8/site-packages/sympy/printing/latex.pyÚ<lambda>[   ó    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   a   rX   c                 C  s   d|  d S )Nz\acute{rR   rS   rT   rS   rS   rV   rW   b   rX   c                 C  s   d|  d S )Nz\grave{rR   rS   rT   rS   rS   rV   rW   c   rX   c                 C  s   d|  d S )Nz\tilde{rR   rS   rT   rS   rS   rV   rW   d   rX   c                 C  s   d|  d S )Nz\hat{rR   rS   rT   rS   rS   rV   rW   e   rX   c                 C  s   d|  d S )Nz\bar{rR   rS   rT   rS   rS   rV   rW   f   rX   c                 C  s   d|  d S )Nz\vec{rR   rS   rT   rS   rS   rV   rW   g   rX   c                 C  s   d|  d S ©NÚ{z}'rS   rT   rS   rS   rV   rW   h   rX   c                 C  s   d|  d S rY   rS   rT   rS   rS   rV   rW   i   rX   c                 C  s   d|  d S ©Nz\boldsymbol{rR   rS   rT   rS   rS   rV   rW   k   rX   c                 C  s   d|  d S r[   rS   rT   rS   rS   rV   rW   l   rX   c                 C  s   d|  d S )Nz	\mathcal{rR   rS   rT   rS   rS   rV   rW   m   rX   c                 C  s   d|  d S )Nz	\mathscr{rR   rS   rT   rS   rS   rV   rW   n   rX   c                 C  s   d|  d S )Nz
\mathfrak{rR   rS   rT   rS   rS   rV   rW   o   rX   c                 C  s   d|  d S )Nz\left\|{z	}\right\|rS   rT   rS   rS   rV   rW   q   rX   c                 C  s   d|  d S )Nz\left\langle{z}\right\ranglerS   rT   rS   rS   rV   rW   r   rX   c                 C  s   d|  d S ©Nz\left|{z}\right|rS   rT   rS   rS   rV   rW   s   rX   c                 C  s   d|  d S r\   rS   rT   rS   rS   rV   rW   t   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(\d|\\frac{\d+}{\d+})Ú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dœZded< �d€dd„Zddœdd„Zddœdd„Z�d�ddœdd„Z	dd„ Z
ddœdd„Zddœdd„Zddœd d!„Z�d‚d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/d0œd1d2„ZeZeZd3d4„ Z�dƒd5d6„Zd7d8„ Zd9d:„ Zd;d<„ Zd=d>„ Zd?d@„ ZdAdB„ ZdCdD„ ZdEdF„ Z dGdH„ Z!dIdJ„ Z"dKd*œdLdM„Z#dNdO„ Z$dPdQ„ Z%dRd*œdSdT„Z&dddUœdVdW„Z'dXdY„ Z(dZd[„ Z)d\d]„ Z*d^d*œd_d`„Z+dadb„ Z,dcdd„ Z-dedf„ Z.dgdh„ Z/didj„ Z0dkdl„ Z1dmdn„ Z2dddoœdpdq„Z3�d„drddsœdtdu„Z4dvdw„ Z5dxdy„ Z6e7dzd{„ ƒZ8d|d}„ Z9d~d„ Z:d€d�„ Z;�d…ddœd‚dƒ„Z<e< Z=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‘„ ZEd’d“„ ZFd”d•„ ZGd–d—„ ZHd˜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©„ZQ�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œ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�d¦dÔ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)„Z�e�Z‘�dÎdd�d*œ�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ž�dÏ�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¨�dYd*œ�dZ�d[„Z©�d\�d]œ�d^�d_„Zª�d`�da„ Z«�db�dc„ Z¬�dd�de„ Z­�df�dg„ Z®�dh�di„ Z¯�dj�dk„ Z°�dl�dm„ Z±�dn�do„ Z²�dp�dq„ Z³�dÐ�dr�ds„Z´�dt�du„ Zµ�dv�dw„ Z¶�dx�dy„ Z·�dz�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ˆ�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¢�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�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!�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+�dX�dY„ �Z,�dZ�d[„ �Z-�d\�d]„ �Z.�d^�d_„ �Z/�dâ�d`�da„�Z0�dã�db�dc„�Z1�dä�dd�de„�Z2�då�df�dg„�Z3�dæ�dh�di„�Z4�dç�dj�dk„�Z5�dl�dm„ �Z6�dn�do„ �Z7�dp�dq„ �Z8�dr�ds„ �Z9�dt�du„ �Z:�dv�dw„ �Z;�dx�dy„ �Z<�dz�d{„ �Z=�d|�d}„ �Z>‡ f�d~�d„�Z?‡  �Z@S (è  ÚLatexPrinterZ_latexFNÚabbreviatedú[ÚplainTÚiÚperiodÚdÚdagger)Ú	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_operatorÚadjoint_stylez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>N  s     z3LatexPrinter._needs_mul_brackets.<locals>.<genexpr>c                 3  s   | ]}ˆ   |¡V  qd S rµ   rÎ   rÐ   rÓ   rS   rV   rÔ   Q  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_brackets7  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_bracketsV  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Æ   d  s    
zLatexPrinter._mul_is_cleanc                 C  s   |   |j¡ S rµ   )rÄ   ÚbaserÃ   rS   rS   rV   rÇ   j  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_exponentm  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>v  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_Basics  s    zLatexPrinter._print_Basicz!bool | BooleanTrue | BooleanFalse)Úec                 C  s   d| S ©Nú	\text{%s}rS   ©r­   rì   rS   rS   rV   Ú_print_bool|  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 )Nr{   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  |¡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Úmatch)rÜ   Z_texZlast_term_texrw   r÷   rø   )Ú	numbersepr­   r  rS   rV   r4    s&    
ÿÿ

z-LatexPrinter._print_Mul.<locals>.convert_argsc                 s  s   | ]}t |tƒV  qd S rµ   )r.  r
   r  rS   rS   rV   rÔ   :  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(  r5  rÜ   Zinclude_parensr¾   ÚnumerÚdenomZsnumerZsdenomZldenomÚratioÚaÚbrÒ   rS   )r4  r9  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_AlgebraicNumberz  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ÚalpharG  )r­   r½   rJ  rK  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Â   rJ  Úqrh   r§   r¶   rÝ   Zis_negativer»   r    Ú	is_Symbolr�   rÉ   r@  rF  Ú_helper_print_standard_power)r­   r½   rJ  rO  rÝ   r¾   Zbase_pZbase_qrS   rS   rV   Ú
_print_Pow‡  sF    






zLatexPrinter._print_Pow)Útemplaterl   c                 C  sˆ   |   |j¡}|  |jtd ¡}|jjr2|  |¡}nJ|jjrDd| }n8t|jt	ƒr|| 
d¡r|t d|¡r|| d¡r||dd… }|||f S )Nr   z{%s}rI  z\\left\(\\d?d?dotr   é   iùÿÿÿ)r¶   rà   r»   rÝ   r    rP  r�   Zis_Floatr.  r   Ú
startswithr1   r8  Úendswith)r­   r½   rS  rà   rÝ   rS   rS   rV   rQ  ´  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`  ©ra  rS   rV   rä   Ò  s     rô   ©	r  Úlimitsr^  rk   ré   r.  Úfunctionr   r¶   ©r­   r½   r¾   rS   ©ra  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â   rZ  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 )Nr[  c                   s   g | ]}ˆ   |¡‘qS rS   râ   r\  rã   rS   rV   rä   â  s     zELatexPrinter._print_Product.<locals>._format_ineq.<locals>.<listcomp>rþ   r   r=  r]  r_  rã   rS   rV   ra  à  s    &ÿz1LatexPrinter._print_Product.<locals>._format_ineqz\prod_{\substack{%s}} rb  c                   s   g | ]}ˆ |ƒ‘qS rS   rS   rc  rd  rS   rV   rä   å  s     rô   re  rh  rS   ri  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 rW  )Ú__str__r/  rS   rS   rV   rW   û  rX   z4LatexPrinter._print_BasisDependent.<locals>.<lambda>©Úkeyrþ   ró   rý   rò   rI  r   r›   ú-é   )Zsympy.vectorrl  ÚzeroZ_latex_formr.  ZseparateÚitemsr2  Ú
componentsÚsortÚappendr¶   ré   )r­   r½   rl  Zo1rs  Ú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Õ   rZ  rS   rS   rV   rÔ   :  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Ô   H  s     z+LatexPrinter._print_Subs.<locals>.<genexpr>c                 3  s   | ]}ˆ   |¡V  qd S rµ   râ   rŒ  rã   rS   rV   rÔ   I  s     z\\ c                 s  s"   | ]}|d  d |d  V  qdS )r   ú=rþ   NrS   rŒ  rS   rS   rV   rÔ   J  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_SubsE  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Ô   T  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ä   X  s   ÿz0LatexPrinter._print_Integral.<locals>.<listcomp>r   z\intr…   r•   r€   z\limitsrq  z
_{%s}^{%s}r=  ú^{%s}r•  z%s %s%sr	   c                 s  s   | ]}|  ¡ V  qd S rµ   r…  rZ  rS   rS   rV   rÔ   o  s     Tr†  )r§   r  rf  Úallr‡  r¶   Úinsertr»   rg  r    r×   rÜ   ré   )r­   r½   r¾   Úsymbolsr“  r—  rS   r˜  rV   Ú_print_IntegralO  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_Limits  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  rU  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}rN  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¶   rg  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 )Nrn  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å   rN  )Ú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   rN  rX  ©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   rN  rX  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)}rN  )r§   r¶   rÜ   rÆ  rS   rS   rV   Ú
_print_log5  s    
zLatexPrinter._print_logc                 C  s0   d|   |jd ¡ }|d k	r(d||f S |S d S )Nú\left|{%s}\right|r   rN  rX  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_reH  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_imP  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_NotX  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_LogOpc  s    zLatexPrinter._print_LogOpc                 C  s   t |jtd�}|  |d¡S )Nrn  z\wedge©rÄ  rÜ   r   rØ  ©r­   rì   rÜ   rS   rS   rV   Ú
_print_Andr  s    zLatexPrinter._print_Andc                 C  s   t |jtd�}|  |d¡S )Nrn  z\veerÙ  rÚ  rS   rS   rV   Ú	_print_Orv  s    zLatexPrinter._print_Orc                 C  s   t |jtd�}|  |d¡S )Nrn  z\veebarrÙ  rÚ  rS   rS   rV   Ú
_print_Xorz  s    zLatexPrinter._print_Xorc                 C  s   |   |j|pd¡S )Nz\Rightarrow)rØ  rÜ   )r­   rì   ÚaltcharrS   rS   rV   rÔ  ~  s    zLatexPrinter._print_Impliesc                 C  s   t |jtd�}|  ||pd¡S )Nrn  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   rN  rX  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%srX  )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%srX  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%srX  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 )	Nrq  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þ   rI  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=  rq  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%srX  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%srX  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}%srX  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}%srX  )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%srX  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%srX  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þ  rN  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þ  rN  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þ   rN  rX  rÆ  rS   rS   rV   Ú_print_binomial2  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à   Únrx  rÝ   r¾   rS   rS   rV   Ú_print_RisingFactorial;  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  rx  Úsubr¾   rS   rS   rV   Ú_print_FallingFactorialC  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ý   rN  Tú%s_{%s}\left(%s\right))r¥  r¶   r‡   Úargumentrá   )r­   r½   rà   r	  r¾   Zneed_exprS   rS   rV   Ú_hprint_BesselBaseK  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_vec\  s    zLatexPrinter._hprint_vecc                 C  s   |   ||d¡S )NÚJ©r  rß   rS   rS   rV   Ú_print_besselje  s    zLatexPrinter._print_besseljc                 C  s   |   ||d¡S )Nrò  r  rß   rS   rS   rV   Ú_print_besselih  s    zLatexPrinter._print_besselic                 C  s   |   ||d¡S )NÚKr  rß   rS   rS   rV   Ú_print_besselkk  s    zLatexPrinter._print_besselkc                 C  s   |   ||d¡S )NÚYr  rß   rS   rS   rV   Ú_print_besselyn  s    zLatexPrinter._print_besselyc                 C  s   |   ||d¡S )Nrë  r  rß   rS   rS   rV   Ú	_print_ynq  s    zLatexPrinter._print_ync                 C  s   |   ||d¡S )Nr    r  rß   rS   rS   rV   Ú	_print_jnt  s    zLatexPrinter._print_jnc                 C  s   |   ||d¡S )NzH^{(1)}r  rß   rS   rS   rV   Ú_print_hankel1w  s    zLatexPrinter._print_hankel1c                 C  s   |   ||d¡S )NzH^{(2)}r  rß   rS   rS   rV   Ú_print_hankel2z  s    zLatexPrinter._print_hankel2c                 C  s   |   ||d¡S )Nzh^{(1)}r  rß   rS   rS   rV   Ú
_print_hn1}  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÷  rX  ©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%srX  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%srX  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^  r|  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)r{  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^  r|  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©r|  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)rI  ú\right)^{%s}r3  )r­   r½   rà   r  rD  rE  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)rI  r5  r3  ©r­   r½   rà   r  rD  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)rI  r5  r3  ©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)rI  r5  r3  r9  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)rI  r5  r3  r9  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)rI  r5  r3  r7  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)rI  r5  r3  r9  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)rI  r5  r3  r9  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)rI  r5  r3  r7  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)rI  r5  r3  ©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)rI  r5  r3  rA  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)r|  r¶   )	r­   Ú	characterrÜ   rc   rà   rD  rO  r¡  ÚsuprS   rS   rV   Z__print_mathieu_functions)  s    z&LatexPrinter.__print_mathieu_functionsc                 C  s   | j d|j|d�S )NÚCrM  ©Ú&_LatexPrinter__print_mathieu_functionsrÜ   rß   rS   rS   rV   Ú_print_mathieuc/  s    zLatexPrinter._print_mathieucc                 C  s   | j d|j|d�S )Nr   rM  rJ  rß   rS   rS   rV   Ú_print_mathieus2  s    zLatexPrinter._print_mathieusc                 C  s   | j d|jd|d�S )NrI  T©rc   rà   rJ  rß   rS   rS   rV   Ú_print_mathieucprime5  s    z!LatexPrinter._print_mathieucprimec                 C  s   | j d|jd|d�S )Nr   TrN  rJ  rß   rS   rS   rV   Ú_print_mathieusprime8  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   r:  r~   z	%s%d / %dz%s\frac{%d}{%d})rO  rJ  r§   r¶   )r­   r½   ÚsignrJ  rS   rS   rV   Ú_print_Rational;  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Ñ   rJ  rS   rS   rV   rÔ   J  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_OrderH  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½   rY  rê   rS   rS   rV   Ú_print_SymbolX  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Ñ   rH  rS   rS   rV   rä   h  s     z5LatexPrinter._deal_with_super_sub.<locals>.<listcomp>c                 S  s   g | ]}t |ƒ‘qS rS   r\  ©rÑ   r  rS   rS   rV   rä   i  s     rd   ú\mathbf{{{}}}r™  r–   r{  )r   r]  r±   ré   )r­   r[  rY  rê   Úsupersr�  rS   rS   rV   ræ   a  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==rb  rc  z>=z<=z!=z%s %s %s)r§   r¶   ÚlhsZrel_opÚrhs)r­   r½   ÚgtÚltÚcharmaprS   rS   rV   Ú_print_Relationalw  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}rj  z\begin{cases} %s \end{cases}z \\)rÜ   Zcondr   rv  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â   rZ  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   ú}%srb  )r
  Úrowsrv  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)rx  r§   r«   )r­   r½   rw  Ú
left_delimÚright_delimrS   rS   rV   Ú_print_MatrixBase®  s    




ÿÿzLatexPrinter._print_MatrixBasec                 C  sF   | j |jtd dd�}|  |j¡› d|  |j¡› �}d|› d|› d�S )NrÌ  T©rº   rÿ   rZ   z}_{rR   )r»   Úparentr    r¶   rw   r    )r­   r½   Zmatrix_partZ
index_partrS   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>)r2  ré   )rÒ   r‰  rã   rS   rV   Ú
latexslice½  s    z3LatexPrinter._print_MatrixSlice.<locals>.latexslicerÌ  Tr~  ú\left[rå   ú\right])r»   r  r    Zrowslicers  Zcolslicert  )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  s–   ddddœ}|  | jd d¡}|j}ddlm}m} t||ƒs`t||ƒs`|jr`d|  |¡|f S |  	|t
|ƒd	¡}d
|kr†d||f S d||f S d S )Nz\daggerz\astz
\mathsf{H})rz   ÚstarZ	hermitianr“   r   r‰  rÞ   Tro   rN  )r¬   r§   r4   rŒ  rŠ  r‹  r.  r�  r¶   r»   r   )r­   r½   Zstyle_to_latexr“   r  rŠ  r‹  rU   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þ   r:  r–   )Zsympyr“  r2  rÜ   rÕ   ré   r|  )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.  rx  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    rQ  )r­   r½   rS  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Ô   0  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   rN  )rÝ   rà   rŒ  rŠ  r.  r�  r¶   )r­   r½   rÝ   rà   rŠ  Zbase_strrS   rS   rV   Ú_print_MatPow2  s    
ÿ
zLatexPrinter._print_MatPowc                 C  s   | j || jd d�S )NrŠ   rX  )rZ  r§   rÃ   rS   rS   rV   Ú_print_MatrixSymbol?  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_ZeroMatrixC  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_OneMatrixG  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_IdentityK  s    ÿÿÿzLatexPrinter._print_Identityc                 C  s   |   |jd ¡}d| S )Nr   zP_{%s}rX  )r­   ÚPZperm_strrS   rS   rV   Ú_print_PermutationMatrixO  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d|j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 �rn �q|	�r’||
  	d ||
d  ¡¡ nR||
  	|d ||
d  ¡ ¡ t
||
d  ƒdk�räd||
 d  d ||
 d< |	 }	g ||
d < �qH�q|d d }|  ¡ d dk�r$|| }|S )Nr   rS   r„   r…   r•   rl  rý   rm  rn  ro  rp  rq  r³  rZ   rq   rr  rƒ   ry  rz  r›   c                 S  s   g | ]}g ‘qS rS   rS   rZ  rS   rS   rV   rä   o  s     z1LatexPrinter._print_NDimArray.<locals>.<listcomp>rþ   c                 S  s   g | ]}t t|ƒƒ‘qS rS   )r2  r
  rZ  rS   rS   rV   rä   p  s     Tr	  rb  r„  r…  r=  )Úrankr¶   r§   Úshaperp   r«   r
  Ú	itertoolsÚproductrv  r  ré   )r­   r½   r„   Z	block_strr{  r|  Z	level_strZshape_rangesZouter_iZevenZback_outer_irw  rS   rS   rV   Ú_print_NDimArrayS  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µ  rw  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 rW  )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 rW  )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½   rQ  rÜ   rS   r¼  rV   Ú_print_TensMul±  s    ÿzLatexPrinter._print_TensMulc                 C  sL   g }|j }|D ]}| |  |t|ƒ¡¡ q| ¡  d |¡}| dd¡}|S )Nró   z+ -r:  )rÜ   rv  r»   r   ru  ré   rp   )r­   r½   rD  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â   rZ  rã   rS   rV   rä   Ñ  s     z9LatexPrinter._print_PartialDerivative.<locals>.<listcomp>)r  rU  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â   rZ  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}rX  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â   rZ  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Ñ   rD  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â   rZ  rã   rS   rV   rä     s     z,LatexPrinter._print_list.<locals>.<listcomp>rx   ú, \  c                   s   g | ]}ˆ   |¡‘qS rS   râ   rZ  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 )Nrn  z%s : %sz\left\{ %s\right\}rÐ  )rÄ  Úkeysr   rv  r¶   ré   )r­   ry   rÒ  rs  ro  Ú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}rX  )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_KroneckerDelta2  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Ô   ?  s     z1LatexPrinter._print_LeviCivita.<locals>.<genexpr>z\varepsilon_{%s}r–   rå   rÞ   )r|  r¶   rÜ   rš  ré   )r­   r½   rà   r}  r¾   rS   rS   rV   Ú_print_LeviCivita=  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_RandomDomainG  s    


ÿ
z LatexPrinter._print_RandomDomainc                 C  s   t |jtd�}|  |¡S )Nrn  )rÄ  rÜ   r   Ú
_print_set©r­   rU   rs  rS   rS   rV   Ú_print_FiniteSetR  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 )	Nrn  r�   r  rS  rx   rå   rÆ  ú\left\{%s\right\})rÄ  r   r§   ré   r|  r¶   r¨   rá  rS   rS   rV   rà  V  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Ô   j  s     zKLatexPrinter._print_Range.<locals>._print_symbolic_range.<locals>.<genexpr>c                 3  s   | ]}ˆ   |¡V  qd S rµ   râ   r  rã   rS   rV   rÔ   m  s     c                 3  s   | ]}ˆ   |¡V  qd S rµ   râ   r  rã   rS   rV   rÔ   o  s     z\text{Range}\left(r   )rÜ   r¶   ré   )Úcont)rU   r­   rS   rV   Ú_print_symbolic_ranged  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^  Zis_iterableré   )r­   rU   rå  ÚprintsetÚitrS   )rê  rU   r­   rV   Ú_print_Rangec  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	r�d||f }|S )Nr=  z%s_{%s}^{%s}\left(%s\right)r   rþ   r
  z%s_{%s}rN  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 )Nrq  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   rN  rX  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                 C  s4   |d krd|   |jd ¡ S d||   |jd ¡f S )Nz\mu\left(%s\right)r   z\mu^{%s}\left(%s\right)rX  rß   rS   rS   rV   Ú_print_mobiusº  s    zLatexPrinter._print_mobiusc                   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}rq  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¶   ÚformularU  r   r   ÚcoeffrŸ  Úlengthrv  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»   rZ  ©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  rZ  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  rZ  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  rZ  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­   rJ  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_PowerSet3	  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ä   8	  s     z5LatexPrinter._print_ComplexRegion.<locals>.<listcomp>z)\left\{%s\; \middle|\; %s \in %s \right\})ré   rU  r¶   r½   r  r,  rS   rã   rV   Ú_print_ComplexRegion7	  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_FourierSeriesA	  s    z!LatexPrinter._print_FourierSeriesc                 C  s   |   |j¡S rµ   )rù   Zinfiniter²   rS   rS   rV   Ú_print_FormalPowerSeriesF	  s    z%LatexPrinter._print_FormalPowerSeriesc                 C  s
   d|j  S )Nz\mathbb{F}_{%s})ÚmodrÃ   rS   rS   rV   Ú_print_FiniteFieldI	  s    zLatexPrinter._print_FiniteFieldc                 C  s   dS r  rS   rÃ   rS   rS   rV   Ú_print_IntegerRingL	  s    zLatexPrinter._print_IntegerRingc                 C  s   dS r   rS   rÃ   rS   rS   rV   Ú_print_RationalFieldO	  s    z!LatexPrinter._print_RationalFieldc                 C  s   dS r"  rS   rÃ   rS   rS   rV   Ú_print_RealFieldR	  s    zLatexPrinter._print_RealFieldc                 C  s   dS r$  rS   rÃ   rS   rS   rV   Ú_print_ComplexFieldU	  s    z LatexPrinter._print_ComplexFieldc                 C  s,   |   |j¡}d t| j |jƒ¡}d||f S )Nrå   z%s\left[%s\right]©r¶   Údomainré   r|  rœ  ©r­   r½   r<  rœ  rS   rS   rV   Ú_print_PolynomialRingX	  s    z"LatexPrinter._print_PolynomialRingc                 C  s,   |   |j¡}d t| j |jƒ¡}d||f S )Nrå   rž  r;  r=  rS   rS   rV   Ú_print_FractionField]	  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é   r|  rœ  Zis_Poly)r­   r½   r<  rœ  ÚinvrS   rS   rV   Ú_print_PolynomialRingBaseb	  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  rp  r–   )rp  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Á   rU  Úpopré   r2  r|  Z
get_domainr¦  )r­   ÚpolyrÀ  rö   Zmonomr  Zs_monomrw   rà   Zs_coeffZs_termÚmodifierr½   rB  r<  rÜ   r¾   rS   rS   rV   Ú_print_Polyj	  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IdentityFunctionrv  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^{{{}}}rK  )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­   rF  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>  )rB  r¶   rA  )r­   r2   rA  rB  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}rN  rž  rè  )r­   r½   rà   rB  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   rN  rX  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©rU  rÃ   rS   rS   rV   Ú_print_MellinTransformí	  s    z#LatexPrinter._print_MellinTransformc                 C  s   |   |dd¡S )NrV  TrW  rÃ   rS   rS   rV   Ú_print_InverseMellinTransformð	  s    z*LatexPrinter._print_InverseMellinTransformc                 C  s   |   |d¡S )NÚLrW  rÃ   rS   rS   rV   Ú_print_LaplaceTransformó	  s    z$LatexPrinter._print_LaplaceTransformc                 C  s   |   |dd¡S )NrZ  TrW  rÃ   rS   rS   rV   Ú_print_InverseLaplaceTransformö	  s    z+LatexPrinter._print_InverseLaplaceTransformc                 C  s   |   |d¡S rü  rW  rÃ   rS   rS   rV   Ú_print_FourierTransformù	  s    z$LatexPrinter._print_FourierTransformc                 C  s   |   |dd¡S )Nrý  TrW  rÃ   rS   rS   rV   Ú_print_InverseFourierTransformü	  s    z+LatexPrinter._print_InverseFourierTransformc                 C  s   |   |d¡S )NÚSINrW  rÃ   rS   rS   rV   Ú_print_SineTransformÿ	  s    z!LatexPrinter._print_SineTransformc                 C  s   |   |dd¡S )Nr_  TrW  rÃ   rS   rS   rV   Ú_print_InverseSineTransform
  s    z(LatexPrinter._print_InverseSineTransformc                 C  s   |   |d¡S )NÚCOSrW  rÃ   rS   rS   rV   Ú_print_CosineTransform
  s    z#LatexPrinter._print_CosineTransformc                 C  s   |   |dd¡S )Nrb  TrW  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¶   Úto_sympyr   Úreprr  rS   rS   rV   Ú
_print_DMP
  s    
zLatexPrinter._print_DMPc                 C  s
   |   |¡S rµ   )rh  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   rT  rÃ   rS   rS   rV   Ú_print_Expectation$
  s    zLatexPrinter._print_Expectationc                 C  s   d  |  |jd ¡¡S )Nz#\operatorname{{Var}}\left({}\right)r   rT  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   rT  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<  rr  rS   rS   rV   Ú_print_Morphism0
  s    zLatexPrinter._print_Morphismc                 C  s&   |   |j¡|   |j¡ }}d||f S )Nr>  )r¶   rŠ  Úden)r­   r½   rŠ  ru  rS   rS   rV   Ú_print_TransferFunction5
  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–   )r2  rÜ   ré   r|  ©r­   r½   rÜ   r–  rS   r¼  rV   Ú_print_Series9
  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/  ©ry  r½   r­   rS   rV   rW   B
  s
    ÿÿz0LatexPrinter._print_MIMOSeries.<locals>.<lambda>z\cdot)Zsympy.physics.control.ltiry  r2  rÜ   ré   r|  rw  rS   rz  rV   Ú_print_MIMOSeries?
  s    zLatexPrinter._print_MIMOSeriesc                 C  s   d  t| j|jƒ¡S ©Nró   ©ré   r|  r¶   rÜ   rÃ   rS   rS   rV   Ú_print_ParallelF
  s    zLatexPrinter._print_Parallelc                 C  s   d  t| j|jƒ¡S r|  r}  rÃ   rS   rS   rV   Ú_print_MIMOParallelI
  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  rp  z\frac{%s}{%s %s %s})Úsympy.physics.controlr€  r�  Úsys1r  r.  r2  rÜ   Úsys2r¶   rQ  )r­   r½   r€  r�  rŠ  ÚtfZnum_arg_listZden_arg_listZ
den_term_1Z
den_term_2rA  Zdenom_1Zdenom_2Ú_signrS   rS   rV   Ú_print_FeedbackL
  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  rp  z)\left(I_{\tau} %s %s\right)^{-1} \cdot %s)r‚  rˆ  r¶   r„  rƒ  rQ  )r­   r½   rˆ  Zinv_matrƒ  r†  rS   rS   rV   Ú_print_MIMOFeedbackp
  s
    z LatexPrinter._print_MIMOFeedbackc                 C  s   |   |j¡}d| S )Nz%s_\tau)r¶   Z	_expr_matr�  rS   rS   rV   Ú_print_TransferFunctionMatrixw
  s    z*LatexPrinter._print_TransferFunctionMatrixc                 C  s   d  |jj|j¡S )Nz\text{{{}}}_{{{}}})r±   rç   rè   r  rÃ   rS   rS   rV   Ú
_print_DFT{
  s    zLatexPrinter._print_DFTc                 C  s&   |   t|jƒ¡}|  |¡}d||f S )Nz%s:%s)r¶   r   rê   rt  )r­   rs  Úpretty_nameÚpretty_morphismrS   rS   rV   Ú_print_NamedMorphism
  s    
z!LatexPrinter._print_NamedMorphismc                 C  s"   ddl m} |  ||j|jdƒ¡S )Nr   )ÚNamedMorphismÚid)Zsympy.categoriesr�  rŽ  r<  rr  )r­   rs  r�  rS   rS   rV   Ú_print_IdentityMorphism„
  s      ÿz$LatexPrinter._print_IdentityMorphismc                   s<   ‡ fdd„|j D ƒ}| ¡  d |¡d }ˆ  |¡}|| S )Nc                   s   g | ]}ˆ   t|jƒ¡‘qS rS   rj  )rÑ   Ú	componentrã   rS   rV   rä   Œ
  s   ÿz9LatexPrinter._print_CompositeMorphism.<locals>.<listcomp>z\circ r�  )rt  Úreverseré   rt  )r­   rs  Zcomponent_names_listZcomponent_namesr�  rS   rã   rV   Ú_print_CompositeMorphism‰
  s    
ÿ
z%LatexPrinter._print_CompositeMorphismc                 C  s   d  |  t|jƒ¡¡S ©Nr`  )r±   r¶   r   rê   )r­   rs  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­   Z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þ   ú& rb  Ú
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¶   re  r¯  ©r­   rV  rS   rS   rV   Ú_print_FreeModuleµ
  s    zLatexPrinter._print_FreeModulec                   s   d  d ‡ fdd„|D ƒ¡¡S )Nú\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­   rB  rS   rã   rV   Ú_print_FreeModuleElement¸
  s    ÿz%LatexPrinter._print_FreeModuleElementc                   sJ   ‡‡fdd„ˆj D ƒ}dd„ ‰ dd„ ‰d ‡ ‡fdd„|D ƒ¡}d	 |¡S )
Nc                   s    g | ]}‡ ‡fd d„|D ƒ‘qS )c                   s   g | ]}ˆ  ˆ j |¡¡‘qS rS   )r¶   re  rf  rÐ   ©rB  r­   rS   rV   rä   ¾
  s     z<LatexPrinter._print_SubModule.<locals>.<listcomp>.<listcomp>rS   ©rÑ   Úgr¥  rS   rV   rä   ¾
  s     z1LatexPrinter._print_SubModule.<locals>.<listcomp>c                 S  s   d|  d S )NrZ   rR   rS   ©r6   rS   rS   rV   rW   ¿
  rX   z/LatexPrinter._print_SubModule.<locals>.<lambda>c                 S  s   d|  d S )Nz\left[ z \right]rS   r¨  rS   rS   rV   rW   À
  rX   rÿ   c                 3  s.   | ]&}ˆ ˆd   ‡ fdd„|D ƒ¡ƒƒV  qdS )rÿ   c                 3  s   | ]}ˆ |ƒV  qd S rµ   rS   rÐ   )ÚcurlyrS   rV   rÔ   Á
  s     z:LatexPrinter._print_SubModule.<locals>.<genexpr>.<genexpr>N)ré   r¦  )r©  ÚsquarerS   rV   rÔ   Á
  s     z0LatexPrinter._print_SubModule.<locals>.<genexpr>ú\left\langle {} \right\rangle)rB  ré   r±   ©r­   rB  rB  Ú
gens_latexrS   )r©  rB  r­   rª  rV   Ú_print_SubModule½
  s
    zLatexPrinter._print_SubModulec                   s$   d  ‡ fdd„|jD ƒ¡}d |¡S )Nrÿ   c                   s   g | ]}d ˆ   |¡ d ‘qS )rZ   rR   râ   r¦  rã   rS   rV   rä   Å
  s     z9LatexPrinter._print_SubQuotientModule.<locals>.<listcomp>r«  )ré   rB  r±   )r­   rB  r­  rS   rã   rV   Ú_print_SubQuotientModuleÄ
  s    z%LatexPrinter._print_SubQuotientModulec                   s8   ‡ fdd„ˆ j jD ƒ}d ‡fdd„|D ƒ¡}d |¡S )Nc                   s   g | ]\}ˆ j  |¡‘qS rS   )re  rf  rÐ   ©rB  rS   rV   rä   É
  s     z>LatexPrinter._print_ModuleImplementedIdeal.<locals>.<listcomp>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«  )Ú_modulerB  ré   r±   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    rZ  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   rD  rS   rã   rV   Ú_print_QuaternionÍ
  s
    
ÿ&zLatexPrinter._print_Quaternionc                 C  s   d  |  |j¡|  |j¡¡S ©Nz\frac{{{}}}{{{}}})r±   r¶   re  Ú
base_ideal)r­   ÚRrS   rS   rV   Ú_print_QuotientRingÕ
  s    
ÿz LatexPrinter._print_QuotientRingc                 C  s(   |   |j |¡¡}d ||   |jj¡¡S )Nú{{{}}} + {{{}}})r¶   re  rf  r±   rµ  )r­   rÒ   Zx_latexrS   rS   rV   Ú_print_QuotientRingElementÚ
  s    ÿz'LatexPrinter._print_QuotientRingElementc                   sH   ‡ fdd„ˆ j D ƒ}d d ‡fdd„|D ƒ¡¡}d |ˆ ˆ jj¡¡S )Nc                   s   g | ]}ˆ j j |¡‘qS rS   )Úmodulere  rf  rÐ   r°  rS   rV   rä   à
  s     z=LatexPrinter._print_QuotientModuleElement.<locals>.<listcomp>r¢  rÿ   c                 3  s    | ]}d ˆ   |¡ d V  qdS r£  râ   rÐ   rã   rS   rV   rÔ   á
  s    z<LatexPrinter._print_QuotientModuleElement.<locals>.<genexpr>r¸  )Údatar±   ré   r¶   rº  Úkilled_module)r­   rB  r»  Z
data_latexrS   r¥  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<  rr  )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   r\  r^  rS   rS   rV   rä   ÷
  s     z0LatexPrinter._print_Manifold.<locals>.<listcomp>c                 S  s   g | ]}t |ƒ‘qS rS   r\  r_  rS   rS   rV   rä   ø
  s     rî   r™  r–   r{  )rê   r   r]  ré   )r­   Úmanifoldr[  rê   ra  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­   Úfieldr[  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Ê  r[  rS   rS   rV   Ú_print_Differential  s    

z LatexPrinter._print_Differentialc                 C  s   |   |jd ¡}d |¡S )Nr   z"\operatorname{{tr}}\left({}\right)r.  )r­   rJ  Ú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)rX  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)rX  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_sigma9  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)rX  rß   rS   rS   rV   Ú_print_primenuC  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)rX  rß   rS   rS   rV   Ú_print_primeomegaI  s
    ÿzLatexPrinter._print_primeomegac                 C  s
   t |jƒS rµ   )rk   rê   r²   rS   rS   rV   Ú
_print_StrO  s    zLatexPrinter._print_Strc                 C  s   |   t|ƒ¡S rµ   )r¶   r   rÃ   rS   rS   rV   Ú_print_floatR  s    zLatexPrinter._print_floatc                 C  s   t |ƒS rµ   ©rk   rÃ   rS   rS   rV   Ú
_print_intU  s    zLatexPrinter._print_intc                 C  s   t |ƒS rµ   rÚ  rÃ   rS   rS   rV   Ú
_print_mpzX  s    zLatexPrinter._print_mpzc                 C  s   t |ƒS rµ   rÚ  rÃ   rS   rS   rV   Ú
_print_mpq[  s    zLatexPrinter._print_mpqc                 C  s   t |ƒS rµ   rÚ  rÃ   rS   rS   rV   Ú_print_fmpz^  s    zLatexPrinter._print_fmpzc                 C  s   t |ƒS rµ   rÚ  rÃ   rS   rS   rV   Ú_print_fmpqa  s    zLatexPrinter._print_fmpqc                 C  s   d  tt|jƒƒ¡S )Nz"\operatorname{{Q}}_{{\text{{{}}}}})r±   rr   rk   rê   rÃ   rS   rS   rV   Ú_print_Predicated  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ä   k  s     z8LatexPrinter._print_AppliedPredicate.<locals>.<listcomp>z%s(%s))rg  Ú	argumentsr¶   ré   )r­   r½   ÚpredrÜ   Z
pred_latexZ
args_latexrS   rã   rV   Ú_print_AppliedPredicateg  s
    
z$LatexPrinter._print_AppliedPredicatec                   s   t ƒ  |¡}dt|ƒ S )Nz\mathtt{\text{%s}})ÚsuperÚemptyPrinterrr   rV  ©rç   rS   rV   rå  n  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)N)F)N)N)N)N)N)N)N(A  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'  rF  rH  rL  rR  rQ  rY  rj  rk  rz  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.  r0  r1  r2  r4  r6  r8  r:  r;  r<  r=  r>  r?  r@  rE  rF  rK  rL  rM  rO  rP  rR  rW  rZ  Z_print_RandomSymbolræ   ri  rk  rx  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â  rà  Z_print_frozensetrô  r÷  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/  r0  r1  r3  r4  r6  r7  r8  r9  r:  r>  r?  rA  rH  rI  rJ  rL  rN  rO  rP  rQ  rR  rS  rU  rX  rY  r[  r\  r]  r^  r`  ra  rc  rd  rh  ri  rk  rm  rn  ro  rp  rq  rt  rv  rx  r{  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ß  rà  rã  rå  Ú__classcell__rS   rS   ræ  rV   rs   Ž   s¨  
ç=

	!s-!
$ L

										
7



*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)ro  r“  N)Útex_greek_dictionaryr¬   r  Úgreek_letters_setÚother_symbolsrÄ  rj   rÒ  r  rV  r]  )rU   r¾   ro  rS   rS   rV   r]  u  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}``.
    adjoint_style: string, optional
        String to use for the adjoint symbol. Defined options are ``'dagger'``
        (default),``'star'``, and ``'hermitian'``.

    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�  ”  s     Xr�  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_latexn  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™  rb  rš  r   rý   rp  z{:s} {:s}{:s} {:s} {:s}z{:s}{:s} {:s} {:s})rs   r¨   r±   Zas_ordered_termsr  r
  r1  r¼   )rd  re  Zterms_per_lineÚenvironmentZuse_dotsr®   r`  rl  Z
first_termZnonumberZend_termZdoubleetrê  rö   Zn_termsZ
term_countrw   r÷   Z
term_startZterm_endrQ  rS   rS   rV   Úmultiline_latexu  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.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.tensor.arrayr%   Zsympy.vector.basisdependentr&   r¦  rì  rî  rj   ré  Ú	frozensetrí  Úcompiler6  rr   rs   r]  r�  rñ  rô  rS   rS   rS   rV   Ú<module>   s  (            ýÜ'  ÿåþ                     |
 Z