o
    8VaY                     @   s   d Z ddl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 ddlmZ d	d
 Zdd Zdd ZdZ							dddZdS )z7Tools for setting up printing in interactive sessions.     N)version_tuple)BytesIO)latex)preview)debug)	Printablec                    s*   ddl }ddl  fdd}||_dS )z.Setup printing in Python interactive session. r   Nc                    s0   | durd _ t| fi  |  _ dS dS )zPython's pretty-printer display hook.

           This function was adapted from:

            http://www.python.org/dev/peps/pep-0217/

        N)_print)argbuiltinssettingsstringify_func </usr/lib/python3/dist-packages/sympy/interactive/printing.py_displayhook   s
   
z+_init_python_printing.<locals>._displayhook)sysr   displayhook)r   r   r   r   r   r   r   _init_python_printing   s   
r   c                    s  zddl m
 W n	 ty   Y nw du r0| j }|dkr"dn	|dkr)dndtd	 d
|r7d}nd}|dkrC|d  }||f d}d}td }d||||f }| d }dd|gtd td td |	p}t	 fdd}fddfdd
fdd d!fd"d#	fd$d%}	fd&d'}fd(d)}	fd*d+}fd,d-}ddl
 t jtd.krtttttttg}| jjd/ }|tg D ]}||| q| jjd0 }|d1v rtd2 |D ]	}||| q|t_ntd3 |D ]}||jv r1|j| q#tjt_| jjd4 }|d5v rVtd6 |D ]	}||| qH|t_n3|d7krotd8 |D ]	}||| qa|t_ntd9 |D ]}||jv r|j| qutjt_| jjd: }|d;v rtd< |D ]	}||| q|t_dS td= |D ]}||jv r|j| qtjt_dS | d>| dS )?z/Setup printing in IPython interactive session. r   )latex_to_pngNZlightbgZBlackZlinuxZWhiteZGrayz*init_printing: Automatic foreground color:zW\documentclass[varwidth,%s]{standalone}
\usepackage{amsmath,amsfonts}%s\begin{document}z\usepackage{euler} svgz
\special{color %s}Ztightz0cm,0cm   z-T %s -D %d -bg %s -fg %s -O %sg @z
--no-fontsz
--scale={}zinit_printing: DVIOPTIONS:zinit_printing: DVIOPTIONS_SVG:zinit_printing: PREAMBLE:c                    s2   | r| |  dS |  jj|  dS )z*caller for pretty, for use in IPython 0.11N)textlibpretty)r
   pcycle)IPython
_can_printr   r   r   _print_plainW   s   z,_init_ipython_printing.<locals>._print_plainc              
      sP   t  }zt| dd| d W | S  ty' } z	tddt|  d }~ww )Npngr   outputZviewerZoutputbufferpreamble
dvioptionszpng printing:"_preview_wrapper exception raised:)r   r   	Exceptionr   reprgetvalueoZ
exprbuffere)r%   r$   r   r   _preview_wrapper^   s   z0_init_ipython_printing.<locals>._preview_wrapperc              
      sX   t  }zt| dd| d W n ty$ } z	tddt|  d }~ww | dS )Nr   r   r"   zsvg printing:r&   zutf-8)r   r   r'   r   r(   r)   decoder*   )dvioptions_svgr$   r   r   _svg_wrapperk   s   
z,_init_ipython_printing.<locals>._svg_wrapperc              
      s~   |  dd} |  dd} zz	|  dW W S  ty$   |  Y W S w  ty> } ztdt| W Y d }~d S d }~ww )Nz\operatornamer   z	\overlinez\bar)colorscalezmatplotlib exception caught:)replace	TypeError
