Longueurs
Une longueur est une mesure de distance. Beaucoup de commandes LaTeX prennent une longueur en argument.
Il y a deux types de longueur. Une longueur rigide telle que 10pt ne contient pas de composante en plus ou minus. (En TeX de base on appelle cela une dimen). Une longueur élastique (ce qu’en TeX de base on appel un skip ou une glue) telle que dans 1cm plus0.05cm minus0.01cm peut contenir l’un ou l’autre de ces composantes ou les deux. Dans cette longueur élastique, le 1cm est la longueur naturelle alors que les deux autres, les composantes en plus et minus, permette à TeX à dilater ou contracter la longueur pour optimiser la disposition.
Les exemples qui suivent utilisent ces deux commandes.

% Fait une barre noire de 10pt de haut et #1 de large
\newcommand{\blackbar}[1]{\rule{#1}{10pt}}

% Fait une boîte autour de #2 qui est #1 de large (sans la bordure)
\newcommand{\showhbox}[2]{%
  \fboxsep=0pt\fbox{\hbox to #1{#2}}}

Cet exemple utilise ces commandes pour afficher une barre noire de 100 points de long entre ‘XXX’ et ‘YYY’. Cette longueur est rigide.

XXX\showhbox{100pt}{\blackbar{100pt}}YYY

Quant au longueur élastiques, la contraction est le plus simple des deux : avec 1cm minus 0.05cm, la longueur naturelle est 1cm mais TeX peut la contracter jusqu’à 0,95cm. TeX refuse de contracter plus que cela. Ainsi, ci-dessous le premier \showhbox fonctionne bien, un espace de 98 points étant produit entre les deux barres.

XXX\showhbox{300pt}{%
  \blackbar{101pt}\hspace{100pt minus 2pt}\blackbar{101pt}}YYY

XXX\showhbox{300pt}{%
  \blackbar{105pt}\hspace{100pt minus 1pt}\blackbar{105pt}}YYY

Mais le second produit un avertissement du genre de ‘Overfull \hbox (1.0pt too wide) detected at line 17’. En sortie le premier ‘Y’ est écrasé par la fin de la barre noire, parce que la matière contenue par la boîte est plus large que les 300pt alloués, et que TeX a refusé de contracter le total en deçà de 309 points.
Dilater est similaire à contracter, à ceci près que si TeX doit dilater plus que la quantité disponible, alors il le fait. Ci-dessous la première ligne fonctionne bien, et produit un espace de 110 points entre les barres.

XXX\showhbox{300pt}{%
  \blackbar{95pt}\hspace{100pt plus 10pt}\blackbar{95pt}}YYY

XXX\showhbox{300pt}{%
  \blackbar{95pt}\hspace{100pt plus 1pt}\blackbar{95pt}}YYY

Dans la seconde ligne TeX a besoin de dilater de 10 points alors que seulement 1 point a été spécifié. TeX dilate l’espace jusqu’à la longueur requise mais il produit un avertissement du genre de ‘Underfull \hbox (badness 10000) detected at line 22’. (On ne discute pas ici de ce que signifie « badness »).
Il est possible de mettre à la fois de la dilatation et de la contraction dans la même longueur, comme dans 1ex plus 0.05ex minus 0.02ex.
Si TeX ajuste plus d’une longueur élastique alors il alloue la dilatation ou la contraction proportionnellement.

XXX\showhbox{300pt}{%
  \blackbar{100pt}%  gauche
  \hspace{0pt plus 50pt}\blackbar{80pt}\hspace{0pt plus 10pt}%  milieu
  \blackbar{100pt}}YYY  % droite

Les barres de gauche et de droite prennent 100 points, de sorte que celle du milieu a besoin également de 100. La barre du milieu fait 80 points et donc les deux \hspace doivent se dilater de 20 points. Comme les deux sont plus 50pt et plus 10pt, TeX obtient 5/6 de la dilatation du premier espace et 1/6 du second.
La composante plus ou minus d’une longueur élastique peut contenir un composante en fill, comme dans 1in plus2fill. Cela donne à la longueur une dilatabilité ou contractibilité infinie de sorte que TeX puisse l’ajuster à n’importe quelle distance. Dans l’exemple suivant les deux figures sont également espacées horizontalement sur la page.

\begin{minipage}{\linewidth}
  \hspace{0pt plus 1fill}\includegraphics{godel.png}%
  \hspace{0pt plus 1fill}\includegraphics{einstein.png}%
  \hspace{0pt plus 1fill}
\end{minipage}

TeX a trois niveaux d’infinité pour les composantes élastiques : fil, fill, et filll dans l’ordre d’infinité croissante. D’ordinaire les auteurs de documents n’utilisent que celle du milieu (voir \hfill et voir \vfill).
Multiplier une longueur élastique par un nombre la transforme en une longueur rigide, de sorte qu’après \setlength{\ylength}{2.5cm plus 0.5cm} et \setlength{\zlength}{3\ylength} alors la valeur de \zlength est 2.5cm.

Unités de longueur
TeX et LaTeX connaissent ces unités aussi bien en mode mathématique qu’en dehors de celui-ci.
pt 	 Point (1/72,27)pouce. La conversion (approximative) en unités métriques est 1point = 0,35146mm = 0,035146cm.
pc 	 Pica, 12pt
in 	 Pouce, 72,27pt
bp 	 Big point, 1/72 pouce. Cette longueur est la définition d’un point en PostScript et dans beaucoup d’autres systèmes bureautiques d’éditique (PAO).
mm 	 Millimètre, 2,845pt
cm 	 Centimètre, 10mm
dd 	 Point Didot, 1,07pt
cc 	 Cicéro, 12dd, encore appelé douze.
sp 	 Point proportionné, (1/65536)pt
Trois autres unités sont définies en fonction de la fonte courante, plutôt que comme des dimensions absolues.
ex 	 La hauteur ex d’un x de la fonte courante , traditionnellement la hauteur de la lettre x en bas de casse, est souvent utilisée pour les longueurs verticales.
em 	 De même le em, traditionnellement la largeur de la lettre M capitale, est souvent utilisée pour les longueurs horizontales. C’est également souvent la taille de la fonte en cours, par exemple une fonte nominalement en 10pt a 1em = 10pt. LaTeX a plusieurs commandes pour produire de l’espace horizontal basé sur le em (voir \enspace & \quad & \qquad).
mu 	 Finalement, en mode mathématique, beaucoup de définitions sont exprimées dans l’unité mathématique mu donnée par 1em = 18mu, où le em est pris de la famille courante des symboles mathématiques. Voir Spacing in math mode.
L’utilisation de ces unités peut aider améliorer le fonctionnement d’une définition lors des changements de fonte. Par exemple, il est plus probable qu’une définition de l’espace verticale entre les articles d’une liste donnée comme \setlength{\itemsep}{1ex plus 0.05ex minus 0.01ex} reste raisonnable si la fonte est changée que si elle était exprimée en points.

\setlength
Synopsis :

\setlength{\longueur}{quantité}

La commande \setlength règle la longueur \longueur à quantité. Le nom \longueur doit être une séquence de contrôle (voir Control sequences), et donc commencer par une controblique \ dans les circonstances normales. La quantité peut être une longueur élastique (voir Lengths). Elle peut être positive, négative ou nulle, et peut être exprimée dans n’importe quelle unité comprise par LaTeX (voir Units of length).
Ci-dessous, avec les réglages par défaut de LaTeX le premier paragraphe est renfoncé alors que le second ne l’est pas.

J'ai dit au docteur que je m'étais cassé la jambe à deux endroits.

\setlength{\parindent}{0em}
Il me répondit d'arrêter d'aller à ces endroits.

Si vous n’avez pas déclaré \longueur avec \newlength, par exemple si vous faites une faute de frappe dessus comme dans \newlength{\specparindent}\setlength{\sepcparindent}{...}, alors vous obtiendrez une erreur du genre de ‘Undefined control sequence. <argument> \sepcindent’. Si vous oubliez la controblique au début du nom de la longueur alors vous obtiendrez une erreur du genre de ‘Missing number, treated as zero.’.

\addtolength
Synopsis :

\addtolength{\longueur}{quantité}

Incrémente la longueur \longueur par quantité. Le nom \longueur doit être une séquence de contrôle (voir Control sequences), et donc commencer par une controblique \ dans les circonstances normales. La quantité peut être une longueur élastique (voir Lengths). Elle peut être positive, négative ou nulle, et peut être exprimée dans n’importe quelle unité comprise par LaTeX (voir Units of length).
Dans l’exemple ci-dessous, si \parskip commence avec la valeur 0pt plus 1pt

Docteur : comment va le garçon qui a avalé une monnaie en argent ?
\addtolength{\parskip}{1pt}

Infirmière : aucun changement.

alors il a la valeur 1pt plus 1pt pour le second paragraphe.
Si vous n’avez pas déclaré la longueur \longueur avec \newlength, par exemple si vous faites une faute de frappe dessus comme dans \newlength{\specparindent}\addtolength{\sepcparindent}{...}, alors vous obtiendrez une erreur du genre de ‘Undefined control sequence. <argument> \sepcindent’. Si c’est la quantité qui utilise une longueur qui n’a pas été déclarée, par exemple si vous faites la faute de frappe comme cela \addtolength{\specparindent}{0.6\praindent}, alors vous obtenez une erreur du genre de ‘Undefined control sequence. <argument> \praindent’. Si vous oubliez la controblique au début du nom de la longueur, comme dans \addtolength{parindent}{1pt}, alors vous obtiendrez quelque chose du genre de ‘You can't use `the letter p' after \advance’.

\settodepth
Synopsis :

\settodepth{\longueur}{texte}

La commande \settodepth règle la longueur \longueur à la profondeur de la boîte que LaTeX obtient en composant l’argument texte. Le nom \longueur doit être une séquence de contrôle (voir Control sequences), et donc commencer par une controblique \ dans les circonstances normales.
L’exemple ci-dessous imprime la profondeur maximale des descendantes de l’alphabet :

\newlength{\alphabetdepth}
\settodepth{\alphabetdepth}{abcdefghijklmnopqrstuvwxyz}
\the\alphabetdepth

Si vous n’avez pas déclaré la longueur \longueur avec \newlength, par exemple si vous faites une faute de frappe dans l’exemple ci-dessus comme dans \settodepth{\aplhabetdepth}{abc...}, alors vous obtiendrez quelque chose du genre de ‘Undefined control sequence. <argument> \aplhabetdepth’. Si vous oubliez la controblique au début du nom de la longueur, comme dans \settodepth{alphabetdepth}{...} alors vous obtiendrez quelque chose du genre de ‘Missing number, treated as zero. <to be read again> \setbox’.

\settoheight
Synopsis :

\settoheight{\longueur}{texte}

La commande \settoheight règle la longueur \longueur à la hauteur de la boîte que LaTeX obtient en composant l’argument texte. Le nom \longueur doit être une séquence de contrôle (voir Control sequences), et donc commencer par une controblique \ dans les circonstances normales.
L’exemple suivant imprime la hauteur maximale des ascendantes de l’alphabet ASCII bas de casse :

\newlength{\alphabetheight}
\settoheight{\alphabetheight}{abcdefghijklmnopqrstuvwxyz}
\the\alphabetheight

Si vous n’avez pas déclaré la longueur \longueur avec \newlength, par exemple si vous faites une faute de frappe dans l’exemple ci-dessus comme dans \settoheight{\aplhabetheight}{abc...}, alors vous obtiendrez quelque chose du genre de ‘Undefined control sequence. <argument> \aplhabetdepth’. Si vous oubliez la controblique au début de \longueur, comme dans \settoheight{alphabetheight}{...} alors vous obtiendrez quelque chose du genre de ‘Missing number, treated as zero. <to be read again> \setbox’.

\settowidth
Synopsis :

\settowidth{\longueur}{texte}

La commande \settowidth règle la longueur \longueur à la largeur de la boîte que LaTeX obtient en composant l’argument texte. Le nom \longueur doit être une séquence de contrôle (voir Control sequences), et donc commencer par une controblique \ dans les circonstances normales.
L’exemple suivant imprime la largeur de l’alphabet ASCII bas de casse :

\newlength{\alphabetwidth}
\settowidth{\alphabetwidth}{abcdefghijklmnopqrstuvwxyz}
\the\alphabetwidth

Si vous n’avez pas déclaré la longueur \longueur avec \newlength, par exemple si vous faites une faute de frappe dans l’exemple ci-dessus comme dans \settowidth{\aplhabetwidth}{abc...}, alors vous obtiendrez quelque chose du genre de ‘Undefined control sequence. <argument> \aplhabetwidth’. Si vous oubliez la controblique au début de \longueur, comme dans \settowidth{alphabetwidth}{...} alors vous obtiendrez quelque chose du genre de ‘Missing number, treated as zero. <to be read again> \setbox’.

Expressions
Synopsis, l’un parmi :

\numexpr expression
\dimexpr expression
\glueexpr expression
\muglue expression

En tout lieu où vous pourriez écrire un entier, une dimen, une muglue ou une glue de TeX, vous pouvez à la place écrire une expression pour écrire ce genre de quantité.
Un exemple est que \the\dimexpr\linewidth-4pt\relax produit en sortie la longueur égale à quatre points de moins que la largeur de la ligne (le seul usage de \the est d’afficher le résultat dans le document). De même, \romannumeral\numexpr6+3\relax produit ‘ix’, et \the\glueexpr 5pt plus 1pt * 2 \relax produit ‘10.0pt plus 2.0pt’.
Une commodité ici par rapport à effectuer les calculs en allouant des registres et en utilisant \advance, etc., est que l’évaluation d’expression n’implique par d’affectations et peut donc être effectuée à des endroits où les affectations ne sont pas autorisées. L’exemple suivant calcule la largeur de la \parbox.

\newlength{\offset}\setlength{\offset}{2em}
\begin{center}
\parbox{\dimexpr\linewidth-\offset*3}{Sans animosité envers
quiconque, charitables envers tous, et sûrs de notre droit en tant que
Dieu nous en accorde conscience, mettons-nous à l'œuvre afin d'achever
la tâche qui nous occupe, de panser les blessures de notre nation, de
porter soin à l'homme qui a affronté le combat et soulagement à sa veuve
et à son orphelin, enfin de faire tout pour réaliser et honorer une paix
juste et durable entre nous et avec toutes les nations.  --- Abraham
Lincoln, second discours d'investiture, inscrit dans le mémorial
Lincoln}
\end{center}

L’expression consiste en un ou plusieurs termes du même type (entier, dimension, etc.) qui sont ajoutés ou soustraits. Un terme est un type de nombre, dimension, etc., et consiste en un facteur de ce type, optionnellement multiplié ou divisé par des facteurs. Un facteur d’un type est soit une quantité de ce type ou une sous-expression parenthésés. L’expression produit un résultat du type donné, de sorte que \numexpr produit un entier, \dimexpr produit une dimension dimension, etc.
Dans l’exemple de citation donné plus haut, changer l’expression en \dimexpr\linewidth-3*\offset produit l’erreur Illegal unit of measure (pt inserted). La raison en est que pour \dimexpr et \glueexpr, l’entrée consiste en une valeur de dimension ou de glue suivie par un facteur multiplicatif optionnel, et non l’inverse. Ainsi \the\dimexpr 1pt*10\relax est valide et produit ‘10.0pt’, mais \the\dimexpr 10*1pt\relax produit l’erreur Illegal unit.
Les expressions absorbent les unités lexicales et effectuent les opérations mathématiques appropriées jusqu’à ce qu’un \relax (qui est absorbé), ou jusqu’à ce que la première unité lexicale non valide soit rencontrée. Ainsi, \the\numexpr2+3px imprime ‘5px’, parce que LaTeX lit le \numexpr2+3, ce qui est composé de nombres, et ensuite trouve la lettre p, qui ne peut pas faire partie d’un nombre. Il termine alors l’expression et produit le ‘5’, suivi par le texte ordinaire ‘px’.
Ce comportement de terminaison est utile dans les comparaisons. Dans \ifnum\numexpr\parindent*2 < 10pt Oui\else Non\fi, le signe inférieur à termine l’expression et le résultat est ‘Non’ (dans un document de classe LaTeX standarde article).
Les expressions peuvent utiliser les opérateurs +, -, * et / ainsi que les parenthèses pour les sous-expressions, (...). Dans les expressions glue les parties en plus et minus ne nécessitent pas de parenthèses pour être affectés par un facteur. Ainsi le résultat de \the\glueexpr 5pt plus 1pt * 2 \relax est ‘10pt plus 2pt’.
TeX convertit les autres types numériques de la même façon que lorsqu’il fait une affectation à un registre. Ainsi le résultat de \the\numexpr\dimexpr 1pt\relax\relax est ‘65536’, ce qui est 1pt exprimé en points proportionnés (voir sp, l’unité interne de TeX) et ensuite converti en entier. Si ça avait été une \glueexpr, on aurait laissé tomber la dilatation et la contraction. Dans l’autre sens, une \numexpr au sein d’une \dimexpr ou d’une \glueexpr nécessite l’ajout d’unité appropriées, comme dans \the\dimexpr\numexpr 1 + 2\relax pt\relax, ce qui produit ‘3.0pt’.
Voici les détails de l’arithmétique : chaque facteur est vérifié comme étant compris dans l’intervalle autorisé, les nombres doivent être inférieurs à 2^{31} en valeur absolue, et les composantes de dimensions ou glues doivent être inférieures à 2^{14} points, ou mu, ou fil, etc. Les opérations arithmétiques sont effectuées individuellement, sauf pour les opérations de dilatation (une multiplication immédiatement suivie d’une division) qui sont faites comme une opération combinée avec un produit sur 64-bit comme valeur intermédiaire. Le résultat de chaque opération est de nouveau vérifié comme appartenant à l’intervalle autorisé.
Finalement, on notera que les divisions et dilatations sont faites avec un arrondi au plus proche (contrairement à l’opération \divide de TeX qui prend un arrondi vers zéro). Ainsi \the\dimexpr 5pt*(3/2)\relax met ‘10.0pt’ dans le document, parce qu’il arrondit 3/2 en 2, tandis que \the\dimexpr 5pt*(4/3)\relax produit ‘5.0pt’.