%% This program is free software; you can redistribute it and/or
%% modify it under the terms of the GNU General Public License
%% as published by the Free Software Foundation; either version 2
%% of the License, or (at your option) any later version.
%%
%% This program is distributed in the hope that it will be useful,
%% but WITHOUT ANY WARRANTY; without even the implied warranty of
%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
%% GNU General Public License for more details.
%%
%% You should have received a copy of the GNU General Public License
%% along with this program; if not, write to the Free Software
%% Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
%%
%% Author: Martin R. Ehmsen, martin@ehmsen.org.
%%
%% You can find an online copy of the GPL at
%% http://www.gnu.org/copyleft/gpl.html .
%% 
%% Note: shell-escape needs to be activated for this to work.
%% This can either be done by passing -shell-escape as an option to
%% latex or by adding/changing "shell_escape = t" in your texmf.cnf .

%% 0.2 -> 0.21: Moved \newwrite\@module from \@writemodule and out, since
%% no more than 15 \newwrites are allowed (and the previous version created a new
%% every time \@writemodule was called.

%% 0.21 -> 0.22: Fixed bug where spurious spaces were introduced in the output.
%% Thanks goes to Gernot Salzer <gernot.salzer@tuwien.ac.at> for pointing out
%% the bug and providing a patch.

\NeedsTeXFormat{LaTeX2e}[1994/12/01]
\ProvidesPackage{python}[2021/08/03 v0.22 Python in LaTeX]

\newwrite\@out
\newwrite\@module

\begingroup \catcode `|=0 \catcode `[=1
\catcode`]=2 \catcode `\{=12 \catcode `\}=12
\catcode`\\=12 |gdef|@xpython#1\end{python}[|immediate|write|@out[#1]|end[python]]
|endgroup

\def\python{\kernel@ifnextchar [{\@python}{\@python[]}}

\def\@python[#1]{%
\gdef\@pythoninclude{#1}%
\immediate\openout\@out=\jobname.py
\newlinechar='15
\begingroup \catcode`\^^M=12 %
\let\do\@makeother\dospecials\obeyspaces%
\@xpython}

\def\endpython{%
\endgroup
\immediate\closeout\@out
\@writemodule
\immediate\write18{cat \@pythoninclude\space\jobname.py | python > \jobname.py.out 2> \jobname.py.err}%
\immediate\input\jobname.py.out}
%\immediate\write{\begin{verbatim}}
%\immediate\input\jobname.py.err
%\immediate\write{\end{verbatim}}}

\def\@writemodule{%
\immediate\openout\@module=latex.py
\immediate\write\@module{jobname="\jobname"}
\immediate\closeout\@module}

% BUGS:
% 1. If anything gets send to stderr then it should be included
% in \begin{verbatim}...\end{verbatim} to be properly displayed
%
% \immediate\write18{cat \@pythoninclude\space\jobname.py | python > \jobname.py.out 2>\jobname.py.err}
%
% 2. Watch out for indentation done by aucTeX in Emacs
%
% 3. Let the package accept a "final version" option, such
% that the output of each python run is saved such that it can be
% inserted into the document by hand 
% (conference, journals are not likely to compile with
% shell_escape or have python).
%
% 4. Somehow cache the output for each \begin{python}...\end{python}
% and reuse the cached version if it has not changed.
% Perhaps dangerous if the included python script has changed
% but we would check for that as well.
%
%
% \gdef\@prepython{}
% \def\prepython#1{%
% \gdef\@prepython{#1}
% }
% sed -e 's/^  //g' cluster.py
% \immediate\write18{\@prepython\space\jobname.py > \
