##// END OF EJS Templates
Update SymPy profile: SymPy's latex() can now print set and frozenset...
Update SymPy profile: SymPy's latex() can now print set and frozenset I've included a version check against the latest version of SymPy that supports it (the current development version, 0.7.1-git), so that users of old versions of SymPy where this doesn't work will still have a good user experience. This is a continuation of pull request #1399.

File last commit:

r7039:9fe341d7
r7039:9fe341d7
Show More
sympyprinting.py
133 lines | 4.3 KiB | text/x-python | PythonLexer
Pauli Virtanen
DOC: extensions: add documentation for the bundled extensions
r4888 """
A print function that pretty prints sympy Basic objects.
:moduleauthor: Brian Granger
Usage
=====
Once the extension is loaded, Sympy Basic objects are automatically
pretty-printed.
Brian Granger
Display system is fully working now....
r3278
"""
#-----------------------------------------------------------------------------
# Copyright (C) 2008-2011 The IPython Development Team
#
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
Brian Granger
More improvements to the display system....
r3279 from IPython.lib.latextools import latex_to_png
Paul Ivanov
skip sympy tests if sympy not installed
r3504 from IPython.testing import decorators as dec
Paul Ivanov
removed skipif decorators from non-tests
r3507 # use @dec.skipif_not_sympy to skip tests requiring sympy
Paul Ivanov
skip sympy tests if sympy not installed
r3504
try:
from sympy import pretty, latex
except ImportError:
pass
Brian Granger
More improvements to the display system....
r3279
Brian Granger
Display system is fully working now....
r3278 #-----------------------------------------------------------------------------
Fernando Perez
Fix simple comment.
r6934 # Definitions of special display functions for use with IPython
Brian Granger
Display system is fully working now....
r3278 #-----------------------------------------------------------------------------
def print_basic_unicode(o, p, cycle):
"""A function to pretty print sympy Basic objects."""
if cycle:
return p.text('Basic(...)')
out = pretty(o, use_unicode=True)
if '\n' in out:
p.text(u'\n')
p.text(out)
Brian Granger
More improvements to the display system....
r3279 def print_png(o):
Brian Granger
Renaming the special methods of the formatters....
r3878 """A function to display sympy expression using LaTex -> PNG."""
Brian Granger
Using inline mode for rendering sympy Expr to latex.
r3283 s = latex(o, mode='inline')
Brian Granger
Fixing Matrix/overbar printing for sympy.
r3285 # mathtext does not understand certain latex flags, so we try to replace
# them with suitable subs.
Brian Granger
Small fixes for latex/png printing....
r3284 s = s.replace('\\operatorname','')
Brian Granger
Fixing Matrix/overbar printing for sympy.
r3285 s = s.replace('\\overline', '\\bar')
Brian Granger
Misc updates the display system....
r3880 png = latex_to_png(s)
Brian Granger
More improvements to the display system....
r3279 return png
Aaron Meurer
Only print container types with LaTeX in the notebook if all the elements can...
r6297 def can_print_latex(o):
"""
Return True if type o can be printed with LaTeX.
If o is a container type, this is True if and only if every element of o
can be printed with LaTeX.
"""
import sympy
Aaron Meurer
Update SymPy profile: SymPy's latex() can now print set and frozenset...
r7039 if isinstance(o, (list, tuple, set, frozenset)):
Aaron Meurer
Only print container types with LaTeX in the notebook if all the elements can...
r6297 return all(can_print_latex(i) for i in o)
elif isinstance(o, dict):
return all((isinstance(i, basestring) or can_print_latex(i)) and can_print_latex(o[i]) for i in o)
elif isinstance(o,(sympy.Basic, sympy.matrices.Matrix, int, long, float)):
return True
return False
Brian Granger
Initial latex printing for sympy and fixes to autogrow.
r4316
def print_latex(o):
Aaron Meurer
Only print container types with LaTeX in the notebook if all the elements can...
r6297 """A function to generate the latex representation of sympy
expressions."""
if can_print_latex(o):
s = latex(o, mode='plain')
s = s.replace('\\dag','\\dagger')
s = s.strip('$')
return '$$%s$$' % s
# Fallback to the string printer
return None
Brian Granger
Initial latex printing for sympy and fixes to autogrow.
r4316
Brian Granger
Display system is fully working now....
r3278 _loaded = False
def load_ipython_extension(ip):
"""Load the extension in IPython."""
Aaron Meurer
Update SymPy profile: SymPy's latex() can now print set and frozenset...
r7039 import sympy
Brian Granger
Display system is fully working now....
r3278 global _loaded
if not _loaded:
plaintext_formatter = ip.display_formatter.formatters['text/plain']
Brian E. Granger
Adding basic types (list, dict ,etc) to the sympy profile....
r4270
Aaron Meurer
Update SymPy profile: SymPy's latex() can now print set and frozenset...
r7039 for cls in (object, str):
plaintext_formatter.for_type(cls, print_basic_unicode)
printable_containers = [list, tuple]
if sympy.__version__ < '0.7.1-git':
# set and frozen set were broken with SymPy's latex() function,
# but was fixed in the 0.7.1-git development version. See
# http://code.google.com/p/sympy/issues/detail?id=3062.
Brian E. Granger
Adding basic types (list, dict ,etc) to the sympy profile....
r4270 plaintext_formatter.for_type(cls, print_basic_unicode)
Aaron Meurer
Update SymPy profile: SymPy's latex() can now print set and frozenset...
r7039 else:
printable_containers += [set, frozenset]
Brian E. Granger
Adding basic types (list, dict ,etc) to the sympy profile....
r4270
Brian Granger
Display system is fully working now....
r3278 plaintext_formatter.for_type_by_name(
'sympy.core.basic', 'Basic', print_basic_unicode
)
Brian Granger
Fixing Matrix/overbar printing for sympy.
r3285 plaintext_formatter.for_type_by_name(
'sympy.matrices.matrices', 'Matrix', print_basic_unicode
)
Brian Granger
More improvements to the display system....
r3279 png_formatter = ip.display_formatter.formatters['image/png']
Brian E. Granger
Adding basic types (list, dict ,etc) to the sympy profile....
r4270
Brian Granger
More improvements to the display system....
r3279 png_formatter.for_type_by_name(
'sympy.core.basic', 'Basic', print_png
)
Aaron Meurer
Update SymPy profile: SymPy's latex() can now print set and frozenset...
r7039 for cls in [dict, int, long, float] + printable_containers:
Aaron Meurer
Use LaTeX to print various built-in types with the SymPy printing extension...
r6110 png_formatter.for_type(cls, print_png)
Brian Granger
Initial latex printing for sympy and fixes to autogrow.
r4316
latex_formatter = ip.display_formatter.formatters['text/latex']
latex_formatter.for_type_by_name(
'sympy.core.basic', 'Basic', print_latex
)
latex_formatter.for_type_by_name(
'sympy.matrices.matrices', 'Matrix', print_latex
)
Aaron Meurer
Only print container types with LaTeX in the notebook if all the elements can...
r6297
Aaron Meurer
Update SymPy profile: SymPy's latex() can now print set and frozenset...
r7039 for cls in printable_containers:
Aaron Meurer
Only print container types with LaTeX in the notebook if all the elements can...
r6297 # Use LaTeX only if every element is printable by latex
Aaron Meurer
Use LaTeX to print various built-in types with the SymPy printing extension...
r6110 latex_formatter.for_type(cls, print_latex)
Brian Granger
Display system is fully working now....
r3278
Aaron Meurer
Use LaTeX to print various built-in types with the SymPy printing extension...
r6110 _loaded = True