LaTeX, Beamer and TikZ tips

Here is a list of various tips for LaTeX writing, and figure drawing. Although I am not particularly proficient in advanced LaTeX features, I try to put some emphasis on good looking figures as well as good integration and consistency throughout documents. This list acts as a quick-access page that I use when I forgot about a specific thing. I'd be glad if any of the listed points could be helpful to anyone.

I often find StackOverflow & co answers very complicated when it comes to LaTeX. I believe that LaTeX is powerful enough to allow good-looking documents while keeping a decent level of simplicity.

Table of contents

Some TikZ tips

Here I gather some pieces of advice regarding TikZ figures. Some external references for TikZ are of course the official manual which has some great tutorials in it, along an exhaustive documentation of the library. Its chapter I.7 Guidelines on Graphics develops some ideas on general use of graphic elements in scientific writing, and is quite independant from TikZ technicalities. I also recommend checking out Overleaf's introduction to TikZ which contains a lighter introduction to the principles of the library.

Colors

I have a dedicated page that list the colors pre-defined when using TikZ as well as some operations allowed under TikZ's color model.

I usually define my own color scheme, and stick to it along the whole document. The default TikZ colors tend to be quite kitschy. Below is the palette that I currently use. It is available as a colors.tex file that I just import into my main document and which redefines some default colors. Do not hesitate to use opacity variations of those colors (blue!20 instead of blue for example). This is also shown in the different rows in the picture below. Also do not hesitate to tweak it to your liking, there are a lot of helpful websites out there dedicated to colorscheme design.

The colorscheme that I use in my documents

Lines and Arrows

The thick and ultra thick parameters tend to make things more pleasant to look at. Another classic one: the default arrows are not very good looking to me, so use a replacement for them. A good list of options is available at this page. I usually go with the following:

