# Interaction with Sage

The objective of this post is to show a few examples of interaction of `sage`

with \( \LaTeX \) to produce results that, otherwise, would carry extensive writing and computation on the side. We will base it on the figure from the post Sequence of Right Triangles, where right triangles were constructed by halving one of their angles, placing one of the legs on the hypotenuse of the previous triangle, and point the second leg towards the \( x \)–axis.

In the first example, we show how to get the most of your skills manipulating strings to produce a `sage`

script that generates a `tikz`

code. In the second example, we utilize the full power of the graphing capabilities of `sage`

to accomplish a similar result.

The mathematical background is nonetheless the same for both examples: According to the results shown in the relevant post, we need to concern only with the position of the vertices at the end of the hypotenuses: We can think of those as vectors \( v_n \) that can be expressed in polar coordinates by \( \theta=\tfrac{\pi}{2^n}, \rho=2^n \sin\big( \tfrac{\pi}{2^{n+1}} \big). \)

### Interaction of `sage`

with `tikz`

We are looking for a string of characters that codes the construction of the triangles in `tikz`

language: A possible quick `sage`

script that would generate such a string holding up to \( n \) triangles in this fashion, could be something like this:

1
2
3
4
5
6
7
8
9
10

m = 1
n = 5
output = ""
while (m <=n):
m=m+1
s = pi/2^(m+1)
h = 2^m*sin(pi/2^(m+1))
smo = pi/2^m
hmo = 2^(m-1)*sin(pi/2^m)
output += r"\draw (0cm,0cm)--(%f r:%fcm)--(%f r:%fcm)--cycle;"%(s,h,smo,hmo)

Note that, since I chose a `while`

environment, I initialize the counter `m=1`

outside, an empty string `output`

and for this particular example, chose five steps (`n=5`

). The following four variable declarations simply compute the value of angle (`s, smo`

) and length (`h, hmo`

) of the vectors \( v_m \) and \( v_{m-1} \) respectively, for values of `m`

from 2 to 5. Finally, on each step I append to `output`

the corresponding `tikz`

code that produces the desired triangle.

To insert this code in a \( \LaTeX \) document, all we have to do is wrap it in a `sagesilent`

environment (or `sageblock`

if you want it displayed), and call `\sagestr{output}`

inside of a `tikzpicture`

environment. Something like this:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

\begin{sagesilent}
m=1
n=5
output=""
while (m <=n):
m=m+1
s=pi/2^(m+1)
h=2^m*sin(pi/2^(m+1))
smo=pi/2^m
hmo=2^(m-1)*sin(pi/2^m)
output+=r"\draw (0cm,0cm)--(%f r:%fcm)--(%f r:%fcm)--cycle;"%(s,h,smo,hmo)
\end{sagesilent}
\begin{center}
\begin{tikzpicture}[scale=2]
\draw[domain=0.001:3.141,smooth,variable=\t,very thick,blue] %
plot ({\t r}:1.570796*{sin(\t r)}/\t);
\draw[ultra thick,->] (-0.5cm,0cm) -- (2cm,0cm);
\draw[ultra thick,->] (0cm,-0.5cm) -- (0cm,1.5cm);
\draw (0,0) -- (1cm,1cm) -- (0cm,1cm) -- cycle;
\sagestr{output}
\end{tikzpicture}

To make style changes, like adding your own color scheme, filling the triangles with texture, or labeling each vertex, all you need to modify in the code is the `tikz`

bit in the declaration of `output+=[...]`

. In order to produce a different number of triangles, simply change the declaration `n=5`

to any other value.

### Making the most of the graphing capabilities of `sage`

It is a no-brainer: we have so much more control over the technical details from within `sage`

, that we can leave the task of rendering and computation directly, to focus on the writing alone. A quick \( \LaTeX \) script that produces a similar result, could look like this:

As before, we place the actual code that constructs the different plots inside of a `sagesilent`

environment. This code simply creates a polar plot of the required function \( f(\theta) = \tfrac{\sin \theta}{\theta} \) between the angular values of zero and \( \pi \), and then append to it all the triangles, one at a time, by calling the `polygon2d`

command. We take the liberty to change the shade of the triangle inside. That is all. Once the code is finished, we simply call the resulting plot (that was stored in the variable `t`

) with the command `\sageplot`

. Easy, right?