##// END OF EJS Templates
Document print_png and print_display_png
Takafumi Arakaki -
Show More
@@ -1,145 +1,151 b''
1 1 """
2 2 A print function that pretty prints sympy Basic objects.
3 3
4 4 :moduleauthor: Brian Granger
5 5
6 6 Usage
7 7 =====
8 8
9 9 Once the extension is loaded, Sympy Basic objects are automatically
10 10 pretty-printed.
11 11
12 12 """
13 13 #-----------------------------------------------------------------------------
14 14 # Copyright (C) 2008-2011 The IPython Development Team
15 15 #
16 16 # Distributed under the terms of the BSD License. The full license is in
17 17 # the file COPYING, distributed as part of this software.
18 18 #-----------------------------------------------------------------------------
19 19
20 20 #-----------------------------------------------------------------------------
21 21 # Imports
22 22 #-----------------------------------------------------------------------------
23 23
24 24 from IPython.lib.latextools import latex_to_png
25 25 from IPython.testing import decorators as dec
26 26 # use @dec.skipif_not_sympy to skip tests requiring sympy
27 27
28 28 try:
29 29 from sympy import pretty, latex
30 30 except ImportError:
31 31 pass
32 32
33 33 #-----------------------------------------------------------------------------
34 34 # Definitions of special display functions for use with IPython
35 35 #-----------------------------------------------------------------------------
36 36
37 37 def print_basic_unicode(o, p, cycle):
38 38 """A function to pretty print sympy Basic objects."""
39 39 if cycle:
40 40 return p.text('Basic(...)')
41 41 out = pretty(o, use_unicode=True)
42 42 if '\n' in out:
43 43 p.text(u'\n')
44 44 p.text(out)
45 45
46 46
47 47 def print_png(o):
48 """A function to display sympy expression using LaTex -> PNG."""
48 """
49 A function to display sympy expression using inline style LaTeX in PNG.
50 """
49 51 s = latex(o, mode='inline')
50 52 # mathtext does not understand certain latex flags, so we try to replace
51 53 # them with suitable subs.
52 54 s = s.replace('\\operatorname','')
53 55 s = s.replace('\\overline', '\\bar')
54 56 png = latex_to_png(s)
55 57 return png
56 58
57 59
58 60 def print_display_png(o):
59 """A function to display sympy expression using LaTex -> PNG."""
61 """
62 A function to display sympy expression using display style LaTeX in PNG.
63 """
60 64 s = latex(o, mode='plain')
61 65 s = s.strip('$')
66 # As matplotlib does not support display style, dvipng backend is
67 # used here.
62 68 png = latex_to_png('$$%s$$' % s, backend='dvipng')
63 69 return png
64 70
65 71
66 72 def can_print_latex(o):
67 73 """
68 74 Return True if type o can be printed with LaTeX.
69 75
70 76 If o is a container type, this is True if and only if every element of o
71 77 can be printed with LaTeX.
72 78 """
73 79 import sympy
74 80 if isinstance(o, (list, tuple, set, frozenset)):
75 81 return all(can_print_latex(i) for i in o)
76 82 elif isinstance(o, dict):
77 83 return all((isinstance(i, basestring) or can_print_latex(i)) and can_print_latex(o[i]) for i in o)
78 84 elif isinstance(o,(sympy.Basic, sympy.matrices.Matrix, int, long, float)):
79 85 return True
80 86 return False
81 87
82 88 def print_latex(o):
83 89 """A function to generate the latex representation of sympy
84 90 expressions."""
85 91 if can_print_latex(o):
86 92 s = latex(o, mode='plain')
87 93 s = s.replace('\\dag','\\dagger')
88 94 s = s.strip('$')
89 95 return '$$%s$$' % s
90 96 # Fallback to the string printer
91 97 return None
92 98
93 99 _loaded = False
94 100
95 101 def load_ipython_extension(ip):
96 102 """Load the extension in IPython."""
97 103 import sympy
98 104 global _loaded
99 105 if not _loaded:
100 106 plaintext_formatter = ip.display_formatter.formatters['text/plain']
101 107
102 108 for cls in (object, str):
103 109 plaintext_formatter.for_type(cls, print_basic_unicode)
104 110
105 111 printable_containers = [list, tuple]
106 112
107 113 # set and frozen set were broken with SymPy's latex() function, but
108 114 # was fixed in the 0.7.1-git development version. See
109 115 # http://code.google.com/p/sympy/issues/detail?id=3062.
110 116 if sympy.__version__ > '0.7.1':
111 117 printable_containers += [set, frozenset]
112 118 else:
113 119 plaintext_formatter.for_type(cls, print_basic_unicode)
114 120
115 121 plaintext_formatter.for_type_by_name(
116 122 'sympy.core.basic', 'Basic', print_basic_unicode
117 123 )
118 124 plaintext_formatter.for_type_by_name(
119 125 'sympy.matrices.matrices', 'Matrix', print_basic_unicode
120 126 )
121 127
122 128 png_formatter = ip.display_formatter.formatters['image/png']
123 129
124 130 png_formatter.for_type_by_name(
125 131 'sympy.core.basic', 'Basic', print_png
126 132 )
127 133 png_formatter.for_type_by_name(
128 134 'sympy.matrices.matrices', 'Matrix', print_display_png
129 135 )
130 136 for cls in [dict, int, long, float] + printable_containers:
131 137 png_formatter.for_type(cls, print_png)
132 138
133 139 latex_formatter = ip.display_formatter.formatters['text/latex']
134 140 latex_formatter.for_type_by_name(
135 141 'sympy.core.basic', 'Basic', print_latex
136 142 )
137 143 latex_formatter.for_type_by_name(
138 144 'sympy.matrices.matrices', 'Matrix', print_latex
139 145 )
140 146
141 147 for cls in printable_containers:
142 148 # Use LaTeX only if every element is printable by latex
143 149 latex_formatter.for_type(cls, print_latex)
144 150
145 151 _loaded = True
General Comments 0
You need to be logged in to leave comments. Login now