|
|
((= Notebook input/output style =))
|
|
|
|
|
|
((* extends 'latex_base.tplx' *))
|
|
|
|
|
|
% Custom packages
|
|
|
((* block packages *))
|
|
|
((( super() )))
|
|
|
|
|
|
\usepackage{tikz} % Needed to box output/input
|
|
|
\usepackage{scrextend} % Used to indent output
|
|
|
\usepackage{needspace} % Make prompts follow contents
|
|
|
\usepackage{framed} % Used to draw output that spans multiple pages
|
|
|
((* endblock packages *))
|
|
|
|
|
|
% Custom definitions
|
|
|
((* block definitions *))
|
|
|
((( super() )))
|
|
|
|
|
|
% Pygments definitions
|
|
|
((( resources.latex.pygment_definitions )))
|
|
|
|
|
|
% NB prompt colors
|
|
|
\definecolor{nbframe-border}{rgb}{0.867,0.867,0.867}
|
|
|
\definecolor{nbframe-bg}{rgb}{0.969,0.969,0.969}
|
|
|
\definecolor{nbframe-in-prompt}{rgb}{0.0,0.0,0.502}
|
|
|
\definecolor{nbframe-out-prompt}{rgb}{0.545,0.0,0.0}
|
|
|
|
|
|
% NB prompt lengths
|
|
|
\newlength{\inputpadding}
|
|
|
\setlength{\inputpadding}{0.5em}
|
|
|
\newlength{\cellleftmargin}
|
|
|
\setlength{\cellleftmargin}{0.15\linewidth}
|
|
|
\newlength{\borderthickness}
|
|
|
\setlength{\borderthickness}{0.4pt}
|
|
|
\newlength{\smallerfontscale}
|
|
|
\setlength{\smallerfontscale}{9.5pt}
|
|
|
|
|
|
% NB prompt font size
|
|
|
\def\smaller{\fontsize{\smallerfontscale}{\smallerfontscale}\selectfont}
|
|
|
|
|
|
% Define a background layer, in which the nb prompt shape is drawn
|
|
|
\pgfdeclarelayer{background}
|
|
|
\pgfsetlayers{background,main}
|
|
|
\usetikzlibrary{calc}
|
|
|
|
|
|
% define styles for the normal border and the torn border
|
|
|
\tikzset{
|
|
|
normal border/.style={draw=nbframe-border, fill=nbframe-bg,
|
|
|
rectangle, rounded corners=2.5pt, line width=\borderthickness},
|
|
|
torn border/.style={draw=white, fill=white, line width=\borderthickness}}
|
|
|
|
|
|
% Macro to draw the shape behind the text, when it fits completly in the
|
|
|
% page
|
|
|
\def\notebookcellframe#1{%
|
|
|
\tikz{%
|
|
|
\node[inner sep=\inputpadding] (A) {#1};% Draw the text of the node
|
|
|
\begin{pgfonlayer}{background}% Draw the shape behind
|
|
|
\fill[normal border]%
|
|
|
(A.south east) -- ($(A.south west)+(\cellleftmargin,0)$) --
|
|
|
($(A.north west)+(\cellleftmargin,0)$) -- (A.north east) -- cycle;
|
|
|
\end{pgfonlayer}}}%
|
|
|
|
|
|
% Macro to draw the shape, when the text will continue in next page
|
|
|
\def\notebookcellframetop#1{%
|
|
|
\tikz{%
|
|
|
\node[inner sep=\inputpadding] (A) {#1}; % Draw the text of the node
|
|
|
\begin{pgfonlayer}{background}
|
|
|
\fill[normal border] % Draw the ``complete shape'' behind
|
|
|
(A.south east) -- ($(A.south west)+(\cellleftmargin,0)$) --
|
|
|
($(A.north west)+(\cellleftmargin,0)$) -- (A.north east) -- cycle;
|
|
|
\fill[torn border] % Add the torn lower border
|
|
|
($(A.south east)-(0,.1)$) -- ($(A.south west)+(\cellleftmargin,-.1)$) --
|
|
|
($(A.south west)+(\cellleftmargin,.1)$) -- ($(A.south east)+(0,.1)$) -- cycle;
|
|
|
\end{pgfonlayer}}}
|
|
|
|
|
|
% Macro to draw the shape, when the text continues from previous page
|
|
|
\def\notebookcellframebottom#1{%
|
|
|
\tikz{%
|
|
|
\node[inner sep=\inputpadding] (A) {#1}; % Draw the text of the node
|
|
|
\begin{pgfonlayer}{background}
|
|
|
\fill[normal border] % Draw the ``complete shape'' behind
|
|
|
(A.south east) -- ($(A.south west)+(\cellleftmargin,0)$) --
|
|
|
($(A.north west)+(\cellleftmargin,0)$) -- (A.north east) -- cycle;
|
|
|
\fill[torn border] % Add the torn upper border
|
|
|
($(A.north east)-(0,.1)$) -- ($(A.north west)+(\cellleftmargin,-.1)$) --
|
|
|
($(A.north west)+(\cellleftmargin,.1)$) -- ($(A.north east)+(0,.1)$) -- cycle;
|
|
|
\end{pgfonlayer}}}
|
|
|
|
|
|
% Macro to draw the shape, when both the text continues from previous page
|
|
|
% and it will continue in next page
|
|
|
\def\notebookcellframemiddle#1{%
|
|
|
\tikz{%
|
|
|
\node[inner sep=\inputpadding] (A) {#1}; % Draw the text of the node
|
|
|
\begin{pgfonlayer}{background}
|
|
|
\fill[normal border] % Draw the ``complete shape'' behind
|
|
|
(A.south east) -- ($(A.south west)+(\cellleftmargin,0)$) --
|
|
|
($(A.north west)+(\cellleftmargin,0)$) -- (A.north east) -- cycle;
|
|
|
\fill[torn border] % Add the torn lower border
|
|
|
($(A.south east)-(0,.1)$) -- ($(A.south west)+(\cellleftmargin,-.1)$) --
|
|
|
($(A.south west)+(\cellleftmargin,.1)$) -- ($(A.south east)+(0,.1)$) -- cycle;
|
|
|
\fill[torn border] % Add the torn upper border
|
|
|
($(A.north east)-(0,.1)$) -- ($(A.north west)+(\cellleftmargin,-.1)$) --
|
|
|
($(A.north west)+(\cellleftmargin,.1)$) -- ($(A.north east)+(0,.1)$) -- cycle;
|
|
|
\end{pgfonlayer}}}
|
|
|
|
|
|
% Define the environment which puts the frame
|
|
|
% In this case, the environment also accepts an argument with an optional
|
|
|
% title (which defaults to ``Example'', which is typeset in a box overlaid
|
|
|
% on the top border
|
|
|
\newenvironment{notebookcell}[1][0]{%
|
|
|
\def\FrameCommand{\notebookcellframe}%
|
|
|
\def\FirstFrameCommand{\notebookcellframetop}%
|
|
|
\def\LastFrameCommand{\notebookcellframebottom}%
|
|
|
\def\MidFrameCommand{\notebookcellframemiddle}%
|
|
|
\par\vspace{1\baselineskip}%
|
|
|
\MakeFramed {\FrameRestore}%
|
|
|
\noindent\tikz\node[inner sep=0em] at ($(A.north west)-(0,0)$) {%
|
|
|
((( draw_prompt("In", "#1", "nbframe-in-prompt", "2pt") )))%
|
|
|
}; \par}%
|
|
|
{\endMakeFramed}
|
|
|
|
|
|
((* endblock definitions *))
|
|
|
|
|
|
%===============================================================================
|
|
|
% Input
|
|
|
%===============================================================================
|
|
|
|
|
|
((* block input scoped *))
|
|
|
% Add contents below.
|
|
|
|
|
|
{\par%
|
|
|
\vspace{-1\baselineskip}%
|
|
|
\needspace{4\baselineskip}}%
|
|
|
\begin{notebookcell}[((( cell.prompt_number )))]%
|
|
|
\begin{addmargin}[\cellleftmargin]{0em}% left, right
|
|
|
{\smaller%
|
|
|
\par%
|
|
|
((* block extra_input_spacing *))((* endblock extra_input_spacing *))%
|
|
|
\vspace{-1\smallerfontscale}%
|
|
|
((( cell.input | highlight2latex )))%
|
|
|
\par%
|
|
|
\vspace{-1\smallerfontscale}}%
|
|
|
\end{addmargin}
|
|
|
\end{notebookcell}
|
|
|
|
|
|
((* endblock input *))
|
|
|
|
|
|
%===============================================================================
|
|
|
% Output
|
|
|
%===============================================================================
|
|
|
|
|
|
((* block output -*))
|
|
|
\par\vspace{1\smallerfontscale}%
|
|
|
\needspace{4\baselineskip}%
|
|
|
% Only render the prompt if the cell is pyout. Note, the outputs prompt
|
|
|
% block isn't used since we need to check each indiviual output and only
|
|
|
% add prompts to the pyout ones.
|
|
|
((* if output.output_type in ['pyout'] *))
|
|
|
{\par%
|
|
|
\vspace{-1\smallerfontscale}%
|
|
|
\noindent%
|
|
|
((( draw_prompt("Out", cell.prompt_number, "nbframe-out-prompt", "0em") )))%
|
|
|
((* block extra_output_spacing *))((* endblock extra_output_spacing *))}%
|
|
|
((* endif *))%
|
|
|
%
|
|
|
\begin{addmargin}[\cellleftmargin]{0em}% left, right
|
|
|
{\smaller%
|
|
|
\vspace{-1\smallerfontscale}%
|
|
|
((( super() )))}%
|
|
|
\end{addmargin}%
|
|
|
((*- endblock output *))
|
|
|
|
|
|
%==============================================================================
|
|
|
% Support Macros
|
|
|
%==============================================================================
|
|
|
|
|
|
% Name: draw_prompt
|
|
|
% Purpose: Renders an output/input prompt for notebook style pdfs
|
|
|
((* macro draw_prompt(prompt, number, color, space) -*))
|
|
|
\begin{minipage}{\cellleftmargin}%
|
|
|
\hfill%
|
|
|
{\smaller%
|
|
|
\tt%
|
|
|
\color{(((color)))}%
|
|
|
(((prompt)))[(((number)))]:}%
|
|
|
\hspace{\inputpadding}%
|
|
|
\hspace{(((space)))}%
|
|
|
\hspace{3pt}%
|
|
|
\end{minipage}%
|
|
|
((*- endmacro *))
|
|
|
|
|
|
|