Como incrustar código Python nun documento Latex

A posibilidade de introducir código Python nun documento Latex, otórgalle a estes unha capacidade de edición de contidos incríbel. Pódense crear exercicios con datos automatizados e aleatorios e incluso se lle pode facilitar a resposta correcta ao alumno, permite a representación de funcións e gráficos de diferentes tipos, o análise dun ficheiro con datos: cálculo de medias, varianzas, etc. Tamén podemos imprimir nun pdf distintos mapas de Google Maps. Vexamos como se instala a librería Pythontex, que é a protagonista desta maxia.

 

Primeiramente comprobamos se está instalada pythontex no sistema operativo. Tan só temos que abrir o emulador de terminal e escribir pythontex. Se non recoñece o comando, debemos instalala segundo os seguintes puntos:

1. Descarga da librería pythontex

Páxina oficial: https://ctan.org/pkg/pythontex

Ligazón para a súa descarga: https://mirrors.ctan.org/macros/latex/contrib/pythontex.zip

2. Descomprimimos e instalamos

Abrimos un terminal no cartafol e executamos as seguintes intrucións:

latex pythontex.ins

 

E con esta orde xérase o ficheiro pythontex.sty

Seguidamente executamos o seguinte:

su root (introducimos o contrasinal)

python pythontex_install.py

E aparece un diálogo mediante o cal nos pregunta pola ruta na que queremos instalar o pythontex. Escollemos a opción 1

E instala na seguinte ruta:

/usr/share/texmf-dist/scripts/pythontex


3. Editamos un ficheiro tex

Neste exemplo creamos un número aleatorio con Python. Introducimos o seguinte código no noso editor favorito:

\documentclass{article}
\usepackage[pyfuture=none,gobble=auto]{pythontex}
\begin{document}    
    Número aleatorio:
    \begin{pycode}
        from numpy import *
        r1=random.uniform(3,11)
        print (r1)                
    \end{pycode}    
\end{document}

Se o que desexamos é escoller un número dentro dunha serie deles definidos nun array, podemos facelo do seguinte xeito:

\documentclass{article}
\usepackage[pyfuture=none,gobble=auto]{pythontex}
\begin{document}    
    Número aleatorio:
    \begin{pycode}
        from numpy import *
        r1=random.choice([2,3,4,5,6])
        print (r1)                
    \end{pycode}    
\end{document}

Incluso podemos rescatar un valor calculado en Python e empregalo dentro do documento Latex. Ista propiedade é moi interesante, xa que nos permite crear exercicios con valores aleatorios e automatizados.

\documentclass{article}
\usepackage[pyfuture=none,gobble=auto]{pythontex}
\begin{document}    
    \begin{pycode}
        from numpy import *
        r1=random.choice([2,3,4,5,6])                   
    \end{pycode}
    Valor aleatorio: \py{r1}
\end{document}

 

4. Compilamos o ficheiro .tex

Abrimos o terminal na ruta na cal teñamos gardado o ficheiro anterior e executamos as tres ordes seguintes en orde:

pdflatex --shell-escape -synctex=1 -interaction=nonstopmode *.tex

python3 /usr/share/texmf-dist/scripts/pythontex/pythontex3.py *.tex

pdflatex --shell-escape -synctex=1 -interaction=nonstopmode *.tex

Se abrimos o ficheiro pdf que se xerou no mesmo cartafol no cal está situado o ficheiro tex, visalizamos o resultado:

Resulta moi cómodo crear uns alias dos comandos para evitar recordar ordes tan longas ou ter que andar copiando e pegando no terminal. Para isto editamos o ficheiros .bashrc do usuario que utilicemos

cd ~

nano .bashrc

E engadimos ao final do ficheiro os seguintes alias:

alias plx='pdflatex --shell-escape -synctex=1 -interaction=nonstopmode'

alias ptx='python3 /usr/share/texmf-dist/scripts/pythontex/pythontex3.py'

Para gardar prememos a combinación de teclas Ctrl + o e para saír Ctrl + x

E seguidamente para cargar estes alias, podemos reiniciar o equipo ou escribir:

source ~.bashrc

Se empregamos os alias anteriores procederiamos do seguinte xeito para compilar o ficheiro tex:

plx *.tex && ptx *.tex && plx *.tex

5.  importar librerías Python

Nos seguinte exemplos debemos importar librerías Python.

apt install python-sympy python-numpy python-scipy python-matplotlib

 

6. Outros exemplos

a. Outra forma de chamar a comandos Python

\documentclass{article}
\usepackage[pyfuture=none,gobble=auto]{pythontex}
\begin{document}
    Sabes que $2^{65} = \py{2**65}$?    
\end{document}

E compilando, obtemos:

b. Inserir gráficos no documento final

Con Python podemos crear moitos gráficos a partir de datos numéricos. Na seguinte páxina dispoñemos de moitos tipos de gráficos e do seu código python para crealos. Facendo unha labor de adaptación podemos empregalos en Latex. Vexamos un exemplo:

\documentclass{article}
\usepackage[pyfuture=none,gobble=auto]{pythontex}
\begin{document}
    \begin{pycode}
        from pylab import *
        t = arange(0.0, 2.0, 0.01)
        s = sin(2*pi*t)
        plot(t, s)
        grid(True)
        # MATLAB style
        xticklines = getp(gca(), 'xticklines')
        yticklines = getp(gca(), 'yticklines')
        xgridlines = getp(gca(), 'xgridlines')
        ygridlines = getp(gca(), 'ygridlines')
        xticklabels = getp(gca(), 'xticklabels')
        yticklabels = getp(gca(), 'yticklabels')
        setp(xticklines, 'linewidth', 3)
        setp(yticklines, 'linewidth', 3)
        setp(xgridlines, 'linestyle', '-')
        setp(ygridlines, 'linestyle', '-')
        setp(yticklabels, 'color', 'r', fontsize='medium')
        setp(xticklabels, 'color', 'r', fontsize='medium')
        show()
    \end{pycode}
\end{document}

E despois de compilalo obtemos esta vista:

c. Enviar unha función a un pdf

\documentclass{article}
\usepackage[pyfuture=none,gobble=auto]{pythontex}
\pgfplotsset{compat=1.17}
\usepackage{pgfplots}
\usepackage{graphicx}
\begin{document}
    \begin{pycode}
        from pylab import *
        t = arange(0.0, 2.0, 0.01)
        s = sin(2*pi*t)
        plot(t, s)
        grid(True)
        # MATLAB style
        xticklines = getp(gca(), 'xticklines')
        yticklines = getp(gca(), 'yticklines')
        xgridlines = getp(gca(), 'xgridlines')
        ygridlines = getp(gca(), 'ygridlines')
        xticklabels = getp(gca(), 'xticklabels')
        yticklabels = getp(gca(), 'yticklabels')
        setp(xticklines, 'linewidth', 3)
        setp(yticklines, 'linewidth', 3)
        setp(xgridlines, 'linestyle', '-')
        setp(ygridlines, 'linestyle', '-')
        setp(yticklabels, 'color', 'r', fontsize='medium')
        setp(xticklabels, 'color', 'r', fontsize='medium')
        plt.savefig('figure.png',dpi=200)        
    \end{pycode}
\IfFileExists{figure.png}{
    \includegraphics{figure}
}{}
\end{document}

Pero para compilalo, debemos de chamar aos tres comandos, pero por separado. Cando remate un executamos o outro:

plx *.tex

ptx *.tex

plx *.tex