\documentclass{article}
\title{Examples of embedding Sage in \LaTeX{} with \textsf{Sage\TeX}}
\author{Drake and others}
\usepackage{amsmath}
\usepackage{sagetex}
\setlength{\sagetexindent}{10ex}
\begin{document}
\maketitle
\section{Inline SageMath, code blocks}
This is an example $2+2=\sage{2+2}$. If you raise the current year mod
$100$ (which equals $\sage{mod(\the\year, 100)}$) to the power of the
current day ($\the\day$), you get
$\sage{Integer(mod(\the\year, 100))^\the\day}$.
Also, $\the\year$ modulo $42$ is $\sage{\the\year\percent 42}$.
Code block, which uses a variable \texttt{s} to store the solutions:
\begin{sageblock}
1+1
var('a,b,c,d')
eqn = [a+b*c==1, b-a*c==0, a+b==5]
s = solve(eqn, a,b,c)
\end{sageblock}
Solutions of $\mbox{eqn}=\sage{eqn}$:
\[
\sage{s[0]}
\]
\[
\sage{s[1]}
\]
Now we evaluate the following block:
\begin{sageblock}
E = EllipticCurve("37a")
\end{sageblock}
You can't do assignment inside \verb|\sage| macros, since Sage doesn't
know how to typeset the output of such a thing. So you have to use a
code block. The elliptic curve $E$ given by $\sage{E}$ has discriminant
$\sage{E.discriminant()}$.
You can do anything in a code block that you can do in Sage and/or
Python. Here we save an elliptic curve into a file.
\begin{sageblock}
try:
E = load('E2')
except IOError:
E = EllipticCurve([1,2,7,4,5])
E.anlist(100000)
E.save('E2')
\end{sageblock}
The 9999th Fourier coefficient of $\sage{E}$ is $\sage{E.anlist(100000)[9999]}$.
The following code block doesn't appear in the typeset file\dots
\begin{sagesilent}
e = 2
e = 3*e + 1
\end{sagesilent}
but we can refer to whatever we did in that code block: $e=\sage{e}$.
\begin{sageblock}
var('x')
f(x) = log(sin(x)/x)
\end{sageblock}
The Taylor Series of $f$ begins: $\sage{ f.taylor(x, 0, 10) }$.
\section{Plotting}
Here's a plot of the elliptic curve $E$.
\sageplot[scale=.4]{E.plot(-3,3)}
\begin{sagesilent}
var('x')
f(x) = -x^3+4*x^2+7*x-4
\end{sagesilent}
You can use variables to hold plot objects and do stuff with them.
\begin{sageblock}
p = plot(f, x, -5, 8)
\end{sageblock}
Here's a small plot of $f$ from $-5$ to $5$, which I've centered:
\begin{center} \sageplot[scale=.2]{p} \end{center}
On second thought, use the default size of $3/4$ the \verb|\textwidth|
and don't use axes:
\sageplot[scale=.4]{p, axes=False}
Remember, you're using Sage, and can therefore call upon any of the
software packages Sage is built out of.
\begin{sageblock}
f = maxima('sin(.4 * x)^3*cos(x)')
g = f.integrate('x')
\end{sageblock}
Plot $g(x)$, but don't typeset it.
\begin{sagesilent}
plot1 = plot(g.sage(),x,-1,2*pi)
\end{sagesilent}
You can specify a file format and options for \verb|includegraphics|.
The default is for EPS and PDF files, which are the best choice in
almost all situations. (Although see the section on 3D plotting.)
\sageplot[angle=45, width=.5\textwidth][png]{plot1}
If you use regular \verb|latex| to make a DVI file, you'll see a box,
because DVI files can't include PNG files. If you use \verb|pdflatex|
that will work. See the documentation for details.
When using \verb|\sageplot|, you can pass in just about anything that
Sage can call \verb|.save()| on to produce a graphics file:
\begin{center}
\sageplot{plot1 + plot(f.sage(),x,-1,2*pi,rgbcolor=hue(0.4)), figsize=[1,2]}
\end{center}
\sageplot{graphs.FlowerSnark().plot()}
\begin{sageblock}
G4 = DiGraph({1:[2,2,3,5], 2:[3,4], 3:[4], 4:[5,7], 5:[6]},\
multiedges=True)
G4plot = G4.plot(layout='circular')
\end{sageblock}
\sageplot{G4plot, axes=False}
Indentation and so on works fine.
\begin{sageblock}
s = 7
s2 = 2^s
P.<x> = GF(2)[]
M = matrix(parent(x),s2)
for i in range(s2):
p = (1+x)^i
pc = p.coeffs()
a = pc.count(1)
for j in range(a):
idx = pc.index(1)
M[i,idx+j] = pc.pop(idx)
matrixprogram = matrix_plot(M,cmap='Greys')
\end{sageblock}
And here's the picture:
\sageplot{matrixprogram}
Reset \texttt{x} in Sage so that it's not a generator for the polynomial
ring: \sage{var('x')}
\subsection{3D plotting}
3D plotting right now is problematic because there's no convenient way
to produce vector graphics. We can make PNGs, though, and since the
\verb|sageplot| command defaults to EPS and PDF, \emph{you must specify
a valid format for 3D plotting}. Sage right now (version 3.4.2) can't
produce EPS or PDF files from plot3d objects, so if you don't specify a
valid format, things will go badly. You can specify the
``\texttt{imagemagick}'' option, which will use the Imagemagick
\texttt{convert} utility to make EPS files. See the documentation for
details.
Here's the famous Sage cube graph:
\begin{sageblock}
G = graphs.CubeGraph(5)
\end{sageblock}
\sageplot[][png]{G.plot3d(engine='tachyon')}
\section{Pausing Sage\TeX}
\label{sec:pausing-sagetex}
Sometimes you want to ``pause'' for a bit while writing your document if
you have embedded a long calculation or just want to concentrate on the
\LaTeX{} and ignore any Sage stuff. You can use the \verb|\sagetexpause|
and \verb|\sagetexunpause| macros to do that.
\sagetexpause
A calculation: $\sage{factor(2^325 + 1)}$ and a code environment that
simulates a time-consuming calculation. While paused, this will get
skipped over.
\begin{sageblock}
import time
time.sleep(15)
\end{sageblock}
Graphics are also skipped: \sageplot{plot(2*sin(x^2) + x^2, (x, 0, 5))}
\sagetexunpause
\section{Make Sage write your \LaTeX{} for you}
With \textsf{Sage\TeX}, you can not only have Sage do your math for you,
it can write parts of your \LaTeX{} document for you! For example, I
hate writing \texttt{tabular} environments; there's too many fiddly
little bits of punctuation and whatnot\ldots and what if you want to add
a column? It's a pain---or rather, it \emph{was} a pain. Here's how to
make Pascal's triangle. It requires the \texttt{amsmath} package because
of what Sage does when producing a \LaTeX{} representation of a string.
(It puts it inside a \verb|\text| macro.)
\begin{sageblock}
%def pascals_triangle(n):
%
% s = r"\begin{tabular}{cc|" + "r" * (n+1) + "}"
% s += r" & & $k$: & \\"
%
% s += r" & "
% for k in [0..n]:
% s += "& %d " % k
% s += r"\\"
%
% s += r"\hline" + "\n" + r"$n$: & 0 & 1 & \\"
%
% for r in [1..n]:
% s += " & %d " % r
% for k in [0..r]:
% s += "& %d " % binomial(r, k)
% s += r"\\"
%
% s += r"\end{tabular}"
% return s
%
%
% n = 8
%\end{sageblock}
Okay, now here's the table. To change the size, edit \texttt{n} above.
If you have several tables, you can use this to get them all the same
size, while changing only one thing.
\sage{pascals_triangle(n)}$
$\sage{version()}$
\end{document}