summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/pynotebook/tex/pynotebook.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/pynotebook/tex/pynotebook.sty')
-rw-r--r--macros/latex/contrib/pynotebook/tex/pynotebook.sty315
1 files changed, 315 insertions, 0 deletions
diff --git a/macros/latex/contrib/pynotebook/tex/pynotebook.sty b/macros/latex/contrib/pynotebook/tex/pynotebook.sty
new file mode 100644
index 0000000000..6a84f42a6b
--- /dev/null
+++ b/macros/latex/contrib/pynotebook/tex/pynotebook.sty
@@ -0,0 +1,315 @@
+% Author : C. Pierquet
+% licence : Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txtf
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{pynotebook}[2024/02/15 0.1.0 Present codes like in jupyter notebook]
+%0.1.0 Initial version
+
+%------Usefull packages and libraries
+\RequirePackage{tcolorbox}
+\RequirePackage{iftex}
+\RequirePackage{xstring}
+\RequirePackage{calc}
+\tcbuselibrary{skins,breakable}
+
+%-----Option(s) for not loading piton and not creating environments
+\newif\if@piton \@pitontrue
+\DeclareOption{nopiton}{\@pitonfalse}%
+\DeclareOption*{}
+\ProcessOptions\relax
+
+%------Utils
+\newcommand\JupyterPromptIn{In~}
+\newcommand\JupyterPromptOut{Out}
+
+\NewDocumentCommand\promptjupyter{ s m m m m }{%
+ \IfBooleanTF{#1}%
+ {\makebox[0pt][r]{\texttt{\color{#3}#2[~~]:#5}}\vspace{-\baselineskip}}%
+ {\makebox[0pt][r]{\texttt{\color{#3}#2[#4]:#5}}\vspace{-\baselineskip}}%
+}
+
+\newcounter{JupyterIn}
+
+\NewDocumentCommand\SetJupyterLng{ m }{%
+ \IfStrEqCase{#1}{%
+ {en}{\renewcommand\JupyterPromptIn{In~}\renewcommand\JupyterPromptOut{Out}}%
+ {fr}{\renewcommand\JupyterPromptIn{Entrée}\renewcommand\JupyterPromptOut{Sortie}}%
+ }%
+ [\renewcommand\JupyterPromptIn{In~}\renewcommand\JupyterPromptOut{Out}]%
+}
+
+%-----Parskip
+\newlength{\JupyterParSkip}
+\setlength{\JupyterParSkip}{0.33\baselineskip}
+\NewDocumentCommand\SetJupyterParSkip{ m }{%
+ \IfStrEq{#1}{default}%
+ {\setlength{\JupyterParSkip}{0.33\baselineskip}}%
+ {\setlength{\JupyterParSkip}{#1}}%
+}
+\tcbset{tcbjpuparskip/.style={before skip=\JupyterParSkip,after skip=\JupyterParSkip}}
+
+%------With listings (pdflatex or lualatex)
+\ifluatex
+\tcbuselibrary{listings}
+\lstdefinestyle{PLJupyter}{%
+ language = python,
+ inputencoding = utf8,
+ basicstyle = \ttfamily\footnotesize,
+ keywordstyle = \color{green!50!black},
+ keywordstyle = [2]\color{magenta},
+ commentstyle = \color{gray}\itshape,
+ stringstyle = \color{red!75},
+ numberstyle = \scriptsize\ttfamily\color{gray},
+ aboveskip = 0pt,
+ belowskip = 0pt,
+ tabsize = 4,
+ showstringspaces = false,
+ columns = fullflexible,
+ keepspaces = true,
+ breaklines = true,
+ breakatwhitespace = true
+}
+\else
+\tcbuselibrary{listingsutf8}
+\lstdefinestyle{PLJupyter}{%
+ language = python,
+ inputencoding = utf8/latin1,
+ basicstyle = \ttfamily\footnotesize,
+ keywordstyle = \color{green!50!black},
+ keywordstyle = [2]\color{magenta},
+ commentstyle = \color{gray}\itshape,
+ stringstyle = \color{red!75},
+ numberstyle = \scriptsize\ttfamily\color{gray},
+ aboveskip = 0pt,
+ belowskip = 0pt,
+ tabsize = 4,
+ showstringspaces = false,
+ columns = fullflexible,
+ keepspaces = true,
+ breaklines = true,
+ breakatwhitespace = true
+}
+\fi
+
+\newlength{\LargeurPromptJupyterIn}
+\newlength{\LargeurPromptJupyterOut}
+\newlength{\LargeurPromptJupyter}
+\newlength{\OffsetPromptJupyter}
+\setlength{\OffsetPromptJupyter}{9pt}
+\newlength{\LargeurNumbersJupyter}
+
+\newcommand\SetJupyterLengths{%
+ \settowidth{\LargeurPromptJupyterIn}{\footnotesize\texttt{\JupyterPromptIn[10]:}}%
+ \settowidth{\LargeurPromptJupyterOut}{\footnotesize\texttt{\JupyterPromptOut[10]:}}%
+ \setlength{\LargeurPromptJupyter}{\maxof{\LargeurPromptJupyterIn}{\LargeurPromptJupyterOut}}
+ \settowidth{\LargeurNumbersJupyter}{\scriptsize\texttt{00}}%
+}
+
+\NewDocumentEnvironment{NotebookIn}{ s O{} m }%
+{%
+ \SetJupyterLengths%
+ \noindent%
+ \IfBooleanTF{#1}%
+ {\tcbset{tcbjpuptitlein/.style={title=\promptjupyter*{\JupyterPromptIn}{red!75!black}{\theJupyterIn}{\hspace*{\OffsetPromptJupyter}}}}}%
+ {\refstepcounter{JupyterIn}\tcbset{tcbjpuptitlein/.style={title=\promptjupyter{\JupyterPromptIn\ifnum\value{JupyterIn}<10~\fi}{red!75!black}{\theJupyterIn}{\hspace*{\OffsetPromptJupyter}}}}}%
+ \tcblisting{%
+ breakable,sharp corners=all,boxrule=0.5pt,enhanced,size=small,width=#3,tcbjpuparskip,
+ colframe=gray,colback=lightgray!15,
+ left skip=\LargeurPromptJupyter+\OffsetPromptJupyter-2mm,
+ tcbjpuptitlein,
+ fonttitle=\linespread{1}\footnotesize,
+ attach title to upper,
+ listing only,
+ listing options={style=PLJupyter,xleftmargin=\LargeurNumbersJupyter,numbers=left,firstnumber=1,numbersep=2mm},%
+ overlay={\begin{tcbclipinterior}\draw[line width=0.375pt,gray!75] ([xshift={\LargeurNumbersJupyter+1mm}]frame.south west)--([xshift={\LargeurNumbersJupyter+1mm}]frame.north west);\end{tcbclipinterior}},%
+ #2
+ }%
+}%
+{%
+ \endtcblisting%
+}
+
+\NewDocumentEnvironment{NotebookConsole}{ O{} m }%
+{%
+ \SetJupyterLengths%
+ \addtolength{\LargeurNumbersJupyter}{0.5mm}
+ \noindent%
+ \tcblisting{%
+ breakable,sharp corners=all,boxrule=0.3pt,enhanced,size=small,width=#2,tcbjpuparskip,
+ colframe=lightgray!15,colback=white,
+ left skip=\LargeurPromptJupyter+\OffsetPromptJupyter-2mm,
+ attach title to upper,
+ listing only,
+ listing options={style=tcblatex,basicstyle=\ttfamily\footnotesize},%
+ #1
+ }%
+}%
+{%
+ \endtcblisting%
+}%
+
+\NewDocumentEnvironment{NotebookOut}{ s O{} m }%
+{%
+ \SetJupyterLengths%
+ \addtolength{\LargeurNumbersJupyter}{0.5mm}
+ \IfBooleanTF{#1}%
+ {\tcbset{tcbjpuptitleout/.style={title=\promptjupyter*{\JupyterPromptOut}{blue!75!black}{\theJupyterIn}{\hspace*{\OffsetPromptJupyter}}}}}%
+ {\tcbset{tcbjpuptitleout/.style={title=\promptjupyter{\JupyterPromptOut\ifnum\value{JupyterIn}<10~\fi}{blue!75!black}{\theJupyterIn}{\hspace*{\OffsetPromptJupyter}}}}}%
+ \noindent%
+ \tcblisting{%
+ breakable,sharp corners=all,boxrule=0.3pt,enhanced,size=small,width=#3,tcbjpuparskip,
+ colframe=lightgray!15,colback=white,
+ left skip=\LargeurPromptJupyter+\OffsetPromptJupyter-2mm,
+ tcbjpuptitleout,
+ fonttitle=\linespread{1}\footnotesize,
+ attach title to upper,
+ listing only,
+ listing options={style=tcblatex,basicstyle=\ttfamily\footnotesize},%
+ #2
+ }%
+}%
+{%
+ \endtcblisting%
+}%
+
+\NewDocumentEnvironment{NotebookRaw}{ O{} m }%
+{%
+ \SetJupyterLengths%
+ \addtolength{\LargeurNumbersJupyter}{0.5mm}
+ \noindent%
+ \tcblisting{%
+ breakable,sharp corners=all,boxrule=0.5pt,enhanced,size=small,width=#2,tcbjpuparskip,
+ colframe=gray,colback=lightgray!15,
+ left skip=\LargeurPromptJupyter+\OffsetPromptJupyter-2mm,
+ attach title to upper,
+ listing only,
+ listing options={style=tcblatex,basicstyle=\ttfamily\footnotesize,numberstyle=\scriptsize\ttfamily\color{gray},xleftmargin=\LargeurNumbersJupyter,numbers=left,firstnumber=1,numbersep=2mm},%
+ overlay={\begin{tcbclipinterior}\draw[line width=0.375pt,gray!75] ([xshift={\LargeurNumbersJupyter+1mm}]frame.south west)--([xshift={\LargeurNumbersJupyter+1mm}]frame.north west);\end{tcbclipinterior}},%
+ #1
+ }%
+}%
+{%
+ \endtcblisting%
+}%
+
+\NewDocumentEnvironment{NotebookMarkdown}{ O{} m }%
+{%
+ \SetJupyterLengths%
+ \addtolength{\LargeurNumbersJupyter}{0.5mm}
+ \noindent%
+ \tcolorbox[breakable,sharp corners=all,boxrule=0.3pt,enhanced,size=small,width=#2,tcbjpuparskip,colframe=lightgray!15,colback=white,left skip=\LargeurPromptJupyter+\OffsetPromptJupyter-2mm,
+ attach title to upper,fontupper=\footnotesize,tcbjpuparskip,#1]%
+}%
+{%
+ \endtcolorbox%
+}%
+
+\if@piton
+%----With Piton (only lualatex)
+\ifluatex
+\RequirePackage{piton}
+\RequirePackage{environ}
+\newlength{\LargeurPromptJupiter}
+\newlength{\LargeurPromptJupiterIn}
+\newlength{\LargeurPromptJupiterOut}
+\newlength{\OffsetPromptJupiter}
+\setlength{\OffsetPromptJupiter}{9pt}
+\newlength{\LargeurNumbersJupiter}
+
+\newcommand\SetJupiterLengths{%
+ \settowidth{\LargeurPromptJupiterIn}{\footnotesize\texttt{\JupyterPromptIn[10]:}}%
+ \settowidth{\LargeurPromptJupiterOut}{\footnotesize\texttt{\JupyterPromptOut[10]:}}%
+ \setlength{\LargeurPromptJupiter}{\maxof{\LargeurPromptJupiterIn}{\LargeurPromptJupiterOut}}%
+ \settowidth{\LargeurNumbersJupiter}{\footnotesize\texttt{00}}%
+}
+
+\NewPitonEnvironment{NotebookPitonIn}{ s O{} m }%
+{%
+ \SetJupiterLengths%
+ \IfBooleanTF{#1}%
+ {\tcbset{tcbjpuptitlein/.style={title=\promptjupyter*{\JupyterPromptIn}{red!75!black}{\theJupyterIn}{\hspace*{\OffsetPromptJupiter}}}}}%
+ {\refstepcounter{JupyterIn}\tcbset{tcbjpuptitlein/.style={title=\promptjupyter{\JupyterPromptIn\ifnum\value{JupyterIn}<10~\fi}{red!75!black}{\theJupyterIn}{\hspace*{\OffsetPromptJupiter}}}}}%
+ \noindent%
+ \PitonOptions{left-margin={\LargeurNumbersJupiter+1.75mm},all-line-numbers}%
+ \PitonOptions{tabs-auto-gobble,break-lines,indent-broken-lines}%
+ %on crée la boîte
+ \tcolorbox[breakable,sharp corners=all,boxrule=0.5pt,enhanced,size=small,width=#3,colframe=gray,colback=lightgray!15,left skip=\LargeurPromptJupiter+\OffsetPromptJupiter-2mm,tcbjpuptitlein,fonttitle=\linespread{1}\footnotesize,attach title to upper,fontupper=\footnotesize,overlay={%
+ \begin{tcbclipinterior}\draw[line width=0.375pt,gray!75] ([xshift={\LargeurNumbersJupiter+2.25mm}]frame.south west)--([xshift={\LargeurNumbersJupiter+2.25mm}]frame.north west);\end{tcbclipinterior}},bottom=-0.5mm,tcbjpuparskip,#2]%
+}%
+{%
+ \endtcolorbox%
+}
+
+\NewDocumentEnvironment{NotebookPitonConsole}{ O{} m }%
+{%
+ \SetJupiterLengths%
+ \noindent%
+ \PitonOptions{tabs-auto-gobble,break-lines,indent-broken-lines}%
+ %on crée la boîte
+ \PyLTVerbatimEnv%
+ \tcolorbox[breakable,sharp corners=all,boxrule=0.3pt,enhanced,size=small,width=#2,colframe=lightgray!15,colback=white,left skip=\LargeurPromptJupiter+\OffsetPromptJupiter-2mm,attach title to upper,fontupper=\footnotesize,bottom=-0.5mm,tcbjpuparskip,#1]%
+ \begin{pythonq}%
+}%
+{%
+ \end{pythonq}%
+ \directlua{%
+ tex.print("\\begin{Piton}")
+ tex.print(pyluatex.get_last_output())
+ tex.print("\\end{Piton}")
+ }%
+ \endtcolorbox%
+}
+
+\NewDocumentEnvironment{NotebookPitonOut}{ s O{} m }%
+{%
+ \SetJupiterLengths%
+ \IfBooleanTF{#1}%
+ {\tcbset{tcbjpuptitleout/.style={title=\promptjupyter*{\JupyterPromptOut}{blue!75!black}{\theJupyterIn}{\hspace*{\OffsetPromptJupiter}}}}}%
+ {\tcbset{tcbjpuptitleout/.style={title=\promptjupyter{\JupyterPromptOut\ifnum\value{JupyterIn}<10~\fi}{blue!75!black}{\theJupyterIn}{\hspace*{\OffsetPromptJupiter}}}}}%
+ \noindent%
+ \PitonOptions{tabs-auto-gobble,break-lines,indent-broken-lines}%
+ %on crée la boîte
+ \PyLTVerbatimEnv%
+ \tcolorbox[breakable,sharp corners=all,boxrule=0.3pt,enhanced,size=small,width=#3,colframe=lightgray!15,colback=white,left skip=\LargeurPromptJupiter+\OffsetPromptJupiter-2mm,tcbjpuptitleout,fonttitle=\linespread{1}\footnotesize,attach title to upper,fontupper=\footnotesize,bottom=-0.5mm,tcbjpuparskip,#2]%
+ \begin{pythonq}%
+}%
+{%
+ \end{pythonq}%
+ \directlua{%
+ tex.print("\\begin{Piton}")
+ tex.print(pyluatex.get_last_output())
+ tex.print("\\end{Piton}")
+ }%
+ \endtcolorbox%
+}
+
+\NewPitonEnvironment{NotebookPitonRaw}{ O{} m }%
+{%
+ \SetJupiterLengths%
+ \noindent%
+ \SetPitonStyle{Number=}%
+ \PitonOptions{left-margin={\LargeurNumbersJupiter+1.75mm},all-line-numbers,language=minimal}%
+ \PitonOptions{tabs-auto-gobble,break-lines,indent-broken-lines}%
+ %on crée la boîte
+ \tcolorbox[breakable,sharp corners=all,boxrule=0.5pt,enhanced,size=small,width=#2,colframe=gray,colback=lightgray!15,left skip=\LargeurPromptJupiter+\OffsetPromptJupiter-2mm,attach title to upper,fontupper=\footnotesize,overlay={%
+ \begin{tcbclipinterior}\draw[line width=0.375pt,gray!75] ([xshift={\LargeurNumbersJupiter+2.25mm}]frame.south west)--([xshift={\LargeurNumbersJupiter+2.25mm}]frame.north west);\end{tcbclipinterior}},bottom=-0.5mm,tcbjpuparskip,#1]%
+}%
+{%
+ \endtcolorbox%
+}
+
+\NewDocumentEnvironment{NotebookPitonMarkdown}{ O{} m }%
+{%
+ \SetJupiterLengths%
+ \noindent%
+ \tcolorbox[breakable,sharp corners=all,boxrule=0.3pt,enhanced,size=small,width=#2,tcbjpuparskip,colframe=lightgray!15,colback=white,left skip=\LargeurPromptJupiter+\OffsetPromptJupiter-2mm,
+ attach title to upper,fontupper=\footnotesize,tcbjpuparskip,#1]%
+}%
+{%
+ \endtcolorbox%
+}%
+
+\fi
+\fi
+
+\endinput \ No newline at end of file