Please wait
A template for creating boxes of Python code in a LaTeX document.
\documentclass[10pt]{extarticle}
\usepackage[english]{babel}
\usepackage[T1]{fontenc}
\usepackage{lmodern,mathrsfs}
\usepackage{xparse}
\usepackage[inline,shortlabels]{enumitem}
\setlist{topsep=2pt,itemsep=2pt,parsep=0pt,partopsep=0pt}
\usepackage[dvipsnames]{xcolor}
\usepackage[utf8]{inputenc}
\usepackage[a4paper,top=0.5in,bottom=0.2in,left=0.5in,right=0.5in,footskip=0.3in,includefoot]{geometry}
\usepackage[most]{tcolorbox}
\tcbuselibrary{minted} % tcolorbox minted library, required to use the "minted" tcb listing engine (this library is not loaded by the option [most])
\usepackage{minted} % Allows input of raw code, such as Python code
\usepackage[colorlinks]{hyperref} % ALWAYS load this package LAST
% Custom tcolorbox style for Python code (not the code or the box it appears in, just the options for the box)
\tcbset{
pythoncodebox/.style={
enhanced jigsaw,breakable,
colback=gray!10,colframe=gray!20!black,
boxrule=1pt,top=2pt,bottom=2pt,left=2pt,right=2pt,
sharp corners,before skip=10pt,after skip=10pt,
attach boxed title to top left,
boxed title style={empty,
top=0pt,bottom=0pt,left=2pt,right=2pt,
interior code={\fill[fill=tcbcolframe] (frame.south west)
--([yshift=-4pt]frame.north west)
to[out=90,in=180] ([xshift=4pt]frame.north west)
--([xshift=-8pt]frame.north east)
to[out=0,in=180] ([xshift=16pt]frame.south east)
--cycle;
}
},
title={#1}, % Argument of pythoncodebox specifies the title
fonttitle=\sffamily\bfseries
},
pythoncodebox/.default={}, % Default is No title
%%% Starred version has no frame %%%
pythoncodebox*/.style={
enhanced jigsaw,breakable,
colback=gray!10,coltitle=gray!20!black,colbacktitle=tcbcolback,
frame hidden,
top=2pt,bottom=2pt,left=2pt,right=2pt,
sharp corners,before skip=10pt,after skip=10pt,
attach boxed title to top text left={yshift=-1mm},
boxed title style={empty,
top=0pt,bottom=0pt,left=2pt,right=2pt,
interior code={\fill[fill=tcbcolback] (interior.south west)
--([yshift=-4pt]interior.north west)
to[out=90,in=180] ([xshift=4pt]interior.north west)
--([xshift=-8pt]interior.north east)
to[out=0,in=180] ([xshift=16pt]interior.south east)
--cycle;
}
},
title={#1}, % Argument of pythoncodebox specifies the title
fonttitle=\sffamily\bfseries
},
pythoncodebox*/.default={}, % Default is No title
}
% Custom tcolorbox for Python code (not the code itself, just the box it appears in)
\newtcolorbox{pythonbox}[1][]{pythoncodebox=#1}
\newtcolorbox{pythonbox*}[1][]{pythoncodebox*=#1} % Starred version has no frame
% Custom minted environment for Python code, NOT using tcolorbox
\newminted{python}{autogobble,breaklines,mathescape}
% Custom tcblisting environment for Python code, using the "minted" tcb listing engine
% Adapted from https://tex.stackexchange.com/a/402096
\NewTCBListing{python}{ !O{} !D(){} !G{} }{
listing engine=minted,
listing only,
pythoncodebox={#1}, % First argument specifies the title (if any)
minted language=python,
minted options/.expanded={
autogobble,breaklines,mathescape,
#2 % Second argument, delimited by (), denotes options for the minted environment
},
#3 % Third argument, delimited by {}, denotes options for the tcolorbox
}
%%% Starred version has no frame %%%
\NewTCBListing{python*}{ !O{} !D(){} !G{} }{
listing engine=minted,
listing only,
pythoncodebox*={#1}, % First argument specifies the title (if any)
minted language=python,
minted options/.expanded={
autogobble,breaklines,mathescape,
#2 % Second argument, delimited by (), denotes options for the minted environment
},
#3 % Third argument, delimited by {}, denotes options for the tcolorbox
}
% verbbox environment, for showing verbatim text next to code output (for package documentation and user learning purposes)
\NewTCBListing{verbbox}{ !O{} }{
listing engine=minted,
minted language=latex,
boxrule=1pt,sidebyside,skin=bicolor,
colback=gray!10,colbacklower=white,valign=center,
top=2pt,bottom=2pt,left=2pt,right=2pt,
#1
} % Last argument allows more tcolorbox options to be added
\setlength{\parindent}{0.2in}
\setlength{\parskip}{0pt}
\setlength{\columnseprule}{0pt}
\makeatletter
% Redefining the title block
\renewcommand\maketitle{
\null\vspace{4mm}
\begin{center}
{\Huge\sffamily\bfseries\selectfont\@title}\\
\vspace{4mm}
{\Large\sffamily\selectfont\@author}\\
\vspace{4mm}
{\large\sffamily\selectfont\@date}
\end{center}
\vspace{6mm}
}
% Adapted from https://tex.stackexchange.com/questions/483953/how-to-add-new-macros-like-author-without-editing-latex-ltx?noredirect=1&lq=1
\makeatother
\title{Typing Python in \textrm{\LaTeX}}
\author{Senan Sekhon}
\date{April 10, 2023}
% Created April 6, 2023
\begin{document}
\maketitle
This template provides environments for rendering aesthetic, professional-looking \href{https://www.python.org/}{\textsf{Python}} code in \LaTeX.\\
The code is rendered using the \href{https://ctan.org/pkg/minted}{\texttt{minted}} package, which is based on \href{https://pygments.org/}{\textsf{Pygments}}. The boxes surrounding them are created using the \href{https://ctan.org/pkg/tcolorbox}{\texttt{tcolorbox}} package. Note that this package must be loaded with the \texttt{minted} library, e.g. by adding \mintinline{latex}{\tcbuselibrary{minted}} to the preamble, for these to work.\\
The \texttt{pythonbox} environment creates a box for Python code (just the box, not the code). The starred version \texttt{pythonbox*} creates a ``soft'' box with no border.
\begin{verbbox}
\begin{pythonbox}
This is a \texttt{pythonbox}.
\end{pythonbox}
\end{verbbox}
\begin{verbbox}
\begin{pythonbox}[The title]
This is a \texttt{pythonbox} with a title.
\end{pythonbox}
\end{verbbox}
\begin{verbbox}
\begin{pythonbox*}
This is a soft \texttt{pythonbox}.
\end{pythonbox*}
\end{verbbox}
\begin{verbbox}
\begin{pythonbox*}[The title]
This is a soft \texttt{pythonbox} with a title.
\end{pythonbox*}
\end{verbbox}
The \texttt{python} environment creates Python code inside a \texttt{pythonbox}. In this environment, you can directly enter Python code and \texttt{minted} will color the text accordingly. Similarly, the starred version \texttt{python*} has no border.
\begin{verbbox}
\begin{python}
def next_two(x):
lst=[x+i for i in range(3)]
return lst
\end{python}
\end{verbbox}
\begin{verbbox}
\begin{python}[The function]
def next_two(x):
lst=[x+i for i in range(3)]
return lst
\end{python}
\end{verbbox}
\begin{verbbox}
\begin{python*}
def next_two(x):
lst=[x+i for i in range(3)]
return lst
\end{python*}
\end{verbbox}
\begin{verbbox}
\begin{python*}[The function]
def next_two(x):
lst=[x+i for i in range(3)]
return lst
\end{python*}
\end{verbbox}
The \texttt{python} and \texttt{python*} boxes have three optional arguments:
\begin{itemize}
\item The first argument, delimited by brackets \texttt{[ ]}, specifies the title.
\item The second argument, delimited by parentheses \texttt{( )}, specifies the options for the \texttt{minted} environment, i.e. the code itself. These are handled by the \texttt{minted} package.
\item The third argument, delimited by braces \texttt{\{ \}}, specifies the options for the box containing the code. These are handled by the \texttt{tcolorbox} package.
\end{itemize}
\begin{verbbox}[sidebyside=false]
\begin{python}[How to calculate a factorial](style=one-dark){colback=gray!40!black,colframe=blue}
def factorial(n):
product=1 # Start with $1$
for k in range(2,n+1): # For each $k=2,3,\ldots,n$,
product*=k # Multiply by $k$
return product
\end{python}
\end{verbbox}
In the above example, the option \texttt{style=one-dark} is an option for the \emph{code}, while the options \texttt{colback=gray!40!black} and \texttt{colframe=blue} are options for the \emph{box}. Note that the option \texttt{style} only specifies the style for the code itself, it does not change the background color --- this has to be done separately by specifying the \texttt{tcolorbox} option \texttt{colback}\footnote{This \emph{cannot} be achieved by specifying the \texttt{minted} option \texttt{bgcolor} --- doing this would only create a colored box around the code, rather than coloring the entire interior of the \texttt{tcolorbox}.}.\\
See \url{https://pygments.org/styles/} for a list of available styles. You can also use other \texttt{tcolorbox} environments\footnote{For example, the \texttt{filingbox}, \texttt{railingbox} and \texttt{flagbox} environments from \href{https://www.overleaf.com/latex/templates/fun-template-2/sgqjnsftvysf}{\textsf{this template}}.}.\\
The pre-defined options for the code are \texttt{autogobble} (this removes any common indentation from all lines of code), \texttt{breaklines} (to allow lines that are too long to be broken) and \texttt{mathescape} (to allow \LaTeX\ math to be rendered in code comments). See the \href{https://github.com/gpoore/minted/blob/master/source/minted.pdf}{\textsf{documentation}} for the \texttt{minted} package for a list of available options.
\begin{verbbox}
\begin{python}
def f(x):
# This function takes a number $x$ and returns $x^2$
return x**2
\end{python}
\end{verbbox}
You can also typeset Python code by itself (without the box) using the \texttt{pythoncode} environment. This is based on the \mintinline{latex}{\newminted} command from the \texttt{minted} package, and contains the same pre-defined options as \texttt{python}.
\begin{verbbox}
\begin{pythoncode}
def least_square_above(x):
return 0 if x<0 else (int(x**0.5)+1)**2
\end{pythoncode}
\end{verbbox}
You can overwrite these options or provide additional options by using \texttt{pythoncode*}, but it is better to use the standard \texttt{minted} environment: \mintinline{latex}{\begin{minted}[}$\langle options\rangle$\mintinline{latex}{]{python} ... \end{minted}}.
\begin{verbbox}
\begin{pythoncode*}{style=manni}
def least_square_above(x):
return 0 if x<0 else (int(x**0.5)+1)**2
\end{pythoncode*}
\end{verbbox}
Finally, note that \LaTeX\ does not \emph{run} the Python code, it only typesets it. If you want to run the code, you can paste it into TutorialsPoint:
\begin{center}
\url{https://www.tutorialspoint.com/online_python_compiler.php}
\end{center}
Or you can use any IDE, such as \href{https://www.jetbrains.com/pycharm/}{\textsf{PyCharm}} or \href{https://code.visualstudio.com/}{\textsf{Visual Studio Code}}.
\end{document}
Overleaf is perfect for all types of projects — from papers and presentations to newsletters, CVs and much more! It's also a great way to learn how to use LaTeX and produce professional looking projects quickly.
Upload or create templates for journals you submit to and theses and presentation templates for your institution. Just create it as a project on Overleaf and use the publish menu. It's free! No sign-up required.
New template are added all the time. Follow us on twitter for the highlights!
Overleaf is a free online collaborative LaTeX editor. No sign up required.
Learn more