Ian Jauslin
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIan Jauslin <jauslin@ias.edu>2018-04-07 07:16:28 +0000
committerIan Jauslin <jauslin@ias.edu>2018-04-07 07:16:28 +0000
commitf2af89a0b6f2dbab0b3ebe8a02200e4b97aa19aa (patch)
treebf0c59f78245abb305c97ecac8baeb23fd689a32
Initial commitHEADv1.0master
-rw-r--r--Jauslin_IAMP_2018.tex289
-rw-r--r--Makefile63
-rw-r--r--README48
-rw-r--r--bibliography/bibliography.tex97
-rw-r--r--figs/atoms.fig/Makefile15
-rw-r--r--figs/atoms.fig/chiral-base.gp22
-rw-r--r--figs/atoms.fig/chiral.py102
-rw-r--r--figs/atoms.fig/crystal-base.gp21
-rw-r--r--figs/atoms.fig/crystal.py24
-rw-r--r--figs/atoms.fig/gas-base.gp21
-rw-r--r--figs/atoms.fig/gas.py39
-rw-r--r--figs/atoms.fig/liquid-base.gp21
-rw-r--r--figs/atoms.fig/liquid.py39
-rw-r--r--figs/atoms.fig/nematic-base.gp21
-rw-r--r--figs/atoms.fig/nematic.py90
-rw-r--r--figs/dimer_example.fig/Makefile38
-rw-r--r--figs/dimer_example.fig/dimer_conf.py261
l---------figs/dimer_example.fig/libs/dimer.sty1
-rw-r--r--figs/libs/Makefile25
-rw-r--r--figs/libs/dimer.sty33
l---------figs/polymer_example.fig/Makefile1
l---------figs/polymer_example.fig/libs/dimer.sty1
-rw-r--r--figs/polymer_example.fig/segments.tikz.tex132
-rw-r--r--libs/ian.cls659
-rw-r--r--libs/iantheo.sty162
-rw-r--r--libs/point.sty106
26 files changed, 2331 insertions, 0 deletions
diff --git a/Jauslin_IAMP_2018.tex b/Jauslin_IAMP_2018.tex
new file mode 100644
index 0000000..52c45ab
--- /dev/null
+++ b/Jauslin_IAMP_2018.tex
@@ -0,0 +1,289 @@
+\documentclass{ian}
+
+\usepackage{graphicx}
+\usepackage{dsfont}
+
+\begin{document}
+
+\hbox{}
+\hfil{\bf\LARGE
+Liquid crystals\par
+\vskip10pt
+\hfil and the Heilmann-Lieb model
+}
+\vskip40pt
+
+\hfil{\bf\large Ian Jauslin}\par
+\hfil{\it School of Mathematics, Institute for Advanced Study}\par
+\hfil{\tt\color{blue}\href{mailto:jauslin@ias.edu}{jauslin@ias.edu}}
+\hskip20pt
+{\tt\color{blue}\href{http://ian.jauslin.org}{http://ian.jauslin.org}}\par
+\vskip40pt
+
+\hfil{\bf Abstract}\par
+Liquid crystals are everywhere, and they do more for you than you might think. They tell you the weather, the time, and will kindly let you know that your connection to eduroam was rejected, and that you'll have to listen to the rest of the seminar. Indeed, most displays run on liquid crystals, from the small dials in digital wristwatches to large flat-screen televisions. In this paper, I will review some results pertaining to why (or, perhaps, how) liquid crystals exist in the first place. In particular, I will focus on a model introduced by Heilmann and Lieb in 1979, for which Lieb and I have recently proved the emergence of a nematic liquid crystal phase.
+\vskip40pt
+
+\tableofcontents
+
+\vskip40pt
+
+\pagestyle{plain}
+
+\section{Gases, liquids and crystals}
+\indent Let's start with a familiar paradigm: many materials (water, for example) occur in many different phases, each of which is stable in a given range of temperatures and pressures. At 101.3\-~kPa (the standard atmospheric pressure), water is gaseous above 100$^\circ$C, liquid between $0^\circ$C and $100^\circ$C and solid below $0^\circ$C. These three phases are, rather dramatically, different, both from a microscopic and a macroscopic point of view.
+
+\indent Gases have a low density, so low, in fact, that it's constituent molecules barely notice each other's presence. Solids and liquids are much denser (by a factor of $10^3$ in the case of water). Pushed together into close quarters, its constituent molecules interact strongly with each other. The absence (or, rather, weakness) of interactions between the molecules in a gas has observable macroscopic consequences: it implies the {\it ideal gas law}, $pV=nk_BT$, which, in particular, says that gases are rather amenable to being compressed or dilated, in contrast to liquids and solids.
+
+\indent In liquids, the molecules move around each other in a disorderly fashion, despite the smallness of the elbow-room allotted to them. Solids, on the other hand, cope with the density by spontaneously ordering: the molecules arrange themselves in a regular pattern. This is no small feat: an ice cube might contain a septillion ($10^{24}$) molecules, and almost all of these are aligned! As a consequence, liquids flow, whereas solids don't exactly do much of anything.
+\bigskip
+
+\begin{figure}
+ \hfil\includegraphics[width=5cm]{gas.png}
+ \hfil\includegraphics[width=5cm]{liquid.png}
+ \hfil\includegraphics[width=5cm]{crystal.png}
+ \caption{A caricatural depiction of a gas, liquid and crystalline phase. In the gaseous phase, the density is so low that the particles barely interact. The solid phase has a high density, and the molecules spontaneously align. The liquid phase has a large density, but displays no long range order.}
+ \label{fig:glc}
+\end{figure}
+\bigskip
+
+\indent The question of interest here, is whether one can prove that these phases actually occur in models of interacting molecules. To be definite, let us focus on the hard sphere model, in which each molecule is represented by a sphere, and particles interact solely through the condition that the spheres may not overlap. This system has a gas phase at low densities, and is expected to have a crystalline phase at high densities\-~\cite{WJ57,AW57,IK15}, with a first order phase transition between the two.
+
+\indent The gas phase is rather well understood: at low densities, particles rarely ever run into each other, and one can compute many observables in terms of convergent power series in the density. These expansions are called {\it virial expansions}, and date back, at least, to the early years of the XX\textsuperscript{th} century\-~\cite{Ka02}. Of particular note are two papers, one by Ursell\-~\cite{Ur27} and the other by Mayer\-~\cite{Ma37}, in which a systematic recipe is introduced to compute virial expansions for any model with short-range (integrable) pair interactions. The convergence of this construction was later proved by Groeneveld\-~\cite{Gr62}, Ruelle\-~\cite{Ru63} and Penrose\-~\cite{Pe63}.
+
+\indent On the other side of the spectrum, at high densities, the situation is a bit more dicey, even for such a simple system as the hard sphere model. Even at close packing, that is, at the largest possible density, it is a challenge to prove that the system is crystalline. There is an old conjecture, often attributed to Kepler, which states that the maximal density configuration is either a face-centered cubic lattice, a hexagonal close packing, or a combination thereof. This is also called the {\it cannonball stacking} (or, for the more peaceful minded among us, the {\it orange stacking}) problem, since the question reduces to finding the optimal way of stacking cannonballs. Hales proved this conjecture\-~\cite{Ha05}, using the assistance of a computer. There has been some debate over the validity of this proof, and it has recently been formalized and checked by a formal proof checker\-~\cite{HAe17}. However, at densities which are lower than close packing, there is, as of yet, no proof of crystallization in the hard sphere model.
+
+\indent In short, in the hard sphere model, one can get rigorous control over the low density gas phase and the maximal density crystalline phase, but there are no results for intermediate densities, and, in particular, no proof that the phase transition exists and is of first order.
+\bigskip
+
+\indent The main difficulty in proving that the hard sphere model crystallizes at high density is that it is a {\it continuum} model: the positions of the spheres can take any value in $\mathbb R^3$. This spells out trouble for imposing translational order: if two neighboring spheres differ infinitesimally from the crystalline structure, and so do the next pair, and the next pair, and so on, then two spheres which are sufficiently far from each other could have completely decorrelated positions, which would break the crystalline structure.
+
+\indent In fact, if one puts the system on a lattice, that is, if one restricts the positions of the hard spheres (or, more generally, the particles) to a discrete set, then proving crystallization is feasible in certain cases. For example, Dobrushin\-~\cite{Do68} proved it for the nearest neighbor exclusion on the square lattice, Baxter~\-\cite{Ba82} on the hexagonal lattice, Heilmann and Pr\ae stgaard\-~\cite{HP74} for the third-nearest neighbor exclusion on the square lattice, a result which was generalized by Lebowitz and I\-~\cite{JL17b} to a class of hard-core lattice particle models in $d\geqslant 2$ dimensions. In all of these cases, the basic idea is to map the dense particle system to a dilute model of holes, for which low-density methods can be used. The issue is that the interaction between holes can be difficult to treat, even on the lattice. The same could be done for the continuum model, but the interaction between holes is simply too complicated to control.
+\bigskip
+
+\indent The hard sphere model does not have a liquid phase. A simple model which is expected to have a gas, a liquid and a crystalline phase is the {\it Widom-Rowlinson} model\-~\cite{WR70}. It consists of two species of particles, called A- and B-particles, which interact via a hard-core repulsion, like the hard sphere model. The difference with the hard spheres is that the radius of the interaction depends on whether it occurs between two A particles ($R_{AA}$), two B's ($R_{BB}$) or an A and a B ($R_{AB}$, with $R_{AB}>R_{AA},R_{BB}$). In the gas phase, all particles intermingle, whereas in the `liquid' phase, A's and B's are segregated and disordered. In the crystalline phase, they are ordered, like in the hard sphere model. Ruelle\-~\cite{Ru71} was the first to prove the existence of the `liquid' phase in the case where the radii of the A-A and B-B interactions is 0. The result was generalized to a large class of Widom-Rowlinson-like models by Bricmont, Kuroda and Lebowitz\-~\cite{BKL84}. Proving crystallization, however, would be just as difficult as in the hard sphere model.
+
+\indent All the theorems I mentioned until now are about the existence of gas, liquid or crystalline phases, not about the nature of the phase transition between them. In the case of the gas-liquid transition Maxwell\-~\cite{Ma75} developed a heuristic construction to account for the corrections to the ideal gas law near the transition point. By introducing a family of forces acting between particles in a gas, Van der Waals derived an equation which refined the ideal gas law. The Van der Waals equation gives good agreement with experiments provided the density is small enough, but, at larger values, one finds an unphysical regime, in which the pressure increases with the volume. The Maxwell construction consists in flattening out that region, and interpreting it as the liquid-vapor phase transition. The construction was shown to be rigorous by Lebowitz and Penrose\-~\cite{LP66} in a system of particles with an infinitely weak and infinitely long range interaction called a {\it Ka\v c} potential.
+
+
+\section{Liquid crystals}
+\indent The take-home message which is buried somewhere in the previous section is that liquids are disordered and crystals are ordered, thus making the term `liquid crystal' an oxymoron. Liquid crystals are phases which combine properties of ordered and disordered matter. They are typically found in systems of anisotropic molecules, which may be long and elongated like rods, or flat and wide like plates, or shaped like a boomerang, or a helix, et c\ae tera... Whereas there are many types of liquid crystals, we will mostly focus on {\it nematic} liquid crystals, which occur in rod-shaped molecules (see figure\-~\ref{fig:nematic}). A rod has 5 degrees of freedom: 3 specify the position of the center of the rod and 2 its orientation. In a nematic phase, the orientational degrees of freedom exhibit long range order, that is, the rods are aligned, whereas the positional degrees of freedom are disordered (see figure\-~\ref{fig:nematic}). This phase is quite different from the ones mentioned until now, because it is {\it partially} ordered. From a macroscopic point of view, liquid crystals flow, like liquids, which is made possible by the positional disorder of the molecules. The orientational order manifests itself mostly through optical properties: a nematic liquid crystal is a polarizing filter, only allowing light polarized along the orientation of the molecules through.
+\bigskip
+
+\begin{figure}
+ \hfil\includegraphics[width=7cm]{nematic.png}
+ \hfil\includegraphics[width=7cm]{chiral.png}
+ \caption{Caricatural depiction of a nematic liquid crystal phase and a chiral nematic liquid crystal phase. In the first the rod-shaped molecules are mostly aligned, but their positions are disordered. The second consists of a stack of horizontal planes, in each of which the rods are aligned but their positions are disordered. The orientation of the rods changes from one plane to the next.}
+ \label{fig:nematic}
+\end{figure}
+\bigskip
+
+\indent Liquid crystals have come to play an important role in various display technologies, and have been used in digital watches, Game Boys, flat screen computer monitors, televisions, and smartphones. The basic mechanism underlying these technologies relies on liquid crystals that can be switched between a nematic and a {\it chiral} nematic phase. In a chiral nematic phase, the molecules are arranged in a stack of planes, in each of which the molecules are aligned. The direction in each plane is rotated from one plane to the next (see figure\-~\ref{fig:nematic}). Because nematic liquid crystals are polarizing filters, by stacking the molecules in this way, chiral nematic liquid crystals alter the polarization of light. In particular, if horizontally polarized light is shined through a chiral nematic liquid crystal whose total change in the angle of the particles is $90^\circ$, then it will come out with a vertical polarization.
+
+\indent Using this mechanism, one can design an electronic light filter. In its {\it off} (opaque) state, the filter consists of a chiral nematic liquid crystal sandwiched between two horizontal polarizing filters. In this state, the filter does not let any light through, since the first filter only allows horizontal light through, which is rotated by the liquid crystal and is vertically polarized by the time it reaches the second filter, which blocks the signal. To turn the filter {\it on} (transparent), an electric field is applied through the liquid crystal, which, by the {\it Twisted Nematic Field} effect, becomes nematic. At this point, the horizontally polarized light can make its way through the filter.
+
+\indent Modern LCD displays (`LCD' stands for Liquid Crystal Display) are made of an array of LEDs (Light Emitting Diodes), three for each pixel. Of these three, one is blue, another green, and the third red. In front of each of these LEDs, there is an electronic light filter, like the ones I just described. Pixels are turned on or off by applying an electric field through the filter or not. (By varying the strength of the field, one can adjust the proportion of the crystal that is chiral nematic, and thus adjust the brightness of the pixel, beyond a simple on/off switch.)
+
+\indent LCD technology is on its way out of smartphones, televisions and computer monitors, since, as it turns out, one gets better contrast by controlling the intensity of the LEDs directly. This is a bit of a technological challenge, which has been overcome only recently, through the introduction of OLEDs (Organic Light Emitting Diode). However, as of yet, OLED displays are still quite a bit more expensive than LCDs.
+\bigskip
+
+\indent The question of interest here is why, or rather how, do liquid crystal phases exist? In other words, can one construct a microscopic model in which one can prove the emergence of a liquid crystalline phase?
+
+\indent Onsager\-~\cite{On49} made a significant first step in this direction. He set out to understand a colloidal suspension of tobacco mosaic viruses, which consist of a single strand of RNA cozily nestled into a cylindrical shell of proteins. The virus is shaped like a rigid cylinder, about 18nm in diameter and 300nm long. Onsager modeled the suspension as a system of hard cylinders (in which the only interaction between cylinders is that they are not allowed to overlap), which are meant to represent the electrostatic repulsion between viruses, whose effective diameter far exceeds the size of the virus itself (Onsager noted that a nematic phase would appear even at densities as low as 2 percent, so the electrostatic repulsion must play a role in the formation of this phase). To study the system, Onsager computed a virial expansion, truncated at second order, and, by a (non-rigorous) self-consistency argument, conjectured that the nematic phase exists, and that the phase transition is of first order.
+
+\indent The earliest attempt (to my knowledge) at a rigorous proof of a nematic phase was undertaken by Heilmann and Lieb\-~\cite{HL79}. The model they considered is a dimer model on the square lattice $\mathbb Z^2$. A dimer is an object that occupies an edge of the lattice and its two endpoints (see figure\-~\ref{fig:hl}), with the constraint that no two dimers can cover the same vertex. (This is sometimes called a {\it monomer-dimer} model, and the sites that are not covered by any dimers are called {\it monomers}.) Dimers represent molecules, which have a (discrete) position, and a (discrete) orientation, which can be either vertical or horizontal. One may, therefore, wonder whether the monomer-dimer model exhibits a nematic phase, but, in an earlier paper\-~\cite{HL72}, Heilmann and Lieb had proved that there are no phase transitions in the monomer-dimer model, which, in particular, implies that there is no long range orientational order, and, therefore, no nematic phase. In order to favor orientational order, Heilmann and Lieb\-~\cite{HL79} introduced an interaction between dimers to induce alignment. The interaction favors configurations in which pairs of dimers are {\it adjacent} and {\it aligned}, that is, they are neighbors and are contained within the same row or column (see figure\-~\ref{fig:hl}). They proved, using a reflection positivity argument, that dimers spontaneously align if the interaction is strong enough. In other words, there is long range orientational order. However, their argument does not show that there is no positional order, thus stopping short of proving the emergence of a nematic phase in this model.
+
+\indent Since then, other models have been introduced in which a nematic phase has been proved to form. Bricmont, Kuroda and Lebowitz\-~\cite{BKL84} noticed that a system of infinitely thin needles in two dimensions, in which the needles are allowed to be in one of two orientations (say, horizontal and vertical) is, essentially, a Widom-Rowlinson model. If more orientations are allowed (but a finite number of them), then the model closely resembles a {\it multi-component} Widom-Rowlinson model. They commented that the machinery developed in their paper\-~\cite{BKL84} for the Widom-Rowlinson model could easily be adapted to prove a nematic phase in this model.
+
+\indent Ioffe, Velenik and Zahradn\'ik\-~\cite{IVZ06} discussed a model of rods on $\mathbb Z^2$, in which rods consist of adjacent and aligned vertices, and are of varying length. The parameters of the model are tuned so as to make it {\it integrable}, and, by solving it exactly, they showed the emergence of a nematic phase. Disertori and Giuliani\-~\cite{DG13} considered a system of rods on $\mathbb Z^2$ of {\it fixed} length, which is {\it not} integrable, and showed the existence of a nematic phase.
+
+\indent There had also been some progress in proving the Heilmann-Lieb conjecture: Alberici\-~\cite{Al16} considered an interacting dimer model that is almost identical to the Heilmann-Lieb model, except that the chemical potentials of the horizontal and vertical dimers are different, which means that vertical dimers are favored over horizontal ones. This is a rather mild assumption, since Heilmann and Lieb proved\-~\cite{HL79} that dimers tend to align, so one of the orientations is spontaneously favored over the other, but in Alberici's model, this uniformity in the orientation is built into the model directly. Nevertheless, there was little doubt that the conjecture is true, and Papanikolaou, Charrier and Fradkin\-~\cite{PCF14} showed numerical evidence for the lack of positional order in the system.
+
+\indent Lieb and I\-~\cite{JL17c} have recently presented a proof of this conjecture, which I will discuss in the next section.
+\bigskip
+
+\begin{figure}
+ \hfil\includegraphics[width=8cm]{interaction.pdf}
+ \caption{A dimer configuration in the Heilmann-Lieb model. Pairs of dimers which are adjacent and aligned interact, which is represented by a red wavy line.}
+ \label{fig:hl}
+\end{figure}
+\bigskip
+
+\section{Nematic order in the Heilmann-Lieb model}
+\indent I will now introduce the Heilmann-Lieb model on a more formal footing, state the theorem that implies the emergence of nematic order, and go through the main ideas of its proof.
+\bigskip
+
+\subsection{The Heilmann-Lieb model}
+\indent In\-~\cite{HL79}, Heilmann Lieb actually introduced five models, in two and three dimensions, and proved long-range orientational order for each of them. The model which we consider here is called `model\-~I' in\-~\cite{HL79}. As was mentioned above, it is an interacting (monomer-)dimer model on $\mathbb Z^2$. We consider the system in the {\it grand-canonical ensemble}, which means that we pick dimer configurations randomly, according to the Gibbs grand-canonical distribution. In order to define it, and, in the process, introduce some relevant notations, I will define the average of an observable $A$:
+\begin{equation}
+ \left<A\right>_{\mathrm v}
+ =
+ \lim_{L\to\infty}
+ \frac1{\Xi_{\Lambda_L}(z,J)}
+ \sum_{\underline\delta\in\Omega_{\mathrm v}(\Lambda_L)}
+ A(\underline\delta)
+ z^{|\underline\delta|}
+ \prod_{\delta\neq\delta'\in\underline\delta}e^{\frac12J\mathds 1_{\delta\sim\delta'}}
+\end{equation}
+in which
+\begin{itemize}
+ \item $\Lambda_L:=\{1,\cdots,L\}\times\{1,\cdots,L\}\subset\mathbb Z^2$ is a {\it finite} subset of $\mathbb Z^2$ of volume $L^2$,
+ \item $\Omega_{\mathrm v}(\Lambda_L)$ is the set of (monomer-)dimer configurations on $\Lambda_L$, with {\it vertical} boundary conditions (I will come back to these later),
+ \item $A$ is an observable, that is, a map from $\Omega_{\mathrm v}(\Lambda_L)$ to $\mathbb R$,
+ \item $z\geqslant 0$ is a parameter called the {\it fugacity} (if $\beta$ is the inverse temperature and $\mu$ is the chemical potential, then $z\equiv e^{\beta\mu}$),
+ \item $|\underline\delta|$ is the number of dimers in $\underline\delta$
+ \item $J\geqslant 0$ is the {\it interaction strength}
+ \item $\mathds 1_{\delta\sim\delta'}\in\{0,1\}$ is equal to 1 if and only if $\delta$ and $\delta'$ are adjacent and aligned
+ \item $\Xi_{\Lambda_L}(z,J)$ is a normalization constant, called the {\it partition function}:
+ \begin{equation}
+ \Xi_{\Lambda_L}(z,J)
+ :=
+ \sum_{\underline\delta\in\Omega_{\mathrm v}(\Lambda_L)}
+ z^{|\underline\delta|}
+ \prod_{\delta\neq\delta'\in\underline\delta}e^{\frac12J\mathds 1_{\delta\sim\delta'}}
+ .
+ \label{Xi}
+ \end{equation}
+\end{itemize}
+Note that the fugacity $z$ is related to the density of dimers: if $z$ is large, then configurations with many dimers are favored. Similarly, when $J$ is large, configurations with many interactions are more probable.
+\bigskip
+
+\indent Heilmann and Lieb showed that, if $J\gg \mathrm{max}(1,-\log z)$, then, given a vertical edge $e_{\mathrm v}$ and a horizontal one $e_{\mathrm h}$, the probability that they are both occupied is small. This implies that the system has at least two extremal Gibbs measures, one of which mostly contains vertical dimers, while the other mostly contains horizontal ones. In an effort to study each of these separately, I will impose a boundary condition that will select the vertical Gibbs measure (the same could, obviously, be done for the horizontal phase). This is done by isolating two horizontal strips of height $\ell_0:=e^{\frac32J}z^{\frac12}$ at the top and bottom of $\Lambda_L$ (see figure\-~\ref{fig:boundary}). Horizontal dimers are forbidden from intersecting these strips. Since these regions have a large volume, they are likely to contain many vertical dimers, which will push the other dimers in the bulk to be vertical as well. The choice of the size $e^{\frac32J}z^{\frac12}$ of the strips will be clarified later.
+\bigskip
+
+\begin{figure}
+ \hfil\includegraphics[width=8cm]{boundary.pdf}
+ \caption{The boundary condition is chosen in such a way to favor vertical dimers. The blue strips, whose height is $\ell_0:=e^{\frac32J}z^{\frac12}$, are devoid of horizontal dimers.}
+ \label{fig:boundary}
+\end{figure}
+
+\subsection{Main result}
+\indent Let me state the theorem that Lieb and I proved\-~\cite{JL17c}, after which I will comment on why it implies the existence of a nematic phase.
+\bigskip
+
+\theo{Theorem}\label{theo:main}
+ We assume that
+ \begin{equation}
+ J\gg z\gg 1
+ .
+ \label{Jz}
+ \end{equation}
+ Given an edge $e$, we define the observable $\mathds 1_e$, which returns 1 if $e$ is occupied by a dimer, and 0 if not. Given two vertical edges $e_{\mathrm v}$ and $e_{\mathrm v}'$, $\left<\mathds 1_{e_{\mathrm v}}\right>_{\mathrm v}$ (that is, the probability that $e_{\mathrm v}$ is occupied) is {\it independent} of the choice of $e_{\mathrm v}$, and
+ \begin{equation}
+ \left<\mathds 1_{e_{\mathrm v}}\right>_{\mathrm v}=\frac12\left(1+O(z^{-\frac12}e^{-\frac12J})\right)
+ \label{v}
+ \end{equation}
+ \begin{equation}
+ \left<\mathds 1_{e_{\mathrm v}}\mathds 1_{e_{\mathrm v}'}\right>_{\mathrm v}-\left<\mathds 1_{e_{\mathrm v}}\right>_{\mathrm v}\left<\mathds 1_{e_{\mathrm v}'}\right>_{\mathrm v}
+ =O\left(e^{-c\ \mathrm{dist}_{\mathrm{HL}}(e_{\mathrm v},e_{\mathrm v}')}\right)
+ \label{vv}
+ \end{equation}
+ in which $\mathrm{dist}_{\mathrm{HL}}$ is the distance induced by the norm
+ \begin{equation}
+ \|(x,y)\|_{\mathrm{HL}}=J|x|+\ell_0^{-1}|y|
+ .
+ \label{HLnorm}
+ \end{equation}
+ Similarly, given two horizontal edges $e_{\mathrm h}$ and $e_{\mathrm h}'$, $\left<\mathds 1_{e_{\mathrm h}}\right>_{\mathrm v}$ is {\it independent} of the choice of $e_{\mathrm h}$, and
+ \begin{equation}
+ \left<\mathds 1_{e_{\mathrm h}}\right>_{\mathrm v}=O(e^{-3J})
+ \label{h}
+ \end{equation}
+ \begin{equation}
+ \left<\mathds 1_{e_{\mathrm h}}\mathds 1_{e_{\mathrm h}'}\right>_{\mathrm v}-\left<\mathds 1_{e_{\mathrm h}}\right>_{\mathrm v}\left<\mathds 1_{e_{\mathrm h}'}\right>_{\mathrm v}
+ =O\left(e^{-6J-c\ \mathrm{dist}_{\mathrm{HL}}(e_{\mathrm h},e_{\mathrm h}')}\right)
+ .
+ \label{hh}
+ \end{equation}
+ Finally,
+ \begin{equation}
+ \left<\mathds 1_{e_{\mathrm h}}\mathds 1_{e_{\mathrm v}}\right>_{\mathrm v}-\left<\mathds 1_{e_{\mathrm h}}\right>_{\mathrm v}\left<\mathds 1_{e_{\mathrm v}}\right>_{\mathrm v}
+ =O\left(e^{-3J-c\ \mathrm{dist}_{\mathrm{HL}}(e_{\mathrm h},e_{\mathrm v})}\right)
+ .
+ \label{hv}
+ \end{equation}
+\endtheo
+\bigskip
+
+\indent This theorem implies long range orientational order and the absence of positional order. Indeed, (\ref{h}) and\-~(\ref{v}) imply that the probability of finding a horizontal dimer is much smaller than that of a vertical dimer. This is not a trivial fact, since the symmetry between vertical and horizontal dimers is only broken at the boundary, which is {\it infinitely} far away from $e_{\mathrm h}$ or $e_{\mathrm v}$. In addition, (\ref{hv}) means that the joint probability of finding a vertical and a horizontal dimer is low (and, up to exponentially small terms, equal to the product of the probabilities of finding a dimer in each site). This implies orientational order
+
+\indent The probability that a vertical or horizontal edge is occupied is independent on the location of that edge. This is a good sign, but is not sufficient to prove that there is no positional order. Indeed, the Gibbs measure could be a mixture of two measures, in which half of the vertical edges are favored in one of the measures, while the other half is favored in the other. The decay of the correlation functions\-~(\ref{vv}), (\ref{hh}) and\-~(\ref{hv}) forbid this. Indeed, they show that the joint probability of finding a dimer at an edge $e$ and another at $e'$ is equal to a term that does not depend on $e$ or $e'$ plus an exponentially vanishing term.
+
+\indent Thus, there is long range orientational order, and no positional order: the symmetry of the system is partially broken. Therefore, in this range of parameters\-~(\ref{Jz}), the system is in a {\it nematic} phase.
+\bigskip
+
+\indent The range of parameters\-~(\ref{Jz}) makes some sense, but is, presumably, not the optimal one. The orientational order is due to the interaction and to the large density of dimers. Therefore, it is natural to expect that $J,z$ should be rather large. However, the range for which Heilmann and Lieb's proof holds is much wider:
+\begin{equation}
+ J\gg\mathrm{max}(1,-\log z)
+ .
+\end{equation}
+(This inequality does not even require $z\gg 1$, because, by making $J$ big enough, the dimer density is already large.)
+\bigskip
+
+\indent An interesting point is hidden in\-~(\ref{HLnorm}): the truncated correlation functions decay exponentially, but the rate of the decay is extremely anisotropic. In the horizontal direction, the rate is $J\gg 1$, which means that correlations are strongly dampened in the horizontal direction. In the vertical direction, it is $\ell_0^{-1}\equiv e^{-\frac32J}z^{-\frac12}\ll 1$. Therefore, the correlation length in the vertical direction is huge. This is the expected behavior, and is due to the large density of dimers. Indeed, in a column that contains only vertical dimers, that is, no horizontal dimers {\it and} no empty sites, the dimers can either only occupy even or only occupy odd edges. These dimers are strongly correlated. It is only when an empty site or a horizontal dimer is encountered that this restriction is relaxed. However, in this dense nematic phase, such events are {\it improbable}. On the other hand, it is {\it probable} to find an empty site in any interval of size $\approx \ell_0$, which is why correlations decay exponentially on that scale.
+
+\subsection{Ideas of the proof}
+\indent It all starts with Heilmann and Lieb's result\-~\cite{HL79}, which, I recall, ensures that most dimers are vertical. If {\it all} dimers were vertical, then the model would be solvable exactly: every column would be independent from the other columns (dimers are vertical and interact vertically), and each column is a one-dimensional system that can be solved by a transfer matrix technique. The observables in the right sides of\-~(\ref{v}) and\-~(\ref{vv}) can be computed exactly, so\-~(\ref{v}) and\-~(\ref{vv}) can be checked explicitly. Incidentally, this is where $e^{\frac32J}z^{\frac12}$ appears, as the correlation length of the one-dimensional interacting dimer model. (As long as there are no horizontal dimers, the exponential decay in the horizontal direction could be replaced by a sharp step function, but this is not terribly important.) I will call the model with only vertical dimers the `vertical dimer model', and the model with vertical and horizontal dimers the `full model'. The proof is based on showing that the full model is {\it close}, in a sense to be made precise, to the vertical dimer model. Given Heilmann and Lieb's result, this is not a surprising claim.
+\bigskip
+
+\indent Instead of focusing on dimer configurations, we will look at where {\it interfaces} between vertical and horizontal phases lie (see figure\-~\ref{fig:dimer_contour}). The basic idea behind this approach is that interfaces should be unlikely, so there will be few of them and they will be far apart. Locating an interface is slightly ambiguous when there are monomers (empty sites) around (are monomers in the vertical or horizontal phase?), but this can be dealt with rather easily. With this in mind, we can rewrite the partition function\-~(\ref{Xi}), symbolically, as: (I will mostly be discussing the computation of the partition function, the correlation functions in theorem\-~\ref{theo:main} can be computed in a similar way)
+\begin{equation}
+ \frac{\Xi_{\Lambda_L}(z,J)}{Z_{\Lambda_L}(z,J)}
+ =
+ \sum_{\displaystyle\mathop{\scriptstyle\mathrm{interface}}_{\mathrm{configurations}}}e^{-W(\mathrm{interfaces})}\left(\prod_{\displaystyle\mathop{\scriptstyle\mathrm{interfaces}}_{\mathrm{in\,configuration}}}\zeta(\mathrm{interface})\right)
+ \label{loop_model}
+\end{equation}
+where $Z_{\Lambda_L}(z,J)$ is the partition function of the vertical dimer model, $\zeta$ is the {\it effective activity} of each interface, and $W$ is the {\it effective interaction} between interfaces. Once the interface configuration has been fixed, the partition function reduces to a product of partition functions in the areas between the interfaces. In these areas, dimers are either all horizontal or all vertical, so, using the exact solution of the vertical (horizontal) dimer model, one can compute these partition functions exactly. This yields an expression for the activity $\zeta$ and the interaction $W$.
+
+\indent The dominant factor in the activity comes from the interactions that are broken by the interface (since there is no force between a horizontal and a vertical dimer, there are no interactions along the interface, see figure\-~\ref{fig:dimer_contour}). When the dimer density is large enough, each site contributes, roughly (ignoring empty sites), a half of an interaction (see figure\-~\ref{fig:dimer_contour}). When an interface runs between two sites, it cuts one of the two half-interactions of the sites, so, roughly, the activity of an interface of length (that is, the number of edges the interface cuts) $|l|$ is
+\begin{equation}
+ \zeta(\mathrm{interface\ of\ length\ }|l|)\lesssim e^{-\frac12J|l|}
+ .
+\end{equation}
+When $J$ is large, this is a very small factor, which is consistent with the fact that interfaces are rare. In fact, if there were no interaction, then the system would reduce to a rarefied {\it gas} of interfaces, which, as was mentioned previously, can be solved by standard expansions (in this case, it would be called a {\it cluster expansion}, see, for instance, \cite{Ru99,GBG04,KP86,BZ00} for details).
+\bigskip
+
+\begin{figure}
+ \hfil\includegraphics[width=8cm]{dimer_contour.pdf}
+ \caption{The interfaces in the configuration of figure\-~\ref{fig:hl}. Each interface cuts interactions: whereas, in the uniform phases, if one were to neglect the presence of monomers (empty sites), there would be one half of an interaction for each site, whenever an interface runs between two sites, one of the half-interactions disappears.}
+ \label{fig:dimer_contour}
+\end{figure}
+
+\indent The interaction is much nastier. There are, essentially, two contributions, both of which cause trouble. The first is standard in problems which require Pirogov-Sinai theory\-~\cite{PS75,BKL84,KP84}. Interfaces have geometric constraints, which depend on whether they separate a vertical phase outside from a horizontal phase inside, or the other way around. It is, therefore, important to keep track of the orientation of the phase outside an interface. However, if an interface has horizontal dimers outside it, it must be surrounded by an interface which has vertical dimers outside it. This induces an interaction between interfaces, which does not decay with the distance between them. A simple solution to this problem is to pretend that every interface has vertical dimers outside it. This can be done by rotating the dimers in each horizontal phase. However, the partition function of the horizontal dimer model and that of the vertical dimer model in an anisotropic region are different (there is no reason to assume that the horizontal regions are isotropic). It is expected that the ratio of these two partition functions is, at most, exponentially large in the size of the {\it boundary} of the region. If this is true, this rotating operation would yield a large factor $e^{|l|}$, which would be compensated by the gain $e^{-\frac12J|l|}$ coming from the activity of the interface. To prove that the ratio is, indeed, exponentially large in the size of the boundary, we use the expression\-~(\ref{loop_model}) (with $\Lambda_L$ replaced by the horizontal region) to explicitly compute the ratio, and prove the appropriate bound.
+
+\indent The second contribution to the interaction comes from the fact that there are dimers between interfaces (see figure\-~\ref{fig:segments}). Let us focus on the case in which these are vertical dimers. As was mentioned above, the correlation length in a column of vertical dimers is very large ($\ell_0:=e^{\frac32J}z^{\frac12}\gg 1$) which means that the partition function in a column of height $\ll\ell_0$ depends strongly on its height. This translates to an interaction between interfaces which decays exponentially with the distance between interfaces, but with a very small rate $\ell_0^{-1}\ll 1$. Therefore, the interaction is weak when the distance separating the interfaces is at least $\ell_0$, but can be (and is) strong on shorter length scales. Overcoming this is the main difficulty (and novelty) of the proof.
+
+\indent In other words, there are two length scales in the problem: 1, which is the size of a dimer, and $\ell_0$, the correlation length of the vertical dimer model. In addition, the system is very anisotropic (in a vertical phase, $\ell_0$ appears in the vertical direction, and conversely in a horizontal phase). As a consequence, the two-scale nature of the problem cannot be dealt with by a coarse-graining procedure (as was done in\-~\cite{DG13}): the coarse-grained block would need to be a square of size $\ell_0$ (because both columns of height $\ell_0$ and rows of length $\ell_0$ need to be taken into account). However, computing the partition function within this elementary block is already a hard problem. For the same reason, a reflection positivity argument similar to the one in\-~\cite{HL79} cannot be used.
+
+\indent At first glance, the situation is not terribly dire: the interaction is one-dimensional (vertical or horizontal) and, when summing over the positions of the interfaces, one only really needs to sum over the length of one interaction per interface. This yields a factor $\sum_{l}e^{-\ell_0^{-1}l}\approx\ell_0\gg 1$, but each interface contributes, at least $e^{-3J}$ (because its length is, at least, 6). Provided $z\ll e^{3J}$, $\ell_0e^{-3J}\ll 1$, which is good. However, there also are columns of dimers that do not touch any interface, and go straight through $\Lambda_L$ (see figure\-~\ref{fig:segments}). These are called {\it trivial polymers}. If $L$ is larger than $\ell_0$, these cause no trouble, but, as was mentioned earlier, we need to compute the partition function for any horizontal region, which could contain columns of length $\ll \ell_0$. Therefore, we need to ensure that this situation never arises, which we accomplish by redefining the loop model to include interactions of length $<\ell_0$, thus removing them from the horizontal regions entirely.
+\bigskip
+
+\begin{figure}
+ \hfil\includegraphics[width=8cm]{segments.pdf}
+ \caption{An interface configuration. The highlighted vertical and horizontal lines represent the interactions between the interfaces, which are mediated by the dimers between them.}
+ \label{fig:segments}
+\end{figure}
+\bigskip
+
+\indent After having dealt with the interactions as stated above, one can use a cluster expansion to compute the ratio in the left side of\-~(\ref{loop_model}) as the exponential of an absolutely converging series. This actually tells us more than just the statement of theorem\-~\ref{theo:main}: the free energy and every correlation function can be computed, and estimated, in this way.
+
+\section{Concluding remarks}
+\indent The Heilmann-Lieb model has now joined the few other models\-~\cite{BKL84,IVZ06,DG13} for which there is a proof of the existence of a nematic liquid crystal phase. There are a few open problems related to this result, some more important than others, which I would like to mention.
+
+\indent We have shown that the nematic phase appears in the range $J\gg z\gg 1$, but expect it to exist whenever $J\gg\mathrm{max}(1,-\log z)$. The reasons why we have restricted the range in such a way are extremely technical, so much so that I did not deem it appropriate to expound on them in this review, and I have little doubt that they can be relaxed.
+
+\indent As was mentioned above, Heilmann and Lieb\-~\cite{HL79} actually proved orientational ordering for {\it five} models, two of which are two-dimensional dimer models, two are three dimensional fourmer systems (a fourmer covers four vertices, and is shaped like a square), and the last is a three-dimensional dimer model. The proof that was discussed here only really works for the first of these five models, but it is not hard to imagine how to adapt it to the other two two-dimensional models. The situation could get more complicated in three dimensions. In fact, all four papers\-~\cite{BKL84,IVZ06,DG13,JL17c} cited here concern two-dimensional systems. Disertori, Giuliani and I are currently in the final stages of proving a result for a system of hard {\it plates} in three-dimensions. The plates we are considering are $k\times k^\alpha\times1$ parallelepipeds with $k$ large and $\alpha>\frac34$, and they are allowed to be in any one of six orthogonal orientations. We show that a {\it uniaxial plate-nematic} phase emerges in a certain range of densities. In this phase, the short axis of the plates exhibits long range order, which means that the plates are, for the most part, horizontal. It would be rather interesting to prove the existence of a nematic phase in a three-dimensional {\it rod} model (note that Heilmann and Lieb did prove long range orientational order for a three-dimensional dimer model\-~\cite{HL79}).
+
+\indent The important open problem is to prove Onsager's heuristic result\-~\cite{On49}, and show the existence of a nematic phase in a {\it continuous} system of rods. Since this would involve breaking a continuous symmetry, one would have to consider a three-dimensional continuum model, for which, as was just mentioned, there is no proof of a nematic phase even with discrete orientations.
+
+
+\vfill
+\eject
+
+\begin{thebibliography}{WWW99}
+\small
+\IfFileExists{bibliography/bibliography.tex}{\input bibliography/bibliography.tex}{}
+\end{thebibliography}
+
+
+\end{document}
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..76e872a
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,63 @@
+PROJECTNAME=$(basename $(wildcard *.tex))
+LIBS=$(notdir $(wildcard libs/*))
+FIGS=$(notdir $(wildcard figs/*.fig))
+
+PDFS=$(addsuffix .pdf, $(PROJECTNAME))
+SYNCTEXS=$(addsuffix .synctex.gz, $(PROJECTNAME))
+
+all: $(PROJECTNAME)
+
+$(PROJECTNAME): $(LIBS) $(FIGS)
+ pdflatex -file-line-error $@.tex
+ pdflatex -file-line-error $@.tex
+ pdflatex -synctex=1 $@.tex
+
+$(PROJECTNAME).aux: $(LIBS) $(FIGS)
+ pdflatex -file-line-error -draftmode $(PROJECTNAME).tex
+
+
+$(SYNCTEXS): $(LIBS) $(FIGS)
+ pdflatex -synctex=1 $(patsubst %.synctex.gz, %.tex, $@)
+
+
+libs: $(LIBS)
+
+$(LIBS):
+ ln -fs libs/$@ ./
+
+bibliography/bibliography.tex: $(PROJECTNAME).aux
+ BBlog -c bibliography/conf.BBlog -d $(BIBLIOGRAPHY) -b bibliography/bibliography.tex
+
+figs: $(FIGS)
+
+$(FIGS):
+ make -C figs/$@
+ for pdf in $$(find figs/$@/ -name '*.pdf'); do ln -fs "$$pdf" ./ ; done
+ for png in $$(find figs/$@/ -name '*.png'); do ln -fs "$$png" ./ ; done
+
+
+clean-aux: clean-figs-aux
+ rm -f $(addsuffix .aux, $(PROJECTNAME))
+ rm -f $(addsuffix .log, $(PROJECTNAME))
+ rm -f $(addsuffix .out, $(PROJECTNAME))
+ rm -f $(addsuffix .toc, $(PROJECTNAME))
+
+clean-libs:
+ rm -f $(LIBS)
+
+clean-figs:
+ $(foreach fig,$(addprefix figs/, $(FIGS)), make -C $(fig) clean; )
+ rm -f $(notdir $(wildcard figs/*.fig/*.pdf))
+ rm -f $(notdir $(wildcard figs/*.fig/*.png))
+
+clean-figs-aux:
+ $(foreach fig,$(addprefix figs/, $(FIGS)), make -C $(fig) clean-aux; )
+
+
+clean-tex:
+ rm -f $(PDFS) $(SYNCTEXS)
+
+clean-bibliography:
+ rm -f bibliography/bibliography.tex
+
+clean: clean-aux clean-tex clean-libs clean-figs
diff --git a/README b/README
new file mode 100644
index 0000000..6a6a51a
--- /dev/null
+++ b/README
@@ -0,0 +1,48 @@
+This directory contains the source files to typeset the article, and generate
+the figures. This can be accomplished by running
+ make
+
+This document uses a custom class file, located in the 'libs' directory, which
+defines a number of commands. Most of these are drop-in replacements for those
+defined in the 'article' class.
+
+Some extra functionality is provided in custom style files, located in the
+'libs' directory.
+
+
+* Dependencies:
+
+ pdflatex
+ TeXlive packages:
+ amsfonts
+ color
+ doublestroke
+ graphics
+ hyperref
+ latex
+ marginnote
+ pgf
+ standalone
+ GNU make
+ python3
+ gnuplot
+
+* Files:
+
+ Jauslin_IAMP_2018.tex:
+ main LaTeX file
+
+ libs:
+ custom LaTeX class and style files
+
+ figs:
+ source code for the figures
+
+ figs/dimer_example.fig/dimer_conf.py:
+ this python script randomly generates a suitable dimer configuration for
+ the figures interaction.pdf boundary.pdf and dimer_contour.pdf
+
+ figs/atoms.fig/*.py:
+ these python script generate the figures gas.png, liquid.png, crystal.png,
+ nematic.png and chiral.png
+
diff --git a/bibliography/bibliography.tex b/bibliography/bibliography.tex
new file mode 100644
index 0000000..47c2cc3
--- /dev/null
+++ b/bibliography/bibliography.tex
@@ -0,0 +1,97 @@
+\bibitem[Al16]{Al16}D. Alberici - {\it A Cluster Expansion Approach to the Heilmann-Lieb Liquid Crystal Model}, Journal of Statistical Physics, volume~\-162, issue~\-3, pages~\-761-791, 2016,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.1007/s10955-015-1421-8}{10.1007/s10955-015-1421-8}}, arxiv:{\tt\color{blue}\href{http://arxiv.org/abs/1506.02255}{1506.02255}}.\par\medskip
+
+\bibitem[AW57]{AW57}B.J. Alder, T.E. Wainwright - {\it Phase Transition for a Hard Sphere System}, The Journal of Chemical Physics, volume~\-27, issue~\-5, pages~\-1208-1209, 1957,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.1063/1.1743957}{10.1063/1.1743957}}.\par\medskip
+
+\bibitem[Ba82]{Ba82}R.J. Baxter - {\it Exactly solved models in Statistical Mechanics}, Academic Press, 1982.\par\medskip
+
+\bibitem[BZ00]{BZ00}A. Bovier, M. Zahradn\'\i k - {\it A Simple Inductive Approach to the Problem of Convergence of Cluster Expansions of Polymer Models}, Journal of Statistical Physics, volume~\-100, issue~\-3-4, pages~\-765-778, 2000,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.1023/A:1018631710626}{10.1023/A:1018631710626}}.\par\medskip
+
+\bibitem[BKL84]{BKL84}J. Bricmont, K. Kuroda, J.L. Lebowitz - {\it The struture of Gibbs states and phase coexistence for non-symmetric continuum Widom-Rowlinson models}, Zeitschrift f\"ur Wahrscheinlichkeitstheorie und Verwandte Gebiete, volume~\-67, issue~\-2, pages~\-121-138, 1984,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.1007/BF00535264}{10.1007/BF00535264}}.\par\medskip
+
+\bibitem[DG13]{DG13}M. Disertori, A. Giuliani - {\it The nematic phase of a system of long hard rods}, Communications in Mathematical Physics, volume~\-323, pages~\-143-175, 2013,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.1007/s00220-013-1767-1}{10.1007/s00220-013-1767-1}}, arxiv:{\tt\color{blue}\href{http://arxiv.org/abs/1112.5564}{1112.5564}}.\par\medskip
+
+\bibitem[Do68]{Do68}R.L. Dobrushin - {\it The problem of uniqueness of a Gibbsian random field and the problem of phase transitions}, Functional Analysis and its Applications, volume~\-2, issue~\-4, pages~\-302-312, 1968,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.1007/BF01075682}{10.1007/BF01075682}}.\par\medskip
+
+\bibitem[GBG04]{GBG04}G. Gallavotti, F. Bonetto, G. Gentile - {\it Aspects of Ergodic, Qualitative and Statistical Theory of Motion}, Springer, 2004.\par\medskip
+
+\bibitem[Gr62]{Gr62}J. Groeneveld - {\it Two theorems on classical many-particle systems}, Physics Letters, volume~\-3, issue~\-1, pages~\-50-51, 1962,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.1016/0031-9163(62)90198-1}{10.1016/0031-9163(62)90198-1}}.\par\medskip
+
+\bibitem[Ha05]{Ha05}T.C. Hales - {\it A proof of the Kepler conjecture}, Annals of Mathematics, volume~\-162, issue~\-3, pages~\-1065-1185, 2005,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.4007/annals.2005.162.1065}{10.4007/annals.2005.162.1065}}.\par\medskip
+
+\bibitem[HAe17]{HAe17}T. Hales, M. Adams, G. Bauer, T.D. Dang, J. Harrison, L.T. Hoang, C. Kaliszyk, V. Magron, S. Mclaughlin, T. Nguyen, Q.T. Nguyen, T. Nipkow, S. Obua, J. Pleso, J. Rute, A. Solovyev, T.H.A. Ta, N.T. Tran, T.D. Trieu, J. Urban, K. Vu, R. Zumkeller - {\it A formal proof of the Kepler conjecture}, Forum of Mathematics, Pi, volume~\-5, issue~\-2, pages~\-1-29, 2017,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.1017/fmp.2017.1}{10.1017/fmp.2017.1}}, arxiv:{\tt\color{blue}\href{http://arxiv.org/abs/1501.02155}{1501.02155}}.\par\medskip
+
+\bibitem[HL72]{HL72}O.J. Heilmann, E.H. Lieb - {\it Theory of monomer-dimer systems}, Communications in Mathematical Physics, volume~\-25, issue~\-3, pages~\-190-232, 1972,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.1007/BF01877590}{10.1007/BF01877590}}.\par\medskip
+
+\bibitem[HP74]{HP74}O.J. Heilmann, E. Pr\ae{}stgaard - {\it Phase transition in a lattice gas with third nearest neighbour exclusion on a square lattice}, Journal of Physics A, volume~\-7, issue~\-15, pages~\-1913-1917, 1974,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.1088/0305-4470/7/15/017}{10.1088/0305-4470/7/15/017}}.\par\medskip
+
+\bibitem[HL79]{HL79}O.J. Heilmann, E.H. Lieb - {\it Lattice models for liquid crystals}, Journal of Statistical Physics, volume~\-20, issue~\-6, pages~\-679-693, 1979,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.1007/BF01009518}{10.1007/BF01009518}}.\par\medskip
+
+\bibitem[IVZ06]{IVZ06}D. Ioffe, Y. Velenik, M. Zahradn\'\i k - {\it Entropy-Driven Phase Transition in a Polydisperse Hard-Rods Lattice System}, Journal of Statistical Physics, volume~\-122, issue~\-4, pages~\-761-786, 2006,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.1007/s10955-005-8085-8}{10.1007/s10955-005-8085-8}}, arxiv:{\tt\color{blue}\href{http://arxiv.org/abs/math/0503222}{math/0503222}}.\par\medskip
+
+\bibitem[IK15]{IK15}M. Isobe, W. Krauth - {\it Hard-sphere melting and crystallization with event-chain Monte Carlo}, The Journal of Chemical Physics, volume~\-143, number~\-084509, 2015,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.1063/1.4929529}{10.1063/1.4929529}}, arxiv:{\tt\color{blue}\href{http://arxiv.org/abs/1505.07896}{1505.07896}}.\par\medskip
+
+\bibitem[JL17]{JL17b}I. Jauslin, J.L. Lebowitz - {\it High-fugacity expansion, Lee-Yang zeros and order-disorder transitions in hard-core lattice systems}, 2017,\par\penalty10000
+arxiv:{\tt\color{blue}\href{http://arxiv.org/abs/1708.01912}{1708.01912}}.\par\medskip
+
+\bibitem[JL17b]{JL17c}I. Jauslin, E.H. Lieb - {\it Nematic liquid crystal phase in a system of interacting dimers and monomers}, 2017,\par\penalty10000
+arxiv:{\tt\color{blue}\href{http://arxiv.org/abs/1709.05297}{1709.05297}}.\par\medskip
+
+\bibitem[Ka02]{Ka02}H.\-~Kamerlingh Onnes - {\it Expression of the equation of state of gases and liquids by means of series}, KNAW, Proceedings, 4, p.\-~125-147, 1902.\par\medskip
+
+\bibitem[KP84]{KP84}R. Koteck\'y, D. Preiss - {\it An inductive approach to the Pirogov-Sinai theory}, Proceedings of the~\-11th Winter School on Abstract Analysis, Rendiconti del Circolo Matematico di Palermo, Serie II, supplemento~\-3, pages~\-161-164, 1984.\par\medskip
+
+\bibitem[KP86]{KP86}R. Koteck\'y, D. Preiss - {\it Cluster expansion for abstract polymer models}, Communications in Mathematical Physics, volume~\-103, issue~\-3, pages~\-491-498, 1986,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.1007/BF01211762}{10.1007/BF01211762}}.\par\medskip
+
+\bibitem[LP66]{LP66}J.L. Lebowitz, O. Penrose - {\it Rigorous Treatment of the Van Der Waals‐Maxwell Theory of the Liquid‐Vapor Transition}, Journal of Mathematical Physics, volume~\-7, issue~\-1, pages~\-98-113, 1966,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.1063/1.1704821}{10.1063/1.1704821}}.\par\medskip
+
+\bibitem[Ma75]{Ma75}J. Clerk-Maxwell - {\it On the Dynamical Evidence of the Molecular Constitution of Bodies}, Nature, volume~\-11 , pages~\-357-359, 1875,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.1038/011357a0}{10.1038/011357a0}}.\par\medskip
+
+\bibitem[Ma37]{Ma37}J.E. Mayer - {\it The Statistical Mechanics of Condensing Systems. I}, The Journal of Chemical Physics, volume~\-5, issue~\-67, pages~\-67-73, 1937,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.1063/1.1749933}{10.1063/1.1749933}}.\par\medskip
+
+\bibitem[On49]{On49}L. Onsager - {\it The effects of shape on the interaction of colloidal particles}, Annals of the New York Academy of Sciences, volume~\-51, pages~\-627-659, 1949,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.1111/j.1749-6632.1949.tb27296.x}{10.1111/j.1749-6632.1949.tb27296.x}}.\par\medskip
+
+\bibitem[PCF14]{PCF14}S. Papanikolaou, D. Charrier, E. Fradkin - {\it Ising nematic fluid phase of hard-core dimers on the square lattice}, Physical Review B, volume~\-89, page~\-035128, 2014,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.1103/PhysRevB.89.035128}{10.1103/PhysRevB.89.035128}}, arxiv:{\tt\color{blue}\href{http://arxiv.org/abs/1310.4173}{1310.4173}}.\par\medskip
+
+\bibitem[Pe63]{Pe63}O. Penrose - {\it Convergence of Fugacity Expansions for Fluids and Lattice Gases}, Journal of Mathematical Physics, volume~\-4, issue~\-10, pages~\-1312-1320, 1963,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.1063/1.1703906}{10.1063/1.1703906}}.\par\medskip
+
+\bibitem[PS75]{PS75}S.A. Pirogov, Y.G. Sinai - {\it Phase diagrams of classical lattice systems}, Theoretical and Mathematical Physics, volume~\-25, pages~\-1185-1192, 1975,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.1007/BF01040127}{10.1007/BF01040127}}.\par\medskip
+
+\bibitem[Ru63]{Ru63}D. Ruelle - {\it Correlation functions of classical gases}, Annals of Physics, volume~\-25, issue~\-1, pages~\-109-120, 1963,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.1016/0003-4916(63)90336-1}{10.1016/0003-4916(63)90336-1}}.\par\medskip
+
+\bibitem[Ru71]{Ru71}D. Ruelle - {\it Existence of a phase transition in a continuous classical system}, Physical Review Letters, volume~\-27, issue~\-16, pages~\-1040-1041, 1971,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.1103/PhysRevLett.27.1040}{10.1103/PhysRevLett.27.1040}}.\par\medskip
+
+\bibitem[Ru99]{Ru99}D. Ruelle - {\it Statistical mechanics: rigorous results}, Imperial College Press, World Scientific, (first edition: Benjamin, 1969), 1999.\par\medskip
+
+\bibitem[Ur27]{Ur27}H.D. Ursell - {\it The evaluation of Gibbs' phase-integral for imperfect gases}, Mathematical Proceedings of the Cambridge Philosophical Society, volume~\-23, issue~\-6, pages~\-685-697, 1927,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.1017/S0305004100011191}{10.1017/S0305004100011191}}.\par\medskip
+
+\bibitem[WR70]{WR70}B. Widom, J.S. Rowlinson - {\it New Model for the Study of Liquid–Vapor Phase Transitions}, The Journal of Chemical Physics, volume~\-52, pages~\-1670-1684, 1970,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.1063/1.1673203}{10.1063/1.1673203}}.\par\medskip
+
+\bibitem[WJ57]{WJ57}W.W. Wood, J.D. Jacobson - {\it Preliminary results from a recalculation of the Monte Carlo equation of state of hard spheres}, The Journal of Chemical Physics, volume~\-27, issue~\-5, pages~\-1207-1208, 1957,\par\penalty10000
+doi:{\tt\color{blue}\href{http://dx.doi.org/10.1063/1.1743956}{10.1063/1.1743956}}.\par\medskip
+
diff --git a/figs/atoms.fig/Makefile b/figs/atoms.fig/Makefile
new file mode 100644
index 0000000..a4b610f
--- /dev/null
+++ b/figs/atoms.fig/Makefile
@@ -0,0 +1,15 @@
+PROJECTNAME=crystal liquid gas nematic chiral
+PNGS=$(addsuffix .png, $(PROJECTNAME))
+
+all: $(PNGS)
+
+$(PNGS):
+ cp $(patsubst %.png, %, $@)-base.gp $(patsubst %.png, %, $@).gp
+ python $(patsubst %.png, %, $@).py >> $(patsubst %.png, %, $@).gp
+ gnuplot $(patsubst %.png, %, $@).gp > $@
+
+clean-aux:
+ rm -f $(addsuffix .gp, $(PROJECTNAME))
+
+clean: clean-aux
+ rm -f $(PNGS)
diff --git a/figs/atoms.fig/chiral-base.gp b/figs/atoms.fig/chiral-base.gp
new file mode 100644
index 0000000..5960ce6
--- /dev/null
+++ b/figs/atoms.fig/chiral-base.gp
@@ -0,0 +1,22 @@
+set terminal pngcairo size 2048,2048
+
+set key off
+unset colorbox
+unset border
+unset xtics
+unset ytics
+unset ztics
+
+set parametric
+
+set view 80,10,1.5
+set view equal xyz
+
+set isosample 100
+
+set pm3d depthorder
+set pm3d lighting primary 0.50 specular 0.6
+
+set palette defined (0 "#339999", 1 "#339999")
+
+splot \
diff --git a/figs/atoms.fig/chiral.py b/figs/atoms.fig/chiral.py
new file mode 100644
index 0000000..eed6df8
--- /dev/null
+++ b/figs/atoms.fig/chiral.py
@@ -0,0 +1,102 @@
+#!/usr/bin/env python3
+
+from math import *
+import random
+import sys
+
+# size of space
+L=30
+# number of lines
+H=5
+# heigh of lines
+height=5
+# number of rods per line
+N=16
+# aspect ratio
+a=10
+# spread in theta angle
+spread_t=pi/60
+# in phi
+spread_p=pi/60
+# in height
+spread_h=1/120
+
+# check whether two rods overlap
+def check_overlap(rod1,rod2):
+ # relative placement
+ relative_pos=unrotate(subtract(rod2[0],rod1[0]), rod1[1])
+ if(abs(relative_pos[0])<2 and abs(relative_pos[1])<2 and abs(relative_pos[2])<2):
+ return(True)
+ # relative angle
+ relative_ang=cart_to_spherical(unrotate(spherical_to_cart(rod2[1]), rod1[1]))
+ # exclusion volume
+ # rotate other rod
+ relative_pos=unrotate(relative_pos, [0,relative_ang[1]])
+ #if(abs(relative_pos[1])<2 and abs(relative_pos[0])-2<abs(sin(relative_ang[0]))*a and abs(relative_pos[2])-a-2<abs(cos(relative_ang[0])*a)):
+ if(abs(relative_pos[1])<2 and abs(relative_pos[0])-2<abs(sin(relative_ang[0]))*a and abs(sin(relative_ang[0])*relative_pos[2]-cos(relative_ang[0])*relative_pos[0])-2<abs(sin(relative_ang[0])*a)):
+ return(True)
+ return(False)
+
+# def subtract vectors
+def subtract(x,y):
+ return([x[0]-y[0],x[1]-y[1],x[2]-y[2]])
+# rotate vector
+def unrotate(x,w):
+ ret=[x[0],x[1],x[2]]
+ # rotate phi
+ tmp=cos(w[1])*ret[0]+sin(w[1])*ret[1]
+ ret[1]=-sin(w[1])*ret[0]+cos(w[1])*ret[1]
+ ret[0]=tmp
+ # rotate theta
+ tmp=cos(w[0])*ret[0]-sin(w[0])*ret[2]
+ ret[2]=sin(w[0])*ret[0]+cos(w[0])*ret[2]
+ ret[0]=tmp
+ return(ret)
+
+# convert coordinates
+def spherical_to_cart(w):
+ return([cos(w[1])*sin(w[0]),sin(w[1])*sin(w[0]),cos(w[0])])
+def cart_to_spherical(x):
+ w=[0,0]
+ w[0]=acos(x[2])
+ if(sin(w[0]==0)):
+ return([w[0],0])
+ c=x[0]/sin(w[0])
+ s=x[1]/sin(w[0])
+ # to avoid truncation errors
+ if(abs(c)>1 and abs(c)<1.0001):
+ if(c>0):
+ return([w[0],0])
+ else:
+ return([w[0],pi])
+ if(s>=0):
+ return([w[0],acos(c)])
+ return([w[0],2*pi-acos(c)])
+
+# configuration
+config=[]
+# add rods
+for h in range(H):
+ config_h=[]
+ while len(config_h)<N:
+ # random position and angles
+ x=[random.uniform(0,L), random.uniform(0,L), random.gauss(h*height,spread_h)]
+ w=[abs(random.gauss(pi/2,spread_t)), random.gauss(pi/2*(1-h/(H-1)),spread_p)]
+ # chek it does not interfere with other rods
+ fine=True
+ for rod in config+config_h:
+ if(check_overlap(rod,[x,w])):
+ fine=False
+ break
+ if fine:
+ config_h.append([x,w])
+ config=config+config_h
+
+for i in range(len(config)):
+ rod=config[i]
+ print(str(rod[0][0])+"+("+str(cos(rod[1][1])*cos(rod[1][0]))+")*cos(u)*sin(v)+("+str(-sin(rod[1][1]))+")*sin(u)*sin(v)+("+str(cos(rod[1][1])*sin(rod[1][0])*a)+")*cos(v)", end=", ")
+ print(str(rod[0][1])+"+("+str(sin(rod[1][1])*cos(rod[1][0]))+")*cos(u)*sin(v)+("+str(cos(rod[1][1]))+")*sin(u)*sin(v)+("+str(sin(rod[1][1])*sin(rod[1][0])*a)+")*cos(v)", end=", ")
+ print(str(rod[0][2])+"+("+str(-sin(rod[1][0]))+")*cos(u)*sin(v)+("+str(cos(rod[1][0])*a)+")*cos(v)", end=" ")
+ print("with pm3d", end="")
+ if i<len(config)-1:
+ print(", \\")
diff --git a/figs/atoms.fig/crystal-base.gp b/figs/atoms.fig/crystal-base.gp
new file mode 100644
index 0000000..4502919
--- /dev/null
+++ b/figs/atoms.fig/crystal-base.gp
@@ -0,0 +1,21 @@
+set terminal pngcairo size 2048,2048
+
+set key off
+unset colorbox
+unset border
+unset xtics
+unset ytics
+unset ztics
+
+set parametric
+
+set view equal xyz
+
+set isosample 100
+
+set pm3d depthorder
+set pm3d lighting primary 0.50 specular 0.6
+
+set palette defined (0 "#339999", 1"#339999")
+
+splot \
diff --git a/figs/atoms.fig/crystal.py b/figs/atoms.fig/crystal.py
new file mode 100644
index 0000000..4b1ba3c
--- /dev/null
+++ b/figs/atoms.fig/crystal.py
@@ -0,0 +1,24 @@
+#!/usr/bin/env python3
+
+from math import *
+import random
+import sys
+
+# size of lattice
+N=5
+
+# configuration
+config=[]
+for i in range(N):
+ for j in range(N):
+ for k in range(N):
+ config.append([2*i+((j+k)%2),sqrt(3)*(j+(k%2)/3),2*sqrt(6)/3*k])
+
+
+for i in range(len(config)):
+ print(str(config[i][0])+"+cos(u)*sin(v)", end=",")
+ print(str(config[i][1])+"+sin(u)*sin(v)", end=",")
+ print(str(config[i][2])+"+cos(v)", end=" ")
+ print("with pm3d", end="")
+ if i<len(config)-1:
+ print(", \\")
diff --git a/figs/atoms.fig/gas-base.gp b/figs/atoms.fig/gas-base.gp
new file mode 100644
index 0000000..7e337b6
--- /dev/null
+++ b/figs/atoms.fig/gas-base.gp
@@ -0,0 +1,21 @@
+set terminal pngcairo size 2048,2048
+
+set key off
+unset colorbox
+unset border
+unset xtics
+unset ytics
+unset ztics
+
+set parametric
+
+set view equal xyz
+
+set isosample 100
+
+set pm3d depthorder
+set pm3d lighting primary 0.5 specular 0.6
+
+set palette defined (0 "#339999", 1"#339999")
+
+splot \
diff --git a/figs/atoms.fig/gas.py b/figs/atoms.fig/gas.py
new file mode 100644
index 0000000..0057637
--- /dev/null
+++ b/figs/atoms.fig/gas.py
@@ -0,0 +1,39 @@
+#!/usr/bin/env python3
+
+from math import *
+import random
+
+# size of space
+L=15
+# number of particles
+N=6
+
+# check whether two rods overlap
+def check_overlap(sphere1,sphere2):
+ if(sqrt((sphere2[0]-sphere1[0])**2+(sphere2[1]-sphere1[1])**2+(sphere2[2]-sphere1[2])**2)<2):
+ return(True)
+ return(False)
+
+# configuration
+config=[]
+# add spheres
+while len(config)<N:
+ # random position
+ x=[random.uniform(0,L), random.uniform(0,L), random.uniform(0,L)]
+ # check it does not interfere with other spheres
+ fine=True
+ for sphere in config:
+ if(check_overlap(sphere,x)):
+ fine=False
+ break
+ if fine:
+ config.append(x)
+
+for i in range(len(config)):
+ sphere=config[i]
+ print(str(sphere[0])+"+cos(u)*sin(v)", end=", ")
+ print(str(sphere[1])+"+sin(u)*sin(v)", end=", ")
+ print(str(sphere[2])+"+cos(v)", end=" ")
+ print("with pm3d", end="")
+ if i<len(config)-1:
+ print(", \\")
diff --git a/figs/atoms.fig/liquid-base.gp b/figs/atoms.fig/liquid-base.gp
new file mode 100644
index 0000000..4502919
--- /dev/null
+++ b/figs/atoms.fig/liquid-base.gp
@@ -0,0 +1,21 @@
+set terminal pngcairo size 2048,2048
+
+set key off
+unset colorbox
+unset border
+unset xtics
+unset ytics
+unset ztics
+
+set parametric
+
+set view equal xyz
+
+set isosample 100
+
+set pm3d depthorder
+set pm3d lighting primary 0.50 specular 0.6
+
+set palette defined (0 "#339999", 1"#339999")
+
+splot \
diff --git a/figs/atoms.fig/liquid.py b/figs/atoms.fig/liquid.py
new file mode 100644
index 0000000..99b09ba
--- /dev/null
+++ b/figs/atoms.fig/liquid.py
@@ -0,0 +1,39 @@
+#!/usr/bin/env python3
+
+from math import *
+import random
+
+# size of space
+L=15
+# number of particles
+N=100
+
+# check whether two rods overlap
+def check_overlap(sphere1,sphere2):
+ if(sqrt((sphere2[0]-sphere1[0])**2+(sphere2[1]-sphere1[1])**2+(sphere2[2]-sphere1[2])**2)<2):
+ return(True)
+ return(False)
+
+# configuration
+config=[]
+# add spheres
+while len(config)<N:
+ # random position
+ x=[random.uniform(0,L), random.uniform(0,L), random.uniform(0,L)]
+ # check it does not interfere with other spheres
+ fine=True
+ for sphere in config:
+ if(check_overlap(sphere,x)):
+ fine=False
+ break
+ if fine:
+ config.append(x)
+
+for i in range(len(config)):
+ sphere=config[i]
+ print(str(sphere[0])+"+cos(u)*sin(v)", end=", ")
+ print(str(sphere[1])+"+sin(u)*sin(v)", end=", ")
+ print(str(sphere[2])+"+cos(v)", end=" ")
+ print("with pm3d", end="")
+ if i<len(config)-1:
+ print(", \\")
diff --git a/figs/atoms.fig/nematic-base.gp b/figs/atoms.fig/nematic-base.gp
new file mode 100644
index 0000000..4de0ee2
--- /dev/null
+++ b/figs/atoms.fig/nematic-base.gp
@@ -0,0 +1,21 @@
+set terminal pngcairo size 2048,2048
+
+set key off
+unset colorbox
+unset border
+unset xtics
+unset ytics
+unset ztics
+
+set parametric
+
+set view equal xyz
+
+set isosample 100
+
+set pm3d depthorder
+set pm3d lighting primary 0.50 specular 0.6
+
+set palette defined (0 "#339999", 1 "#339999")
+
+splot \
diff --git a/figs/atoms.fig/nematic.py b/figs/atoms.fig/nematic.py
new file mode 100644
index 0000000..5c779c0
--- /dev/null
+++ b/figs/atoms.fig/nematic.py
@@ -0,0 +1,90 @@
+#!/usr/bin/env python3
+
+from math import *
+import random
+
+# size of space
+L=30
+# number of rods
+N=75
+# aspect ratio
+a=10
+# spread in theta angle
+spread=pi/30
+
+# check whether two rods overlap
+def check_overlap(rod1,rod2):
+ # relative placement
+ relative_pos=unrotate(subtract(rod2[0],rod1[0]), rod1[1])
+ if(abs(relative_pos[0])<2 and abs(relative_pos[1])<2 and abs(relative_pos[2])<2):
+ return(True)
+ # relative angle
+ relative_ang=cart_to_spherical(unrotate(spherical_to_cart(rod2[1]), rod1[1]))
+ # exclusion volume
+ # rotate other rod
+ relative_pos=unrotate(relative_pos, [0,relative_ang[1]])
+ #if(abs(relative_pos[1])<2 and abs(relative_pos[0])-2<abs(sin(relative_ang[0]))*a and abs(relative_pos[2])-a-2<abs(cos(relative_ang[0])*a)):
+ if(abs(relative_pos[1])<2 and abs(relative_pos[0])-2<abs(sin(relative_ang[0]))*a and abs(sin(relative_ang[0])*relative_pos[2]-cos(relative_ang[0])*relative_pos[0])-2<abs(sin(relative_ang[0])*a)):
+ return(True)
+ return(False)
+
+# def subtract vectors
+def subtract(x,y):
+ return([x[0]-y[0],x[1]-y[1],x[2]-y[2]])
+# rotate vector
+def unrotate(x,w):
+ ret=[x[0],x[1],x[2]]
+ # rotate phi
+ tmp=cos(w[1])*ret[0]+sin(w[1])*ret[1]
+ ret[1]=-sin(w[1])*ret[0]+cos(w[1])*ret[1]
+ ret[0]=tmp
+ # rotate theta
+ tmp=cos(w[0])*ret[0]-sin(w[0])*ret[2]
+ ret[2]=sin(w[0])*ret[0]+cos(w[0])*ret[2]
+ ret[0]=tmp
+ return(ret)
+
+# convert coordinates
+def spherical_to_cart(w):
+ return([cos(w[1])*sin(w[0]),sin(w[1])*sin(w[0]),cos(w[0])])
+def cart_to_spherical(x):
+ w=[0,0]
+ w[0]=acos(x[2])
+ if(sin(w[0]==0)):
+ return([w[0],0])
+ c=x[0]/sin(w[0])
+ s=x[1]/sin(w[0])
+ # to avoid truncation errors
+ if(abs(c)>1 and abs(c)<1.0001):
+ if(c>0):
+ return([w[0],0])
+ else:
+ return([w[0],pi])
+ if(s>=0):
+ return([w[0],acos(c)])
+ return([w[0],2*pi-acos(c)])
+
+# configuration
+config=[]
+# add rods
+while len(config)<N:
+ # random position and angles
+ x=[random.uniform(0,L), random.uniform(0,L), random.uniform(0,L)]
+ w=[abs(random.gauss(0,spread)), random.uniform(0,2*pi)]
+ # chek it does not interfere with other rods
+ fine=True
+ for rod in config:
+ if(check_overlap(rod,[x,w])):
+ fine=False
+ break
+ if fine:
+ config.append([x,w])
+
+for i in range(len(config)):
+ rod=config[i]
+ print(str(rod[0][0])+"+("+str(cos(rod[1][1])*cos(rod[1][0]))+")*cos(u)*sin(v)+("+str(-sin(rod[1][1]))+")*sin(u)*sin(v)+("+str(cos(rod[1][1])*sin(rod[1][0])*a)+")*cos(v)", end=", ")
+ print(str(rod[0][1])+"+("+str(sin(rod[1][1])*cos(rod[1][0]))+")*cos(u)*sin(v)+("+str(cos(rod[1][1]))+")*sin(u)*sin(v)+("+str(sin(rod[1][1])*sin(rod[1][0])*a)+")*cos(v)", end=", ")
+ print(str(rod[0][2])+"+("+str(-sin(rod[1][0]))+")*cos(u)*sin(v)+("+str(cos(rod[1][0])*a)+")*cos(v)", end=" ")
+ print("with pm3d", end="")
+ if i<len(config)-1:
+ print(", \\")
diff --git a/figs/dimer_example.fig/Makefile b/figs/dimer_example.fig/Makefile
new file mode 100644
index 0000000..303ffe4
--- /dev/null
+++ b/figs/dimer_example.fig/Makefile
@@ -0,0 +1,38 @@
+PROJECTNAME=interaction boundary dimer_contour
+LIBS=$(notdir $(wildcard libs/*))
+
+PDFS=$(addsuffix .pdf, $(PROJECTNAME))
+SOURCES=$(addsuffix .tikz.tex, $(PROJECTNAME))
+
+all: $(PDFS)
+
+$(PDFS): $(SOURCES) $(LIBS)
+ echo $(LIBS)
+ pdflatex -jobname $(basename $@) -file-line-error $(patsubst %.pdf, %.tikz.tex, $@)
+
+$(SOURCES):
+ python3 dimer_conf.py
+
+install: $(PDFS)
+ cp $^ $(INSTALLDIR)/
+
+install-sources: $(SOURCES)
+ cp $^ $(INSTALLDIR)/
+
+$(LIBS):
+ ln -fs libs/$@ ./
+
+clean-libs:
+ rm -f $(LIBS)
+
+clean-aux:
+ rm -f $(addsuffix .aux, $(PROJECTNAME))
+ rm -f $(addsuffix .log, $(PROJECTNAME))
+
+clean-tex:
+ rm -f $(PDFS)
+
+clean-sources:
+ rm -f $(SOURCES)
+
+clean: clean-libs clean-aux clean-tex clean-sources
diff --git a/figs/dimer_example.fig/dimer_conf.py b/figs/dimer_example.fig/dimer_conf.py
new file mode 100644
index 0000000..ffacb16
--- /dev/null
+++ b/figs/dimer_example.fig/dimer_conf.py
@@ -0,0 +1,261 @@
+#!/usr/bin/env python3
+
+import random
+from math import *
+
+# size of the grid
+L=24
+# boundary thickness (must be even)
+l0=4
+# activity and interaction
+z=3
+J=5
+
+
+# draw random dimers in a select area
+def fill_dimers(mask,direction):
+ if(direction=="h"):
+ d=[1,0]
+ else:
+ d=[0,1]
+
+ dimers=[]
+
+ # keep track of which sites are occupied
+ occupied=[]
+ for i in range(L):
+ occupied.append([])
+ for j in range(L):
+ occupied[i].append(0)
+
+ for i in range(10000):
+ # pick a random edge (indexed by its lower-left corner)
+ e=None
+ while(e==None or e[0]+d[0]>=L or e[1]+d[1]>=L or mask[e[0]][e[1]]==0 or mask[e[0]+d[0]][e[1]+d[1]]==0):
+ e=[random.randint(0,L-1),random.randint(0,L-1)]
+ # check whether a dimer can be added to the edge
+ if(occupied[e[0]][e[1]]==0 and occupied[e[0]+d[0]][e[1]+d[1]]==0):
+ # number of interactions
+ interactions=0
+ if(e[0]+2*d[0]<L and e[1]+2*d[1]<L and occupied[e[0]+2*d[0]][e[1]+2*d[1]]==1):
+ interactions=interactions+1
+ if(e[0]-d[0]>=0 and e[1]-d[1]>=0 and occupied[e[0]-d[0]][e[1]-d[1]]==1):
+ interactions=interactions+1
+ # probability of adding the dimer
+ p=1/(1+1/z*exp(-J*interactions))
+ if(p>random.random()):
+ # add dimer
+ dimers.append(e)
+ occupied[e[0]][e[1]]=1
+ occupied[e[0]+d[0]][e[1]+d[1]]=1
+
+ return(dimers)
+
+# find interactions
+def interactions(dimers,direction):
+ if(direction=="h"):
+ d=[1,0]
+ else:
+ d=[0,1]
+
+ out=[]
+ for d1 in dimers:
+ for d2 in dimers:
+ if(d1[0]-d2[0]==2*d[0] and d1[1]-d2[1]==2*d[1]):
+ out.append([d2[0]+d[0],d2[1]+d[1]])
+ return(out)
+
+# find interactions with boundary
+def boundary_interactions(dimers,rho):
+ out=[]
+ for d in dimers:
+ for v in rho:
+ if(d[0]==v[0] and d[1]==v[1]):
+ out.append([d[0],d[1]-1])
+ elif(d[0]==v[0] and d[1]==v[1]-1):
+ out.append([d[0],d[1]+1])
+ return(out)
+
+
+# draw dimers
+def draw_dimers(v_dimers,h_dimers,file_desc,color):
+ for d in v_dimers:
+ print("\\dimer{[color="+color+"]("+str(d[0])+","+str(d[1])+")}v", file=file_desc)
+ print("", file=file_desc)
+ for d in h_dimers:
+ print("\\dimer{[color="+color+"]("+str(d[0])+","+str(d[1])+")}h", file=file_desc)
+ print("", file=file_desc)
+
+# draw interactions
+def draw_interactions(v_interactions,h_interactions,file_desc):
+ for d in v_interactions:
+ print("\\interaction{("+str(d[0])+","+str(d[1])+")}v", file=file_desc)
+ print("", file=file_desc)
+ for d in h_interactions:
+ print("\\interaction{("+str(d[0])+","+str(d[1])+")}h", file=file_desc)
+ print("", file=file_desc)
+
+
+# draw loops
+def draw_loops(loops,file_desc,color):
+ for loop in loops:
+ print("\\draw[color="+color+", line width=3pt]",end="",file=file_desc)
+ for e in loop:
+ print("("+str(e[0])+","+str(e[1])+")--",end="",file=file_desc)
+ print("cycle;",file=file_desc)
+
+# init tikz file
+def init_tikz(filename):
+ file_desc=open(filename,"w")
+ print("\\documentclass{standalone}\n\n\\usepackage{tikz}\n\\usepackage{dimer}\n\\usetikzlibrary{decorations.pathmorphing}\n\n\\begin{document}\n\\begin{tikzpicture}\n\n", file=file_desc)
+ return(file_desc)
+
+# close tikz file
+def close_tikz(file_desc):
+ print("\\end{tikzpicture}\n\\end{document}", file=file_desc)
+ file_desc.close()
+
+
+mu=int(L/2)
+
+# loops
+loop1=[]
+for i in range(0,2*l0):
+ loop1.append([mu-l0+i,mu+4.5])
+for i in range(0,4):
+ loop1.append([mu+l0-1+0.5,mu+4-i])
+for i in range(0,l0):
+ loop1.append([mu+l0+i,mu+0.5])
+for i in range(0,6):
+ loop1.append([mu+2*l0-1+0.5,mu-i])
+for i in range(0,4*l0):
+ loop1.append([mu+2*l0-1-i,mu-5.5])
+for i in range(0,6):
+ loop1.append([mu-2*l0-0.5,mu-5+i])
+for i in range(0,l0):
+ loop1.append([mu-2*l0+i,mu+0.5])
+for i in range(0,4):
+ loop1.append([mu-l0-0.5,mu+1+i])
+# core of loop1
+core_loop1=[]
+for i in range(0,2*l0-4):
+ core_loop1.append([mu-l0+2+i,mu+3.5])
+for i in range(0,3):
+ core_loop1.append([mu+l0-3+0.5,mu+3-i])
+core_loop1.append([mu+l0-2,mu+0.5])
+core_loop1.append([mu+l0-1,mu+0.5])
+for i in range(0,l0-2):
+ core_loop1.append([mu+l0+i,mu-1+0.5])
+for i in range(0,4):
+ core_loop1.append([mu+2*l0-3+0.5,mu-1-i])
+for i in range(0,4*l0-4):
+ core_loop1.append([mu+2*l0-3-i,mu-4.5])
+for i in range(0,4):
+ core_loop1.append([mu-2*l0+2-0.5,mu-4+i])
+for i in range(0,l0-2):
+ core_loop1.append([mu-2*l0+2+i,mu-1+0.5])
+core_loop1.append([mu-l0,mu+0.5])
+core_loop1.append([mu-l0+1,mu+0.5])
+for i in range(0,3):
+ core_loop1.append([mu-l0+2-0.5,mu+1+i])
+
+loop2=[[mu-1,mu+2.5],[mu-0.5,mu+2],[mu-0.5,mu+1],[mu-1,mu+0.5],[mu-1.5,mu+1],[mu-1.5,mu+2]]
+loop3=[[mu-1,mu-1.5],[mu,mu-1.5],[mu+0.5,mu-2],[mu+0.5,mu-3],[mu,mu-3.5],[mu-1,mu-3.5],[mu-1.5,mu-3],[mu-1.5,mu-2]]
+
+
+loops=[loop1,loop2,loop3]
+
+# masks
+# init
+v_mask=[]
+h_mask=[]
+for i in range(L):
+ v_mask.append([])
+ h_mask.append([])
+ for j in range(L):
+ v_mask[i].append(1)
+ h_mask[i].append(0)
+# draw masks
+for i in range(mu-l0,mu+l0):
+ for j in range(mu+1,mu+5):
+ v_mask[i][j]=0
+for i in range(mu-2*l0,mu+2*l0):
+ for j in range(mu-5,mu+1):
+ v_mask[i][j]=0
+for i in range(mu-l0+2,mu+l0-2):
+ for j in range(mu+1,mu+4):
+ h_mask[i][j]=1
+for i in range(mu-l0,mu+l0):
+ h_mask[i][mu]=1
+for i in range(mu-2*l0+2,mu+2*l0-2):
+ for j in range(mu-4,mu):
+ h_mask[i][j]=1
+h_mask[mu-1][mu+1]=0
+h_mask[mu-1][mu+2]=0
+h_mask[mu-1][mu-3]=0
+h_mask[mu-1][mu-2]=0
+h_mask[mu][mu-3]=0
+h_mask[mu][mu-2]=0
+
+# random dimers in mask
+v_dimers=fill_dimers(v_mask,"v")
+h_dimers=fill_dimers(h_mask,"h")
+
+# mantle dimers
+h_mantle=[]
+for i in range(0,l0):
+ h_mantle.append([mu-l0+2*i,mu+4])
+for i in range(0,4):
+ h_mantle.append([mu+l0-2,mu+4-i])
+ h_mantle.append([mu-l0,mu+4-i])
+for i in range(0,int(l0/2)):
+ h_mantle.append([mu+l0+2*i,mu])
+ h_mantle.append([mu-l0-2-2*i,mu])
+for i in range(0,5):
+ h_mantle.append([mu+2*l0-2,mu-i])
+ h_mantle.append([mu-2*l0,mu-i])
+for i in range(0,2*l0):
+ h_mantle.append([mu-2*l0+2*i,mu-5])
+
+v_mantle=[]
+v_mantle.append([mu-1,mu+1])
+v_mantle.append([mu-1,mu-3])
+v_mantle.append([mu,mu-3])
+
+# interactions
+v_interactions=interactions(v_dimers+v_mantle,"v")
+h_interactions=interactions(h_dimers+h_mantle,"h")
+
+# magnetized part of the boundary
+rho=[]
+for i in range(0,L):
+ if(random.randint(0,1)==0):
+ rho.append([i,0])
+ if(random.randint(0,1)==0):
+ rho.append([i,L-1])
+
+
+# files
+
+interaction=init_tikz("interaction.tikz.tex")
+print("\\grid{"+str(L-1)+"}{"+str(L-1)+"}{(0,0)}\n", file=interaction)
+draw_interactions(v_interactions,h_interactions,interaction)
+draw_dimers(v_dimers+v_mantle,h_dimers+h_mantle,interaction,"black")
+close_tikz(interaction)
+
+boundary=init_tikz("boundary.tikz.tex")
+print("\\fill[color=cyan](-0.5,-0.5)--++("+str(L)+",0)--++(0,"+str(l0)+")--++("+str(-L)+",0)--cycle;", file=boundary)
+print("\\fill[color=cyan](-0.5,"+str(L-l0-0.5)+")--++("+str(L)+",0)--++(0,"+str(l0)+")--++("+str(-L)+",0)--cycle;", file=boundary)
+print("", file=boundary)
+print("\\grid{"+str(L-1)+"}{"+str(L-1)+"}{(0,0)}\n", file=boundary)
+draw_dimers(v_dimers+v_mantle,h_dimers+h_mantle,boundary,"black")
+close_tikz(boundary)
+
+contour=init_tikz("dimer_contour.tikz.tex")
+print("\\grid{"+str(L-1)+"}{"+str(L-1)+"}{(0,0)}\n", file=contour)
+draw_loops([loop1,loop2,loop3],contour,"blue")
+draw_interactions(v_interactions,h_interactions,contour)
+draw_dimers(v_dimers,h_dimers,contour,"black")
+draw_dimers(v_mantle,h_mantle,contour,"black")
+close_tikz(contour)
+
diff --git a/figs/dimer_example.fig/libs/dimer.sty b/figs/dimer_example.fig/libs/dimer.sty
new file mode 120000
index 0000000..2d83c8a
--- /dev/null
+++ b/figs/dimer_example.fig/libs/dimer.sty
@@ -0,0 +1 @@
+../../libs/dimer.sty \ No newline at end of file
diff --git a/figs/libs/Makefile b/figs/libs/Makefile
new file mode 100644
index 0000000..994463b
--- /dev/null
+++ b/figs/libs/Makefile
@@ -0,0 +1,25 @@
+PROJECTNAME=$(basename $(basename $(wildcard *.tikz.tex)))
+LIBS=$(notdir $(wildcard libs/*))
+
+PDFS=$(addsuffix .pdf, $(PROJECTNAME))
+
+all: $(PDFS)
+
+$(PDFS): $(LIBS)
+ echo $(LIBS)
+ pdflatex -jobname $(basename $@) -file-line-error $(patsubst %.pdf, %.tikz.tex, $@)
+
+$(LIBS):
+ ln -fs libs/$@ ./
+
+clean-libs:
+ rm -f $(LIBS)
+
+clean-aux:
+ rm -f $(addsuffix .aux, $(PROJECTNAME))
+ rm -f $(addsuffix .log, $(PROJECTNAME))
+
+clean-tex:
+ rm -f $(PDFS)
+
+clean: clean-libs clean-aux clean-tex
diff --git a/figs/libs/dimer.sty b/figs/libs/dimer.sty
new file mode 100644
index 0000000..0f087ef
--- /dev/null
+++ b/figs/libs/dimer.sty
@@ -0,0 +1,33 @@
+% square lattice (width #1, height #2, origin #3)
+\def\grid#1#2#3{
+ \foreach\i in {0,...,#2}{
+ \draw#3++(0,\i)--++(#1,0);
+ }
+ \foreach\i in {0,...,#1}{
+ \draw#3++(\i,0)--++(0,#2);
+ }
+}
+
+% dimer (bottom-left vertex #1, vertical or horizontal #2)
+\def\dimer#1#2{
+ \if#2h
+ \draw[line width=5pt]#1--++(1,0);
+ \fill#1circle(7pt);
+ \fill#1++(1,0)circle(7pt);
+ \else
+ \draw[line width=5pt]#1--++(0,1);
+ \fill#1circle(7pt);
+ \fill#1++(0,1)circle(7pt);
+ \fi
+}
+
+% interactions (bottom-left vertex #1, vertical or horizontal #2)
+\def\interaction#1#2{
+ \if#2h
+ \draw[line width=5pt, color=white]#1--++(1,0);
+ \draw[line width=4pt, decorate, decoration={snake}, color=red]#1--++(1,0);
+ \else
+ \draw[line width=5pt, color=white]#1--++(0,1);
+ \draw[line width=4pt, decorate, decoration={snake}, color=red]#1--++(0,1);
+ \fi
+}
diff --git a/figs/polymer_example.fig/Makefile b/figs/polymer_example.fig/Makefile
new file mode 120000
index 0000000..704310e
--- /dev/null
+++ b/figs/polymer_example.fig/Makefile
@@ -0,0 +1 @@
+../libs/Makefile \ No newline at end of file
diff --git a/figs/polymer_example.fig/libs/dimer.sty b/figs/polymer_example.fig/libs/dimer.sty
new file mode 120000
index 0000000..2d83c8a
--- /dev/null
+++ b/figs/polymer_example.fig/libs/dimer.sty
@@ -0,0 +1 @@
+../../libs/dimer.sty \ No newline at end of file
diff --git a/figs/polymer_example.fig/segments.tikz.tex b/figs/polymer_example.fig/segments.tikz.tex
new file mode 100644
index 0000000..9669e3b
--- /dev/null
+++ b/figs/polymer_example.fig/segments.tikz.tex
@@ -0,0 +1,132 @@
+\documentclass{standalone}
+
+\usepackage{tikz}
+\usepackage{dimer}
+
+\begin{document}
+\begin{tikzpicture}
+
+
+%% mantles
+
+% blue
+\fill[color=blue](2,6.5)--++(13,0)--++(0.5,0.5)--++(0,8)--++(-0.5,0.5)--++(-13,0)--++(-0.5,-0.5)--++(0,-8)--cycle;
+\fill[color=white](4,7.5)--++(9,0)--++(0.5,0.5)--++(0,6)--++(-0.5,0.5)--++(-9,0)--++(-0.5,-0.5)--++(0,-6)--cycle;
+% red
+\fill[color=red](6,8.5)--++(4,0)--++(0.5,0.5)--++(0,5)--++(-0.5,0.5)--++(-4,0)--++(-0.5,-0.5)--++(0,-5)--cycle;
+\fill[color=white](7,10.5)--++(2,0)--++(0.5,0.5)--++(0,1)--++(-0.5,0.5)--++(-2,0)--++(-0.5,-0.5)--++(0,-1)--cycle;
+% teal
+\fill[color=teal](9,19.5)--++(9,0)--++(0.5,-0.5)--++(0,-10)--++(0.5,-0.5)--++(15,0)--++(0.5,0.5)--++(0,22)--++(-0.5,0.5)--++(-25,0)--++(-0.5,-0.5)--++(0,-11)--cycle;
+\fill[color=white](11,20.5)--++(7,0)--++(0.5,-0.5)--++(0.5,-0.5)--++(1,0)--++(0.5,-0.5)--++(0,-9)--++(0.5,-0.5)--++(11,0)--++(0.5,0.5)--++(0,20)--++(-0.5,0.5)--++(-21,0)--++(-0.5,-0.5)--++(0,-9)--cycle;
+% magenta
+\fill[color=magenta](13,21.5)--++(18,0)--++(0.5,0.5)--++(0,7)--++(-0.5,0.5)--++(-18,0)--++(-0.5,-0.5)--++(0,-7)--cycle;
+\fill[color=white](14,23.5)--++(16,0)--++(0.5,0.5)--++(0,3)--++(-0.5,0.5)--++(-16,0)--++(-0.5,-0.5)--++(0,-3)--cycle;
+% cyan
+\fill[color=cyan](23,11.5)--++(7,0)--++(0.5,0.5)--++(0,5)--++(-0.5,0.5)--++(-7,0)--++(-0.5,-0.5)--++(0,-5)--cycle;
+\fill[color=white](24,13.5)--++(5,0)--++(0.5,0.5)--++(0,1)--++(-0.5,0.5)--++(-5,0)--++(-0.5,-0.5)--++(0,-1)--cycle;
+% orange
+\fill[color=orange](15,23.5)--++(5,0)--++(0.5,0.5)--++(0,3)--++(-0.5,0.5)--++(-5,0)--++(-0.5,-0.5)--++(0,-3)--cycle;
+\fill[color=white](17,24.5)--++(1,0)--++(0.5,0.5)--++(0,1)--++(-0.5,0.5)--++(-1,0)--++(-0.5,-0.5)--++(0,-1)--cycle;
+% green
+\fill[color=green](23,24.5)--++(3,0)--++(0.5,0.5)--++(0,1)--++(-0.5,0.5)--++(-3,0)--++(-0.5,-0.5)--++(0,-1)--cycle;
+
+
+%% segments
+
+\foreach \i in {0,...,1}{
+ \draw[color=gray, line width=15pt](\i,-0.5)--++(0,37);
+}
+\foreach \i in {2,...,8}{
+ \draw[color=gray, line width=15pt](\i,-0.5)--++(0,7);
+ \draw[color=gray, line width=15pt](\i,15.5)--++(0,21);
+}
+\foreach \i in {9,...,15}{
+ \draw[color=gray, line width=15pt](\i,-0.5)--++(0,7);
+ \draw[color=gray, line width=15pt](\i,15.5)--++(0,4);
+ \draw[color=gray, line width=15pt](\i,31.5)--++(0,5);
+}
+\foreach \i in {16,...,18}{
+ \draw[color=gray, line width=15pt](\i,-0.5)--++(0,20);
+ \draw[color=gray, line width=15pt](\i,31.5)--++(0,5);
+}
+\foreach \i in {19,...,34}{
+ \draw[color=gray, line width=15pt](\i,-0.5)--++(0,9);
+ \draw[color=gray, line width=15pt](\i,31.5)--++(0,5);
+}
+\foreach \i in {35,...,36}{
+ \draw[color=gray, line width=15pt](\i,-0.5)--++(0,37);
+}
+
+\draw[color=blue, line width=15pt](3.5,8)--++(10,0);
+\foreach \i in {9,...,14}{
+ \draw[color=blue, line width=15pt](3.5,\i)--++(2,0);
+ \draw[color=blue, line width=15pt](10.5,\i)--++(3,0);
+}
+
+\foreach \i in {7,...,9}{
+ \draw[color=red, line width=15pt](\i,10.5)--++(0,2);
+}
+
+\foreach \i in {10,...,11}{
+ \draw[color=teal, line width=15pt](20.5,\i)--++(12,0);
+}
+\foreach \i in {12,...,17}{
+ \draw[color=teal, line width=15pt](20.5,\i)--++(2,0);
+ \draw[color=teal, line width=15pt](30.5,\i)--++(2,0);
+}
+\foreach \i in {18,...,19}{
+ \draw[color=teal, line width=15pt](20.5,\i)--++(12,0);
+}
+\draw[color=teal, line width=15pt](18.5,20)--++(14,0);
+\draw[color=teal, line width=15pt](10.5,21)--++(22,0);
+\foreach \i in {22,...,29}{
+ \draw[color=teal, line width=15pt](10.5,\i)--++(2,0);
+ \draw[color=teal, line width=15pt](31.5,\i)--++(1,0);
+}
+\draw[color=teal, line width=15pt](10.5,30)--++(22,0);
+
+\foreach \i in {24,...,29}{
+ \draw[color=cyan, line width=15pt](\i,13.5)--++(0,2);
+}
+
+\draw[color=magenta, line width=15pt](14,23.5)--++(0,4);
+\foreach \i in {21,...,22}{
+ \draw[color=magenta, line width=15pt](\i,23.5)--++(0,4);
+}
+\foreach \i in {23,...,26}{
+ \draw[color=magenta, line width=15pt](\i,23.5)--++(0,1);
+ \draw[color=magenta, line width=15pt](\i,26.5)--++(0,1);
+}
+\foreach \i in {27,...,30}{
+ \draw[color=magenta, line width=15pt](\i,23.5)--++(0,4);
+}
+
+\foreach \i in {25,...,26}{
+ \draw[color=orange, line width=15pt](16.5,\i)--++(2,0);
+}
+
+
+
+%% grid
+\grid{36}{36}{[color=lightgray](0,0)}
+
+%% loops
+% blue
+\draw[color=black, line width=5pt](2,6.5)--++(13,0)--++(0.5,0.5)--++(0,8)--++(-0.5,0.5)--++(-13,0)--++(-0.5,-0.5)--++(0,-8)--cycle;
+% red
+\draw[color=black, line width=5pt](6,8.5)--++(4,0)--++(0.5,0.5)--++(0,5)--++(-0.5,0.5)--++(-4,0)--++(-0.5,-0.5)--++(0,-5)--cycle;
+% teal
+\draw[color=black, line width=5pt](9,19.5)--++(9,0)--++(0.5,-0.5)--++(0,-10)--++(0.5,-0.5)--++(15,0)--++(0.5,0.5)--++(0,22)--++(-0.5,0.5)--++(-25,0)--++(-0.5,-0.5)--++(0,-11)--cycle;
+% magenta
+\draw[color=black, line width=5pt](13,21.5)--++(18,0)--++(0.5,0.5)--++(0,7)--++(-0.5,0.5)--++(-18,0)--++(-0.5,-0.5)--++(0,-7)--cycle;
+% cyan
+\draw[color=black, line width=5pt](23,11.5)--++(7,0)--++(0.5,0.5)--++(0,5)--++(-0.5,0.5)--++(-7,0)--++(-0.5,-0.5)--++(0,-5)--cycle;
+% orange
+\draw[color=black, line width=5pt](15,23.5)--++(5,0)--++(0.5,0.5)--++(0,3)--++(-0.5,0.5)--++(-5,0)--++(-0.5,-0.5)--++(0,-3)--cycle;
+%green
+\draw[color=black, line width=5pt](23,24.5)--++(3,0)--++(0.5,0.5)--++(0,1)--++(-0.5,0.5)--++(-3,0)--++(-0.5,-0.5)--++(0,-1)--cycle;
+
+
+\end{tikzpicture}
+\end{document}
+
diff --git a/libs/ian.cls b/libs/ian.cls
new file mode 100644
index 0000000..538a108
--- /dev/null
+++ b/libs/ian.cls
@@ -0,0 +1,659 @@
+%%
+%% Ian's class file
+%%
+
+%% TeX format
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+
+%% class name
+\ProvidesClass{ian}[2017/09/29]
+
+%% boolean to signal that this class is being used
+\newif\ifianclass
+
+%% options
+% no section numbering in equations
+\DeclareOption{section_in_eq}{\sectionsineqtrue}
+\DeclareOption{section_in_fig}{\sectionsinfigtrue}
+\DeclareOption{section_in_theo}{\PassOptionsToPackage{\CurrentOption}{iantheo}}
+\DeclareOption{section_in_all}{\sectionsineqtrue\sectionsinfigtrue\PassOptionsToPackage{section_in_theo}{iantheo}}
+\DeclareOption{subsection_in_eq}{\subsectionsineqtrue}
+\DeclareOption{subsection_in_fig}{\subsectionsinfigtrue}
+\DeclareOption{subsection_in_theo}{\PassOptionsToPackage{\CurrentOption}{iantheo}}
+\DeclareOption{subsection_in_all}{\subsectionsineqtrue\subsectionsinfigtrue\PassOptionsToPackage{subsection_in_theo}{iantheo}}
+\DeclareOption{no_section_in_eq}{\sectionsineqfalse}
+\DeclareOption{no_section_in_fig}{\sectionsinfigfalse}
+\DeclareOption{no_section_in_theo}{\PassOptionsToPackage{\CurrentOption}{iantheo}}
+\DeclareOption{no_section_in_all}{\sectionsineqfalse\sectionsinfigfalse\PassOptionsToPackage{no_section_in_theo}{iantheo}}
+\DeclareOption{no_subsection_in_eq}{\subsectionsineqfalse}
+\DeclareOption{no_subsection_in_fig}{\subsectionsinfigfalse}
+\DeclareOption{no_subsection_in_theo}{\PassOptionsToPackage{\CurrentOption}{iantheo}}
+\DeclareOption{no_subsection_in_all}{\subsectionsineqfalse\subsectionsinfigfalse\PassOptionsToPackage{no_subsection_in_theo}{iantheo}}
+% reset point
+\DeclareOption{point_reset_at_section}{\PassOptionsToPackage{reset_at_section}{point}}
+\DeclareOption{point_no_reset_at_section}{\PassOptionsToPackage{no_reset_at_section}{point}}
+\DeclareOption{point_reset_at_theo}{\PassOptionsToPackage{reset_at_theo}{point}}
+\DeclareOption{point_no_reset_at_theo}{\PassOptionsToPackage{no_reset_at_theo}{point}}
+
+\def\ian@defaultoptions{
+ \ExecuteOptions{section_in_all, no_subsection_in_all}
+ \ProcessOptions
+
+ %% required packages
+ \RequirePackage{iantheo}
+ \RequirePackage{point}
+ \RequirePackage{color}
+ \RequirePackage{marginnote}
+ \RequirePackage{amssymb}
+ \PassOptionsToPackage{hidelinks}{hyperref}
+ \RequirePackage{hyperref}
+}
+
+%% paper dimensions
+\setlength\paperheight{297mm}
+\setlength\paperwidth{210mm}
+
+%% fonts
+\input{size11.clo}
+\DeclareOldFontCommand{\rm}{\normalfont\rmfamily}{\mathrm}
+\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf}
+\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt}
+\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf}
+\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit}
+
+%% text dimensions
+\hoffset=-50pt
+\voffset=-72pt
+\textwidth=460pt
+\textheight=704pt
+
+
+%% remove default indentation
+\parindent=0pt
+%% indent command
+\def\indent{\hskip20pt}
+
+%% something is wrong with \thepage, redefine it
+\gdef\thepage{\the\c@page}
+
+%% array lines (to use the array environment)
+\setlength\arraycolsep{5\p@}
+\setlength\arrayrulewidth{.4\p@}
+
+
+%% correct vertical alignment at the end of a document
+\AtEndDocument{
+ \vfill
+ \eject
+}
+
+
+%% hyperlinks
+% hyperlinkcounter
+\newcounter{lncount}
+% hyperref anchor
+\def\hrefanchor{%
+\stepcounter{lncount}%
+\hypertarget{ln.\thelncount}{}%
+}
+
+%% define a command and write it to aux file
+\def\outdef#1#2{%
+ % define command%
+ \expandafter\xdef\csname #1\endcsname{#2}%
+ % hyperlink number%
+ \expandafter\xdef\csname #1@hl\endcsname{\thelncount}%
+ % write command to aux%
+ \immediate\write\@auxout{\noexpand\expandafter\noexpand\gdef\noexpand\csname #1\endcsname{\csname #1\endcsname}}%
+ \immediate\write\@auxout{\noexpand\expandafter\noexpand\gdef\noexpand\csname #1@hl\endcsname{\thelncount}}%
+}
+
+%% can call commands even when they are not defined
+\def\safe#1{%
+ \ifdefined#1%
+ #1%
+ \else%
+ {\color{red}\bf?}%
+ \fi%
+}
+
+%% define a label for the latest tag
+%% label defines a command containing the string stored in \tag
+\def\deflabel{
+ \def\label##1{\expandafter\outdef{label@##1}{\safe\tag}}
+
+ \def\ref##1{%
+ % check whether the label is defined (hyperlink runs into errors if this check is omitted)
+ \ifcsname label@##1@hl\endcsname%
+ \hyperlink{ln.\csname label@##1@hl\endcsname}{{\color{blue}\safe\csname label@##1\endcsname}}%
+ \else%
+ \ifcsname label@##1\endcsname%
+ {\color{blue}\csname ##1\endcsname}%
+ \else%
+ {\bf ??}%
+ \fi%
+ \fi%
+ }
+}
+
+
+%% make a custom link at any given location in the document
+\def\makelink#1#2{%
+ \hrefanchor%
+ \outdef{label@#1}{#2}%
+}
+
+
+%% section command
+% counter
+\newcounter{sectioncount}
+% space before section
+\newlength\secskip
+\setlength\secskip{40pt}
+% a prefix to put before the section number, e.g. A for appendices
+\def\sectionprefix{}
+% define some lengths
+\newlength\secnumwidth
+\newlength\sectitlewidth
+\def\section#1{
+ % reset counters
+ \stepcounter{sectioncount}
+ \setcounter{subsectioncount}{0}
+ \ifsectionsineq
+ \setcounter{seqcount}0
+ \fi
+ \ifsectionsinfig
+ \setcounter{figcount}0
+ \fi
+
+ % space before section (if not first)
+ \ifnum\thesectioncount>1
+ \vskip\secskip
+ \penalty-1000
+ \fi
+
+ % hyperref anchor
+ \hrefanchor
+ % define tag (for \label)
+ \xdef\tag{\sectionprefix\thesectioncount}
+
+ % get widths
+ \def\@secnum{{\bf\Large\sectionprefix\thesectioncount.\hskip10pt}}
+ \settowidth\secnumwidth{\@secnum}
+ \setlength\sectitlewidth\textwidth
+ \addtolength\sectitlewidth{-\secnumwidth}
+
+ % print name
+ \parbox{\textwidth}{
+ \@secnum
+ \parbox[t]{\sectitlewidth}{\Large\bf #1}}
+
+ % write to table of contents
+ \iftoc
+ % save lncount in aux variable which is written to toc
+ \immediate\write\tocoutput{\noexpand\expandafter\noexpand\edef\noexpand\csname toc@sec.\thesectioncount\endcsname{\thelncount}}
+ \write\tocoutput{\noexpand\tocsection{#1}{\thepage}}
+ \fi
+
+ %space
+ \par\penalty10000
+ \bigskip\penalty10000
+}
+
+%% subsection
+% counter
+\newcounter{subsectioncount}
+% space before subsection
+\newlength\subsecskip
+\setlength\subsecskip{30pt}
+\def\subsection#1{
+ % counters
+ \stepcounter{subsectioncount}
+ \setcounter{subsubsectioncount}{0}
+ \ifsubsectionsineq
+ \setcounter{seqcount}0
+ \fi
+ \ifsubsectionsinfig
+ \setcounter{figcount}0
+ \fi
+
+ % space before subsection (if not first)
+ \ifnum\thesubsectioncount>1
+ \vskip\subsecskip
+ \penalty-500
+ \fi
+
+ % hyperref anchor
+ \hrefanchor
+ % define tag (for \label)
+ \xdef\tag{\sectionprefix\thesectioncount.\thesubsectioncount}
+
+ % get widths
+ \def\@secnum{{\bf\large\hskip.5cm\sectionprefix\thesectioncount.\thesubsectioncount.\hskip5pt}}
+ \settowidth\secnumwidth{\@secnum}
+ \setlength\sectitlewidth\textwidth
+ \addtolength\sectitlewidth{-\secnumwidth}
+ % print name
+ \parbox{\textwidth}{
+ \@secnum
+ \parbox[t]{\sectitlewidth}{\large\bf #1}}
+
+ % write to table of contents
+ \iftoc
+ % save lncount in aux variable which is written to toc
+ \immediate\write\tocoutput{\noexpand\expandafter\noexpand\edef\noexpand\csname toc@subsec.\thesectioncount.\thesubsectioncount\endcsname{\thelncount}}
+ \write\tocoutput{\noexpand\tocsubsection{#1}{\thepage}}
+ \fi
+
+ % space
+ \par\penalty10000
+ \medskip\penalty10000
+}
+
+%% subsubsection
+% counter
+\newcounter{subsubsectioncount}
+% space before subsubsection
+\newlength\subsubsecskip
+\setlength\subsubsecskip{20pt}
+\def\subsubsection#1{
+ % counters
+ \stepcounter{subsubsectioncount}
+
+ % space before subsubsection (if not first)
+ \ifnum\thesubsubsectioncount>1
+ \vskip\subsubsecskip
+ \penalty-500
+ \fi
+
+ % hyperref anchor
+ \hrefanchor
+ % define tag (for \label)
+ \xdef\tag{\sectionprefix\thesectioncount.\thesubsectioncount.\thesubsubsectioncount}
+
+ % get widths
+ \def\@secnum{{\bf\hskip1.cm\sectionprefix\thesectioncount.\thesubsectioncount.\thesubsubsectioncount.\hskip5pt}}
+ \settowidth\secnumwidth{\@secnum}
+ \setlength\sectitlewidth\textwidth
+ \addtolength\sectitlewidth{-\secnumwidth}
+ % print name
+ \parbox{\textwidth}{
+ \@secnum
+ \parbox[t]{\sectitlewidth}{\large\bf #1}}
+
+ % write to table of contents
+ \iftoc
+ % save lncount in aux variable which is written to toc
+ \immediate\write\tocoutput{\noexpand\expandafter\noexpand\edef\noexpand\csname toc@subsubsec.\thesectioncount.\thesubsectioncount.\thesubsubsectioncount\endcsname{\thelncount}}
+ \write\tocoutput{\noexpand\tocsubsubsection{#1}{\thepage}}
+ \fi
+
+ % space
+ \par\penalty10000
+ \medskip\penalty10000
+}
+
+%% itemize
+\newlength\itemizeskip
+% left margin for items
+\setlength\itemizeskip{20pt}
+\newlength\itemizeseparator
+% space between the item symbol and the text
+\setlength\itemizeseparator{5pt}
+% penalty preceding an itemize
+\newcount\itemizepenalty
+\itemizepenalty=0
+% counter counting the itemize level
+\newcounter{itemizecount}
+
+% item symbol
+\def\itemizept#1{
+ \ifnum#1=1
+ \textbullet
+ \else
+ $\scriptstyle\blacktriangleright$
+ \fi
+}
+
+
+\newlength\current@itemizeskip
+\setlength\current@itemizeskip{0pt}
+\def\itemize{%
+ \par\expandafter\penalty\the\itemizepenalty\medskip\expandafter\penalty\the\itemizepenalty%
+ \addtocounter{itemizecount}{1}%
+ \addtolength\current@itemizeskip{\itemizeskip}%
+ \leftskip\current@itemizeskip%
+}
+\def\enditemize{%
+ \addtocounter{itemizecount}{-1}%
+ \addtolength\current@itemizeskip{-\itemizeskip}%
+ \par\expandafter\penalty\the\itemizepenalty\leftskip\current@itemizeskip%
+ \medskip\expandafter\penalty\the\itemizepenalty%
+}
+\newlength\itempt@total
+\def\item{
+ \settowidth\itempt@total{\itemizept\theitemizecount}
+ \addtolength\itempt@total{\itemizeseparator}
+ \par
+ \medskip
+ \hskip-\itempt@total\itemizept\theitemizecount\hskip\itemizeseparator
+}
+
+
+%% prevent page breaks after itemize
+\newcount\previtemizepenalty
+\def\nopagebreakafteritemize{
+ \previtemizepenalty=\itemizepenalty
+ \itemizepenalty=10000
+}
+%% back to previous value
+\def\restorepagebreakafteritemize{
+ \itemizepenalty=\previtemizepenalty
+}
+
+%% enumerate
+\newcounter{enumerate@count}
+\def\enumerate{
+ \setcounter{enumerate@count}0
+ \let\olditem\item
+ \let\olditemizept\itemizept
+ \def\item{
+ % counter
+ \stepcounter{enumerate@count}
+ % set header
+ \def\itemizept{\theenumerate@count.}
+ % hyperref anchor
+ \hrefanchor
+ % define tag (for \label)
+ \xdef\tag{\theenumerate@count}
+ \olditem
+ }
+ \itemize
+}
+\def\endenumerate{
+ \enditemize
+ \let\item\olditem
+ \let\itemizept\olditemizept
+}
+
+
+%% equation numbering
+% counter
+\newcounter{seqcount}
+% booleans (write section or subsection in equation number)
+\newif\ifsectionsineq
+\newif\ifsubsectionsineq
+\def\seqcount{
+ \stepcounter{seqcount}
+ % the output
+ \edef\seqformat{\theseqcount}
+ % add subsection number
+ \ifsubsectionsineq
+ \let\tmp\seqformat
+ \edef\seqformat{\thesubsectioncount.\tmp}
+ \fi
+ % add section number
+ \ifsectionsineq
+ \let\tmp\seqformat
+ \edef\seqformat{\sectionprefix\thesectioncount.\tmp}
+ \fi
+ % define tag (for \label)
+ \xdef\tag{\seqformat}
+ % write number
+ \marginnote{\hfill(\seqformat)}
+}
+%% equation environment compatibility
+\def\equation{\hrefanchor$$\seqcount}
+\def\endequation{$$\@ignoretrue}
+
+
+%% figures
+% counter
+\newcounter{figcount}
+% booleans (write section or subsection in equation number)
+\newif\ifsectionsinfig
+\newif\ifsubsectionsinfig
+% width of figures
+\newlength\figwidth
+\setlength\figwidth\textwidth
+\addtolength\figwidth{-2.5cm}
+% caption
+\def\defcaption{
+ \long\def\caption##1{
+ \stepcounter{figcount}
+
+ % hyperref anchor
+ \hrefanchor
+
+ % the number of the figure
+ \edef\figformat{\thefigcount}
+ % add subsection number
+ \ifsubsectionsinfig
+ \let\tmp\figformat
+ \edef\figformat{\thesubsectioncount.\tmp}
+ \fi
+ % add section number
+ \ifsectionsinfig
+ \let\tmp\figformat
+ \edef\figformat{\sectionprefix\thesectioncount.\tmp}
+ \fi
+
+ % define tag (for \label)
+ \xdef\tag{\figformat}
+
+ % write
+ \hfil fig \figformat: \parbox[t]{\figwidth}{\leavevmode\small##1}
+
+ % space
+ \par\bigskip
+ }
+}
+%% short caption: centered
+\def\captionshort#1{
+ \stepcounter{figcount}
+
+ % hyperref anchor
+ \hrefanchor
+
+ % the number of the figure
+ \edef\figformat{\thefigcount}
+ % add section number
+ \ifsectionsinfig
+ \let\tmp\figformat
+ \edef\figformat{\sectionprefix\thesectioncount.\tmp}
+ \fi
+
+ % define tag (for \label)
+ \xdef\tag{\figformat}
+
+ % write
+ \hfil fig \figformat: {\small#1}
+
+ %space
+ \par\bigskip
+}
+
+%% environment
+\def\figure{
+ \par
+ \vfil\penalty100\vfilneg
+ \bigskip
+}
+\def\endfigure{
+ \par
+ \vfil\penalty100\vfilneg
+ \bigskip
+}
+
+
+%% start appendices
+\def\appendix{
+ \vfill
+ \pagebreak
+
+ % counter
+ \setcounter{sectioncount}0
+
+ % prefix
+ \def\sectionprefix{A}
+
+ % write
+ {\bf \LARGE Appendices}\par\penalty10000\bigskip\penalty10000
+
+ % add a mention in the table of contents
+ \iftoc
+ \immediate\write\tocoutput{\noexpand\tocappendices}\penalty10000
+ \fi
+
+ %% uncomment for new page for each appendix
+ %\def\seqskip{\vfill\pagebreak}
+}
+
+
+%% bibliography
+% size of header
+\newlength\bibheader
+\def\thebibliography#1{
+ \hrefanchor
+
+ % add a mention in the table of contents
+ \iftoc
+ % save lncount in aux variable which is written to toc
+ \immediate\write\tocoutput{\noexpand\expandafter\noexpand\edef\noexpand\csname toc@references\endcsname{\thelncount}}
+ \write\tocoutput{\noexpand\tocreferences{\thepage}}\penalty10000
+ \fi
+
+ % write
+ {\bf \LARGE References}\par\penalty10000\bigskip\penalty10000
+ % width of header
+ \settowidth\bibheader{[#1]}
+ \leftskip\bibheader
+}
+% end environment
+\def\endthebibliography{
+ \par\leftskip0pt
+}
+
+%% bibitem command
+\def\bibitem[#1]#2{%
+ \hrefanchor%
+ \outdef{label@cite#2}{#1}%
+ \hskip-\bibheader%
+ \makebox[\bibheader]{\cite{#2}\hfill}%
+}
+
+%% cite command (adapted from latex.ltx)
+% @tempswa is set to true when there is an optional argument
+\newif\@tempswa
+\def\cite{%
+ % check whether there is an optional argument (if there is none, add on empty '[]')
+ \@ifnextchar [{\@tempswatrue\@citex}{\@tempswafalse\@citex[]}%
+}
+% command with optional argument
+\def\@citex[#1]#2{\leavevmode%
+ % initialize loop
+ \let\@citea\@empty%
+ % format
+ \@cite{%
+ % loop over ',' separated list
+ \@for\@citeb:=#2\do{%
+ % text to add at each iteration of the loop (separator between citations)
+ \@citea\def\@citea{,\ }%
+ % add entry to citelist
+ \@writecitation{\@citeb}%
+ \ref{cite\@citeb}%
+ }%
+ }%
+ % add optional argument text (as an argument to '\@cite')
+ {#1}%
+}
+\def\@cite#1#2{%
+ [#1\if@tempswa , #2\fi]%
+}
+%% add entry to citelist after checking it has not already been added
+\def\@writecitation#1{%
+ \ifcsname if#1cited\endcsname%
+ \else%
+ \expandafter\newif\csname if#1cited\endcsname%
+ \immediate\write\@auxout{\string\citation{#1}}%
+ \fi%
+}
+
+%% table of contents
+% boolean
+\newif\iftoc
+\def\tableofcontents{
+ {\bf \large Table of contents:}\par\penalty10000\bigskip\penalty10000
+
+ % copy content from file
+ \IfFileExists{\jobname.toc}{\input{\jobname.toc}}{{\tt error: table of contents missing}}
+
+ % open new toc
+ \newwrite\tocoutput
+ \immediate\openout\tocoutput=\jobname.toc
+
+ \toctrue
+}
+%% close file
+\AtEndDocument{
+ % close toc
+ \iftoc
+ \immediate\closeout\tocoutput
+ \fi
+}
+
+
+%% fill line with dots
+\def\leaderfill{\leaders\hbox to 1em {\hss. \hss}\hfill}
+
+%% same as sectionprefix
+\def\tocsectionprefix{}
+
+%% toc formats
+\newcounter{tocsectioncount}
+\def\tocsection #1#2{
+ \stepcounter{tocsectioncount}
+ \setcounter{tocsubsectioncount}{0}
+ \setcounter{tocsubsubsectioncount}{0}
+ % write
+ \smallskip\hyperlink{ln.\csname toc@sec.\thetocsectioncount\endcsname}{{\bf \tocsectionprefix\thetocsectioncount}.\hskip5pt {\color{blue}#1}\leaderfill#2}\par
+}
+\newcounter{tocsubsectioncount}
+\def\tocsubsection #1#2{
+ \stepcounter{tocsubsectioncount}
+ \setcounter{tocsubsubsectioncount}{0}
+ % write
+ {\hskip10pt\hyperlink{ln.\csname toc@subsec.\thetocsectioncount.\thetocsubsectioncount\endcsname}{{\bf \thetocsubsectioncount}.\hskip5pt {\color{blue}\small #1}\leaderfill#2}}\par
+}
+\newcounter{tocsubsubsectioncount}
+\def\tocsubsubsection #1#2{
+ \stepcounter{tocsubsubsectioncount}
+ % write
+ {\hskip20pt\hyperlink{ln.\csname toc@subsubsec.\thetocsectioncount.\thetocsubsectioncount.\thetocsubsubsectioncount\endcsname}{{\bf \thetocsubsubsectioncount}.\hskip5pt {\color{blue}\small #1}\leaderfill#2}}\par
+}
+\def\tocappendices{
+ \medskip
+ \setcounter{tocsectioncount}0
+ {\bf Appendices}\par
+ \smallskip
+ \def\tocsectionprefix{A}
+}
+\def\tocreferences#1{
+ \medskip
+ {\hyperlink{ln.\csname toc@references\endcsname}{{\color{blue}\bf References}\leaderfill#1}}\par
+ \smallskip
+}
+
+
+%% definitions that must be loaded at begin document
+\let\ian@olddocument\document
+\def\document{
+ \ian@olddocument
+
+ \deflabel
+ \defcaption
+}
+
+%% end
+\ian@defaultoptions
+\endinput
diff --git a/libs/iantheo.sty b/libs/iantheo.sty
new file mode 100644
index 0000000..d33a93d
--- /dev/null
+++ b/libs/iantheo.sty
@@ -0,0 +1,162 @@
+%%
+%% iantheorem package:
+%% Ian's customized theorem command
+%%
+
+%% boolean to signal that this package was loaded
+\newif\ifiantheo
+
+%% TeX format
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+
+%% package name
+\ProvidesPackage{iantheo}[2016/11/10]
+
+%% options
+\newif\ifsectionintheo
+\DeclareOption{section_in_theo}{\sectionintheotrue}
+\DeclareOption{no_section_in_theo}{\sectionintheofalse}
+\newif\ifsubsectionintheo
+\DeclareOption{subsection_in_theo}{\subsectionintheotrue}
+\DeclareOption{no_subsection_in_theo}{\subsectionintheofalse}
+
+\def\iantheo@defaultoptions{
+ \ExecuteOptions{section_in_theo, no_subsection_in_theo}
+ \ProcessOptions
+
+ %%% reset at every new section
+ \ifsectionintheo
+ \let\iantheo@oldsection\section
+ \gdef\section{\setcounter{theocount}{0}\iantheo@oldsection}
+ \fi
+
+ %% reset at every new subsection
+ \ifsubsectionintheo
+ \let\iantheo@oldsubsection\subsection
+ \gdef\subsection{\setcounter{theocount}{0}\iantheo@oldsubsection}
+ \fi
+}
+
+
+%% delimiters
+\def\delimtitle#1{
+ \par%
+ \leavevmode%
+ \raise.3em\hbox to\hsize{%
+ \lower0.3em\hbox{\vrule height0.3em}%
+ \hrulefill%
+ \ \lower.3em\hbox{#1}\ %
+ \hrulefill%
+ \lower0.3em\hbox{\vrule height0.3em}%
+ }%
+ \par\penalty10000%
+}
+
+%% callable by ref
+\def\delimtitleref#1{
+ \par%
+%
+ \ifdefined\ianclass%
+ % hyperref anchor%
+ \hrefanchor%
+ % define tag (for \label)%
+ \xdef\tag{#1}%
+ \fi%
+%
+ \leavevmode%
+ \raise.3em\hbox to\hsize{%
+ \lower0.3em\hbox{\vrule height0.3em}%
+ \hrulefill%
+ \ \lower.3em\hbox{\bf #1}\ %
+ \hrulefill%
+ \lower0.3em\hbox{\vrule height0.3em}%
+ }%
+ \par\penalty10000%
+}
+
+%% no title
+\def\delim{
+ \par%
+ \leavevmode\raise.3em\hbox to\hsize{%
+ \lower0.3em\hbox{\vrule height0.3em}%
+ \hrulefill%
+ \lower0.3em\hbox{\vrule height0.3em}%
+ }%
+ \par\penalty10000%
+}
+
+%% end delim
+\def\enddelim{
+ \par\penalty10000%
+ \leavevmode%
+ \raise.3em\hbox to\hsize{%
+ \vrule height0.3em\hrulefill\vrule height0.3em%
+ }%
+ \par%
+}
+
+
+%% theorem
+% counter
+\newcounter{theocount}
+% booleans (write section or subsection in equation number)
+\def\theo#1{
+ \stepcounter{theocount}
+ \ifdefined\ianclass
+ % hyperref anchor
+ \hrefanchor
+ \fi
+ % the number
+ \def\formattheo{\thetheocount}
+ % add subsection number
+ \ifsubsectionintheo
+ \let\tmp\formattheo
+ \edef\formattheo{\thesubsectioncount.\tmp}
+ \fi
+ % add section number
+ \ifsectionintheo
+ \let\tmp\formattheo
+ \edef\formattheo{\sectionprefix\thesectioncount.\tmp}
+ \fi
+ % define tag (for \label)
+ \xdef\tag{\formattheo}
+ % write
+ \delimtitle{\bf #1 \formattheo}
+}
+\let\endtheo\enddelim
+%% theorem headers with name
+\def\theoname#1#2{
+ \theo{#1}\hfil({\it #2})\par\penalty10000\medskip%
+}
+
+
+%% qed symbol
+\def\qedsymbol{$\square$}
+\def\qed{\penalty10000\hfill\penalty10000\qedsymbol}
+
+
+%% compatibility with article class
+\ifdefined\ianclasstrue
+ \relax
+\else
+ \def\thesectioncount{\thesection}
+ \def\thesubsectioncount{\thesubsection}
+ \def\sectionprefix{}
+\fi
+
+
+%% prevent page breaks after displayed equations
+\newcount\prevpostdisplaypenalty
+\def\nopagebreakaftereq{
+ \prevpostdisplaypenalty=\postdisplaypenalty
+ \postdisplaypenalty=10000
+}
+%% back to previous value
+\def\restorepagebreakaftereq{
+ \postdisplaypenalty=\prevpostdisplaypenalty
+}
+
+
+%% end
+\iantheo@defaultoptions
+\endinput
diff --git a/libs/point.sty b/libs/point.sty
new file mode 100644
index 0000000..9f983dc
--- /dev/null
+++ b/libs/point.sty
@@ -0,0 +1,106 @@
+%%
+%% Points package:
+%% \point commands
+%%
+
+%% TeX format
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+
+%% package name
+\ProvidesPackage{point}[2017/06/13]
+
+%% options
+\newif\ifresetatsection
+\DeclareOption{reset_at_section}{\resetatsectiontrue}
+\DeclareOption{no_reset_at_section}{\resetatsectionfalse}
+\newif\ifresetatsubsection
+\DeclareOption{reset_at_subsection}{\resetatsubsectiontrue}
+\DeclareOption{no_reset_at_subsection}{\resetatsubsectionfalse}
+\newif\ifresetattheo
+\DeclareOption{reset_at_theo}{\resetattheotrue}
+\DeclareOption{no_reset_at_theo}{\resetattheofalse}
+
+\def\point@defaultoptions{
+ \ExecuteOptions{reset_at_section, reset_at_subsection, no_reset_at_theo}
+ \ProcessOptions
+
+ %% reset at every new section
+ \ifresetatsection
+ \let\point@oldsection\section
+ \gdef\section{\resetpointcounter\point@oldsection}
+ \fi
+ %% reset at every new subsection
+ \ifresetatsubsection
+ \let\point@oldsubsection\subsection
+ \gdef\subsection{\resetpointcounter\point@oldsubsection}
+ \fi
+
+ %% reset at every new theorem
+ \ifresetattheo
+ \ifdefined\iantheotrue
+ \let\point@oldtheo\theo
+ \gdef\theo{\resetpointcounter\point@oldtheo}
+ \fi
+ \fi
+}
+
+
+%% point
+% counter
+\newcounter{pointcount}
+\def\point{
+ \stepcounter{pointcount}
+ \setcounter{subpointcount}{0}
+ % hyperref anchor (only if the class is 'ian')
+ \ifdefined\ifianclass
+ \hrefanchor
+ % define tag (for \label)
+ \xdef\tag{\thepointcount}
+ \fi
+ % header
+ \indent{\bf \thepointcount\ - }
+}
+
+%% subpoint
+% counter
+\newcounter{subpointcount}
+\def\subpoint{
+ \stepcounter{subpointcount}
+ \setcounter{subsubpointcount}0
+ % hyperref anchor (only if the class is 'ian')
+ \ifdefined\ifianclass
+ \hrefanchor
+ % define tag (for \label)
+ \xdef\tag{\thepointcount-\thesubpointcount}
+ \fi
+ % header
+ \indent\hskip.5cm{\bf \thepointcount-\thesubpointcount\ - }
+}
+
+%% subsubpoint
+% counter
+\newcounter{subsubpointcount}
+\def\subsubpoint{
+ \stepcounter{subsubpointcount}
+ % hyperref anchor (only if the class is 'ian')
+ \ifdefined\ifianclass
+ \hrefanchor
+ % define tag (for \label)
+ \xdef\tag{\thepointcount-\thesubpointcount-\thesubsubpointcount}
+ \fi
+ \indent\hskip1cm{\bf \thepointcount-\thesubpointcount-\thesubsubpointcount\ - }
+}
+
+
+%% reset point counters
+\def\resetpointcounter{
+ \setcounter{pointcount}{0}
+ \setcounter{subpointcount}{0}
+ \setcounter{subsubpointcount}{0}
+}
+
+
+
+%% end
+\point@defaultoptions
+\endinput