ValueErrorr   r(   )r+   r,   )	forecolorr   r2   r   r   _matplotlib_wrapperx   s   z3_init_ipython_printing.<locals>._matplotlib_wrapper)Z_latexZ	_sympystrZ_prettyZ
_sympyreprc                    s   zqt tttf}t |r3t jdd |D vs$t jdd |D vr'W dS tfdd D W S t t	rEt fdd D W S t t
rMW dS t trUW dS t fddD rcW dS t ttfroroW dS W dS  ty{   Y dS w )	zReturn True if type o can be printed with one of the sympy printers.

        If o is a container type, this is True if and only if every element of
        o can be printed in this way.
        c                 s       | ]}|j V  qd S N)__str__.0ir   r   r   	<genexpr>       z=_init_ipython_printing.<locals>._can_print.<locals>.<genexpr>c                 s   r8   r9   )__repr__r;   r   r   r   r>      r?   Fc                 3   s    | ]} |V  qd S r9   r   r;   )r   r   r   r>      s    c                 3   s$    | ]} |o | V  qd S r9   r   r;   )r   r+   r   r   r>      s   " Tc                 3   s    | ]}t  |V  qd S r9   )hasattr)r<   hookr+   r   r   r>      s    )listtupleset	frozenset
isinstancetyper:   r@   alldictboolr   anyfloatintRuntimeError)r+   Zbuiltin_types)r   print_builtinprinting_hooksrC   r   r      s,   



z*_init_ipython_printing.<locals>._can_printc              
      s    | rH| fdi}dkrd| }z|W S  t yG } z tdt|d dkr9| fddi}|W  Y d}~S d}~ww dS )z
        A function that returns a png rendered by an external latex
        distribution, falling back to matplotlib rendering
        modeplain$\displaystyle %s$preview failed with:z# Falling back to matplotlib backendinlineNrP   r   r(   r+   sr,   )r   r7   r-   r   
latex_moder   r   r   _print_latex_png   s    

z0_init_ipython_printing.<locals>._print_latex_pngc              
      sr    | r7| fdi}dkrd| }z|W S  t y6 } ztdt|d W Y d}~dS d}~ww dS )zz
        A function that returns a svg rendered by an external latex
        distribution, no fallback available.
        rS   rT   rU   rV   z No fallback available.NrX   rY   )r   r0   r   r[   r   r   r   _print_latex_svg   s   

z0_init_ipython_printing.<locals>._print_latex_svgc                    s(    | r| fddi}|S dS )zD
        A function that returns a png rendered by mathtext
        rS   rW   Nr   r+   rZ   )r   r7   r   r   r   r   _print_latex_matplotlib   s   z7_init_ipython_printing.<locals>._print_latex_matplotlibc                    s4    | r| fdi}dkrd| S |S dS )zW
        A function to generate the latex representation of sympy expressions.
        rS   rT   rU   Nr   r^   )r   r   r[   r   r   r   _print_latex_text   s   z1_init_ipython_printing.<locals>._print_latex_textc                    s:   | j jr |}d|v rt  t| dS tt| dS )zIPython's pretty-printer display hook, for use in IPython 0.10

           This function was adapted from:

            ipython/IPython/hooks.py:155

        
N)ZrcZpprintr	   r(   )selfr
   out)r   r   r   _result_display   s   z/_init_ipython_printing.<locals>._result_displayz0.11z
