\documentclass{article} \usepackage{helvet} \usepackage{courier} \renewcommand{\familydefault}{\sfdefault} \usepackage[margin=2.5cm]{geometry} \usepackage{parskip} \linespread{1.2} \usepackage{tabularx} \usepackage{xcolor} \usepackage[listings,breakable,xparse]{tcolorbox} \tcbset{breakable,listing only,size=fbox,colframe=black!10,boxrule=3pt,colback=black!10} \NewTotalTCBox{\inlcode}{ v }{ on line,boxsep=0pt,left=0.5ex,right=0.5ex,top=0pt,bottom=0pt, boxrule=0pt}{\lstinline[style=tcblatex]|#1|\rule[-.3\baselineskip]{0pt}{0.9\baselineskip}} \usepackage{url} \title{The \emph{pyluatex} package} \author{Tobias Enderle\\\url{https://github.com/tndrle/PyLuaTeX}} \date{v0.6.3 (2024/01/10)} \begin{document} \maketitle \raggedright \textbf{Execute Python code on the fly in your \LaTeX{} documents} PyLuaTeX allows you to execute Python code and to include the resulting output in your \LaTeX{} documents in a \textit{single compilation run}. \LaTeX{} documents must be compiled with Lua\LaTeX{} for this to work. \section{Example} \begin{enumerate} \item \LaTeX{} document \inlcode|example.tex|\\[0.5ex] \begin{tcblisting}{breakable,listing only, size=fbox,colframe=black!8,boxrule=3pt,colback=black!8} \documentclass{article} \usepackage{pyluatex} \begin{python} import math import random random.seed(0) greeting = 'Hello PyLuaTeX!' \end{python} \newcommand{\randint}[2]{\py{random.randint(#1, #2)}} \begin{document} \py{greeting} $\sqrt{371} = \py{math.sqrt(371)}$ \randint{2}{5} \end{document} \end{tcblisting} \item Compile using Lua\LaTeX{} (shell escape is required) \begin{tcblisting}{breakable,listing only, size=fbox,colframe=black!8,boxrule=3pt,colback=black!8} lualatex --shell-escape example.tex \end{tcblisting} \end{enumerate} \textbf{Note:} PyLuaTeX starts Python 3 using the command \inlcode|python3| by default. If \inlcode|python3| does not start Python 3 on your system, find the correct command and replace \inlcode|\usepackage{pyluatex}| with \inlcode|\usepackage[executable=]{pyluatex}|. For example, \inlcode|\usepackage[executable=python.exe]{pyluatex}|. \textbf{Note:} Running \LaTeX{} with the shell escape option enabled allows arbitrary code to be executed. For this reason, it is recommended to compile trusted documents only. \subsection{Further Examples} The folder \inlcode|example| contains additional example documents: \begin{itemize} \item \inlcode|beamer.tex|\\[0.5ex] Demonstrates the use of PyLuaTeX environments and typesetting in \textit{BEAMER} presentations. In particular, the \inlcode|fragile| option for frames is highlighted. \item \inlcode|data-visualization.tex|\\[0.5ex] Demonstrates the visualization of data using \textit{pgfplots} and \textit{pandas} \item \inlcode|matplotlib-external.tex|\\[0.5ex] Demonstrates how \textit{matplotlib} plots can be generated and included in a document \item \inlcode|matplotlib-pgf.tex|\\[0.5ex] Demonstrates how \textit{matplotlib} plots can be generated and included in a document using \textit{PGF} \item \inlcode|readme-example.tex|\\[0.5ex] The example above \item \inlcode|repl.tex|\\[0.5ex] Demonstrates how a Python console/REPL can be run and typeset \item \inlcode|sessions.tex|\\[0.5ex] Demonstrates the use of different Python sessions in a document \item \inlcode|typesetting-example.tex|\\[0.5ex] The code typesetting example below \item \inlcode|typesetting-listings.tex|\\[0.5ex] A detailed example for typesetting code and output with the \textit{listings} package \item \inlcode|typesetting-minted.tex|\\[0.5ex] A detailed example for typesetting code and output with the \textit{minted} package \end{itemize} \section{Installation} PyLuaTeX is available in TeX Live, MiKTeX, and on CTAN\footnote{\url{https://ctan.org/pkg/pyluatex}} as \inlcode|pyluatex|. To install PyLuaTeX in \textbf{TeX Live} run \inlcode|tlmgr install pyluatex|.\\[0.5ex] In \textbf{MiKTeX}, PyLuaTeX can be installed in the \textit{MiKTeX Console}. \section{Reference} PyLuaTeX offers a simple set of options, macros and environments. Most macros and environments are available as \textit{quiet} versions as well. They have the suffix \inlcode|q| in their name, e.g. \inlcode|\pycq| or \inlcode|\pyfileq|. The quiet versions suppress any output, even if the Python code explicitly calls \inlcode|print()|. This is helpful if you want to process code or output further and do your own typesetting. For an example, see the Typesetting Code section. \subsection{Package Options} \begin{itemize} \item \inlcode|executable|\\[0.5ex] Specifies the path to the Python executable. (default: \inlcode|python3|)\\[0.5ex] \textit{Example:} \inlcode|\usepackage[executable=/usr/local/bin/python3]{pyluatex}| \item \inlcode|ignoreerrors|\\[0.5ex] By default, PyLuaTeX aborts the compilation process when Python reports an error. If the \inlcode|ignoreerrors| option is set, the compilation process is not aborted.\\[0.5ex] \textit{Example:} \inlcode|\usepackage[ignoreerrors]{pyluatex}| \item \inlcode|localimports|\\[0.5ex] If this option is set, the folder containing the TeX input file is added to the Python path. This allows local Python packages to be imported. (default: \inlcode|true|)\\[0.5ex] \textit{Example:} \inlcode|\usepackage[localimports=false]{pyluatex}| \item \inlcode|shutdown|\\[0.5ex] Specifies when the Python process is shut down. (default: \inlcode|veryveryend|)\\[0.5ex] \textit{Options:} \inlcode|veryveryend|, \inlcode|veryenddocument|, \inlcode|off|\\[0.5ex] PyLuaTeX shuts down the Python interpreter when the compilation is done. With the option \inlcode|veryveryend|, Python is shut down in the \inlcode|enddocument/end| hook. With the option \inlcode|veryenddocument|, Python is shut down in the \inlcode|enddocument/afteraux| hook. With the option \inlcode|off|, Python is not shut down explicitly. However, the Python process will shut down when the LuaTeX process finishes even if \inlcode|off| is selected. Using \inlcode|off| on Windows might lead to problems with SyncTeX, though.\\[0.5ex] Before v0.6.2, PyLuaTeX used the hooks \inlcode|\AtVeryVeryEnd| and \inlcode|\AtVeryEndDocument| of the package \textit{atveryend}. The new hooks \inlcode|enddocument/end| and \inlcode|enddocument/afteraux| are equivalent to those of the \textit{atveryend} package.\\[0.5ex] \textit{Example:} \inlcode|\usepackage[shutdown=veryenddocument]{pyluatex}| \item \inlcode|verbose|\\[0.5ex] If this option is set, Python input and output is written to the \LaTeX{} log file.\\[0.5ex] \textit{Example:} \inlcode|\usepackage[verbose]{pyluatex}| \end{itemize} The package options \inlcode|verbose| and \inlcode|ignoreerrors| can be changed in the document with the \inlcode|\pyoption| command, e.g. \inlcode|\pyoption{verbose}{true}| or \inlcode|\pyoption{ignoreerrors}{false}|. \subsection{Macros} \begin{itemize} \item \inlcode|\py{}|\\[0.5ex] Executes (object-like) \inlcode|| and writes its string representation to the document.\\[0.5ex] \textit{Example:} \inlcode|\py{3 + 7}| \item \inlcode|\pyq{}|\\[0.5ex] Executes (object-like) \inlcode||. Any output is suppressed.\\[0.5ex] \textit{Example:} \inlcode|\pyq{3 + 7}| \item \inlcode|\pyc{}|\\[0.5ex] Executes \inlcode||. Output (e.g. from a call to \inlcode|print()|) is written to the document.\\[0.5ex] \textit{Examples:} \inlcode|\pyc{x = 5}|, \inlcode|\pyc{print('hello')}| \item \inlcode|\pycq{}|\\[0.5ex] Executes \inlcode||. Any output is suppressed.\\[0.5ex] \textit{Example:} \inlcode|\pycq{x = 5}| \item \inlcode|\pyfile{}|\\[0.5ex] Executes the Python file specified by \inlcode||. Output (e.g. from a call to \inlcode|print()|) is written to the document.\\[0.5ex] \textit{Example:} \inlcode|\pyfile{main.py}| \item \inlcode|\pyfileq{}|\\[0.5ex] Executes the Python file specified by \inlcode||. Any output is suppressed.\\[0.5ex] \textit{Example:} \inlcode|\pyfileq{main.py}| \item \inlcode|\pysession{}|\\[0.5ex] Selects \inlcode|| as Python session for subsequent Python code.\\[0.5ex] The session that is active at the beginning is \inlcode|default|.\\[0.5ex] \textit{Example:} \inlcode|\pysession{main}| \item \inlcode|\pyoption{