async def on_message(self, message): curr_time = time.perf_counter() global err if message.content.lower().startswith(Command.lower()): try: sympy.preview(message.content[len(Command) + 1:], viewer="file", filename=f"rendered-{curr_time}.png") await message.channel.send( file=discord.File(f"rendered-{curr_time}.png")) time.sleep(2) os.remove(f"rendered-{curr_time}.png") except RuntimeError as e: print(e) err = e await message.channel.send( "An Error during the LaTeX Rendering accoured" + ", if you want to see the Error Type 'y' otherwise irgnore this message." ) elif message.content.lower() == "y": char_count = 0 curr_msg = "" for char in str(err): curr_msg = curr_msg + char char_count += 1 if char_count >= 1999: await message.channel.send(curr_msg) char_count = 0 curr_msg = "" await message.channel.send(curr_msg)
async def expr(client, message): args = message.command try: if "arg" not in args: return # nothing to do! expr = args["arg"] logger.info(f"Mathifying \'{expr}\'") await client.send_chat_action(message.chat.id, "upload_document") if "-latex" in args["flags"]: preview(expr, viewer='file', filename='expr.png', dvioptions=[ "-T", "bbox", "-D 300", "--truecolor", "-bg", "Transparent" ]) else: res = parse_expr(expr) preview(res, viewer='file', filename='expr.png', dvioptions=[ "-T", "bbox", "-D 300", "--truecolor", "-bg", "Transparent" ]) await client.send_photo(message.chat.id, "expr.png", reply_to_message_id=message.message_id, caption=f"` → {expr} `") except Exception as e: traceback.print_exc() await edit_or_reply(message, "`[!] → ` " + str(e)) await client.send_chat_action(message.chat.id, "cancel") await client.set_offline()
def render_latex(formula, display, *args, **kwargs): """Renders LaTeX expression to bitmap image data. """ # Set a default math environment to have amsmath if 'preamble' not in kwargs: kwargs['preamble'] = r"""\documentclass[varwidth]{standalone} \usepackage{amsmath,amsfonts} \begin{document}""" if display: sympy.preview(r'\begin{align*}' + formula + r'\end{align*}', viewer='file', filename="out.png", euler=False, *args, **kwargs) else: sympy.preview('$' + formula + '$', viewer='file', filename="out.png", euler=False, *args, **kwargs) with open('out.png', 'rb') as f: data = f.read() im = Image.open(BytesIO(data)) width, height = im.size del im return data, width, height
def prev(expr, **kwargs): """ sympy preview abbreviation """ KWargs = {'output':'pdf'} KWargs.update(kwargs) sp.preview(expr, **KWargs)
def expr_to_png(expr, basename, add_bg=True, pad=10, onlymath=True): """Adding the only math option so that I can also pass in sentences with math inline.""" if onlymath: if expr[0] != '$': expr = '$' + expr if expr[-1] != '$': expr += '$' curdir = os.getcwd() os.chdir(folder) fno, ext = os.path.splitext(basename) pdf_name1 = fno + '.pdf' sympy.preview(expr, viewer='file', output='pdf', filename=pdf_name1, preamble=myheader) cmd1 = 'pdfcrop_rwk.py %s' % pdf_name1 os.system(cmd1) cropped_pdf_name = fno + '_cropped.pdf' cmd2 = 'pdf_to_png_2016.py %s' % cropped_pdf_name os.system(cmd2) if add_bg: cropped_png_name = cropped_pdf_name.replace('.pdf', '.png') add_background(cropped_png_name, pad=pad) os.remove(cropped_png_name) os.chdir(curdir)
async def expr_cmd(client, message): """convert to LaTeX formula This command accepts sympy syntax and will generate a LaTeX formula as image. Add flag `-latex` to directly pass LaTeX. """ if len(message.command) < 1: return await edit_or_reply(message, "`[!] → ` No input") expr = message.command.text prog = ProgressChatAction(client, message.chat.id, action="upload_document") if message.command["-latex"]: preview(expr, viewer='file', filename='expr.png', dvioptions=[ "-T", "bbox", "-D 300", "--truecolor", "-bg", "Transparent" ]) else: res = parse_expr(expr) preview(res, viewer='file', filename='expr.png', dvioptions=[ "-T", "bbox", "-D 300", "--truecolor", "-bg", "Transparent" ]) await client.send_photo(message.chat.id, "expr.png", reply_to_message_id=message.message_id, caption=f"` → {expr} `", progress=prog.tick)
def on_latex(event): cs = listbox.curselection() latex_string = listbox.get(cs) print(latex_string) expr = "$\displaystyle " + latex_string + "$" #This creates a ByteIO stream and saves there the output of sympy.preview f = BytesIO() the_color = "{" + top.cget('bg')[1:].upper() + "}" sp.preview(expr, euler=False, preamble=r"\documentclass{standalone}" r"\begin{document}", viewer="BytesIO", output="ps", outputbuffer=f) f.seek(0) #Open the image as if it were a file. This works only for .ps! img = Image.open(f) #See note at the bottom img.load(scale=10) img = img.resize((int(img.size[0] / 4), int(img.size[1] / 4)), Image.BILINEAR) photo = ImageTk.PhotoImage(img) label.config(image=photo) label.image = photo f.close()
def render(self, formula): """ Synchronous method. Returns rendered image and text of the formula, corresponding to the rendered image when rendering is done. """ if self.cur_formula is None: self.cur_formula = formula elif self.cur_formula == formula: return self.res_img, self.cur_formula self.cur_formula = formula self.res_img = None with tempfile.NamedTemporaryFile(suffix='.png', delete=False) as output_file: output_file_name = output_file.name try: sympy.preview('$${}$$'.format(formula), viewer='file', filename=output_file_name, euler=False, dvioptions=['-D', '{}'.format(DENSITY)]) self.res_img = cv.imread(output_file_name) finally: os.unlink(output_file_name) return self.res_img, self.cur_formula
async def integrate(self, ctx, *, eq: parse_eq, value=None): """Integrates single variable equations""" sympy.preview(sympy.integrate(eq), viewer='file', filename=self.file_location, dvioptions=['-D', '200']) await ctx.send(file=discord.File(self.file_location))
async def triple_integral(self, ctx, eq: parse_eq, order: parse_var): """Computes triple integrals""" sympy.preview(sympy.integrate(eq, order[0], order[1], order[2]), viewer='file', filename=self.file_location, dvioptions=['-D', '200']) await ctx.send(file=discord.File(self.file_location))
def image_generation(formula: str) -> Image: """Returns a PIL Image of the LaTeX input :param formula: The LaTeX input :type formula: str :return: An image of the LaTeX input :rtype: Image """ expr = "$\displaystyle " + formula + "$" # This creates a ByteIO stream and saves there the output of sympy.preview f = BytesIO() sympy.preview(expr, euler=False, preamble=r"\documentclass[varwidth,convert]{standalone}" r"\usepackage{amsmath,amssymb,amsthm,mathtools}" r"\begin{document}", viewer="BytesIO", output="ps", outputbuffer=f) f.seek(0) # Open the image as if it were a file. img = Image.open(f) # Resize the image to look sharper img.load(scale=50) return img
def _convert_math(expr: str, packages: List[str] = []) -> str: """Convert mathematics symbols to a base64 encoded GIF file.""" from base64 import b64encode from io import BytesIO from PIL import Image from sympy import preview # see issue #1096 expr = expr.replace("\\Z", "\\mathbb{Z}") expr = expr.replace("\\N", "\\mathbb{N}") expr = expr.replace("\\R", "\\mathbb{R}") expr = expr.replace("\\isin", "\\in") expr = expr.replace("\\and", "\\land") expr = expr.replace("\\Tau", "\\mathrm{T}") expr = expr.replace("\\infin", "\\infty") expr = expr.replace("\\rarr", "\\rightarrow") dvioptions = ["-T", "tight", "-z", "0", "-D 150", "-bg", "Transparent"] with BytesIO() as buf, BytesIO() as im: preview( f"${expr}$", output="png", viewer="BytesIO", outputbuffer=buf, dvioptions=dvioptions, packages=tuple(packages), ) Image.open(buf).convert("L").save(im, format="gif", optimize=True) im.seek(0) raw = im.read() return f'<img style="{IMG_CSS}" src="data:image/gif;base64,{b64encode(raw).decode()}"/>'
def ingest(message): response = None text = message["text"].strip() if message["sender_type"] == "user" and text.startswith(PREFIX): if message["text"].endswith(SUFFIX): img = BytesIO() imagesize = "bbox" offset = "0.3cm,0.3cm" resolution = 400 backcolor = "White" forecolor = "Black" dvi = r"-T %s -D %d -bg %s -fg %s -O %s" % (imagesize, resolution, backcolor, forecolor, offset) dvioptions = dvi.split() try: sympy.preview(text, output="png", viewer="BytesIO", outputbuffer=img, euler=False, dvioptions=dvioptions) url = upload_image(img.getvalue()) response = ("", url) except Exception as e: print(e) response = ("There was an error typsesetting the equation you specified. Please check your syntax, or report a bug at https://github.com/ErikBoesen/texbot/issues/new!", "") else: command = text.lower().lstrip(PREFIX).split()[0] if command == "info": return ("I'm TeXbot, a helpful tool that you can use to typeset (La)TeX math in GroupMe! I was made by Erik Boesen (erikboesen.com). You can see more information and add me to your own chat at https://mebots.co/bot/texbot. My source code is at https://github.com/ErikBoesen/texbot.", "") return response
def saveToDVI(name, expr): f = open(name, "wb") sympy.preview(expr, viewer="BytesIO", outputbuffer=f, euler=False, output="dvi") f.close()
def saveToPS(name, expr): f = open(name, "wb") sympy.preview(expr, viewer="BytesIO", outputbuffer=f, euler=False, output="postscript") f.close()
def on_latex(master, latex_str): preview_window = Toplevel(master) label = Label(preview_window) expr = latex_str + "\\end{document}" styles_location = os.path.dirname( os.path.realpath(__file__)) + "/src_styles" the_color = "{" + master.cget('bg')[1:].upper() + "}" preamble = r"\newcommand{\pathSrcStyleFiles}{" + styles_location + "}" preamble += r"\documentclass{article}" preamble += r"\usepackage{pagecolor}" preamble += r"\usepackage[utf8x]{inputenc}" preamble += r"\usepackage[T1]{fontenc}" preamble += r"\usepackage{automultiplechoice}" preamble += r"\usepackage{amssymb}" preamble += r"\usepackage{amsmath}" # r"\definecolor{graybg}{HTML}" + the_color + # r"\pagecolor{graybg}" preamble += r"\input{\pathSrcStyleFiles/defGras.tex}" preamble += r"\input{\pathSrcStyleFiles/defCdes.tex}" preamble += r"\begin{document}" # This creates a ByteIO stream and saves there the output of sympy.preview f = BytesIO() sp.preview(expr, euler=False, preamble=preamble, viewer="BytesIO", output="ps", outputbuffer=f) f.seek(0) # Open the image as if it were a file. This works only for .ps! img = PILImage.open(f) # See note at the bottom img.load(scale=5) img = img.resize((int(img.size[0] / 3), int(img.size[1] / 3)), PILImage.BILINEAR) width, height = img.size left = width / 8 top = height / 9 right = width bottom = height / 3.5 img = img.crop((left, top, right, bottom)) photo = ImageTk.PhotoImage(img) label.config(image=photo) label.image = photo f.close() label.pack() preview_window_width = str(int(right - left)) preview_window_height = str(int(bottom - top)) preview_window.geometry(preview_window_width + "x" + preview_window_height) preview_window.resizable(False, False) preview_window.mainloop()
def _preview_wrapper(o): exprbuffer = StringIO() preview(o, output='png', viewer='StringIO', outputbuffer=exprbuffer, preamble=preamble, dvioptions=dvioptions) return exprbuffer.getvalue()
def solve_integral(event, session): print(event.text) integral = event.text.replace(re.search(commands["неопределённый интеграл"]["regex"], event.text, re.IGNORECASE).group(0), '').strip() preview(integrate(parse_expr(integral)), viewer="file", filename="answer.png") upload = VkUpload(session) photo = upload.photo_messages( "answer.png" ) print(photo) return f'photo{str(photo[0]["owner_id"])}_{str(photo[0]["id"])}'
def latex2png(string, name, dvi_options=dviOptions, outTex=False): """ Given a LaTeX formatted string, outputs a PNG image (<name>.png) of the string processed with LaTeX. <name> is also added to mkdwns for printing a markdown file reference to the image. A TEX file (<name>.tex) containing the string will also be output if ouTex is set to True. """ outTexFile = name+'.tex' if outTex else None preview(string, outputTexFile=outTexFile, filename=name+'.png', viewer='file', dvioptions=dvi_options) mkdwns.append( mkdwn % ((name,)*2) )
def _preview_wrapper(o): exprbuffer = BytesIO() try: preview( o, output="png", viewer="BytesIO", outputbuffer=exprbuffer, preamble=preamble, dvioptions=dvioptions ) except Exception as e: # IPython swallows exceptions debug("png printing:", "_preview_wrapper exception raised:", repr(e)) raise return exprbuffer.getvalue()
def _get_latex_bytes(_latex: str): buff = io.BytesIO() preview( _latex, viewer="BytesIO", outputbuffer=buff, euler=False, dvioptions=["-D", "1200"], ) return buff.getvalue()
def create_list_of_hashes(math): """Dla zadanej listy wzorów zwraca listę hashy wygenerowanych na podstwie graficznej reprezentacji wzoru""" math_hash = [] for i in math: print("Przetwarzanie wzory:"+i) byteImgIO = BytesIO() preview(r'$$' + i + '$$', output='png', viewer='BytesIO', outputbuffer=byteImgIO, packages=("polski", "inputenc"), euler=False) img = Image.open(byteImgIO) hash = imagehash.average_hash(img) math_hash.append(hash) return math_hash
def setLabel(self, label=""): self.label = label self.manualysized = False if (self.preview_flag and len(self.label) > 0): preview('$' + self.label + '$', viewer='file', filename=".tmp/.otmt/" + str(os.getpid()) + "/s" + str(self.id) + '.png') self.prev_image = QImage(".tmp/.otmt/" + str(os.getpid()) + "/s" + str(self.id) + '.png') self.update()
def _preview_wrapper(o): exprbuffer = BytesIO() try: preview(o, output='png', viewer='BytesIO', outputbuffer=exprbuffer, preamble=preamble, dvioptions=dvioptions) except Exception as e: # IPython swallows exceptions debug("png printing:", "_preview_wrapper exception raised:", repr(e)) raise return exprbuffer.getvalue()
async def latex(self, ctx: aoi.AoiContext, *, formula: str): await ctx.trigger_typing() buffer = BytesIO() try: sympy.preview(f"\\[{formula.strip('`')}\\]", viewer="BytesIO", outputbuffer=buffer) except RuntimeError: return await ctx.send_error("An error occurred while rendering.") result = BytesIO() buffer.seek(0) old = Image.open(buffer) ImageOps.expand(old, border=20, fill=(0xff, 0xff, 0xff)).save(result, format="png") await ctx.embed(image=result)
def block_math(self, text): import sympy if not os.path.exists('tmp'): os.makedirs('tmp') filename = 'tmp/tmp%d.png' % self.img_counter self.img_counter = self.img_counter + 1 sympy.preview(r'$$%s$$' % text, output='png', viewer='file', filename=filename, euler=False) return self.image(filename, None, "Equation " + str(self.img_counter - 1))
def convert(left, expr, right, args, i): """Render all images and save on local disk or upload.""" global count filename = '{}.png'.format(i) filepath = os.path.join(args.image_assets, filename) markdown = '![{}]({})'.format( i, os.path.join(args.image_url_prefix, filepath)) expr = '{}{}{}'.format(left, expr, right) if not os.path.exists(args.image_assets): os.makedirs(args.image_assets, exist_ok=True) preview(expr, viewer='file', filename=filepath, euler=False) return markdown
def convert_latex_to_image(latex_string): """ This function takes in a LaTex string and saves it as an image in [output_path] """ output_filename = str(time.time()) + ".png" try: preview(latex_string, viewer="file", filename=output_filename, euler=False) f = open(output_filename, "rb") image_base64_string = base64.b64encode(f.read()) f.close() os.remove(output_filename) return image_base64_string except Exception as e: return None
def render_latex(mlist, tup): global args i, formula, font = tup formula = formula.strip('\n') if font: lat = '$$' + font + '{' + formula + '} $$' else: lat = '$$' + formula + '$$' try: preview(lat, viewer='file', filename='{}/{}.png'.format(args.output_dir, i), dvioptions=options) mlist.append((i, formula)) except Exception: pass
async def tex(self, ctx, *, query: str): """Parses and prints LaTeX equations.""" await ctx.trigger_typing() tex = "" sp = "" if "$$" in ctx.message.content: sp = ctx.message.content.split("$$") elif "$" in ctx.message.content: sp = ctx.message.content.split("$") if len(sp) < 3: await ctx.send("PLEASE USE '$' AROUND YOUR LATEX EQUATIONS. CHEEP." ) return up = int(len(sp) / 2) for i in range(up): tex += "\\[" + sp[2 * i + 1] + "\\]" buf = BytesIO() LATEX_PREAMBLE = ("\\documentclass[varwidth,12pt]{standalone}" "\\usepackage{alphabeta}" "\\usepackage[utf8]{inputenc}" "\\usepackage[LGR,T1]{fontenc}" "\\usepackage{amsmath,amsfonts,lmodern}" "\\begin{document}") preview( tex, preamble=LATEX_PREAMBLE, viewer="BytesIO", outputbuffer=buf, euler=False, dvioptions=["-T", "tight", "-z", "9", "--truecolor", "-D", "600"]) buf.seek(0) img_bytes = np.asarray(bytearray(buf.read()), dtype=np.uint8) img = cv2.imdecode(img_bytes, cv2.IMREAD_UNCHANGED) img2 = cv2.copyMakeBorder(img, 115, 115, 115, 115, cv2.BORDER_CONSTANT, value=(255, 255, 255)) fn = "latexed.png" retval, buf = cv2.imencode(".png", img2) img_bytes = BytesIO(buf) await ctx.send(file=discord.File(fp=img_bytes, filename=fn))
def render_latex(text, euler=False, dpi=200, border=3): if not isinstance(text, str): text = sympy.latex(text) text = f"$${text}$$" obj = BytesIO() sympy.preview( text, output='png', viewer='BytesIO', outputbuffer=obj, euler=euler, dvioptions=["-T", "tight", "-z", "0", "--truecolor", f"-D {dpi}"]) img = ImageOps.expand(Image.open(obj), border=border, fill=(255, 255, 255)) obj.close() return img
def _svg_wrapper(o): exprbuffer = BytesIO() try: preview( o, output="svg", viewer="BytesIO", outputbuffer=exprbuffer, preamble=preamble, dvioptions=dvioptions_svg, ) except Exception as e: # IPython swallows exceptions debug("svg printing:", "_preview_wrapper exception raised:", repr(e)) raise return exprbuffer.getvalue().decode("utf-8")
def expr_to_png(expr, basename, add_bg=True, pad=10): if expr[0] != '$': expr = '$' + expr if expr[-1] != '$': expr += '$' curdir = os.getcwd() os.chdir(folder) fno, ext = os.path.splitext(basename) pdf_name1 = fno + '.pdf' sympy.preview(expr, viewer='file', output='pdf',filename=pdf_name1, preamble=myheader) cmd1 = 'pdfcrop_rwk.py %s' % pdf_name1 os.system(cmd1) cropped_pdf_name = fno + '_cropped.pdf' cmd2 = 'pdf_to_png_2016.py %s' % cropped_pdf_name os.system(cmd2) if add_bg: cropped_png_name = cropped_pdf_name.replace('.pdf','.png') add_background(cropped_png_name, pad=pad) os.remove(cropped_png_name) os.chdir(curdir)
def expr_to_latex_png(expr, output_file): """Saves a png of a latex representation of a symbolic expression.""" sympy.preview(expr, viewer='file', filename=output_file)
#--------------------------------------" # from sympy import * # x = Symbol('x') # y = Symbol('y') # print f(x).diff(x, x) + f(x) # print dsolve(f(x).diff(x, x) + f(x), f(x)) from sympy import * x = Symbol('x') print (1/cos(x)).series(x, 0, 10) print f(x).diff(x, x) + f(x) from sympy import Integral, preview from sympy.abc import x preview(Integral(x**2, x)) from sympy.printing.python import python from sympy import Integral from sympy.abc import x print python(x**2) print python(1/x) print python(Integral(x**2, x)) #---------------------------------------------- def fib(n): # write Fibonacci series up to n a, b = 0, 1 while b < n: print b; a, b = b, a+b; # Now call the function we just defined: fib(200)
def _preview_wrapper(o): exprbuffer = StringIO() preview(o, output="png", viewer="StringIO", outputbuffer=exprbuffer, preamble=preamble, dvioptions=dvioptions) return exprbuffer.getvalue()
def previewEquation(self): sympy.preview(self.equation())
def _preview_wrapper(o): exprbuffer = cStringIO() preview(o, output='png', viewer='StringIO', outputbuffer=exprbuffer, preamble=preamble, dvioptions=dvioptions) return exprbuffer.getvalue()