%% Copyright 2021-2024 Tobias Enderle
%%
%% This work may be distributed and/or modified under the
%% conditions of the LaTeX Project Public License, either version 1.3c
%% of this license or (at your option) any later version.
%% The latest version of this license is in
%%   http://www.latex-project.org/lppl.txt
%% and version 1.3c or later is part of all distributions of LaTeX
%% version 2005/12/01 or later.

\documentclass{article}

\usepackage{pyluatex}
\usepackage{listings}
\usepackage{xcolor}
\lstset{
    language=Python,
    breaklines=true,
    framesep=1ex,
    frame=lrtb,
    framerule=0pt,
    numbers=none,
    basicstyle=\ttfamily,
    keywordstyle=\bfseries\color{green!40!black},
    stringstyle=\bfseries\color{red!80!black},
    identifierstyle=\color{blue},
    backgroundcolor=\color{gray!10!white},
}
\usepackage{luacode}

\begin{luacode}
function pytypeset()
    tex.print("\\begin{lstlisting}")
    tex.print(pyluatex.get_last_output())
    tex.print("\\end{lstlisting}")
end
\end{luacode}

\newcommand{\pytypeset}{\directlua{pytypeset()}}

\newenvironment{pyrepl}
{\PyLTVerbatimEnv\begin{pythonrepl}}
{\end{pythonrepl}\pytypeset}

\begin{filecontents*}[nosearch]{repl.py}
def square(x):
    return x**2

square(5)
\end{filecontents*}

\title{PyLuaTeX Example -- Typesetting Python Interactive Console Sessions}
\author{Tobias Enderle}

\begin{document}

\maketitle

PyLuaTeX allows you to run and typeset Python code in an interactive console
or read–eval–print loop (REPL) fashion. Very much like in an interactive Python session,
code is prefixed with \verb|>>>| (or \verb|...| in case of multi-line commands)
and the results are added to the output buffer automatically.

Both code and output are stored in PyLuaTeX's ouput buffer and can be accessed
by \verb|pyluatex.get_last_output()|. In this way, you can adjust the typesetting
to your needs. For examples on typesetting see \verb|typesetting-listings.tex|
and \verb|typesetting-minted.tex|.

In the following example, we use the custom environment \verb|pyrepl|, which is
based on the \verb|pythonrepl| environment provided by PyLuaTeX.
\begin{pyrepl}
def fun():
    print('Hello PyLuaTeX!')

3 + 1 *\
4
fun()
\end{pyrepl}

Python sessions can also be read from files:
\pyfilerepl{repl.py}
\pytypeset

\end{document}
