# How can I print equations just like latex?

Now I'm testing several equations and solutions with Sage. After testing the solutions, I'd present it to the group members. But I met a problem to print the equations.

For example, when I write the code.

sage: z(x)=6/(5*pi*50*(x^2+25))*exp((-x+sqrt(x^2+25))/50)
sage: view (z)


Then the sage doesn't show the equation that is exactly same with the code, but it just shows simplified form. Could anyone let me know how to show the original equation?

And it would be also appreciated, if you tell me how to modify the simplifying mechanism. I'd love to write equations that don't contain any large denominators with many exponential terms.

thank you.

edit retag close merge delete

Sort by » oldest newest most voted

There is the hold option, which might can help:

 z(x)=x.power(2).mul(x,hold=true)
view(z)


which evaluates to $x \mapsto x^2x$ For an easier typing one could use Infix opertors:

 def hold_mult(a,b):
return a.mul(b,hold=true)
h = infix_operator('multiply')(hold_mult)


and then use x^2 *h* x.

However in your case if you need just the initial equation to display it might be the easiest just to print it as a string. If you need this functionality more often, an (extendet version of a) function like this could be helpful:

def paranthese_match(prefix,str):
matches = []
while (str.find(prefix) != -1):
p = -1
for li in [str.find(prefix)+len(prefix)..len(str)-1]:
if str[li] == '(':
p -=1
if str[li] == ')':
p += 1
if p==0:
matches.append(str[str.find(prefix)+len(prefix):li])
str = str[li:]
return matches
def print_expression(str):
str = str.replace('*',' \cdot ')
str = str.replace('pi',' \pi ')
for sr in paranthese_match('sqrt(',str):
str = str.replace('sqrt('+sr+")",'\sqrt{'+sr+'}')
for sr in paranthese_match('exp(',str):
str = str.replace('exp('+sr+")",'e^{'+sr+'}')
html("$"+str+"$")


Then print_expresion("6/(5*pi*h*50*h*(x^2+25))*h*exp((-x+sqrt(x^2+25))/50)") leads to $6/(5 \cdot \pi \cdot h \cdot 50 \cdot h \cdot (x^2+25)) \cdot h \cdot e^{(-x+\sqrt{x^2+25})/50}$

more

Thanks, that's exactly what I was looking for! I changed the line html("$"+str+"$") to print "$"+str+"$" to get raw Latex from a Sage expression. Note that the print_expresion("6/(5*... line should read print_expression("6/(5*... with 2 s's. Also, for those interested: you can print the Latex code for an already defined symbolic equation by converting it to a string as print_expression(str(Lambda)) where Lambda is the name of your symbolic equation.

( 2017-01-25 11:27:44 -0500 )edit

I was looking for the same thing and found these comments on the issue.

This works with a _few_ functions, but not all.

This is probably the best answer on why it does this simplification (and why there's no way to stop it)

As far as the simplification mechanisms, you can look at this page. There are a number of them spread throughout that highlight different means:

If you're looking to just reproduce the same text as your input, unfortunately I have found no better way than writing it out in LaTeX as a initial condition step so Sage doesn't mangle the form. This is a quick latex renderer that I modified from a this post on ask.sagemath

def latexrender(s):
try:
pic = text("$" + s.replace('$','\$') + "$",(0,0),axes=False,figsize=1,color='black',fontsize=20)
pic.show()
except:
latexrender(latex(s))
return

more

I've created an extended version of the script given by Thorsten and posted it on GitHub. This way I will keep it updated were I to make changes or receive suggestions: sageToLatex.sage

LATEX PACKAGES REQUIRED:

*) add the following two lines to the header of you main Latex file if theses packages are not already declared:

\usepackage{esdiff} % for non-italic derivatives

\usepackage{breqn} % automatic linebreaks for eqns

INSTRUCTIONS:

1) paste the whole sageToLatex.sage file somewhere near the beginning of your worksheet and uncomment the following line to set the boolean printArticle as such:

printArticle = bool(1) # enable if want to print the text and equations for the article


if (printArticle):
latexPrint += 'YOUR TEXT,' + get_expression('derivative(x/b + 5 + sqrt(3/b),x)', isEqn=bool(1))


3) at the end of your document create the Latex file that you can then include (ex: \input{myEqns.tex}) in your master Latex document:

if (printArticle):
fLATEX=open('myEqns.tex','w')
fLATEX.write(latexPrint)
fLATEX.close()

more