% TeXsurgery v 0.6.0
%
% This tex package is a companion to the `texsurgery` `python` project:
%
% https://framagit.org/pang/texsurgery
%
% This `LaTeX` library will make sure that
%
% `pdflatex document.tex`
%
% will work, with reasonable defaults, for a document that is intended to work with `texsurgery`, and also has other uses, always in tandem with the `texsurgery` `pypi` package.
%
% However, remember that `texsurgery` is a `python` project whose main focus is on __evaluating code inside a `jupyter` kernel__, and this is _only_ achieved by installing the `python` package and calling the `texsurgery` command
%
% `texsurgery -pdf document.tex`
%
% Both the texsurgery python package and the TexSurgery CTAN package are distributed under a BSD license.

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{texsurgery}[2021/07/09 TeXsurgery package v0.6.0]

\RequirePackage{verbatim}
\RequirePackage{listings}
\RequirePackage{xcolor}
\RequirePackage{environ}
\RequirePackage{hyperref}

% \RequirePackage{imakeidx}
% \RequirePackage{xstring}
% \RequirePackage{xcolor}
% \definecolor{greycolour}{HTML}{525252}
% \definecolor{sharelatexcolour}{HTML}{882B21}
% \definecolor{mybluecolour}{HTML}{394773}
% \newcommand{\wordcolour}{greycolour}

% \DeclareOption{red}{\renewcommand{\wordcolour}{sharelatexcolour}}
% \DeclareOption{blue}{\renewcommand{\wordcolour}{mybluecolour}}


\definecolor{codegreen}{rgb}{0,0.6,0}
\definecolor{codegray}{rgb}{0.5,0.5,0.5}
\definecolor{codepurple}{rgb}{0.58,0,0.82}
\definecolor{backcolour}{rgb}{0.95,0.95,0.92}

\lstdefinestyle{TSstyle}{
    backgroundcolor=\color{backcolour},
    commentstyle=\color{codegreen},
    keywordstyle=\color{magenta},
    numberstyle=\tiny\color{codegray},
    stringstyle=\color{codepurple},
    basicstyle=\ttfamily,
    breakatwhitespace=false,
    breaklines=true,
    captionpos=b,
    keepspaces=true,
    numbers=left,
    numbersep=5pt,
    showspaces=false,
    showstringspaces=false,
    showtabs=false,
    tabsize=2
}
\lstalias{python}{Python}
\lstalias{sage}{Python}
% \lstset{style=TSstyle}


% Counters
\newcounter{TSeval}
\newcounter{TSrun}
\newcounter{TSrunsilent}

% Boolean Options
\newif\if@showcode
\@showcodefalse
\newif\if@noinstructions
\@noinstructionsfalse


\DeclareOption*{%
    \lstalias{\CurrentOption}{Python} %sets Python highlight code as highlight by default for unrecognized kernels.
    \PackageWarningNoLine{texsurgery}{‘\CurrentOption’ declared as a jupyter kernel}%
    }
\DeclareOption{showcode} {%
    \@showcodetrue
}%
\DeclareOption{noinstructions} {%
    \@noinstructionstrue
}
\ProcessOptions\relax



%% Instructions warning
\if@noinstructions
   %
\else
    \AtBeginDocument{
    \fbox{
    \begin{minipage}{0.9\linewidth}
        WARNING: TexSurgery is NOT intended to be a LaTeX package to show your code, but instead a Python module who replaces some commands and environments within a TeX document by evaluating code inside a jupyter kernel.
\\    %
        In order to achieve this goal, it is not enough to install the texsurgery LaTeX package and run \texttt{pdflatex document.tex}.
        You must %
    \begin{center}
      \texttt{pip install texsurgery}
    \end{center}
        and the jupyter kernel for the language that you intend to use, and use the command \texttt{texsurgery document.tex}.
    \\%
        More info: \url{https://framagit.org/pang/texsurgery}.
      \end{minipage}
    }
    \vspace{1cm}%
    \\
    }
   \PackageWarningNoLine{texsurgery}{%
##########
    WARNING: TexSurgery is NOT intended to be a LaTeX package to show your code, but instead a Python module who replaces some commands and environments within a TeX document by evaluating code inside a jupyter kernel.
%
    In order to achieve this goal, it is not enough to install the texsurgery LaTeX package.
    You must `pip install texsurgery` and the jupyter kernel for the language that you intend to use.
%
    More info: https://framagit.org/pang/texsurgery.
##########
    }%
\fi

%% SHOWCODE
\if@showcode
   \lstnewenvironment{run}[1][python]{%
        \refstepcounter{TSrun}%
        \lstset{language=#1, style=TSstyle, frame=single, title={\tt runblock\theTSrun.#1}}%
        \medskip%
    }{}
    \lstnewenvironment{runsilent}[1][python]{%
        \refstepcounter{TSrunsilent}%
        \lstset{language=#1, style=TSstyle, frame=single, title={\tt runsilentblock\theTSrunsilent.#1}}%
        \medskip%
    }{}
    \newcommand{\lstinlinesafe}{\lstinline[style=TSstyle]}
    \newcommand{\eval}[2][]{{\hbox{\lstinlinesafe{#2}}}}
%     \newcommand{\eval}[2][python]{%
%         \refstepcounter{TSeval}%
%         {\hbox{\lstinlinesafe[language=#1]{#2}}}
%     }%
    \newcommand{\sage}[1]{%
        \eval{#1}%
    }%
\else
   \NewEnviron{run}[1][python]{%
   \refstepcounter{TSrun}%
   \begin{center}\fbox{\ttfamily runblock\theTSrun.#1}\end{center}%
   }%
   \NewEnviron{runsilent}[1][python]{%
   \refstepcounter{TSrunsilent}%
   \begin{center}\fbox{\ttfamily runsilentblock\theTSrunsilent.#1}\end{center}%
   }%
   \newcommand{\eval}[2][python]{%
    \refstepcounter{TSeval}%
    \hbox{\fbox{\ttfamily evalcode\theTSeval.#1}}%
   }%
   \newcommand{\sage}[1]{%
    \refstepcounter{TSeval}%
    \eval[sagemath]{#1}%
    }%
\fi