\usetikzlibrary{arrows}
\begin{tikzpicture}[>=stealth']
    ...
\end{tikzpicture}
Default arrow (top) and enhanced arrow (bottom)
The default arrow on the left, and the enhanced one on the right

Externalization

When the amount and the complexity of the figures increase in the document, it is helpful to externalize their compilation, so that they are not compiled at each new iteration of the document. You might need to enable shell escaping for this to (e.g. with latexmk --shell-escape ...).

\usetikzlibrary{external}
\tikzexternalize[prefix=compiled_figures/] % prefix sets where to store figures

It is sometimes useful to disallow externalization for specific figures.

% this disallows the externalization of the very next TikZ figure
\tikzset{external/export next=false}
\begin{tikzpicture}
    ...
\end{tikzpicture}
% this disallows externalizations of all figures produced by the todo package
\makeatletter
\renewcommand{\todo}[2][]{\tikzexternaldisable\@todo[#1]{#2}\tikzexternalenable}
\makeatother

It can also be useful to set the name of tikz figures, so that your pre-compiled figures are easily recognizable. Otherwise you would just get a folder full of figure-1, figure-2 and so on.

\tikzsetnextfilename{informative_figure_name}
\begin{tikzpicture}
    ...
\end{tikzpicture}

Also note that Overleaf has some special rules for using locally pre-compiled figures (cf this documentation). Basically, pre-compiled files should start by output-, so you should set the externalization plugin with something in the spirit of:

\usetikzlibrary{external}
\tikzexternalize[prefix=compiled_figures/output-]

Beware that using externalization for Beamer document can lead to slow compilations, since many beamer-specific elements will be externalized and will need to be re-externalized when their order change (e.g. when inserting a new frame). I still need to figure out a nice workaround for this.

Programming Aspects — Loops, Variables

Loops & Variables

The content of this section has been somewhat scary for me for quit a long time, before I realized that it conveyed additional ways of being lazy. I want to talk about for loops, as well as the use of variables to define quantities.

Using foreach loops is in reality independant of TikZ (since it relies on LaTeX features), but works particularly well in conjunction with TikZ. I point out to the section 88 of the official manual 88. Repeating Things for a precise overview of the syntax and the possibilities.

The basic syntax to define variables, and to use a foreach statement to produce the following figure is detailled below.

A small figure generated using a loop.
\begin{tikzpicture}
    \def \mathvariable {\sigma^2};
    \def \colorvariable {blue};
    \def \alphatransparency {60};
    \def \basewidth {0.1cm};

    % iterate on the list {1,2,4,8}
    \foreach \x in {1,2,4,8} {
        % draw a circle at coordinate (1.5*x, 0) whose radius is x*basewidth
        % use the defined color and transparency
        \fill[\colorvariable!\alphatransparency] (1.5*\x, 0) circle (\x * \basewidth)
                                            node[below=1cm, black] {$\mathvariable = \x$} ;
    }
\end{tikzpicture}

Below is an example that purposingly showcases more intricate aspects of foreach loops and variables and generates the following figure.

A spiral simply generated using foreach statements.
Click to see the code generating the figure.
\begin{tikzpicture}

    % the following is equivalent to defining \col as a counter (see the next loop)
    % but this showcases zipped loops
    \foreach \color / \col in {
                    blue/0, darkblue/1, red/2, orange/3, green/4,
                    palegreen/5, yellow/6, brokenwhite/7, brokengrey/8} {
        \foreach \alpha [count=\row] in {100, 97, ..., 30} {
            % the step (-3) of the loop is infered from the two first values

            % random formula to define an angle for the current point and radius
            % see that we can perform computations on variables
            \def \angle {180*\row/16 + 30*\col};
            \def \radius {0.6*\col};

            % define a coordinate (center\color\alpha) (which are expanded to their actual
            % value so that we can draw a node it later, and have line from the border
            \coordinate (center\color\alpha) at ({\radius*cos(\angle}, {\radius * sin(\angle)});

            % draw a filled circle node named (circle\color\alpha) centered
            % at (center\color\alpha)
            % we define a new node so that lines will leave from the edge of
            % the circle and not from its center
            \node[circle, fill=\color!\alpha]
                    (circle\color\alpha) at (center\color\alpha) {};

            % make a straight line of dots (to showcase an if statement)
            \ifnum \col = \row
                \fill[color=\color, xshift=6cm] (0.5*\col, 0) circle (0.2);
            \fi
        }
    }

    % this showcases a trick to iterate on couples (i-1,i) using the remember keyword
    \foreach \color[remember=\color as \lastcolor (initially blue)] in
                                    {darkblue, red, orange, green, palegreen,
                                     yellow, brokenwhite, brokengrey} {
        \foreach \alpha in {100, 97, ..., 30} {
            \draw[ultra thick, color=\lastcolor!\alpha]
                    (circle\lastcolor\alpha) -- (circle\color\alpha);
        }
    }
\end{tikzpicture}

I recommend using this in conjonction with externalization for rather complex figures.

Mathematical Expressions

As you can see in the above section, we were able to define variables through mathematical expressions, for example as

\def \angle {180*\row/16 + 30*\col};
\def \radius {0.6*\col};
\coordinate (center) at ({\radius*cos(\angle}, {\radius * sin(\angle)});

Those operations are handled by pgfmath under the hood. Documentation on those operations is available in section 94 of TikZ's manual (94. Mathematical Operation, under Part VIII. Mathematical and Object-Oriented Engines). For easy-reference, here are the basic mathematical functions that can be used in such expressions. Individual documentation is available in 94.3 Syntax for Mathematical Expressions: Functions.

abs, acos, add, and, array, asin, atan, atan2, bin, ceil, cos, cosec, cosh, cot, deg, depth, dim, div, divide, e, equal, factorial, false, floor, frac, gcd, greater, height, hex, Hex, int, ifthenelse, iseven, isodd, isprime, less, ln, log10, log2, max, min, mod, Mod, multiply, neg, not, notequal, notgreater, notless, oct, or, pi, pow, rad, rand, random, real, rnd, round, scalar, sec, sign, sin, sinh, sqrt, subtract, tan, tanh, true, veclen, width

Plots

To generate nice plots of data, I recommmend using a combination of matplotlib and seaborn, and export them to LaTeX compatible plots using tikzplotlib. So the whole pipeline essentially goes as follows and allows to obtain high quality figures fully rendered with TikZ and pgfplots. One advantage of it is that you can tweak things like axis title, legend, ticks, etc, from inside your LaTeX document, without the need to go inside the code that generated the plot.

import matplotlib.pyplot as plt
import seaborn
import tikzplotlib

seaborn.set() # applies the seaborn default settings
# you can costumize those settings, e.g. to use the colorscheme of your document

plt.plot(whatever)

tikzplotlib.save("figure.tex", wrap=False) # wrap controls the standaloneness of the tex figure

Some sample plot from the Seaborn examples

A plot fully rendered via LaTeX, obtained from the Seaborn examples

Graphs

To work with graphs, I recommend using networkX to manipulate them and network2tikz to export them to TikZ with a nice control over the layout, the format, and so on. Moreover, networkX provides many standard algorithms and graph-processing pipelines, making it easy to create complex illustrations.

Scaling

You can handle the size of TikZ figures using the scale options.

\begin{tikzpicture}[scale=0.6] % you can also directly set xscale and / or yscale

The aforementionned scale may break a figure with text, or some fixed-size nodes (this is the case when exporting graph with network2tikz for instance). The following might fix the issue by scaling each and every node. Finding the right amount of scaling for both parameters might require a little bit of tweaking though.

\begin{tikzpicture}[scale=0.6, every node/.style={scale=0.6}]

Beamer Tips

Aspect Ratio

On most modern supports, the default beamer image ratio is not optimal and wastes some space. It is easy to switch to another screen ratio, for instance 16:9 using

\documentclass[aspectratio=169]{beamer}

Slides Template

Teaser. True content coming soon.

Standard template. Standard template. Standard template. Standard template.

This is still a work in progress, there are a lot more figures to come. I will also make the source code for each figure accessible by clicking on them. The source code will be provided as a standalone tex file. It should compile as provided, using the latexmk -pdf source.tex command. The only requirements is that it uses the colors.tex file mentionned earlier, so make sure to have it accessible from your latex source.

Basic Elements

Coming soon (collection of basic atomic elements to serve as a quick access list).

More Advanced Figures

time_serie_line_graph clusters adjacency_matrix deblai_remblai graph_distance fused_gromov_wasserstein graph_curvature sphere_manifold graph_topology silhouette geodesic_l2

Figures Made By My Esteemed Colleagues

Here is a collection of figures that colleagues have kindly offered to share here.

Yoann Coudert — Osmont

Here are some images by Yoann Coudert — Osmont.

wasserstein laplace_triangle

Amadeus Reinald

Here are some images by Amadeus Reinald.

bipartition differing_arcs