text/plainzimage/svg+xml)r   z"init_printing: using svg formatterz*init_printing: not using any svg formatterz	image/png)Tr!   z"init_printing: using png formatterZ
matplotlibz)init_printing: using matplotlib formatterz*init_printing: not using any png formatterz
text/latex)TZmathjaxz&init_printing: using mathjax formatterz-init_printing: not using text/latex formatterZresult_display)ZIPython.lib.latextoolsr   ImportErrorZcolorslowerr   roundsplitformatdefault_latexr   r   __version__rN   rE   rD   rF   rG   rK   rO   Zdisplay_formatterZ
formattersr   Zfor_typeZ
_repr_svg_Ztype_printerspopZ_repr_disabledZ
_repr_png_Z_repr_latex_Zset_hook)ipr   	use_latexeulerr6   	backcolorfontsizer[   rQ   latex_printerr2   r   r1   ZaddpackagesZ	imagesizeoffsetZ
resolutionZdviZ	svg_scaler    r\   r]   r_   r`   rd   Zprintable_typesZplaintext_formatterclsZsvg_formatterZpng_formatterZlatex_formatterr   )r   r   r7   r-   r0   r%   r/   r6   r   r[   r   r$   rQ   rR   r2   r   r   r   _init_ipython_printing"   s   	





&





ru   c                 C   sd   dt jvrdS zddlm} W n ty,   zddlm} W n ty)   Y Y dS w Y nw t| |S )z%Is a shell instance an IPython shell?r   Fr   )InteractiveShell)r   modulesZIPython.core.interactiveshellrv   re   ZIPython.iplibrH   )shellrv   r   r   r   _is_ipython?  s   

ry   FTTransparent10ptrT         ?c                    s  ddl }ddlm} | r|dur|}nddlm} n|dur!|}nddlm} d}|du r@zt }W n	 ty;   Y nw |du}|rH|sHt|}|r| rz"ddl	}t
|jt
dkraddlm} nddlm} dd	lm} W n	 tyw   Y n$w t|||fsd
d|jvrdu rtd d|du rtd d}ts|s|jd n| | r fdd}n fdd}|r|dd}|rtd t|||||	|
|||||fi | dS t|fi | dS )a  
    Initializes pretty-printer depending on the environment.

    Parameters
    ==========

    pretty_print : boolean, default=True
        If True, use pretty_print to stringify or the provided pretty
        printer; if False, use sstrrepr to stringify or the provided string
        printer.
    order : string or None, default='lex'
        There are a few different settings for this parameter:
        lex (default), which is lexographic order;
        grlex, which is graded lexographic order;
        grevlex, which is reversed graded lexographic order;
        old, which is used for compatibility reasons and for long expressions;
        None, which sets it to lex.
    use_unicode : boolean or None, default=None
        If True, use unicode characters;
        if False, do not use unicode characters;
        if None, make a guess based on the environment.
    use_latex : string, boolean, or None, default=None
        If True, use default LaTeX rendering in GUI interfaces (png and
        mathjax);
        if False, do not use LaTeX rendering;
        if None, make a guess based on the environment;
        if 'png', enable latex rendering with an external latex compiler,
        falling back to matplotlib if external compilation fails;
        if 'matplotlib', enable LaTeX rendering with matplotlib;
        if 'mathjax', enable LaTeX text generation, for example MathJax
        rendering in IPython notebook or text rendering in LaTeX documents;
        if 'svg', enable LaTeX rendering with an external latex compiler,
        no fallback
    wrap_line : boolean
        If True, lines will wrap at the end; if False, they will not wrap
        but continue as one line. This is only relevant if ``pretty_print`` is
        True.
    num_columns : int or None, default=None
        If int, number of columns before wrapping is set to num_columns; if
        None, number of columns before wrapping is set to terminal width.
        This is only relevant if ``pretty_print`` is True.
    no_global : boolean, default=False
        If True, the settings become system wide;
        if False, use just for this console/session.
    ip : An interactive console
        This can either be an instance of IPython,
        or a class that derives from code.InteractiveConsole.
    euler : boolean, optional, default=False
        Loads the euler package in the LaTeX preamble for handwritten style
        fonts (http://www.ctan.org/pkg/euler).
    forecolor : string or None, optional, default=None
        DVI setting for foreground color. None means that either 'Black',
        'White', or 'Gray' will be selected based on a guess of the IPython
        terminal color setting. See notes.
    backcolor : string, optional, default='Transparent'
        DVI setting for background color. See notes.
    fontsize : string, optional, default='10pt'
        A font size to pass to the LaTeX documentclass function in the
        preamble. Note that the options are limited by the documentclass.
        Consider using scale instead.
    latex_mode : string, optional, default='plain'
        The mode used in the LaTeX printer. Can be one of:
        {'inline'|'plain'|'equation'|'equation*'}.
    print_builtin : boolean, optional, default=True
        If ``True`` then floats and integers will be printed. If ``False`` the
        printer will only print SymPy types.
    str_printer : function, optional, default=None
        A custom string printer function. This should mimic
        sympy.printing.sstrrepr().
    pretty_printer : function, optional, default=None
        A custom pretty printer. This should mimic sympy.printing.pretty().
    latex_printer : function, optional, default=None
        A custom LaTeX printer. This should mimic sympy.printing.latex().
    scale : float, optional, default=1.0
        Scale the LaTeX output when using the ``png`` or ``svg`` backends.
        Useful for high dpi screens.
    settings :
        Any additional settings for the ``latex`` and ``pretty`` commands can
        be used to fine-tune the output.

    Examples
    ========

    >>> from sympy.interactive import init_printing
    >>> from sympy import Symbol, sqrt
    >>> from sympy.abc import x, y
    >>> sqrt(5)
    sqrt(5)
    >>> init_printing(pretty_print=True) # doctest: +SKIP
    >>> sqrt(5) # doctest: +SKIP
      ___
    \/ 5
    >>> theta = Symbol('theta') # doctest: +SKIP
    >>> init_printing(use_unicode=True) # doctest: +SKIP
    >>> theta # doctest: +SKIP
    \u03b8
    >>> init_printing(use_unicode=False) # doctest: +SKIP
    >>> theta # doctest: +SKIP
    theta
    >>> init_printing(order='lex') # doctest: +SKIP
    >>> str(y + x + y**2 + x**2) # doctest: +SKIP
    x**2 + x + y**2 + y
    >>> init_printing(order='grlex') # doctest: +SKIP
    >>> str(y + x + y**2 + x**2) # doctest: +SKIP
    x**2 + x + y**2 + y
    >>> init_printing(order='grevlex') # doctest: +SKIP
    >>> str(y * x**2 + x * y**2) # doctest: +SKIP
    x**2*y + x*y**2
    >>> init_printing(order='old') # doctest: +SKIP
    >>> str(x**2 + y**2 + x + y) # doctest: +SKIP
    x**2 + x + y**2 + y
    >>> init_printing(num_columns=10) # doctest: +SKIP
    >>> x**2 + x + y**2 + y # doctest: +SKIP
    x + y +
    x**2 + y**2

    Notes
    =====

    The foreground and background colors can be selected when using 'png' or
    'svg' LaTeX rendering. Note that before the ``init_printing`` command is
    executed, the LaTeX rendering is handled by the IPython console and not SymPy.

    The colors can be selected among the 68 standard colors known to ``dvips``,
    for a list see [1]_. In addition, the background color can be
    set to  'Transparent' (which is the default value).

    When using the 'Auto' foreground color, the guess is based on the
    ``colors`` variable in the IPython console, see [2]_. Hence, if
    that variable is set correctly in your IPython console, there is a high
    chance that the output will be readable, although manual settings may be
    needed.


    References
    ==========

    .. [1] https://en.wikibooks.org/wiki/LaTeX/Colors#The_68_standard_colors_known_to_dvips

    .. [2] https://ipython.readthedocs.io/en/stable/config/details.html#terminal-colors

    See Also
    ========

    sympy.printing.latex
    sympy.printing.pretty

    r   N)Printer)r   )sstrreprFz1.0)TerminalInteractiveShell)InteractiveConsolezipython-consoler   z*init_printing: Setting use_unicode to TrueTz(init_printing: Setting use_latex to Trueorderuse_unicode	wrap_linenum_columnsc                    s    | fd|S )Nr   r   exprr   _stringify_funcr   r   r   r   r   r   <lambda>(  s   zinit_printing.<locals>.<lambda>c                    s    | fdi|S )Nr   r   r   )r   r   r   r   r   0  s    rS   zMinit_printing: Mode is not able to be set due to internalsof IPython printing)r   Zsympy.printing.printerr}   Zsympy.printingr   r~   Zget_ipython	NameErrorry   r   r   rk   Z!IPython.terminal.interactiveshellr   Z*IPython.frontend.terminal.interactiveshellcoder   re   rH   joinargvr   	NO_GLOBALZset_global_settingsrl   ru   r   )Zpretty_printr   r   rn   r   r   Z	no_globalrm   ro   r6   rp   rq   r[   rQ   Zstr_printerZpretty_printerrr   r2   r   r   r}   r   Z
in_ipythonr   r   r   Zmode_in_settingsr   r   r   init_printingS  sv    


r   )TNNNNNFNFNrz   r{   rT   TNNNr|   )__doc__r   Zsympy.external.importtoolsr   ior   Zsympyr   rj   r   Zsympy.utilities.miscr   Zsympy.printing.defaultsr   r   ru   ry   r   r   r   r   r   r   <module>   s,      