---
myst:
html_meta:
keywords: LuaTeX,callback,Lua,LuaLaTeX
---
# Qu'est-ce qu’un _callback_ ?
Les _callbacks_, ou _fonctions de rappel_ en bon français, sont des fonctions
accessibles par l’utilisateur qui implémentent les opérations internes de TeX ;
celles-ci peuvent être améliorées en les combinant avec d’autres fonctions ad
hoc, mais on peut aussi les remplacer complètement. Ces _callbacks_ ne sont
accessibles qu’avec le [moteur LuaTeX](luatex.md) qui est un moteur TeX
incluant un interpréteur Lua. Tous les _callbacks_ sont écrits en [Lua](wpfr:Lua).
Les fonctions enregistrées comme des _callbacks_ interviennent donc
dans une séquence d’actions qui constitue le traitement par le moteur TeX lors
de la composition d’un document.
Les _callbacks_ sont donc des portes d’entrées à différentes étapes de la
production d’un document. La plupart des fonctions des _callbacks_ recevront des
arguments (et doivent donc être définies pour les gérer) et, surtout, beaucoup
sont censées renvoyer des valeurs.
La liste des _callbacks_ accessibles [est
impressionnante](https://wiki.luatex.org/index.php/Callbacks). Ils permettent
d’avoir accès aux mécanismes :
- de recherche de fichiers ;
- de lecture de fichiers ;
- de traitement de fichiers ;
- de traitement des nœuds (notamment pour fabriquer les paragraphes, mais aussi
pour la fabrication des pages) ;
- de traitement des rapports de TeX ;
- de gestion des fonctionnalités PDF ;
- etc.
Pour lister l’ensemble des _callbacks_ disponibles à partir d’un document
LuaTeX, on pourra compiler le document suivant :
```{noedit}
\documentclass{article}
\usepackage[width=8cm]{geometry}
\pagestyle{empty}
\begin{document}
\directlua{
info = callback.list()
for k, v in pairs(info) do
print(k)
end
}%
\end{document}
```
Ce code produit la liste suivante :
- `pre_dump`
- `show_lua_error_hook`
- `show_warning_message`
- `start_page_number`
- `open_read_file`
- `hpack_quality`
- `read_type1_file`
- `find_read_file`
- `process_input_buffer`
- `process_rule`
- `vpack_filter`
- `stop_run`
- `finish_pdffile`
- `read_enc_file`
- `find_font_file`
- `start_run`
- `find_cidmap_file`
- `finish_pdfpage`
- `read_truetype_file`
- `pre_linebreak_filter`
- `find_truetype_file`
- `start_file`
- `kerning`
- `read_opentype_file`
- `font_descriptor_objnum_provider`
- `read_data_file`
- `read_map_file`
- `input_level_string`
- `find_image_file`
- `glyph_not_found`
- `wrapup_run`
- `make_extensible`
- `process_jobname`
- `find_vf_file`
- `find_type1_file`
- `define_font`
- `find_output_file`
- `glyph_info`
- `process_output_buffer`
- `finish_synctex`
- `page_order_index`
- `append_to_vlist_filter`
- `provide_charproc_data`
- `find_pk_file`
- `read_pk_file`
- `process_pdf_image_content`
- `read_cidmap_file`
- `buildpage_filter`
- `new_graf`
- `hpack_filter`
- `glyph_stream_provider`
- `find_write_file`
- `find_format_file`
- `build_page_insert`
- `call_edit`
- `contribute_filter`
- `insert_local_par`
- `linebreak_filter`
- `find_opentype_file`
- `stop_page_number`
- `stop_file`
- `find_map_file`
- `read_vf_file`
- `vpack_quality`
- `find_enc_file`
- `hyphenate`
- `show_error_message`
- `mlist_to_hlist`
- `show_error_hook`
- `pre_output_filter`
- `read_font_file`
- `find_data_file`
- `ligaturing`
- `post_linebreak_filter`
## Enregistrer un _callback_
Il y a deux types de _callbacks_ : ceux qui étendent la fonctionnalité existante
avec une nouvelle, et ceux qui (quand cela est possible) remplacent la
fonctionnalité existante. Évidemment, lorsqu’on remplace la fonctionnalité
existante, il est attendu que notre nouvelle définition fonctionne de façon
similaire. Pour enregistrer un des _callbacks_ listés ci-dessus, on utilisera la
syntaxe (Lua) suivante :
```lua
id, error = callback.register( callback_name, func)
```
Si l’on souhaite rétablir le comportement par défaut, il suffira d’exécuter le
code suivant :
```lua
id, error = callback.register( callback_name, nil)
```
## Avec LuaLaTeX
Les fonctions ci-dessus sont celles du moteur LuaTeX. L’utilisation du format
LaTeX peut poser quelques problèmes. David Carlisle et Joseph Wright ont
développé le package (présent dans le noyau LaTeX) qui fournit
des commandes TeX et des fonctions Lua adaptées au format. En particulier, on
utilisera les fonctions, aux noms plus explicites :
```lua
luatexbase.add_to_callback( callback_name, func, description)
```
et
```lua
luatexbase.remove_from_callback( callback, description)
```
:::{sources}
[Maxime Chupin, _Lua(La)TeX : comment avoir accès à la fabrication d’un paragraphe ?_, la _Lettre GUTenberg_, numéro 53, p. 36-58](https://publications.gutenberg-asso.fr/lettre/article/view/169)
:::