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 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 qui est un moteur incluant un interpréteur Lua. Tous les callbacks sont écrits en Lua.

Les fonctions enregistrées comme des callbacks interviennent donc dans une séquence d’actions qui constitue le traitement par le moteur 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. 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

  • de gestion des fonctionnalités PDF ;

  • etc.

Pour lister l’ensemble des callbacks disponibles à partir d’un document on pourra compiler le document suivant :

\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

1.  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 :

id, error = callback.register(<string> callback_name, <function> func)

Si l’on souhaite rétablir le comportement par défaut, il suffira d’exécuter le code suivant :

id, error = callback.register(<string> callback_name, nil)

2.  Avec #

Les fonctions ci-dessus sont celles du moteur L’utilisation du format peut poser quelques problèmes. David Carlisle et Joseph Wright ont développé le package ltluatex (présent dans le noyau qui fournit des commandes et des fonctions Lua adaptées au format. En particulier, on utilisera les fonctions, aux noms plus explicites :

luatexbase.add_to_callback(<string> callback_name, <function> func, <string> description)

et

luatexbase.remove_from_callback(<string> callback, <string> description)