---
myst:
html_meta:
keywords: LaTeX, composition, document, création d'un document,
hasard,aléatoire,renvoi
---
# Comment renvoyer à une page choisie au hasard dans le document courant ?
Il est possible de créer un lien "page au hasard" en utilisant LuaLaTeX.
Cette page sera attribuée au lien de manière aléatoire durant la compilation.
Dès lors, en cliquant plusieurs fois sur le même lien, vous serez toujours
dirigé vers la même page.
Pour cela, vous pouvez utiliser Lua pour générer au hasard le numéro d'une page
(entre 1 et le nombre total de pages du documents), puis créer un lien
avec `hyperref` renvoyant vers la page correspondante. Il existe
plusieurs moyens d'obtenir le nombre total de pages du document courant ; ils
sont détaillés à la question
"[](/3_composition/document/document_metadonnee/combien_de_pages_a_mon_document)".
La technique retenue fonctionne avec n'importe quelle classe de document
à condition d'avoir une version de LaTeX suffisamment récente.
Comme le programme doit connaître le nombre total de pages du document,
il faut compiler celui-ci au moins deux fois.
```
%!TEX engine=lualatex
\documentclass[a5paper,latin]{memoir}
\usepackage{babel} % Réglages linguistiques
\usepackage{lipsum} % Du faux texte
\usepackage{luacode}
\usepackage{hyperref}
\newcommand{\versPageAleatoire}{%
% folioAleatoire() est une fonction définie infra en Lua.
\hyperlink{page.\directlua{tex.print(folioAleatoire())}}
{Vers une page au hasard}%
}
\makepagestyle{headings}
% en-tête (fausse page): {gauche}{centre}{droite}
\makeevenhead{headings}{\thepage}{}{}
% en-tête (belle page): {gauche}{centre}{droite}
\makeoddhead{headings}{}{}{\thepage}
% pied de page (fausse page): {gauche}{centre}{droite}
\makeevenfoot{headings}{}{\versPageAleatoire}{}
% pied de page (belle page): {gauche}{centre}{droite}
\makeoddfoot{headings}{}{\versPageAleatoire}{}
\begin{luacode}
-- Initialiser le générateur de nombres aléatoires
math.randomseed(math.random(1,10000), math.random(1,10000))
local function nbTotalPages()
-- Le compteur totalPages est défini infra après begin{document}
local counter = tex.getcount("totalPages")
if counter < 2 then return 2 else return counter end
end
function folioAleatoire()
-- Générer un nombre entier aléatoire
-- compris entre 1 et et le numéro du dernier folio du présent document.
local folio = math.random(1, nbTotalPages())
-- On évite de renvoyer à la page sur laquelle se trouve le lien.
if folio == tex.getcount("c@page") then
return folioAleatoire()
else
return folio
end
end
\end{luacode}
\begin{document}
% Il faut stocker dans un compteur le nombre total de pages
% écrit dans le fichier auxiliaire lors de la précédente compilation,
% de manière à pouvoir récupérer cette valeur avec tex.getcount dans Lua.
% On pourrait utiliser le compteur dédié spécifique à la classe memoir
% ou une extension, mais la solution indiquée ici devrait fonctionner
% avec n'importe quelle installation LaTeX récente.
% Ce code doit toujours se trouver après \begin{document}.
\makeatletter
\newcount\totalPages
\totalPages=\@abspage@last
\makeatother
\lipsum[1-20]
\end{document}
```
:::{sources}
- Une solution proposée par Thomas Savary sur la liste `gut@ens.fr`.
:::