# Hey, Emacs!  This is a -*- mode: org -*- file!

#+TITLE:     Support for the newsletter “La Lettre GUTenberg”
#+AUTHOR:    Association GUTenberg
#+EMAIL:     secretariat@gutenberg-asso.fr
#+DESCRIPTION: ...
#+KEYWORDS:  ...
#+LANGUAGE:  en
#+OPTIONS:   num:t toc:nil title:nil

#+LATEX_COMPILER: lualatex

#+LaTeX_CLASS: letgut
#+LaTeX_HEADER: \setmainfont{KpRoman}
#+LaTeX_HEADER: \setsansfont{KpSans}
#+LaTeX_HEADER: \setmonofont[Scale = MatchLowercase]{RobotoMono}
#+LaTeX_HEADER: \letgutsetup{editorial=false}
#+LaTeX_HEADER: \input{listings-conf}
# #+LaTeX_HEADER: \input{codehigh-conf}
#+LaTeX_HEADER: \letgutsetup{detailedtoc}
# #+LaTeX_HEADER: \letgutsetup{editorial=false,final}

#+PROPERTY: header-args :padline no :mkdirp yes :tangle ../../../tex/lualatex/letgut/letgut.cls :exports both :noweb yes :eval always
#+export_file_name: ../../../doc/lualatex/letgut/letgut-code

* Ctanomat file                                                       :noexport:
:PROPERTIES:
:CUSTOM_ID: Ctanomatfile-2uoc55h0jlj0
:END:

We create here a ~ctanomat~ description file in order to simplify the upload of
new versions of the class on CTAN.

#+begin_src markdown :tangle ../../../letgut.pkg
  % This is a description file for ctan-o-mat.
  % It manages uploads of a package to
  % CTAN -- the Comprehensive TeX Archive Network.
  %
  % The syntax is roughly oriented towards (La)TeX.
  % Two form of the macros are used. The simple macros take one argument
  % in braces. Here the argument may not contain embedded macros.
  %
  % The second form uses an environment enclosed in \begin{}/\end{}.
  % In the long text fields logo macros can be used.
  %
  % You should enter your values between the begin and the end of the
  % named type.
  % -------------------------------------------------------------------------
  % This field contains the CTAN id of the package.
  % The value is optional.
  % The value is restricted to 32 characters.
  \pkg{letgut}
  % -------------------------------------------------------------------------
  % This field contains the version of the package.
  % The value is optional.
  % The value is restricted to 32 characters.
  \version{0.9.13 2025-10-26}
  % -------------------------------------------------------------------------
  % This field contains the name of the author(s).
  % The value is optional.
  % The value is restricted to 128 characters.
  \author{Association GUTenberg}
  % -------------------------------------------------------------------------
  % This field contains the email address of the uploader.
  % The value is an email address.
  % The value is restricted to 255 characters.
  \email{secretariat@gutenberg-asso.fr}
  % -------------------------------------------------------------------------
  % This field contains the name of the uploader.
  % The value is restricted to 255 characters.
  \uploader{Denis Bitouzé}
  % -------------------------------------------------------------------------
  % This field contains the directory on CTAN.
  % The value is optional.
  % The value is restricted to 255 characters.
  \ctanPath{/macros/luatex/latex/letgut}
  % -------------------------------------------------------------------------
  % This field contains the license.
  % The value is optional.
  % The value is restricted to 2048 characters.
  % Multiple values are allowed.
  \license{lppl1.3c}
  % -------------------------------------------------------------------------
  % This field contains the URL of the home page.
  % The value is optional.
  % The value is a URL.
  % The value is restricted to 255 characters.
  % Multiple values are allowed.
  \home{}
  % -------------------------------------------------------------------------
  % This field contains the URL of the bug tracker.
  % The value is optional.
  % The value is a URL.
  % The value is restricted to 255 characters.
  % Multiple values are allowed.
  \bugtracker{https://gitlab.gutenberg-asso.fr/gutenberg/letgut/-/issues}
  % -------------------------------------------------------------------------
  % This field contains the support channel.
  % The value is optional.
  % The value is a URL.
  % The value is restricted to 255 characters.
  % Multiple values are allowed.
  \support{}
  % -------------------------------------------------------------------------
  % This field contains the version management.
  % The value is optional.
  % The value is a URL.
  % The value is restricted to 255 characters.
  % Multiple values are allowed.
  \repository{https://gitlab.gutenberg-asso.fr/gutenberg/letgut}
  % -------------------------------------------------------------------------
  % This field contains the developer's channel.
  % The value is optional.
  % The value is a URL.
  % The value is restricted to 255 characters.
  % Multiple values are allowed.
  \development{https://gitlab.gutenberg-asso.fr/gutenberg/letgut/-/merge_requests}
  % -------------------------------------------------------------------------
  % This field contains the update indicator; true for update.
  % The value is optional.
  % The value is restricted to 8 characters.
  \update{true}
  % -------------------------------------------------------------------------
  % This field contains the topics id.
  % The value is optional.
  % The value is restricted to 1024 characters.
  % Multiple values are allowed.
  \topic{}
  % -------------------------------------------------------------------------
  % This field contains the text for the mail announcement.
  % The value is optional.
  % The value is restricted to 8192 characters.
  \begin{announcement}
  \end{announcement}
  % -------------------------------------------------------------------------
  % This field contains the one-liner for the package.
  % The value is optional.
  % The value is restricted to 128 characters.
  \summary{Class for the newsletter “La Lettre GUTenberg” of the French TeX User Group GUTenberg}
  % -------------------------------------------------------------------------
  % This field contains the descriptive abstract for the package.
  % The value is optional.
  % The value is restricted to 4096 characters.
  \begin{description}
  # English

  The French TeX User Group GUTenberg has been publishing “The GUTenberg Letter”,
  its irregular newsletter, since February 1993.

  For this purpose, a dedicated, in-house (La)TeX class was gradually created but,
  depending on new needs and on the people who were publishing the Newsletter, its
  development was somewhat erratic; in particular, it would not have been possible
  to publish its code as it was. In addition, its documentation was non-existent.

  The Board of Directors of the association, elected in November 2020, wished to
  provide a better structured, more perennial and documented class, able to be
  published on the CTAN. This is now done with the present `letgut` class.

  # French

  L'association GUTenberg publie « La Lettre GUTenberg », son bulletin
  irrégulomestriel, depuis février 1993.

  Pour ce faire, une classe (La)TeX dédiée, maison, a peu à peu vu le jour mais,
  au gré des nouveaux besoins et des personnes qui ont assuré la publication de la
  Lettre, son développement a été quelque peu erratique ; il n'aurait notamment
  pas été possible de publier son code en l'état. En outre, sa documentation était
  inexistante.

  Le Conseil d'Administration de l'association, élu en novembre 2020, a souhaité
  fournir une classe mieux structurée, davantage pérenne et documentée, à même
  d'être publiée sur le CTAN. C'est désormais chose faite avec la présente classe
  `letgut`.
  \end{description}
  % -------------------------------------------------------------------------
  % This field contains the note to the CTAN upload managers.
  % The value is optional.
  % The value is restricted to 2048 characters.
  \begin{note}
  \end{note}
  % -------------------------------------------------------------------------
  % This field contains the archive file.
  % The value is the file name of the archive to be uploaded.
  % It may have a relative or absolute directory.
  \file{../dtx-forge/letgut.zip}
#+end_src

* Changelog file                                                      :noexport:
:PROPERTIES:
:CUSTOM_ID: Changelogfile-2buc55h0jlj0
:END:

#+begin_src markdown :tangle ../../../doc/lualatex/letgut/CHANGELOG.md
  # Changelog
  All notable changes to this project will be documented in this file.

  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
  and this project adheres to [Semantic
  Versioning](https://semver.org/spec/v2.0.0.html).

  ## [Unreleased]

  ## [0.9.13] - 2025-10-26

  ### Fixed
  - Fatal error in case of to be attached files not found
  - Breakable space after “Exemple”
  - Bad kerning for `\Cahiers`
  - Wrong indentation of local ToCs when containing subtitles (#75)
  - Remove the vertical spaces occupied by the titles of local tables of contents

  ### Changed
  - Smaller icons for attached files
  - GUTenberg's informations updated (#65)
  - Softwares names now in sans serif rather than in typewriter (#66)
  - No colon after packages/classes names (#71)
  - Endash instead of colon as caption separator (#81)

  ### Added
  - License in the README file
  - Command for DTK (#67)
  - Command for “liste GUT” (#77)

  ## [0.9.12] - 2024-10-30

  ### Fixed
  - Compilation failure

  ## [0.9.11] - 2024-10-23

  ### Fixed
  - Bibliographic files not attached to the PDF

  ## [0.9.10] - 2024-10-07

  ### Changed
  - Multiple rebuses handled
  - Paper clips (links to source files of the articles) not in the magin anymore and separated by spaces
  - Watermark letter and scale can now be specified

  ### Fixed
  - Wrong output with \terminal
  - Title of publication in small capitals
  - Options of `letgut-banner` never taken in account
  - Not all included graphics attached to the PDF
  - Variables wrongly local or not reset
  - `\citeauthor` displayed family name in small caps

  ## [0.9.9] - 2024-03-07

  ### Fixed
  Private scratch variables not declared.

  ## [0.9.8] - 2024-02-29

  ### Changed
  - Drop use of l3keys2e, as advised.
  - Announcements possibly neither in the ToC nor in the bookmarks.

  ### Fixed
  Floats not outside the article they belong to.

  ## [0.9.7] - 2023-05-21

  ### Changed
  Announcement's title and toc entry possibly different (backward compatibility broken!)

  ### Fixed
  `tabularray`'s needed library added.

  ## [0.9.6] - 2023-01-14

  ### Fixed
  Hot fix for the attachment to the Lettre's PDF of its source files.

  ## [0.9.5] - 2023-01-13

  ### Added
  - Files (`.tex` source, images files, bibliographic files, etc.) used to typeset
    an article possibly attached to the Lettre's PDF.
  - Starred version of `\inputarticle` that prevents the previous feature.
  - Boolean option that (un)forces the previous feature.
  - Plural forms `\lettres` and `\lettresgut` of `\lettre` and `\lettregut`.
  - Shortcuts for “(a|A)ssociation GUTenberg”.
  - Starred versions of `\person` and `\author` that sort the lists of
    persons/authors in alphabetic order.
  - Environment for announcements.
  - Environments and commands for rebus and their solutions.

  ### Changed
  - `⅛` replaced by `™` as a short equivalent of ~\lstinline~ (the former is
    considered as math if ~unicode-math~ is loaded).
  - Documentation updated.

  ### Fixed
  Several bugs and sub-optimalities.

  ## [0.9.4] - 2022-10-03

  ### Added
  - Command `\lettrenumber` that displays various Lettre numbers related to the
    one of the current issue.
  - Options of `\lettre` and `\lettregut` that add various Lettre numbers related
    to the one of the current issue.
  - Command `\Ucode` for points and names of Unicode characters.

  ### Changed
  - Documentation improved.

  ## [0.9.3] - 2022-09-02

  ### Changed
  - Local conf. file doesn't require anymore to start with \ExplSyntaxOff in some
    instances.
  - Documentation improved.

  ## [0.9.2] - 2022-06-18

  ### Added
  - Listings for commands in terminals.
  - Aliases of frequently used commands.
  - New commands for frequently used terms or expressions.
  - Command for specifying LaTeX packages that benefit from syntax highlighting.
  - Own ~listings~' language driver file for LaTeX packages syntax highlighting.
  - Commands for keyboard keys of accentuated characters.
  - ~detailedtoc~ option for Lettre's structure checking.
  - Mimic the multiple option of the footmisc package.
  - Command ~\inputarticle~ (instead of ~\input~) for the input of articles.
  - ⅛ as a short equivalent of ~\lstinline~.
  - Some tweaks and improvements.

  ### Changed
  - Last names of persons and authors not in small caps anymore.
  - \tl isn't an acronym anymore and now typesets “TeX Live”.
  - All the acronyms reset at the beginning of each ~\inputarticle~-ed article.
  - All options now possibly load-time ones.
  - Unlikely to change input files searched:
    1. in the parent directory if not in the current one,
    2. in the TDS.
  - Right ISSN in case of “paper” version of la Lettre.

  ### Fixed
  Several bugs.

  ## [0.9.1] - 2022-03-22

  ### Changed
  File renamed (Karl Berry request).

  ## [0.9] - 2022-03-18

  ### Added
  First public testing release.
#+end_src

* Readme file                                                         :noexport:
:PROPERTIES:
:CUSTOM_ID: Readmefile-8xuc55h0jlj0
:END:

#+begin_src markdown :tangle ../../../doc/lualatex/letgut/README.md
letgut - Support for the newsletter “La Lettre GUTenberg”
=========================================================

About
-----
This bundle includes a LaTeX class, a `.sty` file and an acronym file dedicated
to the newsletter “La Lettre GUTenberg” of GUTenberg, the French TeX User Group.

Release
-------
2025-10-26 v0.9.13

Development
-----------
Follow development, submit issues and suggest improvements at
https://gitlab.gutenberg-asso.fr/gutenberg/letgut/.

License
-------
Released under the LaTeX Project Public License v1.3c or later. See
https://www.latex-project.org/lppl.txt#+end_src.
#+end_src

* How to                                                              :noexport:
:PROPERTIES:
:CUSTOM_ID: Howto-565g55h0jlj0
:END:

We explain in a \file*{HOWTO.md} file how to:

- tangle the \file*{letgut.cls} and \file*{letgut-banner.sty},
- build the:
  - documented codes \file*{letgut-code.pdf} and \file*{letgut-banner-code.pdf}
    of the class and the package,
  - \file*{letgut.pdf} of the class,

from the \software[https://orgmode.org/]{Org Mode} source files
\file*{letgut.org} and \file*{letgut-banner.org}.

#+begin_src markdown :tangle HOWTO.md :exports none
In order to:

- tangle the `letgut.cls` and `letgut-banner.sty` files,
- build the documentations `letgut-code.pdf` and `letgut-banner-code.pdf` of the
  codes,

from the Org Mode source files `letgut.org` and `letgut-banner.org`:

- it is necessary to have a reasonably recent version of Emacs,
- it is then sufficient to run (in a directory containing the `build-letgut.el` file
  to be found in the current directory):
  - for the `letgut` class:

        emacs -Q letgut.org --batch -l build-letgut.el -f org-babel-tangle --kill
        emacs -Q letgut.org --batch -l build-letgut.el -f org-latex-export-to-pdf --kill

  - for the `letgut-banner` package:

        emacs -Q letgut-banner.org --batch -l build-letgut.el -f org-babel-tangle --kill
        emacs -Q letgut-banner.org --batch -l build-letgut.el -f org-latex-export-to-pdf --kill

This creates the files `letgut.cls`, `letgut-banner.sty`, `letgut-code.tex` and
`letgut-banner-code.tex`.

One can then build the PDF files `letgut-code.pdf` and `letgut-banner-code.pdf`
by running `latexmk` on each of the corresponding `.tex` files in a directory
containing the following files to be found in the `.../doc/lualatex/letgut`
directory: `latexmkrc`, `letgut.bib`, `letgut-code.pdf`, `letgut-code.tex`,
`letgut.pdf`, `letgut.tex`, `listings-conf.tex`, `localconf.tex`, `README.md`,
`xindex-letgut.lua`.

Likewise, the user documentation `letgut.pdf` is built by running `latexmk` on
the corresponding `.tex` file (which doesn't derive from an Org Mode file).
#+end_src

* Identification
:PROPERTIES:
:CUSTOM_ID: Identification-mn5g55h0jlj0
:END:

#+begin_src latex
% This is file `letgut.cls',
% generated with the Emacs Org-babel utility.
%
% The original source file is letgut.org
%
% -------:| ----------------------------------------------------
%  letgut:| Class for the newsletter “La Lettre GUTenberg”
%  Author:| Association GUTenberg
%  E-mail:| secretariat@gutenberg-asso.fr
% License:| Released under the LaTeX Project Public License
%         | v1.3c or later
%     See:| http://www.latex-project.org/lppl.txt
%
% Copyright (C) 1994-2025 by Association GUTenberg
%                  <secretariat@gutenberg-asso.fr>
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License (LPPL), either
% version 1.3c of this license or (at your option) any later
% version.  The latest version of this license is in the file:
%
% http://www.latex-project.org/lppl.txt
%
% This work is “maintained” (as per LPPL maintenance status)
% by Association GUTenberg.
%
#+end_src

* Debugging
:PROPERTIES:
:CUSTOM_ID: Debugging-846g55h0jlj0
:END:

#+begin_src latex
% \RequirePackage[
%   , check-declarations
%   , enable-debug
%   , backend=luatex
% ]{expl3}
#+end_src

* Implementation
:PROPERTIES:
:CUSTOM_ID: Implementation-vy6g55h0jlj0
:END:

These document classes can only be used with \LaTeXe, so we make
sure that an appropriate message is displayed when another \TeX{}
format is used.

#+begin_src latex
\NeedsTeXFormat{LaTeX2e}[2020-10-01]
#+end_src

We define some constant token lists immediately useful.

#+begin_src  latex
  \ExplSyntaxOn
  \tl_const:Nn \c__letgut_Lettre_plain_tl { Lettre }
  \tl_const:Nn \c__letgut_Lettre_tl { \emph{ \c__letgut_Lettre_plain_tl } }
  \tl_const:Nn \c__letgut_Lettres_tl {
    \c__letgut_Lettre_tl \emph{ s }
  }
  \tl_const:Nn \c__letgut_gutenberg_tl { GUTenberg }
  \tl_const:Nn \c__letgut_association_tl { association }
  \tl_const:Nn \c__letgut_Lettre_gutenberg_plain_tl {
    \c__letgut_Lettre_plain_tl~\c_space_tl \c__letgut_gutenberg_tl
  }
  \tl_const:Nn \c__letgut_Lettre_gutenberg_tl {
    \c__letgut_Lettre_tl~\c_space_tl \c__letgut_gutenberg_tl
  }
  \tl_const:Nn \c__letgut_la_lettre_gutenberg_plain_tl {
    la~ \c__letgut_Lettre_gutenberg_plain_tl
  }
  \tl_const:Nn \c__letgut_la_lettre_gutenberg_tl {
    la~ \c__letgut_Lettre_gutenberg_tl
  }
  \tl_const:Nn \c__letgut_La_lettre_gutenberg_tl {
    \text_titlecase_first:n \c__letgut_la_lettre_gutenberg_tl
  }
  \ExplSyntaxOff
#+end_src

Now, we can announce the class name and its version:

#+begin_src latex
  \ProvidesExplClass{letgut}
  {2025-10-26}
  {0.9.13}
  {
    Class for the newsletter “The GUTenberg Letter”
  }
#+end_src

** Messages
:PROPERTIES:
:CUSTOM_ID: ImplementationMessages-xg7g55h0jlj0
:END:

We specify the messages come from a class, which is letgut (see
\url{https://github.com/latex3/latex3/issues/887}).

#+begin_src latex
  \prop_gput:Nnn \g_msg_module_type_prop { letgut } { Class }
#+end_src

Some messages are declared for future use.

#+begin_src latex
      \msg_new:nnn{letgut}{Wrong~engine}{
        The~ letgut~ class~ requires~ LuaTeX.\\\\
        You~ must~ change~ your~ typesetting~ engine~ to~
        “lualatex”~ instead~ of~ “latex”~ or~ “pdflatex”
        or~ “xelatex”.
      }
      \msg_new:nnn{letgut}{Existing~command}{
        The~ command~  \c_backslash_str \text_lowercase:n{#1}~
        already~ exists~ and~ has~ not~ be~ overwritten~ by~
        \token_to_str:N \letgutacro{#1}{...}.~
        The~ corresponding~ acronym~ has~ to~ be~ used~ e.g.~
        like~ this:~
        \token_to_str:N \ac{ \text_lowercase:n{#1} }.
      }
      \msg_new:nnn{letgut}{Not~month~iso~date}{
        The~ supplied~ date~(“#1”)~ isn't~ at~ the~ month~ iso~
        date~ format~ (YYYY-MM):~ it~ will~ be~ printed~ as~
        it~ is.
      }
      \msg_new:nnn{letgut}{Banner~file~not~provided}{
        No~ `\c__letgut_banner_file_tl.pdf'~ file~ provided:~
        the~ banner~ will~ be~ automatically~ created.
      }
      \msg_new:nnn{letgut}{Editorial~file~missing}{
        File~`\c__letgut_editorial_file_tl.tex'~missing!~
        The~ editorial~ will~ be~ missing.
      }
      \msg_new:nnn{letgut}{Informations~file~missing}{
        File~ `\c__letgut_informations_gutenberg_file_tl.tex'~
        missing!~ The~ informations~ about~
        \c__letgut_gutenberg_tl\c_space_tl~ will~ be~ missing.
      }
      \msg_new:nnn{letgut}{pagecolor~inoperative~with~paper~option}{
        The~ `pagecolor=#1`~ option~ is~ inoperative~ with~ the~ `paper`~
        option:~ the~ color~ of~ the~ page~ will~ remain~ white.
      }
      \msg_new:nnn{letgut}{frontcover-missing}{
        You~ didn't~ use~ the~ `frontcover`~ option~ for~ the~
        bookreview~ “#1”,~ so~ the~ book~ cover~image~ will~ be~ missing:~
        are~ you~ sure?
      }
      \msg_new:nnn{letgut}{frontcover-file-not-found}{
        The~ book~ cover~ image~ `#2`~ you~ specified~ via~ the~
        `frontcover`~ option~ for~ the~ bookreview~ “#1”~ cannot~ be~ found.
      }
#+end_src

** Engine checking
:PROPERTIES:
:CUSTOM_ID: ImplementationEnginechecking-lz7g55h0jlj0
:END:

#+begin_src latex
  \sys_if_engine_luatex:F {
    \msg_fatal:nn{letgut}{Wrong~engine}
  }
#+end_src

** Declarations
:PROPERTIES:
:CUSTOM_ID: ImplementationDeclarations-3j8g55h0jlj0
:END:

**** Scratch variables
:PROPERTIES:
:CUSTOM_ID: ImplementationDeclarationsScratchvariables-onuajq01p4k0
:END:

#+begin_src latex
  \bool_new:N \g__letgut_tmpa_bool
  \bool_new:N \g__letgut_tmpb_bool
  \box_new:N \g__letgut_tmpa_box
  \box_new:N \g__letgut_tmpb_box
  \clist_new:N \g__letgut_tmpa_clist
  \clist_new:N \g__letgut_tmpb_clist
  \coffin_new:N \g__letgut_tmpa_coffin
  \coffin_new:N \g__letgut_tmpb_coffin
  \dim_new:N \g__letgut_tmpa_dim
  \dim_new:N \g__letgut_tmpb_dim
  \fp_new:N \g__letgut_tmpa_fp
  \fp_new:N \g__letgut_tmpb_fp
  \int_new:N \g__letgut_tmpa_int
  \int_new:N \g__letgut_tmpb_int
  \ior_new:N \g__letgut_tmpa_ior
  \ior_new:N \g__letgut_tmpb_ior
  \iow_new:N \g__letgut_tmpa_iow
  \iow_new:N \g__letgut_tmpb_iow
  \muskip_new:N \g__letgut_tmpa_muskip
  \muskip_new:N \g__letgut_tmpb_muskip
  \prop_new:N \g__letgut_tmpa_prop
  \prop_new:N \g__letgut_tmpb_prop
  \regex_new:N \g__letgut_tmpa_regex
  \regex_new:N \g__letgut_tmpb_regex
  \seq_new:N \g__letgut_tmpa_seq
  \seq_new:N \g__letgut_tmpb_seq
  \skip_new:N \g__letgut_tmpa_skip
  \skip_new:N \g__letgut_tmpb_skip
  \str_new:N \g__letgut_tmpa_str
  \str_new:N \g__letgut_tmpb_str
  \tl_new:N \g__letgut_tmpa_tl
  \tl_new:N \g__letgut_tmpb_tl
  \bool_new:N \l__letgut_tmpa_bool
  \bool_new:N \l__letgut_tmpb_bool
  \box_new:N \l__letgut_tmpa_box
  \box_new:N \l__letgut_tmpb_box
  \clist_new:N \l__letgut_tmpa_clist
  \clist_new:N \l__letgut_tmpb_clist
  \coffin_new:N \l__letgut_tmpa_coffin
  \coffin_new:N \l__letgut_tmpb_coffin
  \dim_new:N \l__letgut_tmpa_dim
  \dim_new:N \l__letgut_tmpb_dim
  \fp_new:N \l__letgut_tmpa_fp
  \fp_new:N \l__letgut_tmpb_fp
  \int_new:N \l__letgut_tmpa_int
  \int_new:N \l__letgut_tmpb_int
  \ior_new:N \l__letgut_tmpa_ior
  \ior_new:N \l__letgut_tmpb_ior
  \iow_new:N \l__letgut_tmpa_iow
  \iow_new:N \l__letgut_tmpb_iow
  \muskip_new:N \l__letgut_tmpa_muskip
  \muskip_new:N \l__letgut_tmpb_muskip
  \prop_new:N \l__letgut_tmpa_prop
  \prop_new:N \l__letgut_tmpb_prop
  \regex_new:N \l__letgut_tmpa_regex
  \regex_new:N \l__letgut_tmpb_regex
  \seq_new:N \l__letgut_tmpa_seq
  \seq_new:N \l__letgut_tmpb_seq
  \skip_new:N \l__letgut_tmpa_skip
  \skip_new:N \l__letgut_tmpb_skip
  \str_new:N \l__letgut_tmpa_str
  \str_new:N \l__letgut_tmpb_str
  \tl_new:N \l__letgut_tmpa_tl
  \tl_new:N \l__letgut_tmpb_tl
#+end_src

*** Booleans
:PROPERTIES:
:CUSTOM_ID: ImplementationDeclarationsBooleans-s09g55h0jlj0
:END:

- For testing the emptyness of the title.
   #+begin_src latex
     \bool_new:N \g__letgut_title_empty_bool
   #+end_src
- For the paper (or not) output.
   #+begin_src latex
    \bool_new:N \g__letgut_paper_bool
   #+end_src
- For testing whether we currently are in a footnote or not.
   #+begin_src latex
    \bool_new:N \l__letgut_in_footnote_bool
   #+end_src
- For testing whether we currently ask the draft or the final version.
   #+begin_src latex
    \bool_new:N \g__letgut_draft_bool
   #+end_src
- For the included files to (not) be attached.
   #+begin_src latex
    \bool_new:N \g__letgut_included_files_attached_bool
   #+end_src
- For the acronym definitions file to (not) be attached.
   #+begin_src latex
    \bool_new:N \g__letgut_acronyms_file_attached_bool
   #+end_src
- For the listings language file to (not) be attached.
   #+begin_src latex
    \bool_new:N \g__letgut_lstlanguage_file_attached_bool
   #+end_src
- For the “for readers” versus “for authors” versions.
   #+begin_src latex
    \bool_new:N \g__letgut_for_readers_bool
   #+end_src

*** Dimensions
:PROPERTIES:
:CUSTOM_ID: ImplementationDeclarationsDimensions-gj9g55h0jlj0
:END:

- Geometry of the document
    #+begin_src latex
      \dim_const:Nn \c__letgut_textheight_dim  { 25cm }
      \dim_const:Nn \c__letgut_textwidth_dim  { 14cm }
      \dim_const:Nn \c__letgut_lmargin_dim  { 5cm }
      \dim_const:Nn \c__letgut_tmargin_dim  { 2.92cm }
      % \dim_const:Nn \c__letgut_tmargin_dim  { 3cm }
      \dim_const:Nn \c__letgut_head_dim  { 0.6cm }
      \dim_const:Nn \c__letgut_headsep_dim  { 0.82cm }
      % \dim_const:Nn \c__letgut_headsep_dim  { 0.9cm }
      \dim_const:Nn \c__letgut_marginparwidth_dim  { 3.74cm }
    #+end_src
- Horizontal offset of the headers and the sections titles:
    #+begin_src latex
      \dim_const:Nn \c__letgut_hoffset_dim  { 3cm }
      \dim_const:Nn \c__letgut_title_hoffset_dim  {
        -\c__letgut_hoffset_dim
      }
      \dim_const:Nn \c__letgut_subtitle_hoffset_dim  {
        \c__letgut_title_hoffset_dim
      }
      \dim_const:Nn \c__letgut_section_hoffset_dim  {
        \c__letgut_title_hoffset_dim + 1cm
      }
      \dim_const:Nn \c__letgut_subsection_hoffset_dim  {
        \c__letgut_title_hoffset_dim + 1.5cm
      }
      \dim_const:Nn \c__letgut_subsubsection_hoffset_dim  {
        \c__letgut_title_hoffset_dim + 2cm
      }
      \dim_const:Nn \c__letgut_paragraph_hoffset_dim  {
        \c__letgut_title_hoffset_dim + 2.5cm
      }
      \dim_const:Nn \c__letgut_subparagraph_hoffset_dim  {
        \c__letgut_title_hoffset_dim + 3cm
      }
    #+end_src
- Distance between the baseline of the header text and the decorative line:
    #+begin_src latex
      \dim_const:Nn \c__letgut_head_rule_skip_dim { 0.115cm }
    #+end_src
- Head rule width:
    #+begin_src latex
      \dim_const:Nn \c__letgut_head_rule_width_dim { 0.03cm }
    #+end_src
- Dimensions of the banner.
  - Thickness of the “L”.
    #+begin_src latex
      \dim_const:Nn \c__letgut_banner_thickness_dim { 4cm }
    #+end_src
  - Height of the “L” (that of the text area plus 3cm).
   #+begin_src latex
     \dim_const:Nn \c__letgut_banner_height_dim  {
       \c__letgut_textheight_dim
       +
       3cm
     }
   #+end_src
- Height of the membership reminder box.
   #+begin_src latex
    \dim_new:N \g__letgut_membership_reminder_box_height_dim
   #+end_src
- Horizontal space for the frontcover in the margin in book reviews.
   #+begin_src latex
     \dim_const:Nn \c__letgut_bookreview_frontcover_margin_sep_dim {
       4mm
      }
   #+end_src
- Dimensions used by the listings and the examples.
#+begin_src latex
  \dim_const:Nn \c__letgut_height_mentions_dim { 5mm }
  \dim_const:Nn \c__letgut_from_left_boundingbox_to_text_dim { 5.5mm }
  \dim_const:Nn \c__letgut_number_offset_dim { 1mm }
  \dim_const:Nn \c__letgut_number_sep_dim {
    \c__letgut_from_left_boundingbox_to_text_dim
    +
    \c__letgut_number_offset_dim
  }
#+end_src

*** Skips (lengths with rubber components)
:PROPERTIES:
:CUSTOM_ID: ImplementationDeclarationsSkipslengthswithrubbercomponents-a4ag55h0jlj0
:END:

    The following skips, borrowed from the standard classes, are specified in
    ~ex~ unit, which depends on the font used and hence have to be specified
    after the class has been loaded; in fact, we postpone this at the end of the
    preamble, when the font is specified (thanks to ~\setmainfont~).

#+begin_src latex
  \AddToHook{begindocument/before}{%
#+end_src

Before and after:

 - “titles titles”:
    #+begin_src latex
      \skip_const:Nn \c__letgut_before_title_title_skip
      {
        3.5ex plus 1ex minus .2ex
      }
      \skip_const:Nn \c__letgut_after_title_title_skip
      {
        2.3ex plus .2ex
      }
    #+end_src
 - subtitles titles:
    #+begin_src latex
      \skip_const:Nn \c__letgut_before_subtitle_title_skip
      {
        \c__letgut_before_title_title_skip
      }
      \skip_const:Nn \c__letgut_after_subtitle_title_skip
      {
        \c__letgut_after_title_title_skip
      }
    #+end_src
 - sections titles:
    #+begin_src latex
      \skip_const:Nn \c__letgut_before_section_title_skip
      {
        3.25ex plus 1ex minus .2ex
      }
      \skip_const:Nn \c__letgut_after_section_title_skip
      {
        1.5ex plus .2ex
      }
    #+end_src
 - subsections titles (identical to the sections ones):
    #+begin_src latex
      \skip_const:Nn \c__letgut_before_subsection_title_skip
      {
        \c__letgut_before_section_title_skip
      }
      \skip_const:Nn \c__letgut_after_subsection_title_skip
      {
        \c__letgut_after_section_title_skip
      }
    #+end_src
 - paragraphs titles:
    #+begin_src latex
      \skip_const:Nn \c__letgut_before_subsubsection_title_skip
      {
        1.5ex plus .5ex minus .2ex
      }
      \skip_const:Nn \c__letgut_after_subsubsection_title_skip
      {
        0.75ex plus 0.1ex
      }
    #+end_src
 - paragraphs titles (identical to the subsubsection ones):
    #+begin_src latex
      \skip_const:Nn \c__letgut_before_paragraph_title_skip
      {
        \c__letgut_before_subsubsection_title_skip
      }
      \skip_const:Nn \c__letgut_after_paragraph_title_skip
      {
        \c__letgut_after_subsubsection_title_skip
      }
    #+end_src
 - subparagraphs titles (identical to the paragraph ones):
    #+begin_src latex
      \skip_const:Nn \c__letgut_before_subparagraph_title_skip
      {
        \c__letgut_before_paragraph_title_skip
      }
      \skip_const:Nn \c__letgut_after_subparagraph_title_skip
      {
        \c__letgut_after_paragraph_title_skip
      }
    #+end_src

We close the ~\AddToHook{begindocument/before}~ argument.

#+begin_src latex
}
#+end_src

*** Integers
:PROPERTIES:
:CUSTOM_ID: ImplementationDeclarationsIntegers-7pag55h0jlj0
:END:
 #+begin_src latex
\int_new:N \g__letgut_ltx_example_int
 #+end_src

*** Strings
:PROPERTIES:
:CUSTOM_ID: ImplementationDeclarationsStrings-t7bg55h0jlj0
:END:

 #+begin_src latex
\str_new:N \g__letgut_label_ltx_example_str
\str_new:N \g__letgut_callout_label_ltx_example_str
\str_const:Nn \c__letgut_label_ltx_example_str {
  __letgut_label_ltx_example
}
\str_const:Nn \c__letgut_callout_label_ltx_example_str {
  __letgut_callout_label_ltx_example
}
 #+end_src

*** Token lists
:PROPERTIES:
:CUSTOM_ID: ImplementationDeclarationsTokenlists-grbg55h0jlj0
:END:

**** Constant ones
:PROPERTIES:
:CUSTOM_ID: ImplementationDeclarationsTokenlistsConstantones-obcg55h0jlj0
:END:

 #+begin_src latex
   \tl_const:Nn \c__letgut_online_issn_tl {
     2742-6149~ (version~ numérique)
   }
   \tl_const:Nn \c__letgut_paper_issn_tl {
     1257–2217~ (version~ papier)
   }
   \tl_const:Nn \c__letgut_liste_gut_tl { liste~ GUT }
   \tl_const:Nn \c__letgut_cahier_tl { \emph{ Cahier } }
   \tl_const:Nn \c__letgut_cahiers_tl { \emph{ Cahiers } }
   \tl_const:Nn \c__letgut_gnu_linux_tl { \software{GNU/Linux} }
   \tl_const:Nn \c__letgut_macOS_tl { \software{macOS} }
   \tl_const:Nn \c__letgut_windows_tl { \software{Windows} }
   \tl_const:Nn \c__letgut_package_tl { package }
   \tl_const:Nn \c__letgut_class_tl { classe }
   \tl_const:Nn \c__letgut_file_tl { fichier }
   \tl_const:Nn \c__letgut_software_tl { logiciel }
   \tl_const:Nn \c__letgut_tugboat_tl { \emph{ TUGboat } }
   \tl_const:Nn \c__letgut_dtk_tl { la~ \emph{\TeX{}nische Komödie} }
   \tl_const:Nn \c__letgut_tex_live_tl {
     \hologo{ TeX }\nobreakspace Live
   }
   \tl_const:Nn \c__letgut_banner_file_tl { bandeau }
   \tl_const:Nn \c__letgut_editorial_file_tl { editorial }
   \tl_const:Nn \c__letgut_informations_gutenberg_file_tl {
     informations-gut
   }
   \tl_const:Nn \c__letgut_acronyms_file_tl { letgut-acronyms }
   \tl_const:Nn \c__letgut_local_config_file_tl { localconf }
   \tl_const:Nn \c__letgut_pre_documentclass_file_tl { pre-documentclass }
   \tl_const:Nn \c__letgut_lstlanguage_file_tl { letgut-lstlang.sty }
   \tl_const:Nn \c__letgut_contents_name_tl { Sommaire }
   \tl_const:Nn \c__letgut_draftwatermark_text_tl {
    \textnormal{Brouillon}
   }
   \tl_const:Nn \c__letgut_membership_reminder_tl {
     {\LARGE
       \bfseries
       Avez-vous~ pensé~ à~ régler~ votre~ cotisation~ ?
       % \the\year~ ?
       \par
       \medskip
     }
     Si~ vous~ avez~ oublié,~ ce~ n'est~ ni~ trop~ tard~
     ni~ difficile~ :
     \par
     \url{https://www.gutenberg-asso.fr/?Adherer-en-ligne}
     \bool_if:NT \g__letgut_informations_bool {
       \file_if_exist:nT
       {./\c__letgut_informations_gutenberg_file_tl}{
         \par
         Voir~ aussi~ page~ \pageref{letgut_label_adhesions}.
       }
     }
   }
   \tl_const:Nn \c__letgut_missing_editorial_tl {
     Ne~ pas~ omettre~ l'éditorial~ !\\(à~ faire~ figurer~
     dans~ un~ \file*{\c__letgut_editorial_file_tl.tex}~
     dans~ le~ dossier~ courant)
   }
   \tl_const:Nn \c__letgut_missing_infomations_tl {
     Ne~ pas~ omettre~ les~ informations~ sur~
     \c__letgut_gutenberg_tl{}~ !\\(dans~ un~
     \file*{\c__letgut_informations_gutenberg_file_tl.tex}~
     situé~ soit~ dans~ le~ dossier~ courant, soit~ dans~ le~
     dossier~ parent)
   }
   \tl_const:Nn \c__letgut_default_alert_box_color_tl {
     gray9
   }
   \tl_const:Nn \c__letgut_default_allcolors_links_color_tl
   {
     teal!60!black
   }
   \tl_const:Nn \c__letgut_attachment_icon_tl
   {
     \color{black}\tiAttachmentOutline
   }
 #+end_src

**** Variables ones
:PROPERTIES:
:CUSTOM_ID: ImplementationDeclarationsTokenlistsVariablesones-pxcg55h0jlj0
:END:

 #+begin_src latex
   \tl_new:N \g__letgut_mark_tl
   \tl_new:N \g__letgut_title_tl
   \tl_new:N \l_letgut_last_name_tl
   \tl_new:N \l_letgut_first_name_tl
   \tl_new:N \l_letgut_title_tl
   \tl_new:N \l__letgut_title_addon_tl
   \tl_new:N \l__letgut_reference_text_tl
   \tl_new:N \g__letgut_effective_acronyms_file_tl
   \tl_new:N \l__letgut_toc_title_announce_tl
   \tl_new:N \l__letgut_toc_color_announce_tl
   \tl_new:N \g__letgut_current_article_filename_tl
 #+end_src

*** Comma separated lists
:PROPERTIES:
:CUSTOM_ID: ImplementationDeclarationsCommaseparatedlists-vhdg55h0jlj0
:END:

#+begin_src latex
  \clist_new:N \g__letgut_pagecolor_clist
  \clist_const:Nn \c__letgut_default_pagecolor_screen_clist
  {1.0, 0.98, 0.94}
  \clist_const:Nn \c__letgut_default_pagecolor_paper_clist
  {1, 1, 1}
#+end_src

*** Sequences
:PROPERTIES:
:CUSTOM_ID: ImplementationDeclarationsSequences-m2eg55h0jlj0
:END:

#+begin_src latex
  \seq_new:N \l__letgut_first_last_names_items_seq
  \seq_new:N \g__letgut_included_files_seq
  \seq_new:N \g__letgut_added_bib_resources_seq
#+end_src

*** Boxes
:PROPERTIES:
:CUSTOM_ID: ImplementationDeclarationsBoxes-os5bm7d1hqk0
:END:

#+begin_src latex
  \box_new:N \l__letgut_space_box
#+end_src

*** Streams
:PROPERTIES:
:CUSTOM_ID: ImplementationDeclarationsStreams-h9y7phi0j1k0
:END:

#+begin_src latex
  \iow_new:N \g__letgut_etocsetlevel_by_article_iow
#+end_src

** Class options
:PROPERTIES:
:CUSTOM_ID: ImplementationClassoptions-4meg55h0jlj0
:END:

We define the 2 load time options for the target audience:

- ~for-readers~ (the default), for the “normal” “Lettre”,
- ~for-authors~, (only) the author(s) of an article of the “Lettre”.

** Date handling
:PROPERTIES:
:CUSTOM_ID: ImplementationDatehandling-c5fg55h0jlj0
:END:

#+begin_src latex
  \int_new:N \g__letgut_date_month_int
  \int_new:N \g__letgut_date_year_int

  \int_gset:Nn \g__letgut_date_month_int {\the\month}
  \int_gset:Nn \g__letgut_date_year_int  {\the\year}

  \tl_new:N \g__letgut_date_month_tl
  \tl_new:N \g__letgut_date_tl

  \cs_new_protected:Npn \__letgut_date_parse:n #1
  {
    \__letgut_if_is_iso_date:nTF {#1}
    {
      \__letgut_date_parse:www #1 \q_stop
    }{
      \msg_term:nnn{letgut}{Not~month~iso~date}{#1}
      \tl_gset:Nn \g__letgut_date_tl { #1 }
    }
  }

  \prg_new_protected_conditional:Npnn
  \__letgut_if_is_iso_date:n #1 { T, F, TF }
  {
    \regex_match:nnTF { ^\d{4}-(\d{1,2}) } {#1}
    { \prg_return_true: }
    { \prg_return_false: }
  }

  \prg_new_protected_conditional:Npnn
  \__letgut_if_is_int:n #1 { T, F, TF }
  {
    \regex_match:nnTF { ^[\+\-]?[\d]+$ } {#1}
    { \prg_return_true: }
    { \prg_return_false: }
  }

  \cs_new_protected:Npn \__letgut_month_name:n #1
  {
    % \text_titlecase_first:n {
    \int_case:nnF
    { #1 }
    {
      { 1 }{ janvier }
      { 2 }{ février }
      { 3 }{ mars }
      { 4 }{ avril }
      { 5 }{ mai }
      { 6 }{ juin }
      { 7 }{ juillet }
      { 8 }{ août }
      { 9 }{ septembre }
      { 10 }{ octobre }
      { 11 }{ novembre }
      { 12 }{ décembre }
    }
    { Month~ Error! }
    % }
  }

  \cs_new_protected:Npn \__letgut_date_parse:www #1-#2
  \q_stop
  {
    \int_compare:nTF
    {
      \the\year <= #1 <= \the\year+1
    #+end_src

# >> (Just not to disturb the parentheses balancing
#    detection of my editor.)

    #+begin_src latex
    }{
      \int_gset:Nn \g__letgut_date_year_int {#1}
    }{
      \int_gset:Nn \g__letgut_date_year_int {\the\year}
    }
    \__letgut_if_is_int:nTF {#2}
    {
      \int_compare:nTF
      {
        1 <= #2 <= 12
    #+end_src

# >> (Just not to disturb the parentheses balancing
#    detection of my editor.)

    #+begin_src latex
      }
      {\int_gset:Nn \g__letgut_date_month_int {#2}}
      {\int_gset:Nn \g__letgut_date_month_int {\the\month}}
    }{
      \int_gset:Nn \g__letgut_date_month_int  {\the\month}
    }
    \tl_gset:Nn \g__letgut_date_month_tl {
      \__letgut_month_name:n { \g__letgut_date_month_int }
    }
    \tl_gset:Nn \g__letgut_date_tl {
      \tl_use:N \g__letgut_date_month_tl
      \c_space_tl
      \int_use:N \g__letgut_date_year_int
    }
  }
#+end_src

** Class and package loading
:PROPERTIES:
:CUSTOM_ID: ImplementationClassandpackageloading-aqfg55h0jlj0
:END:

The \letgutcls{} is based on the ~article~ class. It is by default two sided
because of the alternating headers, and will by typeset with ~11pt~ as global
font size.

#+begin_src latex
  \LoadClass[twoside,11pt]{article}
#+end_src

We now load some packages.

- The \letgutcls{} will have to be used with LuaLaTeX. Hence the font selection
  package for XeLaTeX and LuaLaTeX.
  #+begin_src latex
    \RequirePackage{fontspec}
  #+end_src
- For subliminal refinements towards typographical perfection.
  #+begin_src latex
    \RequirePackage[
    , stretch=30
    , shrink=25
    , letterspace=150
    ]{microtype}
  #+end_src
- Help in implementing paragraph layouts where the paragraphs are separated by
  a vertical space instead of (or in addition to) indenting them.
  #+begin_src latex
    \RequirePackage{parskip}
  #+end_src
- Extensive control of page headers and footers in \LaTeXe.
  #+begin_src latex
    \RequirePackage{fancyhdr}
  #+end_src
- Flexible and complete interface to document dimensions.
  #+begin_src latex
    \RequirePackage[a4paper]{geometry}
  #+end_src
- Enhanced support for graphics.
  #+begin_src latex
\RequirePackage{graphicx}
  #+end_src
- Biolinum font.
  #+begin_src latex
\RequirePackage{biolinum}
  #+end_src
- Extending the array and tabular environments.
  #+begin_src latex
\RequirePackage{array}
  #+end_src
- Completely customisable TOCs.
  #+begin_src latex
\RequirePackage{etoc}
  #+end_src
- Font containing a set of web-related icons.
  #+begin_src latex
\RequirePackage{typicons}
  #+end_src
- Control layout of itemize, enumerate, description, and design our own lists.
  #+begin_src latex
\RequirePackage{enumitem}
  #+end_src
- Select alternative section titles.
  #+begin_src latex
\RequirePackage{titlesec}
  #+end_src
- Driver-independent color extensions.
  #+begin_src latex
    \RequirePackage[table]{xcolor}
  #+end_src
- Several logos and ornaments.
  #+begin_src latex
\RequirePackage{fourier-orns}
  #+end_src
- Drawing of Vectorian ornaments.
  #+begin_src latex
\RequirePackage{pgfornament}
  #+end_src
- Control float placement.
  #+begin_src latex
\RequirePackage[section,above]{placeins}
  #+end_src
- Sophisticated verbatim text.
  #+begin_src latex
\RequirePackage{fancyvrb}
  #+end_src
- Publication quality tables in LaTeX.
  #+begin_src latex
\RequirePackage{booktabs}
  #+end_src
- Context sensitive quotation facilities.
  #+begin_src latex
\RequirePackage{csquotes}
  #+end_src
- Mathematical tools to use with (and which loads) \package{amsmath}.
  #+begin_src latex
\RequirePackage[fleqn]{mathtools}
  #+end_src
- Better accessibility support for PDF files. This package is used because we
  want the material added to the background (banner on the first page and draft
  watermark) to be not selectable in order to let the reader who wants to copy
  the interesting text be able to select it.
#+begin_src latex
  \RequirePackage{accsupp}
#+end_src
- A comprehensive (SI) units package.
  #+begin_src latex
    \RequirePackage{siunitx}
  #+end_src
- Additional TeX-family logos (which loads and extends \package{hologo} which is
  collection of logos with bookmark support).
  #+begin_src latex
    \RequirePackage{bxtexlogo}
  #+end_src
- Coloured boxes, for LaTeX examples and theorems, etc.
  #+begin_src latex
    \RequirePackage{tcolorbox}
  #+end_src
- Compile \TeX{} code stand-alone or as part of a document.
  #+begin_src latex
    \RequirePackage[group=false,subpreambles,sort]{standalone}
  #+end_src
- Attach arbitrary files to a PDF document.
  #+begin_src latex
    \RequirePackage[icon=Paperclip]{attachfile2}
  #+end_src
- Expandable macros to extract the data from references and allow counter
  assignments or calculations.
  #+begin_src latex
\RequirePackage{refcount}
  #+end_src
- Select colors with proper WCAG color contrast.
  #+begin_src latex
    \RequirePackage{ninecolors}
  #+end_src
- Typeset tabulars and arrays with LaTeX3 (for the alert boxes typeset as
  simple tabulars).
  #+begin_src latex
\RequirePackage{tabularray}
  #+end_src
- Multilingual support for Plain TeX or LaTeX.
  #+begin_src latex
\RequirePackage[english,french]{babel}
  #+end_src
- Intelligent page references.
  #+begin_src latex
\RequirePackage[nospace,french]{varioref}
  #+end_src
- Macros for Euro sign.
  #+begin_src latex
\RequirePackage[right]{eurosym}
  #+end_src
- Typeset source code listings using LaTeX.
  #+begin_src latex
\RequirePackage{listings}
  #+end_src
- Modifying the layout of floats.
  #+begin_src latex
\RequirePackage{floatrow}
  #+end_src
- Sophisticated Bibliographies in LaTeX.
  #+begin_src latex
    \RequirePackage[
      sorting=none,
      datamodel=letgut,
      citestyle=letgut
    ]{biblatex}
  #+end_src
- Typeset acronyms.
  #+begin_src latex
\RequirePackage{acro}
  #+end_src
- Allow URL breaks at any alphanumerical character.
  #+begin_src latex
\RequirePackage{xurl}
  #+end_src

The following packages have to be the last ones loaded. So we ensure this by
loading them just before the begining of the document:
#+begin_src latex
\AddToHook{begindocument/before}{
#+end_src
- Extensive support for hypertext in LaTeX
   #+begin_src latex
     \RequirePackage{hyperref}
   #+end_src
- Adjusting the anchors of captions
   #+begin_src latex
     \RequirePackage[all]{hypcap}
   #+end_src
- Intelligent cross-referencing
   #+begin_src latex
     \RequirePackage[french]{cleveref}
   #+end_src
We close the ~\AddToHook{begindocument/before}~ argument.
#+begin_src latex
  }
#+end_src

** Settings for the loaded packages
:PROPERTIES:
:CUSTOM_ID: ImplementationSettingsfortheloadedpackages-cdgg55h0jlj0
:END:

- We force to use endash as floats's caption separators, using the obsolete
  ~CustomiseFigTabCaptions~ ~babel-french~ option because we don't want to rely
  on the ~caption~ package which might conflict with ~floatrow~ heavily used here.
   #+begin_src latex
     \frenchsetup{CustomiseFigTabCaptions}
   #+end_src
- We switch to the French typographic conventions for \package{siunitx}.
   #+begin_src latex
     \sisetup{
       , locale=FR
       , mode=match
     }
   #+end_src
- Concerning floats, we ask:
  - the caption text will be justified,
  - the figures and their captions to be boxed (in order to distiguish them from
    the current text),
  - the tables to have their captions above them.
       #+begin_src latex
         \DeclareMarginSet{hangleft}{
           \setfloatmargins{\hskip-\c__letgut_hoffset_dim}{\hfil}
         }
         \DeclareFloatVCode{__letgut_ruleabove}{
           \par\rule{\hsize}{.8pt}\vskip4pt\par
           }
         \DeclareFloatVCode{__letgut_rulebelow}{
           \par\vskip2pt\rule{\hsize}{.8pt}\par
         }
         \DeclareFloatStyle{__letgut_ruled}{
           precode=__letgut_ruleabove,
           postcode=__letgut_rulebelow,
           % heightadjust=all,
           floatwidth=.8\linewidth
         }
         \floatsetup{objectset=justified}
         \floatsetup[figure]{
           style=__letgut_ruled,
           margins=hangleft,
           capposition=beside,
           capbesideposition={top,left},
           floatwidth=0.85\textwidth
         }
         \floatsetup[table]{capposition=top}
       #+end_src
  Moreover, the tables will be entitled \enquote{tableau} instead of
  \enquote{table}.
       #+begin_src latex
         \renewcommand*\frenchtablename{Tableau}
       #+end_src
- We load a \package{tabularray}'s library.
       #+begin_src latex
         \UseTblrLibrary{booktabs}
       #+end_src
- The ~\printbibliography~ command is redefined in order its ~heading~ is by
  default set to ~subbibliography~.
   #+begin_src latex
     \NewCommandCopy{\__letgut_old_printbibliography}{
       \printbibliography
     }
     \RenewDocumentCommand {\printbibliography} { O{} } {
       \phantomsection
       \__letgut_old_printbibliography[#1]
       \bool_if:NT \g__letgut_included_files_attached_bool {
         \seq_map_inline:Nn \g__letgut_added_bib_resources_seq {
           \file_if_exist:nT {##1}{
             \seq_gput_right:Nn \g__letgut_included_files_seq {
               \textattachfile[
                 description={
                   Fichier~ bibliographique~ utilisé~ dans~ le~
                   présent~ article~ (fichier~ `\tl_to_str:n{##1}`)
                 },
                 mimetype=application/x-bib
               ]
               {\tl_to_str:n{##1}}
               {\c__letgut_attachment_icon_tl}
             }
           }
         }
       }
     }
     #+end_src
   For printing the bibliography, we define two new bibheadings for the
  structure levels ~\title~ and ~\subtitle~.
     #+begin_src latex
       \defbibheading{title}[\refname]{%
         \title{#1}}
       \defbibheading{subtitle}[\refname]{%
         \subtitle{#1}}
   #+end_src
- The acronyms will be typset in its short form, with small caps shape. When they are
  (English) foreign, it will be specified and the translation will be added.
   #+begin_src latex
     \acsetup{
       first-style=short,
       format/short = {\scshape},
       format/foreign = {\em},
       foreign/display,
       locale/format = {\upshape},
       locale/display,
       make-links = true,
       link-only-first = true
     }
   #+end_src

   We currently have to work around an ~acro~ bug (see \url{https://tex.stackexchange.com/q/661966/18401}).

   #+begin_src latex
     \AddToHook{cmd/printacronyms/before}{\bool_set_false:N\l__acro_link_only_first_bool}
   #+end_src

  In case the long form of an acronym is explicited in footnote, we want this
  footnot to be ended with a period.
   #+begin_src latex
     \ProvideDocumentCommand \acroendfootnote {} {.}
   #+end_src

   The following settings for packages that have to be the last ones loaded are
   also done just before the begining of the document.

- The following (temporary?) workaround moved `standalone` code in hook
  `begindocument` to `begindocument/before` in order to get rid of the issue
  \url{https://tex.stackexchange.com/q/670638/18401}.

#+begin_src latex
  \bool_if:NT \g__letgut_for_readers_bool {
    \RemoveFromHook{begindocument}[standalone]
    \ExpandArgs{nv}\AddToHook{begindocument/before}{l__hook_return_tl}
  }
#+end_src

#+begin_src latex
  \AddToHook{begindocument/before}{
#+end_src

- We want the hyperlinks to be as unobtrusive as possible.
   #+begin_src latex
     \bool_if:NTF \g__letgut_paper_bool {
       \hypersetup{hidelinks}
     }{
       \hypersetup{%
         colorlinks,%
         allcolors={letgut_allcolors_links},%
       }%
     }
   #+end_src

   A preset of acronyms is input (if found, firstly in the current directory,
   secondly in the parent directory, thirdly in the TDS).
   #+begin_src latex
     \file_if_exist:nTF {./\c__letgut_acronyms_file_tl}{
       \tl_gset:Nn \g__letgut_effective_acronyms_file_tl {./\c__letgut_acronyms_file_tl}
     }{
       \file_if_exist:nTF {../\c__letgut_acronyms_file_tl}{
         \tl_gset:Nn \g__letgut_effective_acronyms_file_tl {../\c__letgut_acronyms_file_tl}
       }{
         \file_if_exist:nT {\c__letgut_acronyms_file_tl}{
           \tl_gset:Nn \g__letgut_effective_acronyms_file_tl {\c__letgut_acronyms_file_tl}
         }
       }
     }
     \input {\g__letgut_effective_acronyms_file_tl}
   #+end_src

- Depending on some chosen class options, some packages have to be loaded,
  notably before \package*{hyperref} is loaded, and actions are taken
  accordingly.
  - If the `draft` mode (default) is on, we load the \package*{lua-typo} which
    highlights typographical flaws with LuaLaTeX. For the moment,
    # this option is disabled if the `paper` option is enabled since enabling
    # both
    the \package*{lua-typo} isn't loaded since  the `luacolor`
    package it loads
    #
    currently does not work well in ~shipout/background~ (see
    https://github.com/ho-tex/luacolor/issues/4).
    #+begin_src latex
      % % \bool_if:NF \g__letgut_paper_bool {
      \bool_if:NT \g__letgut_draft_bool {
        % \RequirePackage[All]{lua-typo}
        \AddToHook{shipout/background}
        {
          \__letgut_unselectable:n {
            \put(0.5\paperwidth,-0.5\paperheight)
            {
              \Huge
              #+end_src
    Currently, we can't use \package{l3color}'s ~\color_fill:n~ (see
    \url{https://github.com/ho-tex/luacolor/issues/4\#issuecomment-848774260})
    and we have to rely on \package{xcolor}'s ~\color~.
              #+begin_src latex
                % \color_fill:n {black!10}
                \color{black!10}
                \hbox_set:Nn \l__letgut_tmpa_box {
                  \fontsize{0.25\paperwidth}{0.3\paperwidth}
                  \selectfont
                  \c__letgut_draftwatermark_text_tl
                }
                \hbox_set:Nn \l__letgut_tmpb_box {
                  \hbox_overlap_center:n {
                    \box_use:N \l__letgut_tmpa_box
                  }
                }
              #+end_src
    The draft watermak is rotated in order to be parallely slanted to the first
    diagonal of the page (angle $=\arctan(\text{paper height}/\text{paper
    width})$).
              #+begin_src latex
                \box_rotate:Nn \l__letgut_tmpb_box {
                  \fp_eval:n {
                    atand (
                    \dim_to_fp:n {\paperheight}
                    /
                    \dim_to_fp:n {\paperwidth}
                    )
                  }
                }
                \box_use:N \l__letgut_tmpb_box
                }
                }
                }
                #+end_src
                Moreover, we want all the overfull boxes to be shown (as with
    ~draft~ option of the standard classes).
                #+begin_src latex
                  \setlength\overfullrule{5pt}
                  }
                  % % }
#+end_src

# - We proceed to some settings for the \package*{glossaries-extra}:
#   - the acronyms will be displayed in small caps, in footnotes,
#   - the acronym definitions in footnotes are terminated with a period, like
#     other footnotes,
#   - we load the file of the built-in glossaries and acronyms terms.
#
#   Note that we don't make use of ~\makeglossaries~ since we don't need
#   glossaries files, since we don't make use of ~\printglossary~ (and friends)
#   since we don't need to display a glossary or a list of acronyms.
# #+begin_src latex
#   \setabbreviationstyle[acronym]{short-sc-footnote}
#   \glsdisablehyper
#   \renewcommand*{\glsxtrabbrvfootnote}[2]{\footnote{#2.}}
#   \loadglsentries{letgut-acronyms}
# #+end_src

We close the ~\AddToHook{begindocument/before}~ argument.

#+begin_src latex
}
#+end_src

** Page color default settings
:PROPERTIES:
:CUSTOM_ID: ImplementationPagecolordefaultsettings-c1hg55h0jlj0
:END:

   By default, the page color will be the one linked to the ~screen~ option.

#+begin_src latex
  \pagecolor[rgb]{\c__letgut_default_pagecolor_screen_clist}
  \clist_set_eq:NN \g__letgut_pagecolor_clist
    \c__letgut_default_pagecolor_screen_clist
#+end_src

** Options
:PROPERTIES:
:CUSTOM_ID: ImplementationOptions-imhg55h0jlj0
:END:

We now define the options of the class:

- ~for-readers~/~for-authors~, depending on the target audience,
- ~draft~/~final~ depending on the state of the document,
- ~paper~/~screen~ depending on the way the document will be read,
- ~number~ for the number of the issue,
- ~date~ for the date of the issue, either empty (hence the current (month)
  date) or at the format ~YYYY-MM~ or as free input,
- ~pagecolor~ (relevant only with the (default) ~screen~ load time option) for
  a color of the page other than the default one (used behind the scene by the
  ~letgut-banner~ package),
- ~watermark letter~ for another letter than the “g” in watermark,
- ~watermark scale~ for the case the letter in watermark is too big,
- ~allcolorslinks~ for the color of (all) the links,
- ~membership-reminder~ that typesets a membership reminder on the first page,
- ~editorial~ depending on the editorial is wanted or not,
- ~infomations~ depending on the GUTenberg informations are wanted or not,
- ~detailedtoc~ depending on the automatic ToC is wanted maximally (until
  subparagraphs) detailed or not.

#+begin_src latex
  \keys_define:nn { letgut }
  {
    , for-readers  .bool_gset:N = \g__letgut_for_readers_bool
    , for-readers .initial:n = { true }
    , for-authors .bool_gset_inverse:N = \g__letgut_for_readers_bool
    , draft .bool_gset:N = \g__letgut_draft_bool
    , draft .initial:n = { true }
    , draft .default:n = { true }
    , final .bool_gset_inverse:N = \g__letgut_draft_bool
    , paper .code:n = {
      \bool_gset_true:N \g__letgut_paper_bool
      \pagecolor[rgb]{\c__letgut_default_pagecolor_paper_clist}
      \clist_set_eq:NN \g__letgut_pagecolor_clist
        \c__letgut_default_pagecolor_paper_clist
    }
    , screen .code:n = {
      \bool_gset_false:N \g__letgut_paper_bool
    }
    , number .int_gset:N = \g__letgut_number_int
    , date .code:n = { \__letgut_date_parse:n { #1 } }
    , date .initial:x = {\the\year-\the\month}
    , pagecolor .initial:V
      = \c__letgut_default_pagecolor_screen_clist
    , pagecolor .code:n = {
      \definecolor{letgut_pagecolor}{rgb}{#1}
      \AddToHook{begindocument/before}
      {
        \bool_if:NTF \g__letgut_paper_bool {
          \msg_warning:nnn{letgut}{
            pagecolor~inoperative~with~paper~option
          }{#1}
        }{
          \clist_gset:Nn \g__letgut_pagecolor_clist { #1 }
          \pagecolor[rgb]{#1}
        }
      }
    }
    , watermark~ letter .tl_gset:N = \g__letgut_watermark_letter_tl
    , watermark~ letter .initial:n = g
    , watermark~ scale .tl_gset:N = \g__letgut_watermark_scale_tl
    , watermark~ scale .initial:n = 1
    , allcolorslinks .code:n = {
      \colorlet{letgut_allcolors_links}{#1}}
    , allcolorslinks .initial:V
      = \c__letgut_default_allcolors_links_color_tl
    , membership-reminder .bool_gset:N
      = \g__letgut_membership_reminder_bool
    , membership-reminder  .initial:n = { true }
    , editorial .bool_gset:N = \g__letgut_editorial_bool
    , editorial .initial:n = { true }
    , informations .bool_gset:N = \g__letgut_informations_bool
    , informations .initial:n = { true }
    , detailedtoc .str_gset:N = \g__letgut_detailedtoc_level_str
    , detailedtoc .default:n = 5
    , detailedtoc .initial:n = 0
    , reverse-files-attachement .code:n = {
      \AddToHook{begindocument/before}{
        \bool_lazy_and:nnTF {\g__letgut_for_readers_bool} {!\g__letgut_paper_bool}
        {
          \bool_gset_false:N \g__letgut_included_files_attached_bool
        }{
          \bool_gset_true:N \g__letgut_included_files_attached_bool
        }
      }
    }
  }
  \ProcessKeyOptions[ letgut ]
  \AddToHook{begindocument/before}{
    \bool_lazy_and:nnTF {\g__letgut_for_readers_bool} {!\g__letgut_paper_bool}
    {
      \bool_gset_true:N \g__letgut_included_files_attached_bool
    }{
      \bool_gset_false:N \g__letgut_included_files_attached_bool
    }
  }
#+end_src

#+begin_src latex
    \definecolor{letgut_pagecolor}{rgb}{\g__letgut_pagecolor_clist}
#+end_src

** Headers
:PROPERTIES:
:CUSTOM_ID: ImplementationHeaders-78ig55h0jlj0
:END:

We now define the headers.

- The distance between the baseline of the header text and the decorative line
  in the header is made a little bit bigger.
  #+begin_src latex
    \renewcommand{\headruleskip}{
      \c__letgut_head_rule_skip_dim
    }
  #+end_src
- The decorative line width in the header is made a little bit bigger.
  #+begin_src latex
    \renewcommand{\headrulewidth}{
      \c__letgut_head_rule_width_dim
    }
  #+end_src
- The headers alternate between even and odd pages.
  #+begin_src latex
    \fancyhf{}
    \fancyhead[RO,LE]{\thepage}
    \fancyhead[RE,LO]{\scshape \g__letgut_mark_tl}
  #+end_src
- The headers are left offset
  #+begin_src latex
    \fancyheadoffset[L]{\c__letgut_hoffset_dim}
  #+end_src
- We load the default \package{fancyhdr}'s page style
  #+begin_src latex
    \pagestyle{fancy}
#+end_src

** Marginal notes
:PROPERTIES:
:CUSTOM_ID: ImplementationMarginalnotes-1uig55h0jlj0
:END:
   We want the marginal notes to be in the left margin.

#+begin_src latex
  \reversemarginpar
#+end_src

** Table of contents
:PROPERTIES:
:CUSTOM_ID: ImplementationTableofcontents-rhjg55h0jlj0
:END:

   The table of contents is customized:

- layout:
  #+begin_src latex
  \etocsetstyle {section}
  {}
  {\leavevmode\leftskip 2.5cm\relax}
  {\mdseries\small%
    \etocname~\dotfill~\etocpage\par
  }
  {}
  \etocsetstyle {subsection}
  {}
  {\leavevmode\leftskip 3cm\relax}
  {\mdseries\footnotesize%
    \etocname~\dotfill~\etocpage\par
  }
  {}
  \etocsetstyle {subsubsection}
  {}
  {\leavevmode\leftskip 3.5cm\relax}
  {\mdseries\scriptsize%
    \etocname~\dotfill~\etocpage\par
  }
  {}
  \etocsetstyle {paragraph}
  {}
  {\leavevmode\leftskip 4cm\relax}
  {\mdseries\tiny%
    \etocname~\dotfill~\etocpage\par
  }
  {}
  \etocsetstyle {subparagraph}
  {}
  {\leavevmode\leftskip 4.5cm\relax}
  {\mdseries\tiny%
    \etocname~\dotfill~\etocpage\par
  }
  {}
#+end_src
- its title and the corresponding vertical space are dropped:
#+begin_src latex
  \etocsettocstyle{\medskip}{\medskip}
#+end_src

** COMMENT Alerts
:PROPERTIES:
:CUSTOM_ID: ImplementationAlerts-o4kg55h0jlj0
:END:

   We create a box to display alerts.

#+begin_src latex
  \DeclareTCBox{\alertbox}{}{
    nobeforeafter,
    colback=red!5!white,
    colframe=red!75!black,
    title={Attention !},
    fonttitle=\bfseries,
    before=\begin{center},
    after=\end{center}
  }
#+end_src

** Geometry of the document
:PROPERTIES:
:CUSTOM_ID: ImplementationGeometryofthedocument-mqkg55h0jlj0
:END:

#+begin_src latex
  \geometry{
    asymmetric,
    textheight=\c__letgut_textheight_dim,
    textwidth=\c__letgut_textwidth_dim,
    lmargin=\c__letgut_lmargin_dim,
    tmargin=\c__letgut_tmargin_dim,
    head=\c__letgut_head_dim,
    headsep=\c__letgut_headsep_dim,
    marginparwidth=\c__letgut_marginparwidth_dim,
    % verbose,
    % showframe
  }
#+end_src

** Alert box
:PROPERTIES:
:CUSTOM_ID: ImplementationAlertbox-rblg55h0jlj0
:END:

#+begin_src latex
   \cs_new_protected:Nn \__letgut_alert_box:nn
   {
     \noindent
     \begin{tblr}{
         width=\linewidth,
         rowspec={Q[c,m,#1]},
         colspec={|
    #+end_src

# < (Just not to disturb the parentheses balancing
#    detection of my editor.)

    #+begin_src latex
           >{\bfseries}X|
         },
         vlines,
         hlines,
         rowsep=2.5mm,
         colsep=2.5mm
       }
       #2
     \end{tblr}
     \skip_vertical:N \c_zero_dim
   }
#+end_src

** Announcements
:PROPERTIES:
:CUSTOM_ID: ImplementationAnnounces-nahckb909pj0
:END:
#+begin_src latex
  \tcbset{
    announce~ style/.style={
      enhanced,
      sharp~ corners,
      boxrule=0mm,
      leftrule=1cm,
      bottomrule=1cm,
      toptitle=20pt,
      bottomtitle=20pt,
      center~ title,
      before~ title=\hypersetup{hidelinks},
      fonttitle=\scshape\bfseries\huge,
      fontupper=\Large,
      fontlower=\Large,
      skin=empty,
      segmentation~ style=solid,
      halign=center,
      toc~ title/.store~ in=\l__letgut_toc_title_announce_tl,
      color/.store~ in=\l__letgut_toc_color_announce_tl,
    }
  }
  \cs_new_protected:Npn \__letgut_toc_title_announce:nn #1 #2
  {
    \tl_if_empty:NTF {#1}{
      \phantomsection\addcontentsline{toc}{title}{#2}
    }{
      \tl_if_empty:NF {#2}{
        \phantomsection\addcontentsline{toc}{title}{#1}
      }
    }
  }
  \NewTColorBox{announcement}{ O{} m }
  {
    announce~ style,
    title=#2,
    borderline~ west={1cm}{0pt}{\l__letgut_toc_color_announce_tl},
    phantom={\__letgut_toc_title_announce:nn {\l__letgut_toc_title_announce_tl}{#2}},
    overlay~ unbroken~ and~ first ={
      \node[color=\l__letgut_toc_color_announce_tl]~ at~ ([yshift=8pt]title.south)
      {\pgfornament[width=0.4\linewidth]{88}};
      \node[color=white,anchor=north~ west]~ at~ (frame.north~ west)
      {\huge\bfseries\aldineright{}};
    },
    #1,
    coltitle=\l__letgut_toc_color_announce_tl,
  }
#+end_src

** Rebus
   :PROPERTIES:
   :CUSTOM_ID: ImplementationRebus-osw8m3f0cpj0
   :END:

#+begin_src latex
  \int_new:N \g__letgut_rebus_int
  \NewDocumentCommand{\solution}{}{\tcblower}
  \NewDocumentCommand{\displaysolutions}{}{%
    \tcbstoprecording\tcbinputrecords%
  }
  \tcbset{%
    rebus~ style/.style={%
      enhanced,
      boxrule=0pt,
      frame~hidden,
      fonttitle=\normalfont\large\bfseries,
      before~ title={\lefthand\c_space_tl},
      halign=center,
      title~ addon/.store~ in=\l__letgut_title_addon_tl,
      after~ title={
        \tl_if_empty:NF {\l__letgut_title_addon_tl}{
          \c_space_tl(\emph{\l__letgut_title_addon_tl})
        }
      },
      float = bh,
      colback = __letgut_background_terminal_stdout,
      colbacktitle = __letgut_background_terminal_stdin,
      coltitle = black
    }
  }
  \tcbset{
    no~ solution/.style={
      no~ recording,
      after~ upper=dans~ la~ prochaine~ \lettre{},
      after~ upper~ pre={
        \par\bigskip\hfill\scriptsize\itshape
        Solution\c_space_tl
      },
    }
  }
  \NewTColorBox{rebus}{+!O{}}{%
    before~ title~ pre = {\int_gincr:N \g__letgut_rebus_int},
    rebus~ style,
    fonttitle=\bfseries,
    title={Rébus},
    label={rebus@\int_use:N\g__letgut_rebus_int},
    after~ upper={\vpageref[ci-dessous]{solution@\int_use:N\g__letgut_rebus_int}},
    after~ upper~ pre={
      \par\bigskip\hfill\scriptsize\itshape
      Solution\c_space_tl
    },
    lowerbox=ignored,
    savelowerto=rebus-\int_use:N\g__letgut_rebus_int.tex,
    record={\string\rebussolution*[\int_use:N\g__letgut_rebus_int][][]},
    #1
  }
  \NewDocumentCommand{\rebussolution}{s +o o O{}}{%
    \IfValueTF{#2}{
      \begin{tcolorbox}[
        rebus~ style,
        label=solution@\int_use:N\g__letgut_rebus_int,
        halign=justify,
        before~ title={\lefthand{}~Solution~ du~ rébus\c_space_tl},
        title={
          \IfBooleanTF{#1}{
            \vpageref[ci-dessus]{rebus@#2}
          }{
            de~la~\lettre{}\c_space_tl
            \IfValueTF{#3}{
              #3
            }{
              précédente
            }
          }
        },
        phantomlabel={
          \IfBooleanT{#1}{
            solution@#2
          }
        },
        #4
        ]
        \IfBooleanTF{#1}{
          \file_if_exist_input:n {rebus-#2.tex}
        }{
          #2
        }
      \end{tcolorbox}
    }{
      \IfValueF{#3}{
        \tcbstoprecording
        \tcbinputrecords
      }
    }
  }
#+end_src

** “Title” and marks
:PROPERTIES:
:CUSTOM_ID: ImplementationTitleandmarks-5ylg55h0jlj0
:END:

   We redefine ~\@title~ in order to make it empty. Hence we can later test if
   the ~\title~ has been populated by the user (thanks to ~\title~) and, if so,
   we will (automatically) display on the first page and headers the provided
   title instead of the number and the date (see below).
#+begin_src latex
  \tl_gclear:N \@title
#+end_src

At the end of preamble, we put the ~\@title~ (empty or populated by the
user) into ~\g__letgut_@title_str~ for later tests.
#+begin_src latex
  \AddToHook{begindocument/before}
  {
    \str_set_eq:NN \g__letgut_@title_str \@title
#+end_src

The number is added only if it is
# < (Just not to disturb the parentheses balancing
#    detection of my editor.)
$>0$.

 #+begin_src latex
   \tl_gset:Nn \g__letgut_title_tl {
      \int_compare:nNnT
      \g__letgut_number_int
    #+end_src

# < (Just not to disturb the parentheses balancing
#    detection of my editor.)

    #+begin_src latex
         > \c_zero_int
         {numéro~ \int_use:N\g__letgut_number_int{}~ --~ }
         \g__letgut_date_tl
       }
       \str_if_empty:NTF \g__letgut_@title_str {
         \tl_gset:Nn \g__letgut_mark_tl {
           \c__letgut_la_lettre_gutenberg_plain_tl
         }
       }{
         \tl_gset:Nn \g__letgut_mark_tl {
           \g__letgut_@title_str
         }
       }
       \tl_gput_right:Nn \g__letgut_mark_tl {
         ,~\g__letgut_title_tl
       }
      }
#+end_src

** First page handling
:PROPERTIES:
:CUSTOM_ID: ImplementationFirstpagehandling-nmmg55h0jlj0
:END:

The first page is special as it should automatically contain certain elements:
- the banner,
- either the number and the date of the issue, or a given title,
- the table of contents,
- the editorial,
- the membership reminder.

The first page is inserted only is the target audience is the readers of the
Lettre.

#+begin_src latex
    \AddToHook{begindocument/before}{
      \bool_if:NT \g__letgut_for_readers_bool {
#+end_src

#+begin_src latex
  \file_if_exist:nTF {\c__letgut_banner_file_tl.pdf}{
    \AddToHookNext{shipout/background}
    {
      \begin{picture}(0,0)
        \put(-2cm,-25.275cm){
          \__letgut_orig_includegraphics*[scale=0.96]{
            \c__letgut_banner_file_tl.pdf
          }
        }
      \end{picture}
    }
  }{
    #+end_src

The ~pagecolor~ option is possibly set (with ~\AddToHook{begindocument/before}~)
and the page color chosen has to be used for the letters of the banner so the
following code has to be postponed after the former (hence here
~\AddToHook{begindocument}~ and with ~\AddToHook{begindocument/before}~).

#+begin_src latex
      \msg_term:nn{letgut}{Banner~file~not~provided}
      \RequirePackage[
      , pagecolor = { \g__letgut_pagecolor_clist }
      , watermark~ letter = { \g__letgut_watermark_letter_tl }
      , watermark~ scale = { \g__letgut_watermark_scale_tl }
      ]{letgut-banner}
    }
  #+end_src

Here starts what is automatically added at the beginning of the document.

#+begin_src latex
  \AddToHook{begindocument/end}
  {
#+end_src

- If a membership reminder is asked, we create an (alert) box containing the
  corresponding text and reduce the textheight of this page of the height of
  this box.
    #+begin_src latex
      \bool_if:NT \g__letgut_membership_reminder_bool {
        \box_new:N \g__letgut_membership_reminder_box
        \vbox_gset:Nn \g__letgut_membership_reminder_box {
          \alertbox []{ \c__letgut_membership_reminder_tl }
        }
        \dim_gset:Nn
        \g__letgut_membership_reminder_box_height_dim {
          \box_ht:N \g__letgut_membership_reminder_box
        }
        \enlargethispage{
         - \g__letgut_membership_reminder_box_height_dim
        }
      }
    #+end_src
- We want the text on the first page to not encroach on the horizontal bar of
  the banner.
    #+begin_src latex
      \dim_const:Nn \c__letgut_first_page_shrink_dim {
        \c__letgut_banner_thickness_dim
        +
        \c__letgut_tmargin_dim
        +
        \c__letgut_textheight_dim
        -
        .5\paperheight
        -
        .5\c__letgut_banner_height_dim
      }
      \enlargethispage{
        - \c__letgut_first_page_shrink_dim
      }
      \enlargethispage{
        - \baselineskip
      }
    #+end_src
- If the user has specified a title, we make a (our own) title and use it and
  the possibly provided author(s) for the metadata of the PDF; otherwise we
  display the number and the date of the newsletter.
      #+begin_src latex
        \str_if_empty:NTF \g__letgut_@title_str {
          \bool_gset_true:N \g__letgut_title_empty_bool
          \begin{flushright}
            \Huge
            \text_titlecase_first:n { \g__letgut_title_tl }
          \end{flushright}
          \hypersetup{
            pdftitle={
              \c__letgut_Lettre_gutenberg_tl
              \int_compare:nNnT
              \g__letgut_number_int
    #+end_src

# < (Just not to disturb the parentheses balancing
#    detection of my editor.)

    #+begin_src latex
              > \c_zero_int
              {
                \c_space_tl~ \int_use:N \g__letgut_number_int
              }
            },
            pdfauthor={
              Association~
              \c__letgut_gutenberg_tl
              \c_space_tl
              (éditeur)
            },
          }
          \vspace*{1cm}
        }{
          \hypersetup{
            pdftitle={\g__letgut_@title_str}
          }
          \tl_if_empty:NF \@author {
            \hypersetup{
              pdfauthor={\@author}
            }
          }
          #+end_src
  Here, we insert the title, but don't rely on ~\maketitle~ because it
  lets to ~\relax~ the command ~\title~ which is used later as new sectionning
  levels for the titles of the articles of the Lettre. So we emulate the
  intersting part of the ~\maketitle~ command (borrowed from \file{article.cls}).
          #+begin_src latex
            \null
            \vskip 2em%
            \begin{center}%
              \let \footnote \thanks
              {\LARGE \@title \par}%
              \vskip 1.5em%
              {\large
                \lineskip .5em%
                \begin{tabular}[t]{c}%
                  \@author
                \end{tabular}\par}%
              \vskip 1em%
              {\large \@date}%
            \end{center}%
            \par
            \vskip 1.5em
            }
      #+end_src
- No headers on the first page. This has to be inserted after the previous
  (customized) ~\maketitle~ since this command inserts a ~\newpage~ which would
  ruin the effort of ~\thispagestyle{empty}~ if inserted before.
      #+begin_src latex
        \thispagestyle{empty}
      #+end_src
- The table of contents is automatically added and has a bookmark entry. By
  default only the titles of the articles are shown (but the bookmarks have
  their natural depth) but the ~detailedtoc~ option make its depth until
  subpargraphs (which may be useful in order to check the structure of the
  Lettre).
      #+begin_src latex
        \etocsetnexttocdepth{\g__letgut_detailedtoc_level_str}
        \pdfbookmark[1]{
          \c__letgut_contents_name_tl
        }{
          \c__letgut_contents_name_tl
        }
        \tableofcontents
        \etocsetnexttocdepth{2}
      #+end_src
  Should a title be displayed, the table of contents would be added after it,
  followed by a new page (otherwise, if ~\title~ used after ~\begin{document}~
  sees its title on the front page, it will overflow onto the banner).
      #+begin_src latex
        \bool_if:NTF \g__letgut_title_empty_bool {
          \vspace*{1.5cm}
        }{
          \newpage
        }
      #+end_src
- Conditionally to the fact the ~editorial~ option is not set to ~false~: if the
  \file*{editorial.tex} of the editorial is found, its content is input and
  has a bookmark entry; otherwise, a warning is displayed.
      #+begin_src latex
        \bool_if:NTF \g__letgut_editorial_bool {
          \file_if_exist:nTF {./\c__letgut_editorial_file_tl}{
            \RenewDocumentCommand\author{ s m } {
              \__letgut_author:nn { #1 } {#2}
            }
            \pdfbookmark[1]{Éditorial}{
              \c__letgut_editorial_file_tl
            }
            \inputarticle{./\c__letgut_editorial_file_tl}
    #+end_src

# < (Just not to disturb the parentheses balancing
#    detection of my editor.)

    #+begin_src latex
          % \if\count{\pagenumber}>1
          % \else
          % \newpage
          % \fi
        }{
          \msg_warning:nn{letgut}{Editorial~file~missing}
          \alertbox{ \c__letgut_missing_editorial_tl }
          \newpage
        }
      }{
        % \newpage
      }
#+end_src

We close the ~\AddToHook{begindocument/end}~ argument.

#+begin_src latex
  }
#+end_src

Membership reminder.

#+begin_src latex
  \AddToHook{begindocument}{
    \bool_if:NT \g__letgut_membership_reminder_bool {
      \AddToHookNext{shipout/background}
      {
        \put(1in,-1in){
          \put(
          \oddsidemargin,
          - \topmargin
          - \headheight
          - \headsep
          - \textheight
          + \c__letgut_first_page_shrink_dim
          + .5\baselineskip
          ){
            \box_use:N \g__letgut_membership_reminder_box
          }
        }
      }
    }
  }
#+end_src

** Last page handling
:PROPERTIES:
:CUSTOM_ID: ImplementationLastpagehandling-jbng55h0jlj0
:END:

The last pages are special: they should automatically contain
# the list of the acronyms used in the \lettre, and
some informations about \gutenberg.

#+begin_src latex
  \AddToHook{enddocument}
  {
    % \clearpage
    % \printacronyms[heading=title,display=used]
#+end_src
Conditionally to the fact the ~informations~ option is not set to ~false~: if
the \file*{informations-gut.tex} which contains the informations about
\gutenberg{} is found (firstly in the current directory, secondly in the parent
directory, thirdly in the TDS). Otherwise, a warning is displayed.
   #+begin_src latex
     \bool_if:NT \g__letgut_informations_bool {
       \clearpage
       \phantomsection
       \file_if_exist:nTF {./\c__letgut_informations_gutenberg_file_tl}{
         \inputarticle*{
           ./\c__letgut_informations_gutenberg_file_tl
         }
       }{
         \file_if_exist:nTF {../\c__letgut_informations_gutenberg_file_tl}{
           \inputarticle*{
             ../\c__letgut_informations_gutenberg_file_tl
           }
         }{
           \file_if_exist:nTF {\c__letgut_informations_gutenberg_file_tl}{
             \inputarticle*{
               \c__letgut_informations_gutenberg_file_tl
             }
           }{
             \msg_warning:nn{letgut}{Informations~file~missing}
             \alertbox{ \c__letgut_missing_infomations_tl }
           }
         }
       }
     }
   #+end_src

We close the ~\AddToHook{enddocument}~ argument.

#+begin_src latex
  }
#+end_src

We close the boolean which tests whether the target audience is the readers or
the author(s) of the “Lettre”.

#+begin_src latex
  }
  }
#+end_src

** Sections, subsections, etc.
:PROPERTIES:
:CUSTOM_ID: ImplementationSectionssubsectionsetc-vzng55h0jlj0
:END:

*** Numbering
:PROPERTIES:
:CUSTOM_ID: ImplementationSectionssubsectionsetcNumbering-lmog55h0jlj0
:END:
    We want all the sections to be unnumbered.

 #+begin_src latex
   \setcounter{secnumdepth}{-10}
 #+end_src

*** Format
:PROPERTIES:
:CUSTOM_ID: ImplementationSectionssubsectionsetcFormat-tapg55h0jlj0
:END:

When used in titles, ~\hologo~ needs to be protected. In order to not bother the
user with this peticularity, we make this the default for it.

    #+begin_src latex
      % \AddToHook{cmd/hologo/before}{\protect}
      \NewCommandCopy{\__letgut_old_hologo}{\hologo}
      \RenewDocumentCommand {\hologo} { m }{
        \protect\__letgut_old_hologo { #1 }
      }
    #+end_src

We want the \package{hologo}'s ~\hologo~ command to have its mandatory argument
not uppercased in the context of ~\text_uppercase:n~ (as in titles, cf. just
below).

    #+begin_src latex
      \tl_put_right:Nn \l_text_case_exclude_arg_tl { \hologo }
      % \tl_put_right:Nn \l_text_case_exclude_arg_tl { \ac }
      % \tl_put_right:Nn \l_text_case_exclude_arg_tl { \acs }
      % \tl_put_right:Nn \l_text_case_exclude_arg_tl { \acl }
      % \tl_put_right:Nn \l_text_case_exclude_arg_tl { \acf }
    #+end_src

- We create the new level ~\title~ for the titles of the articles. They are
  displayed uppercased.

    #+begin_src latex
      \AddToHook{begindocument/before}{%
        \titleclass{\title}{straight}[\part]
        \titleformat{\title}{
          \normalfont
          \LARGE
          \bfseries
        }{}{1em}{
          \aldineleft\c_space_tl\text_uppercase:n
        }
        \etocsetlevel{title}{0}
        \def\toclevel@title{0}%
        \etocsetstyle {title}
        {}
        {
          \leavevmode\leftskip 2cm\relax
        }
        {
          \bool_lazy_or:nnTF {
            \str_if_eq_p:Vn \g__letgut_detailedtoc_level_str { 0 }
          }{
            \str_if_eq_p:Vn \g__letgut_detailedtoc_level_str { title }
          }
          {
            \mdseries
          }{
            \bfseries
          }
          \normalsize
          \etocname
          \nobreak\leaders\hbox~ to~ 1ex{\hss.}\hfill
          \etocpage
          \par
        }
        {}
        #+end_src
- We also create the new level ~\subtitle~ for the subtitles of the
  articles. They are dispayed uppercased (but in a smaller size than ~\title~).
        #+begin_src latex
          \titleclass{\subtitle}{straight}[\title]
          \titleformat{\subtitle}{
            \normalfont
            \Large
            \bfseries
            \text_uppercase:n
          }{}{1em}{}{}
          \etocsetlevel{subtitle}{1}
          \def\toclevel@subtitle{1}
        #+end_src
- By default (that is when ~\subtitle~ is not used), the toc levels of the
  sections, subsections, etc. are set to ~1~, ~2~, etc. But, when ~\subtitle~ is
  used, since this level has toc level ~1~, the toc levels of the sections,
  subsections, etc. have to be set to ~2~, ~3~, etc. And this has to be reset
  each time ~\title~ and  ~\subtitle~ are used. Unfortunately, this doesn't
  work, probably because of the asynchronous way the ToC is built. Hence, we
  will make
        #+begin_src latex
          \AddToHook{cmd/subtitle/before}{
            \iow_open:Nn \g__letgut_etocsetlevel_by_article_iow {
              \g__letgut_current_article_filename_tl
            }
            \iow_now:Nn \g__letgut_etocsetlevel_by_article_iow {
              \etocsetlevel{section}{2}
              \def\toclevel@section{2}%
              \etocsetlevel{subsection}{3}
              \def\toclevel@subsection{3}%
              \etocsetlevel{subsubsection}{4}
              \def\toclevel@subsubsection{4}%
              \etocsetlevel{paragraph}{5}
              \def\toclevel@paragraph{5}%
              \etocsetlevel{subparagraph}{6}
              \def\toclevel@subparagraph{6}%
            }
            \iow_close:N \g__letgut_etocsetlevel_by_article_iow
          }
     #+end_src
    # - The sections have the usual format, except that their titles are uppercase.
    #     #+begin_src latex
    #       \titleformat{\section}{
    #         \normalfont
    #         \Large
    #         \bfseries
    #         \text_uppercase:n
    #         % }{\thesection}{1em}{}{}
    #    #+end_src
    - The (sub)paragraphs have the usual format, except that they are not
      “runin” (\package{titlesec}'s package's terminology).
    #+begin_src latex
      \titleformat{\paragraph}{
        \normalfont
        \normalsize
        \bfseries
      }{\theparagraph}{1em}{}
      \titleformat{\subparagraph}{
        \normalfont
        \normalsize
        \bfseries
      }{\thesubparagraph}{1em}{}
    }
     #+end_src
- We modify the spacing, mainly by shifting the titles in the left margin (the
  rest is borrowed from the standard classes).
   #+begin_src latex
     \titlespacing*{\title}
     {\c__letgut_title_hoffset_dim}
     {\c__letgut_before_title_title_skip}
     {\c__letgut_after_title_title_skip}
     \titlespacing*{\subtitle}
     {\c__letgut_subtitle_hoffset_dim}
     {\c__letgut_before_subtitle_title_skip}
     {\c__letgut_after_subtitle_title_skip}
     \titlespacing*{\section}
     {\c__letgut_section_hoffset_dim}
     {\c__letgut_before_section_title_skip}
     {\c__letgut_after_section_title_skip}
     \titlespacing*{\subsection}
     {\c__letgut_subsection_hoffset_dim}
     {\c__letgut_before_subsection_title_skip}
     {\c__letgut_after_subsection_title_skip}
     \titlespacing*{\subsubsection}
     {\c__letgut_subsubsection_hoffset_dim}
     {\c__letgut_before_subsubsection_title_skip}
     {\c__letgut_after_subsubsection_title_skip}
     \titlespacing*{\paragraph}
     {\c__letgut_paragraph_hoffset_dim}
     {\c__letgut_before_paragraph_title_skip}
     {\c__letgut_after_paragraph_title_skip}
     \titlespacing*{\subparagraph}
     {\c__letgut_subparagraph_hoffset_dim}
     {\c__letgut_before_subparagraph_title_skip}
     {\c__letgut_after_subparagraph_title_skip}
#+end_src

** Document commands
:PROPERTIES:
:CUSTOM_ID: ImplementationDocumentcommands-s1qg55h0jlj0
:END:

*** Setup
:PROPERTIES:
:CUSTOM_ID: ImplementationDocumentcommandsSetup-roqg55h0jlj0
:END:

We define the command that lets us specify the newsletter setup.

#+begin_src latex
\NewDocumentCommand \letgutsetup { m } {
  \keys_set:nn { letgut } { #1 }
}
#+end_src

*** For the rubric dedicated to new stuffs appeared on \acs{ctan}
:PROPERTIES:
:CUSTOM_ID: ImplementationDocumentcommandsFortherubricdedicatedtonewstuffsappearedonacsctan-jerg55h0jlj0
:END:

 - We create a new type of list, dedicated to the new stuffs (classes, packages,
   etc.) on CTAN and similar to a description list (except the label provided in
   the optional argument of ~\item~ is automatically an argument of the
   ~\package~ command).
    #+begin_src latex
      \cs_new_protected:Nn \__letgut_ctan_news_item:n {
        \package{#1}
      }
      \newlist{ctannews}{description}{1}
      \hbox_set:Nn \l__letgut_space_box {\c_space_tl}
      \setlist[ctannews]{format=\__letgut_ctan_news_item:n,labelsep=\box_wd:N \l__letgut_space_box}
      #+end_src
   The stuffs created by French speaking people are highlighted in a special
   way and, for this, a starred variant of the ~\item~ command is provided. We
   insert a systematic ~\phantomsection~ in order the cross-references to such
   items are correct.
      #+begin_src latex
        \cs_new_protected:Npn \__letgut_item:nn #1 #2
        {
          \tl_if_empty:nTF {#2}
          {
            \__letgut_old_item
          }{
            \__letgut_old_item[#2]
          }
          \phantomsection
          \IfBooleanT {#1}{
            \mbox{}
            \marginpar[\mbox{}\hfill\francophony]{}
            \exp_last_unbraced:NV
            \peek_charcode_remove_ignore_spaces:NT \c_tilde_str {}
          }
        }
        \NewCommandCopy{\__letgut_old_item}{\item}
        \RenewDocumentCommand {\item} { s O{} } {
          \__letgut_item:nn {#1}{#2}
        }
 #+end_src

- Command that inserts the \enquote{francophony} logo.
 #+begin_src latex
   \NewDocumentCommand {\francophony} {  } {
     \raisebox{-1.5pt}{
       \__letgut_orig_includegraphics*[width=\f@size pt]{
         letgut-francophony-icon
       }
     }
   }
    #+end_src

*** Persons, authors and list of participants
:PROPERTIES:
:CUSTOM_ID: ImplementationDocumentcommandsPersonsandauthors-h5sg55h0jlj0
:END:

For both persons and authors, the argument of:
- a single individual is given as:
  - \meta{Last name}, \meta{First name}
  - and possibly \meta{Last name}, \meta{First name}, \meta{Title}
- multiple individuals, the schemes for each of the individuals are the same of
  a single one, separated by a semicolon.

#+begin_src latex
  \NewDocumentCommand {\person} { s m } {
    \__letgut_process_list:nn {#1} {#2}
  }
  \cs_new_protected:Npn \__letgut_author:nn #1 #2
  {
    \nopagebreak
    \begin{flushright}
      \__letgut_process_list:nn {#1} {#2}
    \end{flushright}
  }
  \AddToHook{begindocument/end}{%
    \RenewDocumentCommand\author{ s m } {
      \__letgut_author:nn { #1 } { #2 }
    }
  }
 #+end_src

 In the following ~\__letgut_titlecase_name~ control sequence, we parse last and
 first names, splitting and unsplitting them at spaces and dashes (~-~) with
 titlecasing in between.

 #+begin_src latex
\cs_new_protected:Npn \__letgut_titlecase_name:n #1
{
  \seq_set_split:Nnn \l__letgut_tmpa_seq { - }  {#1}
  \seq_set_map_x:NNn \l__letgut_tmpb_seq \l__letgut_tmpa_seq {
    \text_titlecase_first:n{ \text_lowercase:n {##1} }
  }
  \tl_set:Nx \l__letgut_tmpa_tl {\seq_use:Nn \l__letgut_tmpb_seq {-}}
  \seq_clear:N \l__letgut_tmpa_seq
  \seq_set_split:NnV \l__letgut_tmpa_seq { ~ }  { \l__letgut_tmpa_tl }
  \seq_set_map_x:NNn \l__letgut_tmpb_seq \l__letgut_tmpa_seq {
    \text_titlecase_first:n{##1}
  }
  \seq_use:Nn \l__letgut_tmpb_seq {~}
}
 #+end_src

 The following control sequence splits a semi-colon separated list and each item
 is splitted as a comma separated list.

#+begin_src latex
  \cs_new_protected:Nn \__letgut_person_last_name:n
  {
    {% \scshape
      \__letgut_titlecase_name:n {#1}}
  }
  \cs_new_protected:Nn \__letgut_person_first_name_last_name:nn
  {
    \__letgut_titlecase_name:n {#1}
    \c_space_tl
    \__letgut_person_last_name:n {#2}
  }
  \cs_new_protected:Nn
  \__letgut_person_first_name_last_name_title:nnn
  {
    \__letgut_person_first_name_last_name:nn {#1} {#2}
    \c_space_tl
    (#3)
  }
  \seq_new:N \l__letgut_items_seq
  \cs_new_protected:Npn \__letgut_process_list:nn #1 #2
  {
    \seq_clear:N \l__letgut_items_seq
    \seq_set_split:Nnn \l__letgut_tmpa_seq {~and~} {#2}
    \IfBooleanT{#1}{
      \seq_sort:Nn \l__letgut_tmpa_seq
      {
        \str_compare:nNnTF { ##1 } > { ##2 }
        { \sort_return_swapped: }
        { \sort_return_same: }
      }
    }
    \seq_map_inline:Nn \l__letgut_tmpa_seq {
      \seq_set_from_clist:Nn \l__letgut_tmpb_seq {##1}
      \seq_pop_left:NN \l__letgut_tmpb_seq \l_letgut_last_name_tl
      \seq_pop_left:NN \l__letgut_tmpb_seq \l_letgut_first_name_tl
      \seq_pop_left:NN \l__letgut_tmpb_seq \l_letgut_title_tl
      \seq_put_right:Nx \l__letgut_items_seq {
        \quark_if_no_value:NTF \l_letgut_first_name_tl {
          \__letgut_person_last_name:n {
            \l_letgut_last_name_tl
          }
        }{
          \quark_if_no_value:NTF \l_letgut_title_tl {
            \__letgut_person_first_name_last_name:nn
            {\l_letgut_first_name_tl}
            {\l_letgut_last_name_tl}
          }{
            \__letgut_person_first_name_last_name_title:nnn
            {\l_letgut_first_name_tl}
            {\l_letgut_last_name_tl}
            {\l_letgut_title_tl}
          }
        }
      }
    }
    \seq_use:Nnnn \l__letgut_items_seq {
      \c_space_tl \str_use:N \& \c_space_tl
    } { ,~ } { \c_space_tl \str_use:N \& \c_space_tl }
  }
 #+end_src

The list of contributors (possibly the masthead) will be the list of the persons
who contributed to the current issue of the \lettre{}, with both a pre- and
a post-text, the whole in a centered boxed minipage.

 #+begin_src latex
   \tl_const:Nn \c__letgut_preamble_list_of_contributors_tl {
     De~ près,~ de~ loin,~ par~ leurs~ avis~ éclairés,~ par~ leurs~ remarques~
     pertinentes~ ou~ par~ leurs~ articles,~ ont~ contribué~ à~ cette~
     \lettre{}~ :~ %
   }
   \tl_const:Nn \c__letgut_postamble_list_of_contributors_tl {
     \c_space_tl (et~ nous~ espérons~ n'avoir~ oublié~ personne).
   }
   \cs_new_protected:Nn \__letgut_list_of_contributors:nnn
   {
     \par
     \fbox{
       \begin{minipage}[t]{\linewidth-2\fboxsep-2\fboxrule}
         #1
         \person*{#3}
         #2
       \end{minipage}
     }
   }
   \NewDocumentCommand {\listofcontributors} {
     O{\c__letgut_preamble_list_of_contributors_tl}
     O{\c__letgut_postamble_list_of_contributors_tl}
     m
   } {
     \__letgut_list_of_contributors:nnn {#1} {#2} {#3}
   }
 #+end_src

*** Horizontal rule
:PROPERTIES:
:CUSTOM_ID: ImplementationDocumentcommandsHorizontalrule-8vsg55h0jlj0
:END:

 #+begin_src latex
   \NewDocumentCommand {\separator} {  } {
     \par
     \skip_vertical:N 1em
     \hrule
     \skip_vertical:N 1em
   }
 #+end_src

*** Alert boxes
:PROPERTIES:
:CUSTOM_ID: ImplementationDocumentcommandsAlertboxes-ijtg55h0jlj0
:END:

 #+begin_src latex
   \colorlet {letgut_default_alert_box_color} {
     \c__letgut_default_alert_box_color_tl
   }
   \NewDocumentCommand \alertbox {
     O{letgut_default_alert_box_color} +m
   } {
     \__letgut_alert_box:nn { #1 }{ #2 }
   }
 #+end_src

*** Typesetting of packages, classes, files and softwares.
:PROPERTIES:
:CUSTOM_ID: ImplementationDocumentcommandsTypesettingofpackagesclassesfilesandsoftwares-09ug55h0jlj0
:END:

The ~\c__letgut_httpsprefix_tl~ comes from:

https://github.com/latex3/hyperref/issues/188#issuecomment-826302843.

 #+begin_src latex
   \tl_const:Nx \c__letgut_httpsprefix_tl
   {https\char_generate:nn{58}{12}//}
   #+end_src
   We define the font switches dedicated to each of packages and classes
   (\TeX{} stuff), files and softwares.
   #+begin_src latex
     \tl_new:N \l__letgut__tex_stuff_font_switch_tl
     \tl_new:N \l__letgut_files_font_switch_tl
     \tl_new:N \l__letgut_softwares_font_switch_tl
     \tl_set:Nn \l__letgut__tex_stuff_font_switch_tl {\sffamily}
     \tl_set:Nn \l__letgut_files_font_switch_tl {\ttfamily}
     \tl_set:Nn \l__letgut_softwares_font_switch_tl {\sffamily}
   #+end_src

   #+begin_src latex
     \cs_new_protected:Nn \__letgut_tex_stuff:nn
     {
       \IfNoValueTF {#1}
       {
         \href{
           \c__letgut_httpsprefix_tl ctan.org/pkg/#2
         }{
           {\l__letgut__tex_stuff_font_switch_tl #2}
         }
       }{
         \tl_if_empty:nTF {#1}
         {
           {\l__letgut__tex_stuff_font_switch_tl #2}
         }{
           \href{#1}{{\l__letgut__tex_stuff_font_switch_tl #2}}
         }
       }
     }
     \cs_new_protected:Nn \__letgut_software:nn
     {
   #+end_src

We split the software's name at spaces in order to apply the dedicated
font switch (~\ttfamily~) to all of it except to the spaces.

   #+begin_src latex
       \seq_set_split:Nnn \l__letgut_tmpa_seq { ~ } { #2 }
       \seq_set_map:NNn \l__letgut_tmpb_seq \l__letgut_tmpa_seq {{\l__letgut_softwares_font_switch_tl ##1}}
       \tl_if_empty:nTF {#1}
       {
         \seq_use:Nn \l__letgut_tmpb_seq { ~ }
       }{
         \href{#1}{ \seq_use:Nn \l__letgut_tmpb_seq { ~ } }
       }
     }
     \cs_new_protected:Nn \__letgut_file:n
     {
       {\l__letgut_files_font_switch_tl #1}
     }
     \NewDocumentCommand{\package}{ s o m O{\c__letgut_package_tl} } {
       \IfBooleanT{#1}{
         #4
         \c_space_tl
       }
       \__letgut_tex_stuff:nn {#2}{#3}
     }
     \NewDocumentCommand{\class}{ s o m O{\c__letgut_class_tl} } {
       \IfBooleanT{#1}{
         #4
         \c_space_tl
       }
       \__letgut_tex_stuff:nn {#2}{#3}
     }
     \NewDocumentCommand{\file}{ s m O{\c__letgut_file_tl} } {
       \IfBooleanT{#1}{
         #3
         \c_space_tl
       }
       \__letgut_file:n {#2}
     }
     \NewDocumentCommand {\software} { s O{} m O{\c__letgut_software_tl} } {
       \IfBooleanT{#1}{
         #4
         \c_space_tl
       }
       \__letgut_software:nn {#2}{#3}
     }
 #+end_src

*** Names, expressions, etc.
:PROPERTIES:
:CUSTOM_ID: ImplementationDocumentcommandsNamesexpressionsetc-11vg55h0jlj0
:END:

We define here some commands for names and expressions that are likely to be
frequently used. The more the users will resort to these commands, the less
will be inconsistently typesetted these names and expressions.

#+begin_src latex
  \NewExpandableDocumentCommand { \gutenberg } {  } {
    \c__letgut_gutenberg_tl
  }
  \NewExpandableDocumentCommand { \gut } {  } {
    \c__letgut_gutenberg_tl
  }
  \NewExpandableDocumentCommand { \assogut } {  } {
    \c__letgut_association_tl \c_space_tl \c__letgut_gutenberg_tl
  }
  \NewExpandableDocumentCommand { \Assogut } {  } {
    \text_titlecase_first:n {\assogut}
  }
  \NewExpandableDocumentCommand { \lettres } {  } {
    \c__letgut_Lettres_tl
  }
  \NewExpandableDocumentCommand { \lettresgut } {  } {
    \c__letgut_Lettres_tl \c_space_tl \c__letgut_gutenberg_tl
  }
  \NewExpandableDocumentCommand { \listegut } {  } {
    \c__letgut_liste_gut_tl
  }
  \NewExpandableDocumentCommand { \Cahier } { } {
    \c__letgut_cahier_tl
  }
  \NewExpandableDocumentCommand { \Cahiers } { } {
    \c__letgut_cahiers_tl
  }
  \NewExpandableDocumentCommand { \cahier } { } {
    \c__letgut_cahier_tl
  }
  \NewExpandableDocumentCommand { \cahiers } { } {
    \c__letgut_cahiers_tl
  }
  \NewExpandableDocumentCommand { \cahiergut } { } {
    \cahier \c_space_tl \gutenberg
  }
  \NewExpandableDocumentCommand { \cahiersgut } { } {
    \cahiers \c_space_tl \gutenberg
  }
  \NewExpandableDocumentCommand { \letgut } {  } {
    \class{letgut}
  }
  \NewExpandableDocumentCommand { \letgutcls } {  } {
    \class*{letgut}
  }
  \NewExpandableDocumentCommand { \tugboat } {  } {
    \c__letgut_tugboat_tl
  }
  \NewExpandableDocumentCommand { \dtk } {  } {
    \c__letgut_dtk_tl
  }
  \NewExpandableDocumentCommand { \knuth } {  } {
    \person{Knuth,~ Donald~ E.}
  }
  \NewExpandableDocumentCommand { \lamport } {  } {
    \person{Lamport,~ Leslie}
  }
  \NewExpandableDocumentCommand { \tl } {  } {
    \c__letgut_tex_live_tl
  }
  \NewExpandableDocumentCommand { \linux } {  } {
    \c__letgut_gnu_linux_tl
  }
  \NewExpandableDocumentCommand { \macos } {  } {
    \c__letgut_macOS_tl
  }
  \NewExpandableDocumentCommand { \windows } {  } {
    \c__letgut_windows_tl
  }
#+end_src

We define the command ~\lettrenumber~ that displays the number of
some \lettre{} issue:

- preceeded by “\no” if used starred,
- by default the current one,
- possibly shifted w.r.t. the current one, depending on the first token of the
  optional argument:
  - if it is not ~.~, ~+~ nor ~-~: this argument (pretty useless: it is easier
    to directly type the desired number),
  - if it is ~.~: the current number of the \lettre (pretty useless: it is
    easier to just not use the optional argument),
  - if it is ~+~ or ~-~ followed by a number: the current number of the \lettre,
    shifted by what is specified.

#+begin_src latex
  \cs_new_protected:Npn \__letgut_get_lettre_number:n #1
  {
    \tl_if_empty:nTF {#1}{
      \int_use:N \g__letgut_number_int
    }{
      \tl_set:Nx \l__letgut_tmpa_tl {\tl_head:n { #1 }}
      \tl_set:Nn \l__letgut_tmpb_tl { #1 }
      \tl_case:NnF \l__letgut_tmpa_tl {
        {\c__letgut_plus_tl}  {\int_eval:n {\g__letgut_number_int\l__letgut_tmpa_tl\tl_range:Nnn \l__letgut_tmpb_tl { 2 } { -1 }}}
        {\c__letgut_minus_tl} {\int_eval:n {\g__letgut_number_int\l__letgut_tmpa_tl\tl_range:Nnn \l__letgut_tmpb_tl { 2 } { -1 }}}
        {\c__letgut_dot_tl}   {\int_use:N \g__letgut_number_int}
      }
      {\l__letgut_tmpb_tl}
    }
  }
  \NewDocumentCommand { \lettrenumber } { s O{} } {
    \IfBooleanT{#1}{
      \no
    }
    \__letgut_get_lettre_number:n { #2 }
  }
#+end_src

The “\lettre” and “\lettregut” expressions are treated separately since they are
subject to variations, depending on how they are used. The corresponding commands
~\lettre~ and ~\lettregut~ used without star nor optional argument typeset
resp. “\lettre” and “\lettregut”:

- immediately followed by “\no” if used starred,
- followed by some strings, depending on the first token of their optional
  argument:
  - if it is not ~.~, ~+~ nor ~-~: this argument,
  - if it is ~.~: the current number of the \lettre,
  - if it is ~+~ or ~-~ followed by a number: the current number of the \lettre,
    shifted by what is specified.

#+begin_src latex
  \tl_const:Nn \c__letgut_plus_tl { + }
  \tl_const:Nn \c__letgut_minus_tl { - }
  \tl_const:Nn \c__letgut_dot_tl { . }
  \cs_new_protected:Npn \__letgut_lettre:nnn #1 #2 #3
  {
    \c__letgut_Lettre_tl #2
    \tl_if_empty:nF {#1}
    {
      #3
      \nobreakspace
      \__letgut_get_lettre_number:n {#1}
    }
  }
  \NewDocumentCommand { \lettre } { s O{} } {
    \IfBooleanTF{#1}{
      \__letgut_lettre:nnn { #2 } { } {
        \tl_if_empty:nF {#2}{
          \c_space_tl\no
        }
      }
    }{
      \__letgut_lettre:nnn { #2 } { } {  }
    }
  }
  \NewDocumentCommand { \lettregut } { s O{} } {
    \IfBooleanTF{#1}{
      \__letgut_lettre:nnn { #2 } { \c_space_tl \c__letgut_gutenberg_tl } { \c_space_tl\no }
    }{
      \__letgut_lettre:nnn { #2 } { \c_space_tl \c__letgut_gutenberg_tl } {  }
    }
  }
#+end_src

The ~\lettre~ and ~\lettregut~ can be used in titles, sections, etc. (involving
bookmarks) but, because their last argument isn't a mandatory one, they would
have an inconsistent behavior if used with their star or their optional
argument (see https://tex.stackexchange.com/q/427557/18401).

*** Foreign locutions
:PROPERTIES:
:CUSTOM_ID: ImplementationDocumentcommandsForeignlocutions-1svg55h0jlj0
:END:

#+begin_src latex
  \cs_new_protected:Npn \__letgut_emphasis:n #1
  {
    \emph{#1}
  }
  \NewDocumentCommand { \foreignloc } { m } {
    \__letgut_emphasis:n {#1}
  }
  \NewDocumentCommand { \latinloc } { m } {
    \__letgut_emphasis:n {#1}
  }
#+end_src

*** Unicode code points
:PROPERTIES:
:CUSTOM_ID: ImplementationDocumentcommandsUnicodecodes-30lksfa0nlj0
:END:

#+begin_src latex
  \cs_new_protected:Npn \__letgut_unicode_code:nn #1 #2
  {
    U+\bgroup\addfontfeature{Numbers={Lining,Proportional}}#2\egroup
    \tl_if_empty:nF {#1}{
      \c_space_tl
      ({\addfontfeature{RawFeature={smcp,c2sc}}#1})
    }
  }
  \NewDocumentCommand { \Ucode } { O{} m } {
    \__letgut_unicode_code:nn {#1}{#2}
  }
#+end_src

*** Bookmarks handling
:PROPERTIES:
:CUSTOM_ID: ImplementationDocumentcommandsBookmarkshandling-zbxg55h0jlj0
:END:

We disabling some commands when their arguments have to go to bookmarks.

#+begin_src latex
      \AddToHook{begindocument/end}{
        \pdfstringdefDisableCommands{
          \RenewExpandableDocumentCommand\person { m }{#1}
          \RenewExpandableDocumentCommand\author{ m }{#1}
          \RenewExpandableDocumentCommand \package { s O{} m }{
            \IfBooleanT{#1}{\c__letgut_package_tl\c_space_tl}#3
          }
          \RenewExpandableDocumentCommand\class { s O{} m }{
            \IfBooleanT{#1}{\c__letgut_class_tl\c_space_tl}#3
          }
          \RenewExpandableDocumentCommand\file { s m }{
            \IfBooleanT{#1}{\c__letgut_file_tl\c_space_tl}#2
          }
          \RenewExpandableDocumentCommand\software { s O{} m }{
            \IfBooleanT{#1}{\c__letgut_software_tl\c_space_tl}#3
          }
          \RenewExpandableDocumentCommand\foreignloc{ m }{#1}
          \RenewExpandableDocumentCommand\latinloc{ m }{#1}
          \RenewExpandableDocumentCommand\lettre{ }{Lettre}
          \RenewExpandableDocumentCommand\gutenberg{ }{GUTenberg}
          \RenewExpandableDocumentCommand\gut{ }{\gutenberg}
          \RenewExpandableDocumentCommand\lettregut{ }{
            \lettre\c_space_tl\gutenberg
          }
          \RenewExpandableDocumentCommand\Cahier{ }{Cahier}
          \RenewExpandableDocumentCommand\Cahiers{ }{\Cahier s}
          \RenewExpandableDocumentCommand\cahier{ }{Cahier}
          \RenewExpandableDocumentCommand\cahiers{ }{\cahier s}
          \RenewExpandableDocumentCommand\cahiergut{ }{
            \cahier\c_space_tl\gutenberg
          }
          \RenewExpandableDocumentCommand\cahiersgut{ }{
            \cahier s\c_space_tl\gutenberg
          }
          \RenewExpandableDocumentCommand\letgut{ }{letgut}
          \RenewExpandableDocumentCommand\letgutcls{ }{classe~ letgut}
          \RenewExpandableDocumentCommand\knuth{ }{Donald~ E.~ Knuth}
          \RenewExpandableDocumentCommand\lamport{ }{Leslie~ Lamport}
          \RenewExpandableDocumentCommand\linux{ }{GNU/Linux}
          \RenewExpandableDocumentCommand\macos{ }{macOS}
          \RenewExpandableDocumentCommand\windows{ }{Windows}
        }
      }
#+end_src

*** Acronyms
:PROPERTIES:
:CUSTOM_ID: ImplementationDocumentcommandsAcronyms-93yg55h0jlj0
:END:

The following command let us define acronyms. The arguments are as follows:
- ~#1~: optional argument that let us override the default settings of this
  command,
- ~#2~: the uppercase version of both the id and the short form of the acronym,
- ~#3~: the long form (in French if #4 has ~-NoValue-~, in English otherwise),
- ~#4~: the French translation of an English acronym.

#+begin_src latex
  \cs_new_protected:Nn \__letgut_acronym:nnnn
  {
    \AddToHook{begindocument/before}{
    \IfValueTF {#4}{
      \tl_if_empty:nTF {#4}{
        \exp_args:Nx \DeclareAcronym{\text_lowercase:n {#2}}{
          short = \text_lowercase:n {#2},
          sort= #2,
          long = {\emph{#3}},
          extra-long = {anglais},
          pdfstring = #2,
          short-acc = #2,
          #1
        }
      }{
        \exp_args:Nx \DeclareAcronym{\text_lowercase:n {#2}}{
          short = \text_lowercase:n {#2},
          sort= #2,
          long = {#4},
          foreign = {#3},
          foreign-babel = english,
          foreign-locale = anglais,
          pdfstring = #2,
          short-acc = #2,
          #1
        }
      }
    }{
      \exp_args:Nx \DeclareAcronym{\text_lowercase:n {#2}}{
        short = \text_lowercase:n {#2},
        sort= #2,
        long = {#3},
        pdfstring = #2,
        short-acc = #2,
        #1
      }
    }
#+end_src
The ⟨id⟩ of the acronym will automatically be the name of a public command
(~\~​⟨id⟩) acting as ~\ac{id}~.
#+begin_src latex
  \exp_after:wN \cs_if_exist:cT { \text_lowercase:n {#2} } {
    \msg_note:nnn{letgut}{Existing~command}{#2}
  }
  \exp_args:Nc \ProvideDocumentCommand
  { \text_lowercase:n {#2} } { s } {
    \IfBooleanTF {##1}{
      \exp_args:Nx \acs { \text_lowercase:n {#2} }
    }{
      \exp_args:Nx \ac  { \text_lowercase:n { #2 } }
    }
  }
#+end_src
We want the command ~\~​⟨id⟩ to work also in bookmarks (the resulting string will
be the uppercased acronym).
#+begin_src latex
  \pdfstringdefDisableCommands
    {
      \exp_after:wN
      \def\cs:w \text_lowercase:n {#2} \cs_end: { #2 }
    }
  }
  }
#+end_src

The first occurrences of the acronyms will be displayed in their short forms,
with the long ones in footnotes. But what about acronyms whom first occurrences
arise within footnotes? We want them to be displayed as their short forms
followed by their the long form in parentheses. For this, we have to add
a boolean at the beginning (and reversed at the end) of the ~\footnote~ command
to know whether we currently are in a footnote or not and display the acronym
accordingly.

BTW, we hack the ~\footnote~ command in order to mimic the ~multiple~ option of
the \package{footmisc} package (consecutive ~\footnote~ commands make their
corresponding footnote marks separated by commas). See
https://tex.stackexchange.com/a/62091.

#+begin_src latex
  \let\__letgut_next_token\relax
  \cs_new_protected:Npn \__letgut_next_token_is_footnote:
  {\if_meaning:w\footnote\__letgut_next_token\textsuperscript{,}\fi}
  \NewCommandCopy{\__letgut_old_footnote}{\footnote}
  \RenewDocumentCommand {\footnote} { O{} m }{
    \bool_set_true:N \l__letgut_in_footnote_bool
    \tl_if_empty:nTF {#1}{
      \__letgut_old_footnote { #2 }
    }{
      \__letgut_old_footnote [#1] { #2 }
    }
    \bool_set_false:N \l__letgut_in_footnote_bool
    \futurelet\__letgut_next_token\__letgut_next_token_is_footnote:
  }
#+end_src
We change a bit both the ~footnote~ acro template, the ~description~ list
template, and the macro which prints the locale.
#+begin_src latex
    \DeclareAcroProperty{extra-foreign}
    \DeclareAcroProperty{extra-long}
    \RenewAcroTemplate {footnote}
    {
      \acrowrite {short}
      \acroiffirstT
      {
        #+end_src
        If we are in a footnote, first occurrences of the acronyms are displayed
        as “short (long)”. Otherwise, they are displayed as “short\footnote{long}”.
        #+begin_src latex
        \bool_if:NTF \l__letgut_in_footnote_bool {
          \space
          (
          \acroifT {alt} { \acrotranslate {or} ~ \acrowrite {alt} ~ }
          \acroifT {foreign} { \acrowrite {foreign} }
          \acrowrite {long}
          \acrogroupcite
          )
        }{
          \acfootnote
          {
            \acroifT {alt} {
              \acrotranslate {or} ~ \acrowrite {alt} :~
            }
            \acroifT {foreign} { \acrowrite {foreign} }
            \acrowrite {long}
            \acroifT {extra-long} { ~ [\acrowrite {extra-long}] }
            \acroifT {extra-foreign} {
              \c_space_tl [\acrowrite {extra-foreign}]
            }
            \acrogroupcite
          }
        }
      }
    }
    \RenewAcroTemplate[list]{description}{%
      \acroheading
      \acropreamble
      \begin{description}
        \acronymsmapF{%
      \item[\acrowrite{short}\acroifT{alt}{/\acrowrite{alt}}]
        \acroifT{foreign}{
          \acrowrite{foreign}\acroifT{extra}{, }
        }%
        \acroifT{extra}{\acrowrite{extra}}%
        \acroifanyT{foreign,extra}{\acspace (}%
        \acrowrite{list}%
        \acroifT {extra-foreign} {
          , \c_space_tl \acrowrite {extra-foreign}
        }
        \acroifanyT{foreign,extra}{)}%
        \acropagefill
        \acropages
        {\acrotranslate{page}\nobreakspace}
        {\acrotranslate{pages}\nobreakspace}%
      }
      {\item\AcroRerun}
    \end{description}
  }
  % #1: id
  % #2: property
  % #3: text
  \cs_set_protected:Npn \acro_locale:nnn #1#2#3
    {
      \acro_if_foreign:nTF {#2}
        {
          \acro_if_locale:nnTF {#1} {#2}
            {
              \__acro_foreign_language:en
                { \str_lowercase:e {
                    \acro_property_get:nn {#1} {foreign-babel}
                  }
                }
                {#3}
              \bool_if:NTF \l__acro_list_bool
                { \bool_if:NT \l__acro_list_show_locale_bool }
                { \bool_if:NT \l__acro_show_locale_bool }
                {
                  {
                    \l__acro_locale_format_tl
                      {
                        \acro_property_if_set:nnTF {#1} {
                          foreign-locale
                        }
                          {
                            \acspace
                            [
                            \acro_property_get:nn {#1} {
                              foreign-locale
                            }
                            ]
                          }{
                            \baselanguage
                            {
                              \acro_property_get:nn {#1} {
                                foreign-babel
                              }
                            }
                          }
                      }
                  }
                  :~
                }
            }
            {#3}
        }
        {#3}
    }
#+end_src
Now, the document command that let the user create acronyms.
#+begin_src latex
  \NewDocumentCommand{\letgutacro}{ O{} m m o }
  {
    \__letgut_acronym:nnnn {#1} {#2} {#3} {#4}
  }
#+end_src
For printing the acronyms, we define two new heading templates for the structure
levels ~\title~ and ~\subtitle~.
#+begin_src latex
\NewAcroTemplate[heading] {title}
  { \title { \acrolistname } }
\NewAcroTemplate[heading] {subtitle}
  { \subtitle { \acrolistname } }
#+end_src
We make ~\letgutacro~ available only in the preamble part of the document
(otherwise, no warning from \package{acro} but only the long form of the acronym
is printed when used for the first time with ~\ac~).
#+begin_src latex
\@onlypreamble\letgutacro
#+end_src

** Bibliography
:PROPERTIES:
:CUSTOM_ID: ImplementationBibliography-ruyg55h0jlj0
:END:

We want the ~\citeauthor~ command to display, not only the last, but the
full name of the authors.

#+begin_src latex
  \NewCommandCopy{\__letgut_old_citeauthor}{
    \citeauthor
  }
  \RenewDocumentCommand {\citeauthor} { O{} O{} m } {
    \AtNextCite{
      \DeclareNameAlias{labelname}{given-family}
      \protected\def\mkbibnamefamily#1{%
        \textnohyphenation{#1}}%
    }
    \__letgut_old_citeauthor[#1][#2]{#3}
  }
 #+end_src

** Book reviews
:PROPERTIES:
:CUSTOM_ID: ImplementationBookreviews-ekzg55h0jlj0
:END:

#+begin_src latex
  \tl_new:N \l__letgut_bookreview_frontcover_tl
  \tl_new:N \g__letgut_bookreview_bibkey_tl
  #+end_src
The keys options are created.
  #+begin_src latex
  \keys_define:nn { letgut/bookreview }
  {
    title .tl_gset:N = \g__letgut_bookreview_title_tl,
    frontcover .tl_set:N = \l__letgut_bookreview_frontcover_tl,
    bibkey .tl_gset:N = \g__letgut_bookreview_bibkey_tl,
    reviewer .tl_gset:N = \g__letgut_bookreview_reviewer_tl,
    price .tl_gset:N = \g__letgut_bookreview_price_tl,
  #+end_src

All these options, when used, must receive a value.

#+begin_src latex
    title .value_required:n = true,
    frontcover .value_required:n = true,
    bibkey .value_required:n = true,
    reviewer .value_required:n = true,
  }
#+end_src

We create the new environment for the book reviews.

#+begin_src latex
  \cs_generate_variant:Nn \msg_warning:nnn { nnV }
  \cs_generate_variant:Nn \msg_error:nnnn { nnVV }
  \NewDocumentEnvironment{bookreview}{ m }
  {
    \tl_gclear:N \g__letgut_bookreview_price_tl
    \keys_set:nn { letgut/bookreview } { #1 }
    \section{\g__letgut_bookreview_title_tl}
    \tl_if_empty:NTF \l__letgut_bookreview_frontcover_tl {
      \msg_warning:nnV{letgut}{frontcover-missing}{
        \g__letgut_bookreview_title_tl
      }
    }{
#+end_src

We check if the front cover file is available against the list of accepted
extensions of the ~graphicx~ package.

#+begin_src latex
  \clist_map_inline:Nn \Gin@extensions {
    \file_if_exist:nT{\l__letgut_bookreview_frontcover_tl##1}{
      \bool_set_true:N \l__letgut_tmpa_bool
      \clist_map_break:
    }
  }
  \bool_if:NTF \l__letgut_tmpa_bool {
    \marginpar{
      \hspace*{\c__letgut_bookreview_frontcover_margin_sep_dim}
      % \raggedleft
      \raisebox{-\totalheight}{
        \fbox{
          \includegraphics*[width=-\c__letgut_title_hoffset_dim]{
            \l__letgut_bookreview_frontcover_tl
          }
        }
      }
    }
  }{
    \msg_error:nnVV
    {letgut}
    {frontcover-file-not-found}
    {\g__letgut_bookreview_title_tl}
    {\l__letgut_bookreview_frontcover_tl}
  }
  }
  \noindent
  \textsf{\fullcite{\g__letgut_bookreview_bibkey_tl}}
  \tl_if_empty:NF \g__letgut_bookreview_price_tl{
    .\c_space_tl\g__letgut_bookreview_price_tl\c_space_tl €
  }
  \par
  }{
    \exp_args:NV \author{\g__letgut_bookreview_reviewer_tl}
    \bool_if:NT \g__letgut_included_files_attached_bool {
      \seq_map_inline:Nn \g__letgut_added_bib_resources_seq {
        \file_if_exist:nTF {##1}{
          \seq_gput_right:Nn \g__letgut_included_files_seq {
            \textattachfile[
              description={
                Fichier~ bibliographique~ utilisé~ dans~ le~
                présent~ article~ (fichier~ `\tl_to_str:n{##1}`)
              },
              mimetype=application/x-bib
            ]
            {\tl_to_str:n{##1}}
            {\c__letgut_attachment_icon_tl}
          }
        }
      }
    }
  }
#+end_src

** Keyboard keys
:PROPERTIES:
:CUSTOM_ID: ImplementationKeyboardkeys-qa0h55h0jlj0
:END:

We make use of the Linux Biolinum Keyboard font and extend somehow the ~\LKey~
provided by the \package*{biolinum} in order to more easily write keyboard keys
for usual characters on French keyboards.

#+begin_src latex
  \DeclareRobustCommand*\LKey[1]{%
  \ifx#10\biolinumKeyGlyph{zero}%  % spurious space removed 2016/06/24
  \else\ifx#11\biolinumKeyGlyph{one}%
  \else\ifx#12\biolinumKeyGlyph{two}%
  \else\ifx#13\biolinumKeyGlyph{three}%
  \else\ifx#14\biolinumKeyGlyph{four}%
  \else\ifx#15\biolinumKeyGlyph{five}%
  \else\ifx#16\biolinumKeyGlyph{six}%
  \else\ifx#17\biolinumKeyGlyph{seven}%
  \else\ifx#18\biolinumKeyGlyph{eight}%
  \else\ifx#19\biolinumKeyGlyph{nine}%
  \else\ifx#1à\biolinumKeyGlyph{agrave}%
  \else\ifx#1À\biolinumKeyGlyph{Agrave}%
  \else\ifx#1â\biolinumKeyGlyph{acircumflex}%
  \else\ifx#1Â\biolinumKeyGlyph{Acircumflex}%
  \else\ifx#1é\biolinumKeyGlyph{eacute}%
  \else\ifx#1É\biolinumKeyGlyph{Eacute}%
  \else\ifx#1è\biolinumKeyGlyph{egrave}%
  \else\ifx#1È\biolinumKeyGlyph{Egrave}%
  \else\ifx#1ê\biolinumKeyGlyph{ecircumflex}%
  \else\ifx#1Ê\biolinumKeyGlyph{Ecircumflex}%
  \else\ifx#1ë\biolinumKeyGlyph{edieresis}%
  \else\ifx#1Ë\biolinumKeyGlyph{Edieresis}%
  \else\ifx#1î\biolinumKeyGlyph{icircumflex}%
  \else\ifx#1Î\biolinumKeyGlyph{Icircumflex}%
  \else\ifx#1ï\biolinumKeyGlyph{idieresis}%
  \else\ifx#1Ï\biolinumKeyGlyph{Idieresis}%
  \else\ifx#1ô\biolinumKeyGlyph{ocircumflex}%
  \else\ifx#1Ô\biolinumKeyGlyph{Ocircumflex}%
  \else\ifx#1ù\biolinumKeyGlyph{ugrave}%
  \else\ifx#1Ù\biolinumKeyGlyph{Ugrave}%
  \else\ifx#1û\biolinumKeyGlyph{ucircumflex}%
  \else\ifx#1Û\biolinumKeyGlyph{Ucircumflex}%
  \else\ifx#1ü\biolinumKeyGlyph{udieresis}%
  \else\ifx#1Ü\biolinumKeyGlyph{Udieresis}%
  \else\ifx#1ÿ\biolinumKeyGlyph{ydieresis}%
  \else\ifx#1Ÿ\biolinumKeyGlyph{Ydieresis}%
  \else\ifx#1ç\biolinumKeyGlyph{ccedilla}%
  \else\ifx#1Ç\biolinumKeyGlyph{Ccedilla}%
  \else\biolinumKeyGlyph{#1}%
  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
#+end_src

** Miscellanous
:PROPERTIES:
:CUSTOM_ID: ImplementationMiscellanous-r11h55h0jlj0
:END:

- We specify the possible hyphenations of \enquote{\gutenberg}.
#+begin_src latex
   \hyphenation{GUTen-berg}
#+end_src

*** ISSN
:PROPERTIES:
:CUSTOM_ID: ImplementationMiscellanousISSN-cr1h55h0jlj0
:END:

#+begin_src latex
  \cs_new_protected:Npn \__letgut_issn:
  {
    \bool_if:NTF \g__letgut_paper_bool {
      \c__letgut_paper_issn_tl
    }{
      \c__letgut_online_issn_tl
    }
  }
  \NewDocumentCommand{\letgutissn}{ }{
    \__letgut_issn:
  }
#+end_src

*** Non selectable text
:PROPERTIES:
:CUSTOM_ID: ImplementationMiscellanousNonselectabletext-wh2h55h0jlj0
:END:

We create a control sequence that makes its argument not selectable in the
PDF. This will be used notably for the line numbers of the listings and the
watermarks.
#+begin_src latex
\cs_new_protected:Npn \__letgut_unselectable:n #1
{
  \BeginAccSupp{ActualText={}}#1\EndAccSupp{}
}
#+end_src

*** Typesetting of code, etc.
:PROPERTIES:
:CUSTOM_ID: ImplementationMiscellanousTypesettingofcodeetc-f83h55h0jlj0
:END:

    We provide a ~\meta~ macro that (poorly) mimics the one of the
    \package*{doc}. It is added at the very end of the preamble since other
    package that provide another definition of this macro may have been loaded
    (e.g. \package{tcolorbox}).
 #+begin_src latex
   \colorlet {__letgut_meta} {
     brown
   }
   \cs_new_protected:Nn \__letgut_meta:nn
   {
       \bgroup
       \normalfont
       \ttfamily
       \itshape
       \textcolor{#1}{$\langle$#2$\rangle$}
       \egroup
   }
   \AddToHook{begindocument/end}{
     \DeclareDocumentCommand{\meta}{ O{__letgut_meta} m } {
       \__letgut_meta:nn {#1}{#2}
     }
   }
 #+end_src

*** Input of articles
:PROPERTIES:
:CUSTOM_ID: ImplementationMiscellanousInputofarticles-aqok3ja00pj0
:END:

We create our own ~\input~ command for the articles of the Lettre with the
following characteristics:

- The previous style is applied automatically. Hence, the keywords defined in
  a previous file (by loading some peticular (La)TeX dialects, i.e. control
  sequences and keywords specific to some class or packages) won't interfere
  with the ones of the current file.
- All the acronyms are reset (each acronym is developped at its first occurrence).
- The source file of the article is attached to the \pdf{} (if desired,
  otherwise, use the starred version).

We first create a function that attach to the PDF a file only if it exists in
the current directory and is non empty. This will be applied to both the
\file{localconf.tex} and \file{pre-documentclass.tex} files below.

#+begin_src latex
  \cs_new_protected:Npn \__letgut_attach_non_empty_existing_file:n #1 {
    \file_get_size:nN {./#1.tex} \l__letgut_tmpa_tl
    \quark_if_no_value:NF \l__letgut_tmpa_tl {
      \tl_if_eq:NnF \l__letgut_tmpa_tl {0} {
        \file_if_exist:nTF {##1}{
          \seq_gput_left:Nn \g__letgut_included_files_seq {
            \textattachfile[
              description={Source~ nécessaire~ (fichier~ `#1.tex`)},
              mimetype=application/x-tex]
            {#1.tex}
            {\c__letgut_attachment_icon_tl}
          }
        }
      }
    }
  }
#+end_src

#+begin_src latex
  \cs_new_protected:Npn \__letgut_input_article:nn #1 #2
  {
    \FloatBarrier
    \lstset{ style=__letgut_reset_listings_styles }
    \acresetall%
    \etocsetlevel{section}{1}
    \def\toclevel@section{1}%
    \etocsetlevel{subsection}{2}
    \def\toclevel@subsection{2}%
    \etocsetlevel{subsubsection}{3}
    \def\toclevel@subsubsection{3}%
    \etocsetlevel{paragraph}{4}
    \def\toclevel@paragraph{4}%
    \etocsetlevel{subparagraph}{5}
    \def\toclevel@subparagraph{5}%
    \tl_gset:Nn \g__letgut_current_article_filename_tl {#2.etoc}
    \file_if_exist_input:n {#2.etoc}
    \begin{refsection}
      \input{#2}%
    \end{refsection}
    \bool_if:NT \g__letgut_included_files_attached_bool {
      \IfBooleanF {#1}{
        \__letgut_attach_non_empty_existing_file:n {
          \c__letgut_local_config_file_tl
        }
        \__letgut_attach_non_empty_existing_file:n {
          \c__letgut_pre_documentclass_file_tl
        }
        \seq_gput_left:Nn \g__letgut_included_files_seq {
          \textattachfile[
            description={Source~ du~ présent~ article~ (fichier~ `#2.tex`)},
            mimetype=application/x-tex]
          {#2.tex}
          {\c__letgut_attachment_icon_tl}
        }
        \bool_if:NT \g__letgut_acronyms_file_attached_bool {
          \seq_gput_right:No \g__letgut_included_files_seq {
            \c__letgut_acronyms_file_attached_tl
          }
        }
        \bool_if:NT \g__letgut_lstlanguage_file_attached_bool {
          \seq_gput_right:No \g__letgut_included_files_seq {
            \c__letgut_lstlanguage_file_attached_tl
          }
        }
        \seq_remove_duplicates:N \g__letgut_included_files_seq
        \seq_use:Nn \g__letgut_included_files_seq { \c_space_tl }
        \seq_clear:N \g__letgut_included_files_seq
        \bool_gset_false:N \g__letgut_acronyms_file_attached_bool
        \bool_gset_false:N \g__letgut_lstlanguage_file_attached_bool
      }
    }
  }
  \NewDocumentCommand{\inputarticle}{ s m }{
    \__letgut_input_article:nn { #1 } { #2 }
  }
#+end_src

*** Included graphics attached to the PDF
:PROPERTIES:
:CUSTOM_ID: ImplementationMiscellanousIncludedgraphicsattachedtothePDF-xoc34ja00pj0
:END:

We hack the ~\includegraphics~ command in order to attach the included graphics
to the \pdf{} (if desired, otherwise, use the starred version).

#+begin_src latex
  \NewCommandCopy {\__letgut_orig_includegraphics} {\includegraphics}
  \clist_set:Nx \l__letgut_tmpa_clist {\Gin@extensions}
  \cs_new_protected:Npn \__letgut_includegraphics:nnn #1 #2 #3
  {
    \file_if_exist:nTF {./#3} {
      \bool_if:NT \g__letgut_included_files_attached_bool {
        \IfBooleanF {#1}{
          \seq_gput_left:Nn \g__letgut_included_files_seq {
            \textattachfile[
            description={
              Fichier~ image~ inclus~ dans~ le~
              présent~ article~ (fichier~ `#3`)
            },
            mimetype=image
            ]{./#3}
            {\c__letgut_attachment_icon_tl}
          }
        }
      }
      \__letgut_orig_includegraphics[#2]{./#3}
    }{
      \bool_gset_false:N \g__letgut_tmpa_bool
      \clist_map_inline:Nn \l__letgut_tmpa_clist {%
        \file_if_exist:nT {./#3##1} {
          \clist_map_break:n {
            \bool_if:NT \g__letgut_included_files_attached_bool {
              \IfBooleanF {#1}{
                \seq_gput_left:Nn \g__letgut_included_files_seq {
                  \textattachfile[
                  description={Fichier~ image~ inclus~ dans~ le~ présent~ article~ (fichier~ `#3##1`)},
                  mimetype=image/##1
                  ]{./#3##1}
                  {\c__letgut_attachment_icon_tl}
                }
              }
            }
            \__letgut_orig_includegraphics[#2]{#3}
            \bool_gset_true:N \g__letgut_tmpa_bool
          }
        }
      }
      % \bool_if:NF \g__letgut_tmpa_bool {
      %   \@latex@error{File~ `#3'~ not~ found}%
      %   {I~ could~ not~ locate~ the~ file~ with~ any~ of~ these~ extensions:^^J%
      %     \clist_use:Nn \l__letgut_tmpa_clist { ~ }^^J\@ehc}%
      % }
    }
  }
  \RenewDocumentCommand {\includegraphics} {s O{} m } {
    \__letgut_includegraphics:nnn {#1} {#2} {#3}
  }
#+end_src

*** Added bibliographic ressources attached to the PDF
:PROPERTIES:
:CUSTOM_ID: ImplementationMiscellanousAddedbibliographicressourcesattachedtothePDF-l4e34ja00pj0
:END:

We hack the ~\addbibresource~ command in order to attach the bibliographic
ressources to the \pdf{}.

#+begin_src latex
  \cs_new:Nn \__letgut_extract_file_for:nn
  {
    \seq_clear:N \g__letgut_added_bib_resources_seq
    \regex_extract_all:nnNT
    {
      \c{ #1 } \[?.*?\]?        \{ ( .*? ) \}
    }
    {
      #2
    }
    \g__letgut_added_bib_resources_seq
    {
      \seq_map_indexed_inline:Nn \g__letgut_added_bib_resources_seq {
        \int_if_odd:nT {##1}
        {
          \seq_gset_item:Nnn \g__letgut_added_bib_resources_seq {##1} {}
        }
      }
      \seq_gremove_duplicates:N \g__letgut_added_bib_resources_seq
      \seq_gpop:NN \g__letgut_added_bib_resources_seq \l_tmpa_tl
    }
  }
  \NewCommandCopy {\__letgut_orig_addbibresource} {\addbibresource}
  \cs_new_protected:Npn \__letgut_addbibresource:nnn #1 #2 #3
  {
    \__letgut_orig_addbibresource[#2]{#3}
  }
  \RenewDocumentCommand {\addbibresource} { s O{} m } {
    \__letgut_addbibresource:nnn {#1} {#2} {#3}
  }
  \AddToHookWithArguments{cmd/sa@gobble/before}{
    \__letgut_extract_file_for:nn { addbibresource }{ #1 }
  }
#+end_src

*** Added acronym definitions file attached to the PDF
:PROPERTIES:
:CUSTOM_ID: ImplementationMiscellanousAddedbibliographicressourcesattachedtothePDF-l4e34ja00pj0
:END:

We hack the ~\ac~ and ~\acs~ commands in order to attach the acronym definitions
file to the \pdf{}.

#+begin_src latex
  \bool_if:NT \g__letgut_included_files_attached_bool {
    \tl_const:Nn \c__letgut_acronyms_file_attached_tl {
      \file_if_exist:nTF {\g__letgut_effective_acronyms_file_t}{
        \textattachfile[
          description={
            Source~ du~ fichier~ d'acronymes~ utilisé~ dans~
            le~ présent~ article~
            (fichier~ `\c__letgut_acronyms_file_tl.tex`)
          },
          mimetype=application/x-tex]%
        {\g__letgut_effective_acronyms_file_tl}%
        {\c__letgut_attachment_icon_tl}
      }
    }
    \AddToHook{cmd/ac/before}{
      \bool_gset_true:N \g__letgut_acronyms_file_attached_bool
    }
    \AddToHook{cmd/acs/before}{
      \bool_gset_true:N \g__letgut_acronyms_file_attached_bool
    }
  }
#+end_src

*** Added letgut listings language file attached to the PDF
:PROPERTIES:
:CUSTOM_ID: ImplementationMiscellanousAddedbibliographicressourcesattachedtothePDF-l4e34ja00pj0
:END:

We hack the ~\ac~ and ~\acs~ commands in order to attach the acronym definitions
file to the \pdf{}.

#+begin_src latex
  \bool_if:NT \g__letgut_included_files_attached_bool {
    \file_if_exist:nTF {../\c__letgut_lstlanguage_file_tl}{
      \tl_const:Nn \c__letgut_lstlanguage_file_attached_tl {
        \textattachfile[
          description={
            Source~ du~ fichier~ de~ langages~ informatiques~ utilisé~
            dans~ le~ présent~ article~
            (fichier~ `\c__letgut_lstlanguage_file_tl`)
          },
          mimetype=application/x-tex]%
        {../\c__letgut_lstlanguage_file_tl}%
        {\c__letgut_attachment_icon_tl}
      }
    }{
      \tl_const:Nn \c__letgut_lstlanguage_file_attached_tl {}
    }
    \AddToHook{env/ltx-code/before}{
      \bool_gset_true:N \g__letgut_lstlanguage_file_attached_bool
    }
    \AddToHook{env/ltx-code-result/before}{
      \bool_gset_true:N \g__letgut_lstlanguage_file_attached_bool
    }
    \AddToHook{env/ltx-code-external-result/before}{
      \bool_gset_true:N \g__letgut_lstlanguage_file_attached_bool
    }
  }
#+end_src

** Listings
:PROPERTIES:
:CUSTOM_ID: ImplementationListings-514h55h0jlj0
:END:

We define a style for all the listings which resets all the \TeX{} control
sequences and keywords, and fix some defaults.

#+begin_src latex
  \lstdefinestyle{__letgut_reset_listings_styles}{
    basicstyle=\ttfamily,
    breaklines,
    language=TeX,%
    texcs={},%
    language={},%
    keywords={},%
    keywords=[2]{},%
    keywords=[3]{},%
    keywords=[4]{},%
    keywords=[5]{},%
    otherkeywords={},%
    alsoletter={},%
    alsodigit={},%
    escapechar=£,
    columns=fullflexible,
    keepspaces=true,
    upquote=true,
    showstringspaces=false,
#+end_src

If line numbers are asked, they should always have the same layout and not be
selectable (hence the ~\__letgut_unselectable:n~).

#+begin_src latex
    numbersep=\c__letgut_number_sep_dim,
    numberstyle=\scriptsize\ttfamily
    \color{__letgut_foregroundLinenumber}
    \__letgut_unselectable:n,
       #+end_src

Because of a current issue involving \package{parskip} and \package{listings}
(\url{https://github.com/FrankMittelbach/fmitex-parskip/issues/3}), we have to
set the skip below the displayed listings to a (almost) zero length. We do the
same for the above skip.

#+begin_src latex
    aboveskip={0\p@ \@plus 6\p@},
    belowskip={0\p@ \@plus 6\p@},
  }
#+end_src

We define as short equivalent of ~\lstinline~ the character
\lstDeleteShortInline™\texttt{™} which is unlikely to be used in ordinary text.

#+begin_src latex
\lstMakeShortInline[breaklines=false]™
#+end_src

We start with an empty listings style.

#+begin_src latex
  \lstset{ style=__letgut_reset_listings_styles }
         #+end_src

*** LaTeX listings and examples
:PROPERTIES:
:CUSTOM_ID: ImplementationListingsLaTeXlistingsandexamples-xt4h55h0jlj0
:END:

We define the colors for the syntax highlighting of LaTeX listings.

#+begin_src latex
  \colorlet{__letgut_texcs}{blue}
  \colorlet{__letgut_comment}{gray}
  \colorlet{__letgut_argument_specification_separator}{red}
  \colorlet{__letgut_argument_specification}{cyan}
  \colorlet{__letgut_mandatory_argument}{purple}
  \colorlet{__letgut_environment}{teal}
  \colorlet{__letgut_key}{__letgut_mandatory_argument}
  \colorlet{__letgut_value}{violet}
  \colorlet{__letgut_optional_argument}{__letgut_key}
  \colorlet{__letgut_math}{green!50!black}
#+end_src

We add our own language files taken in account by the \package*{listings}. They
will be considered after the other usual ones, if found. They are searched firstly
in the current directory, secondly in the parent directory, thirdly in the TDS.

#+begin_src latex
  \def\lstlanguagefiles{
    % lstlang0.sty,
    lstlang1.sty,
    lstlang2.sty,
    lstlang3.sty,
    ./\c__letgut_lstlanguage_file_tl,
    ../\c__letgut_lstlanguage_file_tl,
    \c__letgut_lstlanguage_file_tl,
  }
#+end_src

We define a listing style specific to LaTeX listings.

#+begin_src latex
  \lstdefinestyle{__letgut_latex_listings_style}{
    language=TeX,%
    alsolanguage=[AlLaTeX]TeX,%
    alsolanguage=[LaTeX]TeX,%
    alsolanguage=[plain]TeX,%
    alsolanguage=[common]TeX,%
    alsolanguage=[primitive]TeX,%
    alsolanguage=[extendedLaTeX]TeX,%
    alsolanguage=[classes]TeX,%
    texcsstyle=*\color{__letgut_texcs},
    commentstyle=\color{__letgut_comment}\itshape,
    keywordstyle=    \color{__letgut_argument_specification_separator},
    keywordstyle={[2]\color{__letgut_environment}},
    keywordstyle={[3]\color{__letgut_key}},
    keywordstyle={[4]\color{__letgut_value}},
    keywordstyle={[5]\color{__letgut_argument_specification}},
    keywordstyle={[6]\color{__letgut_key}},
    numbers=left,
#+end_src

The ~listings~ package defines some of the LaTeX's environments as keywords of
order 1. This would force us to do the same in our own language driver file but
would ruin our effort to stylize in a special way (in red) other keywords (see
~otherkeywords={...}~) that are stylized as keywords of order 1. Hence, we
delete these keywords of order 1 and will add them as keywords of order 2 like
all the environments in our own language driver file (in the ~extendedLaTeX~ dialect
that we load by default).

#+begin_src latex
  deletekeywords={%
    array,center,displaymath,document,enumerate,eqnarray,%
    equation,flushleft,flushright,itemize,list,lrbox,math,minipage,%
    picture,sloppypar,tabbing,tabular,trivlist,verbatim,%
  },%
#+end_src

#+begin_src latex
    literate=*%
    {\\\\}{{{\color{__letgut_texcs}\textbackslash\textbackslash}}}{2}%
    {\\[}{{\textcolor{__letgut_math}{\textbackslash[}}}{2}%
    {\\]}{{\textcolor{__letgut_math}{\textbackslash]}}}{2}%
    {$}{{\textcolor{__letgut_math}{\$}}}{1}%$
  }
#+end_src

We first define some colors used in the listings and examples.

#+begin_src latex
  \definecolor{__letgut_backgroundCode}{cmyk}{0,0,0,0.04}
  \definecolor{__letgut_borderCode}{cmyk}{0,0,0,0.2}
  \definecolor{__letgut_foregroundLinenumber}{cmyk}{0,0,0,0.5}
  \definecolor{__letgut_foregroundMention}{cmyk}{0,0,0,0}
  \definecolor{__letgut_backgroundResult}{cmyk}{0,0,0,0}
  #+end_src

For the listings and examples, we rely on \package*{tcolorbox}, and more
specifically on some of its libraries.

#+begin_src latex
  \tcbuselibrary{listings,breakable,skins,hooks,documentation}
#+end_src

We want some common settings for all the ~tcolorbox~es.

#+begin_src latex
  \tcbset{
    breakable,
    sharp~ corners,
    fonttitle=\sffamily\bfseries,
  }
#+end_src

The functions:

- ~\__letgut_code_result_mention_box:n~ draws the mentions “code” and “résultat”
  in the codes boxes and the possible corresponding results boxes,
- ~\__letgut_title_code_result_box:n~ for the title of codes and the results
  boxes: “Exemple” followed by the number of the example and, if a ~title addon~
  option is provided, the specified title addon.

#+begin_src latex
  \cs_new_protected:Npn \__letgut_code_result_mention_box:nn #1 #2
  {
    \node[
      minimum~ width=1cm,
      minimum~ height=\c__letgut_height_mentions_dim,
      outer~ sep=auto,
      anchor=north~ east,
      fill=__letgut_borderCode
      ]~ at~ (#1)
    {
      \itshape
      \small
      \color{__letgut_foregroundMention}
      \__letgut_unselectable:n {#2}
    };
  }
  \cs_new_protected:Npn \__letgut_title_code_result_box:n #1
  {
    Exemple\nobreakspace\thetcbcounter
    \tl_if_empty:NF {#1} { \hypersetup{hidelinks} \c_space_tl\textendash\c_space_tl #1 }
  }
  \cs_new_protected:Nn \__letgut_on_callout_page:nn
  {
    \tl_set:Nn \l__letgut_tmpa_int {\getpagerefnumber{#1}}
    \tl_set:Nn \l__letgut_tmpb_int {\thepage}
    \int_compare:nNnF {\l__letgut_tmpa_int} = {\l__letgut_tmpb_int}
    {#2}
  }
#+end_src

We define the style of the codes.

#+begin_src latex
  \tl_set:Nn \l__letgut_reference_text_tl {
    Cf.~\vref{\g__letgut_label_ltx_example_str}.
  }
  \tcbset{
    __letgut_code/.style={
      listing~ options={
        style=__letgut_latex_listings_style,
      },
      every~ float=\raggedleft,
      colback=__letgut_backgroundCode,
      boxrule=0.25mm,
      colframe=__letgut_borderCode,
      sidebyside~ align=top~ seam,
      toprule~ at~ break=0mm,
      bottomrule~ at~ break=0mm,
      colbacktitle=__letgut_borderCode,
      fonttitle=\sffamily\bfseries,
      before~ title={
        \tl_set:Nn \l__letgut__tex_stuff_font_switch_tl {\rmfamily}
      },
      #+end_src
We define a custom \package*{tcolorbox}'s ~title addon~ option that let us
specify an addon to the title which will added after the automatically
generated title “Exemple \meta{number}”.
      #+begin_src latex
        title~ addon/.store~ in=\l__letgut_title_addon_tl,
        title=\__letgut_title_code_result_box:n {\l__letgut_title_addon_tl},
      #+end_src
We define a custom \package*{tcolorbox}'s ~reference text~ option that let us
override the text of the reference for the examples with code and result side by
side that are floating and not being of their call out pages.
      #+begin_src latex
        reference~ text/.code={
            \tl_set:Nn \l__letgut_reference_text_tl {##1}
        },
      #+end_src
We define a custom \package*{tcolorbox}'s ~result width~ option that let us
specify the width of the result which is ~\linewidth~ by default.
      #+begin_src latex
        result~ width/.store~ in=\l__letgut_result_width_dim,
        result~ width=\linewidth,
        },
      #+end_src
We define more specifically the style of the codes with results.
      #+begin_src latex
        __letgut_code_result/.style={
          __letgut_code={#1},
          bicolor,
          colbacklower=__letgut_backgroundResult,
          segmentation~ at~ break=false,
          top=\c__letgut_height_mentions_dim,
          middle=\c__letgut_height_mentions_dim,
        #+end_src
        We want the side by side code/result examples to automatically be floating.
        #+begin_src latex
          sidebyside@true/.code={%
            \tcb@sidebysidetrue%
            \tcb@isbreakablefalse%
            \pgfkeysalso{floatplacement=ht}%
            \pgfkeysalso{float}%
            \pgfkeysalso{label={\g__letgut_label_ltx_example_str}}%
            \tl_set:Nx \l__letgut_tmpa_tl {
              \getpagerefnumber {
                \g__letgut_callout_label_ltx_example_str
              }
            }
            \tl_set:Nx \l__letgut_tmpb_tl {
              \getpagerefnumber {
                \g__letgut_label_ltx_example_str
              }
            }
            \tl_if_eq:NNF \l__letgut_tmpa_tl \l__letgut_tmpb_tl
            {
              \l__letgut_reference_text_tl
              \tl_set:Nn \l__letgut_reference_text_tl {
                Cf.~\vref{\g__letgut_label_ltx_example_str}.
              }
              \pgfkeysalso{
                drop~ shadow=black,
                grow~ to~ left~ by=4cm,
                boxed~ title~ style={sharp~ corners},
              }
              \pgfkeysalso{after~ title~ app=\c_space_tl (cf.~page~\thepage)}
            }
          },%
          overlay={
            \iftcb@sidebyside
            \__letgut_code_result_mention_box:nn {segmentation.north} {code}
            \__letgut_code_result_mention_box:nn {interior.north~ east} {résultat}
            \else
            \ifcase\tcbsegmentstate
            % 0 = Box contains only an upper part
            \__letgut_code_result_mention_box:nn {interior.north~ east} {code}
            \or%
            % 1 = Box contains an upper and a lower part
            \__letgut_code_result_mention_box:nn {interior.north~ east} {code
    #+end_src

# < (Just not to disturb the parentheses balancing
#    detection of my editor.)

    #+begin_src latex
              \int_compare:nNnT {\thetcbbreakpart} > {1} {~(suite)}
            }
            \__letgut_code_result_mention_box:nn {
              [yshift=.1mm]segmentation.east
            } {résultat}
            \else%
            % 2 = Box contains only a lower part
            \__letgut_code_result_mention_box:nn {interior.north~ east} {résultat
    #+end_src

# < (Just not to disturb the parentheses balancing
#    detection of my editor.)

    #+begin_src latex
      \int_compare:nNnT {\thetcbbreakpart} > {1} {~(suite)}
      }
      \fi
      \fi
      },
      },
      }
#+end_src

The \package*{tcolorbox} listings defined below make use of
\package*{cleveref}'s features. But, since the latter package is loaded
~\AddToHook{begindocument/before}~, the same is needed for these listings.

#+begin_src latex
\AddToHook{begindocument/before}{
#+end_src

We now define the environments that let us display:

1. only LaTeX code:
#+begin_src latex
    \DeclareTCBListing[
      auto~ counter,
      crefname={exemple}{exemples}
    ]{ltx-code}{ !O{} }{%
      __letgut_code,
      listing~ only,
      #1%
    }
#+end_src
1. both LaTeX code and its result:
      1. ordinary:
#+begin_src latex
  \DeclareTCBListing[
    use~ counter~ from=ltx-code,
    crefname={exemple}{exemples}
  ]{ltx-code-result}{ !O{} }{%
    __letgut_code_result,
    #1%
  }
#+end_src
      2. with the result obtained externally:
#+begin_src latex
  \DeclareTCBListing[
    use~ counter~ from=ltx-code,
    crefname={exemple}{exemples}
  ]{ltx-code-external-result}{ O{} m }{%
    __letgut_code_result,
    listing~ and~ comment,
    image~ comment={width=\l__letgut_result_width_dim}{#2},
    center~ lower,
    #1%
  }
#+end_src

#+begin_src latex
}
#+end_src

The examples with code and result side by side will be floating but we want the
ones being of their call out pages to have before and after them a reduced
vertical glue (~\g__letgut_reduced_intextsep_dim~). Hence we store the original
glue (~\intextsep~) in a custom one (~\g__letgut_orig_intextsep_dim~) in order
to retrieve the original skip for floats other than these ones.

#+begin_src latex
  \skip_const:Nn \c__letgut_orig_intextsep_skip {\intextsep}
  \skip_const:Nn \c__letgut_reduced_intextsep_skip {
    4\p@ \@plus .667\p@ \@minus .667\p@
  }
  #+end_src

We now use hooks in order to...

  #+begin_src latex
    \AddToHook{env/ltx-code-result/before}{
      \int_gincr:N \g__letgut_ltx_example_int
      \str_set:Nx \g__letgut_label_ltx_example_str {
        \c__letgut_label_ltx_example_str-
        \int_use:N \g__letgut_ltx_example_int
      }
      \str_set:Nx \g__letgut_callout_label_ltx_example_str {
        \c__letgut_callout_label_ltx_example_str-
        \int_use:N \g__letgut_ltx_example_int
      }
      \label{\g__letgut_callout_label_ltx_example_str}
      \tl_set:Nx \l__letgut_tmpa_tl {
        \getpagerefnumber {
          \g__letgut_callout_label_ltx_example_str
        }
      }
      \tl_set:Nx \l__letgut_tmpb_tl {
        \getpagerefnumber {
          \g__letgut_label_ltx_example_str
        }
      }
      \tl_if_eq:NNF \l__letgut_tmpa_tl \l__letgut_tmpb_tl
      {
        \skip_set_eq:NN \intextsep \c__letgut_reduced_intextsep_skip
      }
    }
  #+end_src

Since the syntax highlighting is reset at each ~\input~, the ~ltx-code-*~
environments above provide syntax highlighting only for the commands of the \TeX
dialects specified in the class. So we provide a specific command that let us
specify (the dialects of) the main language (\TeX by default) for which we want
syntax highlighting. This assumes that the commands and keywords of these
packages are listed (properly, according to the ~listings~ package syntax) in
the `lstlang0.sty` or ~letgut-lstlang.sty~ files.

  #+begin_src latex
    \cs_new_protected:Npn \__letgut_tcbset:n #1
    {
      \tcbset{
        __letgut_code/.append~ style={
          listing~ options~ app={
            #1
          }
        }
      }
    }
    \cs_new_protected:Npn \__letgut_alsolanguage_list:nn #1 #2
    {
      #+end_src
      To reduce syntax highlighting conflicts, we reset all previous ones each
      time a new one is asked.
      #+begin_src latex
      \lstset{%
        style=__letgut_reset_listings_styles,%
      }
      \tl_if_empty:nTF {#1} {
        \tl_set:Nx \l__letgut_tmpa_tl {
          alsolanguage={#2}
        }
        \exp_args:NV \__letgut_tcbset:n
        {
          \l__letgut_tmpa_tl
        }
      }{
        \seq_set_from_clist:Nn \l__letgut_tmpa_seq {#1}
        \seq_set_map_x:NNn \l__letgut_tmpb_seq \l__letgut_tmpa_seq {
          alsolanguage={[##1]#2}
        }
        \tl_set:Nx \l__letgut_tmpa_tl
        {
          \seq_use:Nn \l__letgut_tmpb_seq {,}
        }
        \exp_args:NV \__letgut_tcbset:n
        {
          \l__letgut_tmpa_tl
        }
      }
    }
    \NewDocumentCommand{\syntaxhl}{ O{TeX} m}{%
      \__letgut_alsolanguage_list:nn {#2} {#1}
    }
  #+end_src

*** Terminal listings
:PROPERTIES:
:CUSTOM_ID: ImplementationListingsTerminallistings-fq5h55h0jlj0
:END:

We define a command dedicated to terminal stdin and stdout.

#+begin_src latex
\AddToHook{begindocument/before}{
#+end_src

We define a listing style specific to these terminal commands.

  #+begin_src latex
  \definecolor{__letgut_terminal_prompt}{RGB}{204,0,0}
  \colorlet{__letgut_terminal_comment}{gray!80}
  \definecolor{__letgut_terminal_commands}{RGB}{241,124,81}
  \definecolor{__letgut_terminal_keywords}{RGB}{173,127,168}
  \definecolor{__letgut_terminal_variables}{RGB}{114,159,207}
  \colorlet{__letgut_terminal_utilities}{__letgut_terminal_commands}
  \definecolor{__letgut_terminal_strings}{RGB}{78,154,6}
#+end_src

  #+begin_src latex
  \lstdefinestyle{__letgut_terminal_listings_style}{
    commentstyle=    \color{__letgut_terminal_comment},
    keywordstyle=    \color{__letgut_terminal_commands},
    keywordstyle={[2]\color{__letgut_terminal_keywords}},
    keywordstyle={[3]\color{__letgut_terminal_utilities}},
    stringstyle=     \color{__letgut_terminal_strings},
    literate=*%
    {$}{{\textcolor{__letgut_terminal_variables}{\$}}}{1}%$
  }
#+end_src

We define a dialect which is missing in the \package*{listings}.

#+begin_src latex
  \lstdefinelanguage{terminal}{%
    morekeywords={%
      alias,bg,bind,break,builtin,caller,cd,command,compgen,%
      complete,compopt,continue,declare,dirs,disown,echo,enable,%
      eval,exec,exit,export,fc,fg,getopts,hash,help,history,%
      jobs,kill,let,local,logout,mapfile,popd,printf,pushd,pwd,%
      read,readarray,readonly,return,set,shift,shopt,source,%
      suspend,test,times,trap,type,typeset,ulimit,umask,unalias,%
      unset,wait,%
    },%
    morekeywords=[2]{%
      case,do,done,elif,else,esac,fi,for,function,if,in,select,%
      then,time,until,while,%
    },%
    morekeywords=[3]{%
      apropos,apt,apt-get,aptitude,aspell,at,awk,base32,base64,%
      basename,bash,bc,bzip2,cal,cat,cfdisk,chattr,chgrp,%
      chkconfig,chmod,chown,chpasswd,chroot,cksum,clear,cmp,comm,%
      cp,cpio,cron,crontab,csplit,curl,cut,date,dc,dd,ddrescue,%
      df,diff,diff3,dig,dir,dircolors,dirname,dmesg,dos2unix,%
      dpkg,du,egrep,eject,env,ethtool,expand,expr,false,fdformat,%
      fdisk,fgrep,file,find,fmt,fold,format,free,fsck,ftp,fuser,%
      gawk,grep,groupadd,groupdel,groupmod,groups,gzip,head,%
      hostname,htop,iconv,id,ifconfig,ifdown,ifup,import,install,%
      iostat,ip,join,killall,less,link,ln,locate,logname,look,%
      lpc,lpr,lprint,lprintd,lprintq,lprm,ls,lsattr,lsblk,lsof,%
      lspci,make,man,mkdir,mkfifo,mkfile,mkisofs,mknod,mktemp,%
      mmv,more,most,mount,mtools,mtr,mv,nc,netstat,nft,nice,nl,%
      nohup,notify-send,nslookup,op,open,passwd,paste,pathchk,%
      Perf,pgrep,ping,pkill,pr,printcap,printenv,ps,pv,quota,%
      quotacheck,ram,rar,rcp,reboot,remsync,rename,renice,rev,rm,%
      rmdir,rsync,scp,screen,sdiff,sed,seq,sftp,shuf,shutdown,%
      sleep,slocate,sort,split,ss,ssh,stat,strace,su,sudo,sum,%
      sync,tail,tar,tee,timeout,tmux,top,touch,tput,tr,%
      traceroute,true,tsort,tty,umount,uname,unexpand,uniq,units,%
      unix2dos,unrar,unshar,uptime,useradd,userdel,usermod,users,%
      uudecode,uuencode,vdir,vi,vmstat,watch,wc,wget,whereis,%
      which,who,whoami,write,xargs,xdg-open,xxd,xz,yes,zip,%
    },%
    alsoletter={2346-},%
    morecomment=[l]\#,%
    morestring=[d]",%
    morestring=[d]',%
    sensitive%
  }[keywords,comments,strings]%
#+end_src

We define some colors used in the terminal listings.

  #+begin_src latex
    \definecolor{__letgut_foreground_terminal_dark}{named}{black}
    \colorlet{__letgut_background_terminal_dark_stdin}{
      letgut_pagecolor!95!gray
    }
    \colorlet{__letgut_background_terminal_dark_stdout}{
      __letgut_background_terminal_dark_stdin!60
    }
    \definecolor{__letgut_foreground_terminal_light}{named}{black}
    \definecolor{__letgut_background_terminal_light_stdin}{rgb}{
      0.99,0.975,0.98
    }
    \colorlet{__letgut_background_terminal_light_stdout}{
      __letgut_background_terminal_light_stdin!40
    }
#+end_src

  #+begin_src latex
    \bool_if:NTF \g__letgut_paper_bool {
      \colorlet{__letgut_foreground_terminal}{
        __letgut_foreground_terminal_light
      }
      \colorlet{__letgut_background_terminal_stdin}{
        __letgut_background_terminal_light_stdin
      }
      \colorlet{__letgut_background_terminal_stdout}{
        __letgut_background_terminal_light_stdout
      }
    }{
      \colorlet{__letgut_foreground_terminal}{
        __letgut_foreground_terminal_dark
      }
      \colorlet{__letgut_background_terminal_stdin}{
        __letgut_background_terminal_dark_stdin
      }
      \colorlet{__letgut_background_terminal_stdout}{
        __letgut_background_terminal_dark_stdout
      }
    }
  #+end_src

  We define the style of the ~tcolorbox~ in which the terminal stdin and stdout
  will be displayed.

  #+begin_src latex
    \tcbset{%
      terminal/.style={%
        colupper=__letgut_foreground_terminal,
        collower=__letgut_foreground_terminal,
        breakable,
        segmentation~ at~ break=false,
        boxrule=0mm,
        before~ lower={\tcbset{every~ listing~ line={}}},
        listing~ options={%
          style=__letgut_terminal_listings_style,
          language=terminal,
        },
        fontupper=\ttfamily,
        fontlower=\ttfamily,
      },
    }
  #+end_src

  We now define the command.

  #+begin_src latex
    \cs_new_protected:Npn \__letgut_terminal:nnnn #1 #2 #3 #4
    {
      \bool_set_false:N \l__letgut_tmpa_bool
        \tl_if_empty:nTF {#3}{
          \tl_if_empty:nTF {#4}{
            \bool_set_true:N \l__letgut_tmpa_bool
          }{
            \tcbset{colback=__letgut_background_terminal_stdout}
          }
        }{
          \tcbset{colback=__letgut_background_terminal_stdin}
          \tl_if_empty:nF {#4}{
            \tcbset{
              bicolor,
              colbacklower=__letgut_background_terminal_stdout,
            }
          }
        }
        \bool_if:NF \l__letgut_tmpa_bool {
          \begin{tcolorbox}[terminal,#2]
            \lstset{aboveskip=0pt}
            \tl_if_empty:nF {#3}{
              \tl_if_empty:nF {#1}{
                \textcolor{__letgut_terminal_prompt}{%
                  \ttfamily%
                  \bfseries%
                  \__letgut_unselectable:n {#1\c_space_tl}
                }
              }
              #3
              \tl_if_empty:nF {#4}{
                \tcblower
              }
            }
            \tl_if_empty:nF {#4}{
              \tl_if_empty:nF {#3}{
                \lstset{aboveskip=0pt}
              }
              \tcbset{
                every~ listing~ line={},
                listing~ options~ app={
                  language={}
                }
              }
              #4
            }
          \end{tcolorbox}
        }
      }
      \NewDocumentCommand{\terminal}{ O{\$} O{} +v +v}{
        \__letgut_terminal:nnnn {#1} {#2} {#3} {#4}
      }
  #+end_src

  We close the ~\AddToHook{begindocument/before}~ argument.

  #+begin_src latex
}
  #+end_src

*** Unicode characters with positions above 256
:PROPERTIES:
:CUSTOM_ID: ImplementationListingsUnicodecharacterswithpositionsabove256-4l6h55h0jlj0
:END:

Unicode characters with positions above 256 cause troubles in
listings. Here is a workaround for some of them (see
https://tex.stackexchange.com/a/25396).

  #+begin_src latex
    \lst@InputCatcodes
    \def\lst@DefEC{%
      \lst@CCECUse \lst@ProcessLetter
      ^^80^^81^^82^^83^^84^^85^^86^^87^^88^^89^^8a^^8b^^8c^^8d^^8e^^8f%
      ^^90^^91^^92^^93^^94^^95^^96^^97^^98^^99^^9a^^9b^^9c^^9d^^9e^^9f%
      ^^a0^^a1^^a2^^a3^^a4^^a5^^a6^^a7^^a8^^a9^^aa^^ab^^ac^^ad^^ae^^af%
      ^^b0^^b1^^b2^^b3^^b4^^b5^^b6^^b7^^b8^^b9^^ba^^bb^^bc^^bd^^be^^bf%
      ^^c0^^c1^^c2^^c3^^c4^^c5^^c6^^c7^^c8^^c9^^ca^^cb^^cc^^cd^^ce^^cf%
      ^^d0^^d1^^d2^^d3^^d4^^d5^^d6^^d7^^d8^^d9^^da^^db^^dc^^dd^^de^^df%
      ^^e0^^e1^^e2^^e3^^e4^^e5^^e6^^e7^^e8^^e9^^ea^^eb^^ec^^ed^^ee^^ef%
      ^^f0^^f1^^f2^^f3^^f4^^f5^^f6^^f7^^f8^^f9^^fa^^fb^^fc^^fd^^fe^^ff%
      ^^^^201c% for “
      ^^^^201d% for ”
      ^^^^215b% for ⅛
      ^^^^2122% for ™
      ^^^^2019% for ’
      ^^^^0153% for œ
      ^^^^0152% for Œ
      ^^^^20ac% for €
      ^^^^27e8% for ⟨
      ^^^^27e9% for ⟩
      ^^00%
    }
    \lst@RestoreCatcodes
  #+end_src

** Local config file
:PROPERTIES:
:CUSTOM_ID: ImplementationLocalconfigfile-me7h55h0jlj0
:END:

Each issue of the Lettre requires certain local configurations: configuration
dedicated to the issue in question, particular packages used in the articles,
specific configurations of the \package*{listings}, etc. In order to not clutter
the main \file*{.tex} of the Lettre, a local configuration file named
\file{localconf.tex}, if present in the current directory, is automatically
included at the end the preamble. And since this file is input in the current
category régime (~\ExplSyntaxOn~), a ~\ExplSyntaxOff~ is automatically inserted
at its beginning.

#+begin_src latex
  \file_if_exist:nT {./\c__letgut_local_config_file_tl}{
    \@pushfilename
    \xdef\@currname{\c__letgut_local_config_file_tl}
    \input {./\c__letgut_local_config_file_tl}
    \@popfilename
  }
#+end_src

  We don't want the book review entry types to be listed in the bibliography
  (they appears only thanks to the ~bookreview~ environment).

#+begin_src latex
    \ExecuteBibliographyOptions[bookreview]{skipbib,skiplab}
#+end_src

#+begin_src latex
  \endinput
#+end_src

* (biblatex) Data model
:PROPERTIES:
:CUSTOM_ID: biblatexDatamodel-vx7h55h0jlj0
:END:

We give the (\package{biblatex}) data model that enriches the default one for
several purposes:
- the books reviews,
- the books advertisements.

#+begin_src latex :tangle ../../../tex/lualatex/letgut/letgut.lbx :exports both
\ProvidesFile{letgut.lbx}[2025-10-26 v0.9.13 letgut localization]
\InheritBibliographyExtras{french}
\DeclareBibliographyStrings{
  inherit          = {french},
  number           = {{\no}{\no}},
  volume           = {{volume}{vol\adddot}},
  volumes          = {{volumes}{vol\adddot}},
}
 #+end_src

  We create the new bibliography driver ~bookreview~ (that seems to
  create the corresponding new entry).

  #+begin_src latex :tangle ../../../tex/lualatex/letgut/letgut.dbx :exports both
  \ProvidesFile{letgut.dbx}[2025-10-26 v0.9.13 letgut data model macros]
  \DeclareBibliographyDriver{bookreview}{%
    \usebibmacro{bibindex}%
    \usebibmacro{begentry}%
    \usebibmacro{author/editor+others/translator+others}%
    \setunit{\printdelim{nametitledelim}}
    \newblock
    \usebibmacro{maintitle+title}%
    \newunit
    \printlist{language}%
    \newunit\newblock
    \usebibmacro{byauthor}%
    \newunit\newblock
    \usebibmacro{byeditor+others}%
    \newunit\newblock
    \printfield{edition}%
    \newunit
    \iffieldundef{maintitle}
      {\printfield{volume}%
       \printfield{part}}
      {}%
    \newunit
    \printfield{volumes}%
    \newunit\newblock
    \usebibmacro{series+number}%
    \newunit\newblock
    \printfield{note}%
    \newunit\newblock
    \usebibmacro{publisher+location+date}%
    \newunit\newblock
    \usebibmacro{chapter+pages}%
    \newunit
    \printfield{pagetotal}%
    \newunit\newblock
    \iftoggle{bbx:isbn}
      {\printfield{isbn}}
      {}%
    \newunit\newblock
    \usebibmacro{doi+eprint+url}%
    \newunit\newblock
    \usebibmacro{addendum+pubstate}%
    \setunit{\bibpagerefpunct}\newblock
    \usebibmacro{pageref}%
    \newunit\newblock
    \iftoggle{bbx:related}
      {\usebibmacro{related:init}%
       \usebibmacro{related}}
      {}%
      \finentrypunct
    \usebibmacro{finentry}}
#+end_src

We provide a specific ~biblatex~ citation style .

#+begin_src latex :tangle ../../../tex/lualatex/letgut/letgut.cbx :exports both
  \ProvidesFile{letgut.cbx}[2025-10-26 v0.9.13 letgut base citation style]
  \RequireCitationStyle{numeric}
#+end_src

The books reviewed have their titles not only emphasized, but in bold face as
well...

#+begin_src latex :tangle ../../../tex/lualatex/letgut/letgut.cbx :exports both
  \DeclareFieldFormat[bookreview]{title}{\textbf{\emph{#1}}}
#+end_src

... but not their subtitles.

#+begin_src latex :tangle ../../../tex/lualatex/letgut/letgut.cbx :exports both
  \renewbibmacro*{title}{%
    \ifboolexpr{
      test {\iffieldundef{title}}
      and
      test {\iffieldundef{subtitle}}
    }
    {}
    {\printtext[title]{%
        \printfield[titlecase]{title}%
        \setunit{\subtitlepunct}}%
      \printfield[emph]{subtitle}%
      \newunit}%
    \printfield{titleaddon}}
#+end_src

* Provided files
:PROPERTIES:
:CUSTOM_ID: Providedfiles-g09h55h0jlj0
:END:

** Example file of an issue of the newsletter
:PROPERTIES:
:CUSTOM_ID: ProvidedfilesExamplefileofanissueofthenewsletter-ak9h55h0jlj0
:END:

 #+begin_src latex :tangle ../../../doc/lualatex/letgut/lettre-example.tex :exports both
   % Hey, Emacs!  This is a -*- mode: latex -*- file!

   \documentclass{letgut}

   \letgutsetup{
     % % Option booléenne pour la version finale de la Lettre.
     % % L'option contraire`draft` (par défaut) affiche
     % % « Brouillon » en filigrane et actionne le package
     % % `lua-typo`.
     %
     % , final
     %
     % % Option coloriant le fond de la page d'une couleur
     % % par défaut (`1.0, 0.98, 0.94` en « rgb ») mais
     % % modifiable au moyen de l'option `pagecolor` ci-dessous.
     %
     % , paper
     %
     % % Numéro de la Lettre
     %
     , number=44
     %
     % % Date de la Lettre. Celle-ci est déduite de la
     % % date du jour, mais peut être spécifiée sous la forme
     % % AAAA-MM (avec garde-fous) ou librement
     % % (p. ex. `date=Printemps 2021`).
     %
     % , date=2025-16
     %
     % % Couleur de la page, à spécifier selon le modèle « rgb ».
     %
     % , pagecolor={1.0, 0.1, 0.94}
     %
     % % Couleur des hyperliens, à spécifier selon le modèle
     % % « named ».
     %
     % , allcolorslinks=cyan
     %
     % % Un (r)appel à cotisation est automatiquement ajouté
     % % en 1re page. Si on ne le souhaite pas, il suffit de
     % % passer l'option `membership-reminder=false`.
     %
     % , membership-reminder=false
     %
     % % Si un fichier `editorial.tex`, on s'en doute censé
     % % contenir l'éditorial, est présent dans le répertoire
     % % courant, son contenu est automatiquement ajouté en
     % % 1re page. Si un tel fichier est absent du répertoire
     % % courant, une alerte est affichée à la place, sauf si,
     % % parce qu'on ne souhaite pas d'éditorial, on passe
     % % l'option `editorial=false`.
     %
     % , editorial=false
     %
     % % Les informations concernant GUTenberg, si elles
     % % figurent dans un fichier `informations-gut.tex`
     % % présent dans le répertoire courant, sont
     % % automatiquement ajoutées en dernière page.
     % % Si on ne souhaite pas que figurent ces
     % % informations, il suffit de passer l'option
     % % `informations=false`.
     %
     % , informations=false
     %
     % % Lors de la conception d'un numéro de la Lettre,
     % % il peut être utile d'avoir un plan détaillé au
     % % maximum de l'ensemble du document. C'est ce que
     % % permet l'option `detailedtoc`.
     %
     % , detailedtoc
     %
     % % Les fichiers sources sont attachés au PDF si et seulement si la Lettre est
     % % à la fois en version pour les lecteurs (option `for-readers' activée par
     % % défaut) et en sortie écran (option `screen' activée par défaut).  L'option
     % % `reverse-files-attachement' inverse ce comportement par défaut.
     %
     % , reverse-files-attachement
     %
   }

   \setmainfont{TeX Gyre Schola} % Par exemple

   \usepackage[maths=both]{duckuments}
   \usepackage{mwe}

   % \addbibresource{biblio.bib}

   \begin{document}
   \duckument
   \end{document}

   %%% Local Variables:
   %%% TeX-engine: luatex
   %%% TeX-master: t
   %%% End:
 #+end_src

** Example of an editorial
:PROPERTIES:
:CUSTOM_ID: ProvidedfilesExampleofaneditorial-06ah55h0jlj0
:END:

 #+begin_src latex :tangle ../../../doc/lualatex/letgut/editorial.tex :exports both
   Ceci est un intéressant éditorial de la \lettregut{}
   dans lequel on peut causer de l'\ag{} et du \ca{}
   de l'association. Il peut aussi y être question du \ctan.

   \lipsum[1-5]

   \begin{figure}[ht]
     \centering
     \includegraphics[width=.7\linewidth]{example-image}
     \caption{Ducks ?}
     \label{fig:ducks}
   \end{figure}

   \lipsum[6-10]
 #+end_src

** Informations about \gutenberg
:PROPERTIES:
:CUSTOM_ID: ProvidedfilesInformationsabout\gutenberg-hqah55h0jlj0
:END:

#+begin_src latex :tangle ../../../tex/lualatex/letgut/informations-gut.tex :exports both
   % Hey, Emacs!  This is a -*- mode: latex -*- file!

   \enlargethispage{1.5cm}
   \scriptsize
   \vspace*{-1cm}
   \hspace*{-1.5cm}%
   \ExplSyntaxOn
   \raisebox{-\height+0.7\baselineskip}{%
     \begin{minipage}[t]{.6\textwidth}%\vspace{0pt}%
       \__letgut_orig_includegraphics*[width=\linewidth]{logo-gut.pdf}
     \end{minipage}%
   }%
   \ExplSyntaxOff
   \hfill%
   \begin{minipage}[t]{.5\textwidth}%\vspace{0pt}%
     \footnotesize\raggedleft%
     Association \gut{}\\
     15 rue des Halles -- \textsc{bp} 74\\
     75001 Paris\\
     France\\
     \nolinkurl{secretariat[at]gutenberg-asso[dot]fr}
   \end{minipage}%

  \begin{description}
  \item[Site Internet :] \url{https://gutenberg-asso.fr/}
  \item[\Cahiers{} :] \url{https://cahiers.gutenberg-asso.fr/} et
    \url{https://www.numdam.org/journals/CG/}
  \item[\lettre{} :] \url{https://lettre.gutenberg-asso.fr/}
  \item[Problèmes \TeX{}niques :]
    \leavevmode
    \begin{description}
    \item[liste d'entraide :]
      \url{https://gutenberg-asso.fr/-Listes-de-diffusion-}
    \item[site de questions et réponses :]
      \url{https://texnique.fr/}
    \item[foire aux questions :]
      \url{https://faq.gutenberg-asso.fr/}
    \end{description}
  \end{description}

  \alertbox{%
    \raggedright%
    Cette association est la vôtre : faites-nous part de
    vos idées, de vos envies, de vos préoccupations
    à l'adresse \nolinkurl{secretariat@gutenberg-asso.fr}.

    Adhérents, vous pouvez aussi échanger sur la vie de l’association sur la liste
    de diffusion \nolinkurl{adherents@gutenberg-asso.fr}.%
  }

  \title{Adhésion à l'association}
  \label{letgut_label_adhesions}
  \scriptsize%
  \alertbox{%
    \raggedright%
    \gut{} étant reconnue d’intérêt général, vous recevrez en temps voulu un
    justificatif vous permettant de bénéficier d’une réduction fiscale de
    66~\% du montant de votre cotisation ou de votre don.%
  }
  \begin{itemize}
  \item % Adhésions et abonnements
    Les adhésions sont à renouveler  en début d'année
    pour l'année civile.
    % \item Il n'y a pas de lettre de rappel, chaque membre
    %   doit faire son renouvellement annuel; %\hspace*{1em}
    %   merci de renvoyer spontanément le bulletin ci-dessous
    %   en début d'année.
  \item Les administrations peuvent joindre un bon de commande
    revêtu de la signature de la personne responsable ;
    les étudiants doivent joindre un justificatif.
    % \item Si vous souhaitez que vos coordonnées restent
    %   confidentielles, merci de le signaler.
  \end{itemize}

  \section[Tarifs \the\year]{Tarifs\footnote{Dans ce tableau, une personne
    physique à tarif réduit est étudiant, demandeur d’emploi ou plus largement
    toute personne non redevable de l’impôt sur le revenu (sur présentation d’un
    justificatif) ; un organisme peut être doté ou non de la personnalité
    morale : laboratoire de recherche public, etc.} \the\year}

  Les membres de \gut\ peuvent adhérer à l'association internationale, le
  \acf{tug}, et recevoir son bulletin \tugboat{} à un tarif
  préférentiel\footnote{En tarif normal, 65~€ (au lieu de 85~\$) ; en tarif
    étudiant, 40~€ (au lieu de 55~\$).} :

  \begin{center}
    \begin{tblr}{lr@{ }l}
      \toprule
      \textbf{Type d'adhésion}                                 & \textbf{Prix} &                   \\
      \midrule
      Personne physique                                        & 30~€          &                   \\[-0.5 mm]
      Personne physique + adhésion \textsc{tug}                & 95~€          & ($=$ 30~€ + 65~€) \\[-0.5 mm]
      Personne physique à tarif réduit                         & 15~€          &                   \\[-0.5 mm]
      Personne physique à tarif réduit + adhésion \textsc{tug} & 55~€          & ($=$ 15~€ + 40~€) \\[-0.5 mm]
      Association d'étudiants                                  & 65~€          &                   \\[-0.5 mm]
      Organisme ou association à but non lucratif              & 130~€         &                   \\[-0.5 mm]
      Personne morale à but lucratif                           & 229~€         &                   \\[-0.5 mm]
      \bottomrule
    \end{tblr}
  \end{center}

   \section{Règlements}

  Les règlements peuvent s'effectuer par :
  \begin{itemize}
  % \item virement bancaire%
  %   \footnote{L'\textsc{iban} de l'association
  %   est à demander au secrétariat.}
  % %  FR76 1870 7000 3003 0191 3568 475)% banque pop
  % %  FR76 3000 3001 0900 0372 6086 280)% socgen Gap, compte courant
  % \leavevmode
  %
  %   \alertbox{%
  %     Veillez à bien \emph{indiquer vos nom et prénom}
  %     dans les références du virement !%
  %   }
  \item paiement en ligne sécurisé\footnote{En carte
    bancaire.} :
    \url{https://gutenberg-asso.fr/Adherer-en-ligne}
  \item bulletin et chèque :
    \url{https://gutenberg-asso.fr/Adherer-a-l-association}
  \end{itemize}

   \vfill

  \begin{center}
    \begin{tblr}{
        width=.8\linewidth,
        colspec={
          % < (Just not to disturb the parentheses
          % balancing detection of my editor.)
          >{\microtypesetup{protrusion=false}\bfseries}r@{ }X
        },
        vline{1,3}={solid},
        hline{1,7}={solid},
        rowsep=0mm,
        row{1} = {abovesep+=.25cm},
        row{2} = {belowsep+=.125cm},
        row{6} = {belowsep+=.25cm},
        % colsep=2.5mm,
      }
      \SetCell[c=2]{c} \emph{La \lettregut}                                 \\
      \SetCell[c=2]{c} \mdseries Bulletin irrégulomestriel \& apériodique
      de l'association \gut                                                 \\
      Directeur de la publication :
                                        & \person{Bideault, P.}        \\
      Comité de rédaction :
                                        & {P. Bideault, D. Bitouzé,
        C. Chevalier \& B. Dumont}                       \\
      Adresse de la rédaction :         &
      {
        Association \gut\\
        15 rue des Halles -- \textsc{bp} 74 -- 75001 Paris
      }
      \\
      \acs{issn} : & \letgutissn
    \end{tblr}
  \end{center}
  \vfill
  \mbox{}
  \clearpage
#+end_src

** Acronyms
:PROPERTIES:
:CUSTOM_ID: ProvidedfilesAcronyms-8cbh55h0jlj0
:END:

#+begin_src latex :tangle ../../../tex/lualatex/letgut/letgut-acronyms.tex :exports both
% Hey, Emacs!  This is a -*- mode: latex -*- file!

%%%%%%%%%%%%%%%%%%%%%
% Acronymes anglais %
%%%%%%%%%%%%%%%%%%%%%
\letgutacro%
{CTAN}%
{\href{https://www.ctan.org/}{Comprehensive \hologo{TeX} Archive
    Network}}%
[réseau complet d'archives \hologo{TeX}]

\letgutacro%
{PDF}%
{Portable Document Format}%
[format de document portable]

\letgutacro%
{URL}%
{Uniform Resource Locator}%
[localisateur uniforme de ressource ou, plus clairement, format des
  adresses du Web]

\letgutacro%
{ORCID}%
{Open Researcher and Contributor \textsc{id}}%
[identifiant ouvert pour chercheur et contributeur]

\letgutacro%[extra-foreign=souvent librement traduit en \enquote{foire
           %aux questions}]
{FAQ}%
{Frequently Asked Questions}%
[questions fréquemment posées]

\letgutacro%
{SVG}%
{Scalable Vector Graphics}%
[graphiques vectoriels extensibles]

\letgutacro%
{DNS}%
{Domain Name System}%
[système de noms de domaine]

\letgutacro%
{VPS}%
{Virtual Private Server}%
[serveur dédié virtuel]

\letgutacro%
{LDAP}%
{Lightweight Directory Access Protocol}%
[protocole d'accès à répertoire léger, sytème garantissant
  l'authentification d'utilisateurs de plusieurs services dispersés]

\letgutacro%
{OTF}%
{Open Type Format}%
[]

\letgutacro%
{DOI}%
{Digital Object Identifier}%
[identifiant numérique d'objet]

\letgutacro%
{ISSN}%
{International Standard Serial Number}%
[numéro international normalisé des publications en série]

\letgutacro%
{TUG}%
{\hologo{TeX} User Group}%
[groupe (international) d'utilisateurs de \hologo{TeX}]

\letgutacro%
{WCAG}%
{Web Content Accessibility Guidelines}%
[directives sur l'accessibilité du contenu Web]

\letgutacro%
{HTML}%
{HyperText Markup Language}%
[langage de balises pour l'hypertexte]

\letgutacro%
{CSS}%
{Cascading Style Sheets}%
[feuilles de style en cascade]

\letgutacro%
{UTF}%
{Universal (Character Set) Transformation Format}%
[format de transformation (du jeu) universel (de caractères codés)]

\letgutacro%[short=\emph{Ti\emph{k}Z},short-format=\em,foreign-babel=german,foreign-locale=allemand]
{TIKZ}%
{Ti\emph{k}Z ist \emph{kein} Zeichenprogramm}%
[Ti\emph{k}Z \emph{n'}est \emph{pas} un programme de dessin]

\letgutacro%
{PGF}%
{Portable Graphics Format}%
[format de graphiques portable]

\letgutacro%
{GPL}%
{\textsc{gnu} General Public License}%
[licence publique générale \textsc{gnu}]

\letgutacro%
{OFL}%
{SIL Open Font License}%
[]

\letgutacro%
{DVI}%
{DeVice-Independent}%
[indépendant du type de périphérique]

\letgutacro%
{PS}%
{PostScript}%
[]

\letgutacro%
{DVIPS}%
{\acs{dvi}-to-\acs{ps} (translator)}%
[(convertisseur) \acs{dvi} vers \acs{ps}]

\letgutacro%
{IPA}%
{International Phonetic Alphabet}%
[alphabet phonétique international]

\letgutacro%
{TIPA}%
{\hologo{TeX} \acs{ipa} or Tokyo \acs{ipa}}%
[alphabet phonétique international]

\letgutacro%
{XML}%
{eXtensible Markup Language}%
[langage de balisage extensible]

\letgutacro%
{APA}%
{American Psychological Association}%
[association américaine de psychologie]

\letgutacro%
{OS}%
{Operating System}%
[système d'exploitation]

\letgutacro%
{BSD}%
{Berkeley Software Distribution}%
[collection de logiciels de Berkeley]

\letgutacro%
{IMAP}%
{Internet Message Access Protocol}%
[]

\letgutacro%
{SMTP}%
{Simple Mail Transfer Protocol}%
[protocole simple de transfert de courrier]

\letgutacro%
{RTF}%
{Rich Text Format}%
[format de texte enrichi]

\letgutacro%
{WYSIWYG}%
{What You See Is What You Get}%
[ce que vous voyez est ce que vous obtenez]

\letgutacro%
{ISO}%
{\href{https://www.iso.org/home.html}{International Organization for
    Standardization}}%
[\href{https://www.iso.org/fr/home.html}{organisation internationale de
  normalisation}]

\letgutacro%
{OFF}%
{Open Font Format}%
[format de fonte ouvert]

\letgutacro%
{CSV}%
{Comma-separated values}%
[valeurs séparées par des virgules]

\letgutacro%
{YAML}%
{\textsc{yaml} Ain’t Markup Language}%
[\textsc{yaml} n'est pas un langage de balisage (acronyme récursif)]

\letgutacro%
{UCA}%
{Unicode Collation Algorithm}%
[algorithme de tris d'Unicode]

\letgutacro%
{NFSS}%
{New Font Selection Scheme}%
[nouveau schéma de sélection de fonte]

\letgutacro%
{ASCII}%
{American Standard Code for Information Interchange}%
[code américain normalisé pour l'échange d'information]

\letgutacro%
{TDS}%
{\TeX{} Directory Structure}%
[structure de répertoire de \TeX{}]

%%%%%%%%%%%%%%%%%%%%%%
% Acronymes français %
%%%%%%%%%%%%%%%%%%%%%%
\letgutacro%
{SMAI}%
{\href{http://smai.emath.fr/}{Société de Mathématiques Appliquées et
    Industrielles}}%

\letgutacro%
{AG}%
{Assemblée Générale}%

\letgutacro%
{CA}%
{Conseil d'Administration}%

\letgutacro%
{SHS}%
{Sciences Humaines et Sociales}%

\letgutacro%
{IREM}%
{\href{https://www.univ-irem.fr/}{Instituts de Recherche sur
    l'Enseignement des Mathématiques}}%

\letgutacro%
{MEEF}%
{Métiers de l'Enseignement, de l'Éducation et de la Formation}%

\letgutacro%
{ECM}%
{\href{https://texnique.fr/osqa/faq/\#custom-id-ecm}{Exemple Complet
    Minimal}}%

\letgutacro%
{INSPÉ}%
{\href{https://www.reseau-inspe.fr/}{Instituts Nationaux Supérieurs du
    Professorat et de l'Éducation}}%

\letgutacro%[short=\textsc{gra}pp\textsc{a},short-format=\upshape]
{GRAppA}%
{Groupe de recherche en Apprentissage Automatique}%

\letgutacro%
{BBB}%
{BigBlueButton}%

\letgutacro%
{CV}%
{Curriculum Vitæ}%

\letgutacro%
{RGPD}%
{Règlement Général sur la Protection des Données}%

\letgutacro%
{NDLR}%
{Note de la Rédaction}%

\letgutacro%
{BTS}%
{Brevet de Technicien Supérieur}%

\letgutacro%
{APMEP}%
{Association des Professeurs de Mathématiques de l'Enseignement Public}%

\letgutacro%
{PAO}%
{Publication Assistée par Ordinateur}%
#+end_src

** Language driver file
:PROPERTIES:
:CUSTOM_ID: ProvidedfilesLanguagedriverfile-4cch55h0jlj0
:END:

#+begin_src latex :tangle ../../../tex/lualatex/letgut/letgut-lstlang.sty :exports both
  % \lst@definelanguage[...]{TeX}{%
  %   % Control sequences names
  % moretexcs={%
  % },%
  %   %   Keywords of class 1 : keywords that contain other characters
  %   %   (since of the same class as the ones specified as 'otherkeywords')
  %   morekeywords={%
  % },%
  %   %   Keywords of class 2 : environments names
  %   morekeywords=[2]{%
  % },%
  %   %   Keywords of class 3 : mandatory arguments (not environments) &
  %   %   optional arguments which are keys (in key=value)
  %   morekeywords=[3]{%
  % },%
  %   %   Keywords of class 4 : values of keys (in key=value)
  %   morekeywords=[4]{%
  % },%
  %   %   Keywords of class 5 : arguments specifications (after ":" in expl3
  %   %   syntax)
  %   morekeywords=[5]{%
  % },%
  %   %   Keywords of class 6 : current package name (and possibly derived
  %   %   packages)
  %   morekeywords=[6]{%
  %      %
  % },%
  %   %   otherkeywords={},
  %   %   alsoletter={},
  %   %   alsodigit={},%
  %   %   alsoother={},%
  %   sensitive,%
  % }[keywords,tex,comments]

  \lst@definelanguage[lstfiracode]{TeX}{%
    % Control sequences names
    moretexcs={%
    },%
    % Keywords of class 1 : keywords that contain other characters
    % (since of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
      FiraCodeStyle%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      lstfiracode%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]

  \lst@definelanguage[Scrabble]{TeX}{%
    % Control sequences names
    moretexcs={%
      PlateauScrabble,ScrabblePlaceMot,%
      ScrabbleBoard,ScrabblePutWord,%
    },%
    % Keywords of class 1 : keywords that contain other characters
    % (since of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
      EnvScrabble,%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      FR,EN,DE,ES,GR,SP,%
      Echelle,Echellelabels,Cadre,Labels,Aide,%
      Scale,ScaleLabels,Border,Help,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      Scrabble%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]

  \lst@definelanguage[FiraSans]{TeX}{%
    % Control sequences names
    moretexcs={%
      sufigures,firaoldstyle,firalining,firatabular,firaproportional,
      firathin,firalight,firaextralight,firaultralight,firamedium,firabook,
      firasemibold,firaextrabold,firaheavy,%
    }%
    % Keywords of class 1 : keywords that contain other characters
    % (since of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      sfdefault,scaled,scale,type1,lining,lf,oldstyle,osf,tabular,t,proportional,%
      p,book,medium,mb,semibold,sb,light,l,extralight,ultralight,thin,%
      extrabold,heavy,default,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      FiraSans%
    },%
    % otherkeywords={},
    alsoletter={1},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]

  \lst@definelanguage[luagcd]{TeX}{%
    % Control sequences names
    moretexcs={%
      luagcdwithsteps,%
    },%
    % Keywords of class 1 : keywords that contain other characters
    % (since of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      luagcd%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]

  \lst@definelanguage[maze]{TeX}{%
    % Control sequences names
    moretexcs={%
      maze,%
    },%
    % Keywords of class 1 : keywords that contain other characters
    % (since of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      maze%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]

  \lst@definelanguage[animate]{TeX}{%
    % Control sequences names
    moretexcs={%
      multiframe,%
    },%
    % Keywords of class 1 : keywords that contain other characters
    % (since of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
      animateinline,
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      poster,controls,palindrome,bb,rx,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
      first,%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      animate%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]

  \lst@definelanguage[tikz-mirror-lens]{TeX}{%
    % Control sequences names
    moretexcs={%
      lensSphGaussFixed,%
    },%
    % Keywords of class 1 : keywords that contain other characters
    % (since of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      tikz-mirror-lens%
    },%
    % otherkeywords={},
    alsoletter={-},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]

  \lst@definelanguage[jeuxcartes]{TeX}{%
    % Control sequences names
    moretexcs={%
      MainCartesJeu,%
    },%
    % Keywords of class 1 : keywords that contain other characters
    % (since of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      Eventail,10C,10K,AC,AT,AP,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      jeuxcartes%
    },%
    % otherkeywords={},
    alsoletter={0123456789},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]

  \lst@definelanguage[plex-otf]{TeX}{%
    % Control sequences names
    moretexcs={%
    },%
    % Keywords of class 1 : keywords that contain other characters
    % (since of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      RM
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      plex-otf%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]

  \lst@definelanguage[mathtools]{TeX}{%
    % Control sequences names
    moretexcs={%
      mathclap,DeclarePairedDelimiter,%
    },%
    % Keywords of class 1 : keywords that contain other characters
    % (since of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      %
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]

  \lst@definelanguage[tikz-ext]{TeX}{%
    % Control sequences names
    moretexcs={%
    },%
    % Keywords of class 1 : keywords that contain other characters
    % (since of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      distancebetween,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      tikz-ext%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]

  \lst@definelanguage[tikzfill]{TeX}{%
    % Control sequences names
    moretexcs={%
    },%
    % Keywords of class 1 : keywords that contain other characters
    % (since of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      pattern,hexagon,cycle,color,
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      tikzfill
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]

  \lst@definelanguage[unicodemath]{TeX}{%
    % Control sequences names
    moretexcs={%
      symscr,symbb,symfrak,symsfup,symsfit,symtt,setmathfont,%
    },%
    % Keywords of class 1 : keywords that contain other characters
    % (since of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      range,mathrm,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
      up,it,bb,bbit,scr,cal,bfcal,frak,tt,sfup ,sfit,bfup,bfit,bfscr,bffrak,%
      bfsfup,bfsfit,sym,%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      unicode-math
    },%
    % otherkeywords={},
    alsoletter={-},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]

  \lst@definelanguage[xcharter-otf]{TeX}{%
    % Control sequences names
    moretexcs={%
      Bbbone,Bbbk,%
    },%
    % Keywords of class 1 : keywords that contain other characters
    % (since of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      range
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      xcharter-otf
    },%
    % otherkeywords={},
    alsoletter={-},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]

  \lst@definelanguage[braille]{TeX}{%
    % Control sequences names
    moretexcs={%
      braille
    },%
    % Keywords of class 1 : keywords that contain other characters
    % (since of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      %
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]

  \lst@definelanguage[swungdash]{TeX}{%
    % Control sequences names
    moretexcs={%
      swungdash
    },%
    % Keywords of class 1 : keywords that contain other characters
    % (since of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      %
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]


  \lst@definelanguage[simples-matrices]{TeX}{%
    % Control sequences names
    moretexcs={%
      matrice
    },%
    % Keywords of class 1 : keywords that contain other characters
    % (since of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      b,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      %
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]

  \lst@definelanguage[customdice]{TeX}{%
    % Control sequences names
    moretexcs={%
      dice
    },%
    % Keywords of class 1 : keywords that contain other characters
    % (since of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      violet,yellow
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      %
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]

  \lst@definelanguage[pingu]{TeX}{%
    % Control sequences names
    moretexcs={%
      pingu
    },%
    % Keywords of class 1 : keywords that contain other characters
    % (since of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      left,wing,wave,right,grab,eyes,shiny,cup,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      %
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[letgut]{TeX}{%
    % Control sequences names
    moretexcs={%
      letgutsetup,title,subtitle,author,francophony,person,author,%
      package,package*,class,class*,software,software*,file,file*,%
      foreignloc,latinloc,gutenberg,gut,lettre,lettregut,Cahier,%
      Cahiers,letgut,letgutcls,knuth,lamport,tugboat,item*,letgutacro,%
      separator,alertbox,terminal,inputarticle,lettrenumber,solution,%
      rebussolution,Ucode,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
      ctannews,ltx-code,ltx-code-result,ltx-code-external-result,%
      bookreview,announcement,rebus,%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      for-authors,for-readers,draft,final,screen,paper,number,date,%
      pagecolor,allcolorslinks,membership-reminder,editorial,informations,%
      title,addon,result width,reference,text,title,reviewer,bibkey,%
      frontcover,price,result,and,no,solution,color,toc,title,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      letgut%
    },%
    % otherkeywords={},%
    alsoletter={-\ },%
    % alsodigit={},%
    alsoother={*},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % LaTeX texcs and keywords that are missing in `listings` driver file
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  \lst@definelanguage[extendedLaTeX]{TeX}{%
    % Control sequences names
    moretexcs={%
      Huge,LARGE,Large,LoadClass,NewCommandCopy,RequirePackage,%
      ShowCommand,abovecaptionskip,abstractname,appendix,appendixname,%
      arraycolsep,arrayrulewidth,author,backmatter,baselinestretch,%
      belowcaptionskip,bf,bibindent,bibname,bigskipamount,bottomfraction,%
      brokenpenalty,cal,chapter,chaptermark,chaptername,clubpenalty,%
      columnsep,columnseprule,contentsname,date,dblfloatpagefraction,%
      dblfloatsep,dbltextfloatsep,dbltopfraction,descriptionlabel,%
      displaywidowpenalty,doublerulesep,evensidemargin,fboxrule,fboxsep,%
      figurename,floatpagefraction,floatsep,footins,footnoterule,%
      footnotesep,footnotesize,footskip,frontmatter,headheight,headsep,%
      huge,indexname,indexspace,interlinepenalty,intextsep,it,jot,%
      labelenumi,labelenumii,labelenumiii,labelenumiv,labelitemfont,%
      labelitemi,labelitemii,labelitemiii,labelitemiv,labelsep,%
      labelwidth,large,leftmargin,leftmargini,leftmarginii,leftmarginiii,%
      leftmarginiv,leftmarginv,leftmarginvi,lineskip,listfigurename,%
      listoffigures,listoftables,listtablename,mainmatter,maketitle,%
      marginparpush,marginparsep,marginparwidth,maxdepth,medskipamount,%
      mit,newblock,normallineskip,normalsize,oddsidemargin,paragraph,%
      paragraphmark,parindent,parskip,part,partname,partopsep,%
      postdisplaypenalty,predisplaypenalty,refname,rm,sc,scriptsize,%
      section,sectionmark,setlength,sf,sl,small,smallskipamount,%
      subitem,subparagraph,subparagraphmark,subsection,subsectionmark,%
      subsubitem,subsubsection,subsubsectionmark,tabbingsep,tabcolsep,%
      tablename,tableofcontents,textfloatsep,textfraction,textheight,%
      textwidth,thechapter,theenumi,theenumii,theenumiii,theenumiv,%
      theequation,theparagraph,thepart,thesection,thesubparagraph,%
      thesubsection,thesubsubsection,tiny,title,today,topfraction,%
      topmargin,topskip,tt,widowpenalty,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
      abstract,array,center,description,displaymath,document,enumerate,%
      eqnarray,equation,figure,flushleft,flushright,itemize,list,lrbox,math,%
      minipage,picture,quotation,quote,sloppypar,tabbing,table,tabular,%
      thebibliography,theindex,titlepage,trivlist,verbatim,verse,%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      % c,cc,ccc,cccc,X,l,
      empty,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      %
    },
    otherkeywords={|},%
    % alsoletter={},% alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[listings]{TeX}{%
    % Control sequences names
    moretexcs={%
      lstDeleteShortInline,lstMakeShortInline,lstalias,lstaspectfiles,%
      lstdefineformat,lstdefinelanguage,lst@definelanguage,lstdefinestyle,%
      lstindexmacro,lstinline,lstinputlisting,lstlanguagefiles,%
      lstlgrindeffile,lstlistingname,lstlistingnamestyle,%
      lstlistlistingname,lstlistoflistings,lstloadlanguages,lstname,%
      lstnewenvironment,lstset,theHlstnumber,thelstlabel,thelstlisting,%
      thelstnumber,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
      lstlisting,%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      0.21,ABAP,ACM,ACMscript,ACSL,Ada,Algol,Ant,Assembler,Awk,%
      Basic,C,C++,CIL,Caml,Clean,Cobol,Comal 80,Comsol,Delphi,%
      Eiffel,Elan,Euphoria,Fortran,GAP,GCL,Gnuplot,Go,HTML,Haskell,%
      IDL,JVMIS,Java,LLVM,Lingo,Lisp,Logo,Lua,ML,Mathematica,Matlab,%
      Mercury,MetaPost,Miranda,Mizar,Modula-2,MuPAD,NASTRAN,OCL,%
      OORexx,Oberon-2,Octave,Oz,PHP,PL/I,POV,PSTricks,Pascal,Perl,%
      Plasm,PostScript,Prolog,Promela,Python,R,RSL,Reduce,Rexx,Ruby,%
      S,SAS,SHELXL,SPARQL,SQL,Scala,Scilab,Simula,Swift,TeX,%
      VBScript,VHDL,VRML,Verilog,XML,XSLT,[03]Fortran,[08]Fortran,%
      [1.0]Mathematica,[11.0]Mathematica,[11]C++,[1974]Cobol,[1985]Cobol,%
      [2005]Ada,[3.0]Mathematica,[5.0]Lua,[5.1]Lua,[5.2]Lua,%
      [5.2]Mathematica,[5.3]Lua,[60]Algol,[67]Simula,[68]Algol,%
      [77]Fortran,[83]Ada,[90]Fortran,[95]Ada,[95]Fortran,[97]VRML,%
      [AMS]VHDL,[ANSI]C,[ANSI]C++,[AlLaTeX]TeX,[AspectJ]Java,[Auto]Lisp,%
      [Borland6]Pascal,[CII]Simula,[CORBA]IDL,[DEC]Simula,[GNU]C++,%
      [Handel]C,[IBM]Simula,[ISO]C++,[LaTeX]TeX,[Motorola68k]Assembler,%
      [OMG]OCL,[Objective]C,[Objective]Caml,[PLUS]S,[POSIX]Awk,[R/2
      4.3]ABAP,[R/2 5.0]ABAP,[R/3 3.1]ABAP,[R/3 4.6C]ABAP,[R/3 6.10]ABAP,%
      [Sharp]C,[Standard]Pascal,[VM/XA]Rexx,[Visual]Basic,[Visual]C++,%
      [WinXP]command.com,[XSC]Pascal,[common]TeX,[decorative]OCL,%
      [empty]IDL,[empty]Java,[empty]Lisp,[empty]Rexx,[empty]S,%
      [empty]VHDL,[empty]make,[empty]tcl,[gnu]Awk,[gnu]make,[ibm]Cobol,%
      [light]Caml,[plain]TeX,[primitive]TeX,[tk]tcl,[x86masm]Assembler,%
      abovecaptionskip,aboveskip,alsodigit,alsolanguage,alsoletter,%
      alsoother,backgroundcolor,basewidth,bash,basicstyle,%
      belowcaptionskip,belowskip,boxpos,breakatwhitespace,breakautoindent,%
      breakindent,breaklines,caption,captionpos,classoffset,columns,%
      command.com,comment,comments,commentstyle,consecutivenumbers,csh,%
      defaultdialect,deletecomment,deletedelim,deletedirectives,%
      deleteemph,deleteendkeywords,deletehyperref,deleteindex,%
      deletekeywordcomment,deletekeywords,deleteprocnamekeys,deletestring,%
      deletetxcs,delim,directives,directivestyle,draft,elisp,emph,%
      emphstyle,emptylines,erlang,escapebegin,escapechar,escapeend,%
      escapeinside,extendedchars,fancyvrb,fillcolor,final,firstline,%
      firstnumber,flexiblecolumns,float,floatplacement,fontadjust,%
      formats,formfeed,frame,frameround,framerule,framesep,frameshape,%
      framexbottommargin,framexleftmargin,framexrightmargin,%
      framextopmargin,fvcmdparams,gobble,hansl,hyper,hyperanchor,%
      hyperlink,hyperref,identifierstyle,includerangemarker,index,%
      indexprocnames,indexstyle,inform,inputencoding,inputpath,%
      keepspaces,keywordcomment,keywordcommentsemicolon,keywords,%
      keywordsprefix,keywordstyle,ksh,label,language,lastline,lgrind,%
      lgrindef,linerange,lineskip,linewidth,literate,make,makemacrouse,%
      markfirstintag,mathescape,morecomment,moredelim,moredirectives,%
      moreemph,moreendkeywords,morefvcmdparams,morehyperref,moreindex,%
      morekeywordcomment,morekeywords,moreprocnamekeys,morestring,%
      moretexcs,multicols,name,ndkeywords,ndkeywordstyle,noaspects,%
      nolol,numberblanklines,numberbychapter,numberfirstline,numbers,%
      numbersep,numberstyle,otherkeywords,podcomment,postbreak,prebreak,%
      print,printpod,procnamekeys,procnames,procnamestyle,%
      rangebeginprefix,rangebeginsuffix,rangeendprefix,rangeendsuffix,%
      rangeprefix,rangesuffix,resetmargins,rulecolor,rulesep,%
      rulesepcolor,savemem,sensitive,%
      sh,showlines,showspaces,showstringspaces,showtabs,stepnumber,%
      string,stringstyle,style,tab,tabsize,tag,tagstyle,tcl,texcl,%
      texcs,texcsstyle,title,upquote,usekeywordsintag,xleftmargin,%
      xrightmargin,LaTeX,TeX,tex%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
      b,c,t,none,left,right,%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      listings,%
    },%
    % otherkeywords={},%
    alsoletter={@021.[]},%
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[xcolor]{TeX}{%
    % Control sequences names
    moretexcs={%
      color,pagecolor,definecolor,colorlet,textcolor,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      red,green,blue,cyan,magenta,yellow,black,gray,white,darkgray,%
      lightgray,brown,lime,olive,orange,pink,purple,teal,violet },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      xcolor },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[expl3]{TeX}{%
    % Control sequences names
    moretexcs={%
      .bool_gset,%
      ExplFileDate,ExplFileDescription,ExplFileName,ExplFileVersion,%
      ExplSyntaxOff,ExplSyntaxOn,GetIdInfo,ProvidesExplClass,%
      ProvidesExplFile,ProvidesExplPackage,bool_case_false,bool_case_true,%
      bool_const,bool_do_until,bool_do_while,bool_gset,bool_gset_eq,%
      bool_gset_false,bool_gset_inverse,bool_gset_true,bool_if,%
      bool_if_exist,bool_if_exist_p,bool_if_p,bool_lazy_all,%
      bool_lazy_all_p,bool_lazy_and,bool_lazy_and_p,bool_lazy_any,%
      bool_lazy_any_p,bool_lazy_or,bool_lazy_or_p,bool_log,bool_new,%
      bool_not_p,bool_set,bool_set_eq,bool_set_false,bool_set_inverse,%
      bool_set_true,bool_show,bool_to_str,bool_until_do,bool_while_do,%
      bool_xor,bool_xor_p,box_autosize_to_wd_and_ht,%
      box_autosize_to_wd_and_ht_plus_dp,box_clear,box_clear_new,box_clip,%
      box_dp,box_gautosize_to_wd_and_ht,box_gautosize_to_wd_and_ht_plus_dp,%
      box_gclear,box_gclear_new,box_gclip,box_gresize_to_ht,%
      box_gresize_to_ht_plus_dp,box_gresize_to_wd,box_gresize_to_wd_and_ht,%
      box_gresize_to_wd_and_ht_plus_dp,box_grotate,box_gscale,box_gset_dp,%
      box_gset_eq,box_gset_eq_drop,box_gset_ht,box_gset_to_last,%
      box_gset_trim,box_gset_viewport,box_gset_wd,box_ht,box_ht_plus_dp,%
      box_if_empty,box_if_empty_p,box_if_exist,box_if_exist_p,%
      box_if_horizontal,box_if_horizontal_p,box_if_vertical,%
      box_if_vertical_p,box_log,box_move_down,box_move_left,%
      box_move_right,box_move_up,box_new,box_resize_to_ht,%
      box_resize_to_ht_plus_dp,box_resize_to_wd,box_resize_to_wd_and_ht,%
      box_resize_to_wd_and_ht_plus_dp,box_rotate,box_scale,box_set_dp,%
      box_set_eq,box_set_eq_drop,box_set_ht,box_set_to_last,box_set_trim,%
      box_set_viewport,box_set_wd,box_show,box_use,box_use_drop,box_wd,%
      c_alignment_token,c_ampersand_str,c_atsign_str,c_backslash_str,%
      c_catcode_active_space_tl,c_catcode_active_tl,c_catcode_letter_token,%
      c_catcode_other_space_tl,c_catcode_other_token,c_circumflex_str,%
      c_code_cctab,c_colon_str,c_document_cctab,c_dollar_str,c_e_fp,%
      c_empty_box,c_empty_clist,c_empty_coffin,c_empty_prop,c_empty_seq,%
      c_empty_tl,c_false_bool,c_group_begin_token,c_group_end_token,%
      c_hash_str,c_inf_fp,c_initex_cctab,c_left_brace_str,c_log_iow,%
      c_math_subscript_token,c_math_superscript_token,c_math_toggle_token,%
      c_max_char_int,c_max_dim,c_max_int,c_max_muskip,c_max_register_int,%
      c_max_skip,c_minus_inf_fp,c_minus_zero_fp,c_nan_fp,c_novalue_tl,%
      c_one_degree_fp,c_one_fp,c_one_int,c_other_cctab,c_parameter_token,%
      c_percent_str,c_pi_fp,c_right_brace_str,c_space_tl,c_space_token,%
      c_str_cctab,c_sys_backend_str,c_sys_day_int,c_sys_engine_exec_str,%
      c_sys_engine_format_str,c_sys_engine_str,c_sys_engine_version_str,%
      c_sys_hour_int,c_sys_jobname_str,c_sys_minute_int,c_sys_month_int,%
      c_sys_output_str,c_sys_platform_str,c_sys_shell_escape_int,%
      c_sys_year_int,c_term_iow,c_tilde_str,c_true_bool,c_underscore_str,%
      c_zero_dim,c_zero_fp,c_zero_int,c_zero_muskip,c_zero_skip,%
      c_zero_str,cctab_begin,cctab_const,cctab_end,cctab_gset,%
      cctab_if_exist,cctab_if_exist_p,cctab_item,cctab_new,cctab_select,%
      char_foldcase,char_generate,char_gset_active_eq,char_lowercase,%
      char_set_active_eq,char_set_catcode,char_set_catcode_active,%
      char_set_catcode_alignment,char_set_catcode_comment,%
      char_set_catcode_end_line,char_set_catcode_escape,%
      char_set_catcode_group_begin,char_set_catcode_group_end,%
      char_set_catcode_ignore,char_set_catcode_invalid,%
      char_set_catcode_letter,char_set_catcode_math_subscript,%
      char_set_catcode_math_superscript,char_set_catcode_math_toggle,%
      char_set_catcode_other,char_set_catcode_parameter,%
      char_set_catcode_space,char_set_lccode,char_set_mathcode,%
      char_set_sfcode,char_set_uccode,char_show_value_catcode,%
      char_show_value_lccode,char_show_value_mathcode,%
      char_show_value_sfcode,char_show_value_uccode,char_str_foldcase,%
      char_str_lowercase,char_str_titlecase,char_str_uppercase,%
      char_titlecase,char_to_nfd,char_to_utfviii_bytes,char_uppercase,%
      char_value_catcode,char_value_lccode,char_value_mathcode,%
      char_value_sfcode,char_value_uccode,clist_clear,clist_clear_new,%
      clist_concat,clist_const,clist_count,clist_gclear,clist_gclear_new,%
      clist_gconcat,clist_get,clist_gpop,clist_gpush,clist_gput_left,%
      clist_gput_right,clist_gremove_all,clist_gremove_duplicates,%
      clist_greverse,clist_gset,clist_gset_eq,clist_gset_from_seq,%
      clist_gsort,clist_if_empty,clist_if_empty_p,clist_if_exist,%
      clist_if_exist_p,clist_if_in,clist_item,clist_log,clist_map_break,%
      clist_map_function,clist_map_inline,clist_map_tokens,%
      clist_map_variable,clist_new,clist_pop,clist_push,clist_put_left,%
      clist_put_right,clist_rand_item,clist_remove_all,%
      clist_remove_duplicates,clist_reverse,clist_set,clist_set_eq,%
      clist_set_from_seq,clist_show,clist_sort,clist_use,coffin_attach,%
      coffin_clear,coffin_display_handles,coffin_dp,coffin_gattach,%
      coffin_gclear,coffin_gjoin,coffin_gresize,coffin_grotate,%
      coffin_gscale,coffin_gset_eq,coffin_gset_horizontal_pole,%
      coffin_gset_vertical_pole,coffin_ht,coffin_if_exist,%
      coffin_if_exist_p,coffin_join,coffin_log,coffin_log_structure,%
      coffin_mark_handle,coffin_new,coffin_resize,coffin_rotate,%
      coffin_scale,coffin_set_eq,coffin_set_horizontal_pole,%
      coffin_set_vertical_pole,coffin_show,coffin_show_structure,%
      coffin_typeset,coffin_wd,color_ensure_current,color_export,%
      color_fill,color_group_begin,color_group_end,color_log,color_math,%
      color_model_new,color_profile_apply,color_select,color_set,%
      color_set_eq,color_show,color_stroke,cs_argument_spec,cs,cs_end,%
      cs_generate_from_arg_count,cs_generate_variant,cs_gset,cs_gset_eq,%
      cs_gset_nopar,cs_gset_protected,cs_gset_protected_nopar,cs_if_eq,%
      cs_if_eq_p,cs_if_exist,cs_if_exist_p,cs_if_exist_use,cs_if_free,%
      cs_if_free_p,cs_log,cs_meaning,cs_new,cs_new_eq,cs_new_nopar,%
      cs_new_protected,cs_new_protected_nopar,cs_prefix_spec,%
      cs_replacement_spec,cs_set,cs_set_eq,cs_set_nopar,cs_set_protected,%
      cs_set_protected_nopar,cs_show,cs_split_function,cs_to_str,%
      cs_undefine,debug_off,debug_on,debug_resume,debug_suspend,dim_abs,%
      dim_add,dim_case,dim_compare,dim_compare_p,dim_const,dim_do_until,%
      dim_do_while,dim_eval,dim_gadd,dim_gset,dim_gset_eq,dim_gsub,%
      dim_gzero,dim_gzero_new,dim_if_exist,dim_if_exist_p,dim_log,%
      dim_max,dim_min,dim_new,dim_ratio,dim_set,dim_set_eq,dim_show,%
      dim_sign,dim_step_function,dim_step_inline,dim_step_variable,%
      dim_sub,dim_to_decimal,dim_to_decimal_in_bp,dim_to_decimal_in_sp,%
      dim_to_decimal_in_unit,dim_to_fp,dim_until_do,dim_use,dim_while_do,%
      dim_zero,dim_zero_new,draw_begin,draw_end,else,exp_after,exp_args,%
      exp_args_generate,exp_end,exp_end_continue_f,exp_last_two_unbraced,%
      exp_last_unbraced,exp_not,exp_stop_f,expandafter,expanded,fi,%
      file_compare_timestamp,file_compare_timestamp_p,file_full_name,%
      file_get,file_get_full_name,file_get_hex_dump,file_get_mdfive_hash,%
      file_get_size,file_get_timestamp,file_hex_dump,file_if_exist,%
      file_if_exist_input,file_input,file_input_stop,file_log_list,%
      file_mdfive_hash,file_parse_full_name,file_parse_full_name_apply,%
      file_show_list,file_size,file_timestamp,flag_clear,flag_clear_new,%
      flag_height,flag_if_exist,flag_if_exist_p,flag_if_raised,%
      flag_if_raised_p,flag_log,flag_new,flag_raise,flag_raise_if_clear,%
      flag_show,fp_abs,fp_add,fp_compare,fp_compare_p,fp_const,%
      fp_do_until,fp_do_while,fp_eval,fp_format,fp_gadd,fp_gset,%
      fp_gset_eq,fp_gsub,fp_gzero,fp_gzero_new,fp_if_exist,fp_if_exist_p,%
      fp_if_nan,fp_if_nan_p,fp_log,fp_max,fp_min,fp_new,fp_set,%
      fp_set_eq,fp_show,fp_sign,fp_step_function,fp_step_inline,%
      fp_step_variable,fp_sub,fp_to_decimal,fp_to_dim,fp_to_int,%
      fp_to_scientific,fp_to_tl,fp_trap,fp_until_do,fp_use,fp_while_do,%
      fp_zero,fp_zero_new,fparray_count,fparray_gset,fparray_gzero,%
      fparray_item,fparray_item_to_tl,fparray_new,g_file_curr_dir_str,%
      g_file_curr_ext_str,g_file_curr_name_str,g_msg_module_name_prop,%
      g_msg_module_type_prop,g_peek_token,%
      g__letgut_tmpa_bool,g__letgut_tmpa_box,g__letgut_tmpa_clist,%
      g__letgut_tmpa_coffin,g__letgut_tmpa_dim,g__letgut_tmpa_fp,%
      g__letgut_tmpa_int,g__letgut_tmpa_ior,g__letgut_tmpa_iow,%
      g__letgut_tmpa_muskip,g__letgut_tmpa_prop,g__letgut_tmpa_regex,%
      g__letgut_tmpa_seq,g__letgut_tmpa_skip,g__letgut_tmpa_str,%
      g__letgut_tmpa_tl,g__letgut_tmpb_bool,g__letgut_tmpb_box,%
      g__letgut_tmpb_clist,g__letgut_tmpb_coffin,g__letgut_tmpb_dim,%
      g__letgut_tmpb_fp,g__letgut_tmpb_int,g__letgut_tmpb_ior,%
      g__letgut_tmpb_iow,g__letgut_tmpb_muskip,g__letgut_tmpb_prop,%
      g__letgut_tmpb_regex,g__letgut_tmpb_seq,g__letgut_tmpb_skip,%
      g__letgut_tmpb_str,g__letgut_tmpb_tl,%
      group_align_safe_begin,%
      group_align_safe_end,group_begin,group_end,group_insert_after,%
      group_log_list,group_show_list,hbox,hbox_gset,hbox_gset_end,%
      hbox_gset_to_wd,hbox_overlap_center,hbox_overlap_left,%
      hbox_overlap_right,hbox_set,hbox_set_end,hbox_set_to_wd,hbox_to_wd,%
      hbox_to_zero,hbox_unpack,hbox_unpack_drop,hcoffin_gset,%
      hcoffin_gset_end,hcoffin_set,hcoffin_set_end,if,if_bool,%
      if_box_empty,if_case,if_catcode,if_charcode,if_cs_exist,if_dim,%
      if_eof,if_false,if_hbox,if_int_compare,if_int_odd,if_meaning,%
      if_mode_horizontal,if_mode_inner,if_mode_math,if_mode_vertical,%
      if_predicate,if_true,if_vbox,int_abs,int_add,int_case,int_compare,%
      int_compare_p,int_const,int_decr,int_div_round,int_div_truncate,%
      int_do_until,int_do_while,int_eval,int_from_alph,int_from_base,%
      int_from_bin,int_from_hex,int_from_oct,int_from_roman,int_gadd,%
      int_gdecr,int_gincr,int_gset,int_gset_eq,int_gsub,int_gzero,%
      int_gzero_new,int_if_even,int_if_even_p,int_if_exist,int_if_exist_p,%
      int_if_odd,int_if_odd_p,int_incr,int_log,int_max,int_min,int_mod,%
      int_new,int_rand,int_set,int_set_eq,int_show,int_sign,%
      int_step_...,int_step_function,int_step_inline,int_step_variable,%
      int_sub,int_to_Alph,int_to_Base,int_to_Hex,int_to_Roman,%
      int_to_alph,int_to_arabic,int_to_base,int_to_bin,int_to_hex,%
      int_to_oct,int_to_roman,int_to_symbols,int_until_do,int_use,%
      int_value,int_while_do,int_zero,int_zero_new,%
      intarray_const_from_clist,intarray_count,intarray_gset,%
      intarray_gset_rand,intarray_gzero,intarray_item,intarray_log,%
      intarray_new,intarray_rand_item,intarray_show,intarray_to_clist,%
      ior_close,ior_get,ior_get_term,ior_if_eof,ior_if_eof_p,ior_log,%
      ior_log_list,ior_map_break,ior_map_inline,ior_map_variable,ior_new,%
      ior_open,ior_shell_open,ior_show,ior_show_list,ior_str_get,%
      ior_str_get_term,ior_str_map_inline,ior_str_map_variable,%
      iow_allow_break,iow_char,iow_close,iow_indent,iow_log,iow_log_list,%
      iow_new,iow_newline,iow_now,iow_open,iow_shipout,iow_shipout_x,%
      iow_show,iow_show_list,iow_term,iow_wrap,keys_define,%
      keys_if_choice_exist,keys_if_choice_exist_p,keys_if_exist,%
      keys_if_exist_p,keys_log,keys_set,keys_set_filter,keys_set_groups,%
      keys_set_known,keys_show,keyval_parse,l_char_active_seq,%
      l_char_special_seq,l_color_fixed_model_tl,l_color_math_active_tl,%
      l_file_search_path_seq,l_iow_line_count_int,l_keys_choice_int,%
      l_keys_choice_tl,l_keys_key_str,l_keys_path_str,%
      l_keys_usage_load_prop,l_keys_usage_preamble_prop,l_keys_value_tl,%
      l_my_int,l_peek_token,l_text_accents_tl,l_text_case_exclude_arg_tl,%
      l_text_expand_exclude_tl,l_text_letterlike_tl,l_text_math_arg_tl,%
      l_text_math_delims_tl,l_text_titlecase_check_letter_bool,%
      l__letgut_tmpa_bool,l__letgut_tmpa_box,l__letgut_tmpa_clist,%
      l__letgut_tmpa_coffin,l__letgut_tmpa_dim,l__letgut_tmpa_fp,%
      l__letgut_tmpa_int,l__letgut_tmpa_muskip,l__letgut_tmpa_prop,%
      l__letgut_tmpa_regex,l__letgut_tmpa_seq,l__letgut_tmpa_skip,%
      l__letgut_tmpa_str,l__letgut_tmpa_tl,l__letgut_tmpb_bool,%
      l__letgut_tmpb_box,l__letgut_tmpb_clist,l__letgut_tmpb_coffin,%
      l__letgut_tmpb_dim,l__letgut_tmpb_fp,l__letgut_tmpb_int,%
      l__letgut_tmpb_muskip,l__letgut_tmpb_prop,l__letgut_tmpb_regex,%
      l__letgut_tmpb_seq,l__letgut_tmpb_skip,l__letgut_tmpb_str,%
      l__letgut_tmpb_tl,%
      legacy_if,legacy_if_gset,legacy_if_gset_false,%
      legacy_if_gset_true,legacy_if_p,legacy_if_set,legacy_if_set_false,%
      legacy_if_set_true,lua_escape,lua_now,lua_shipout,lua_shipout_e,%
      mode_if_horizontal,mode_if_horizontal_p,mode_if_inner,%
      mode_if_inner_p,mode_if_math,mode_if_math_p,mode_if_vertical,%
      mode_if_vertical_p,mode_leave_vertical,msg_critical,%
      msg_critical_text,msg_error,msg_error_text,msg_expandable_error,%
      msg_fatal,msg_fatal_text,msg_gset,msg_if_exist,msg_if_exist_p,%
      msg_info,msg_info_text,msg_line_context,msg_line_number,msg_log,%
      msg_log_eval,msg_module_name,msg_module_type,msg_new,msg_none,%
      msg_note,msg_redirect_class,msg_redirect_module,msg_redirect_name,%
      msg_see_documentation_text,msg_set,msg_show,msg_show_eval,%
      msg_show_item,msg_show_item_unbraced,msg_term,msg_warning,%
      msg_warning_text,muskip_add,muskip_const,muskip_eval,muskip_gadd,%
      muskip_gset,muskip_gset_eq,muskip_gsub,muskip_gzero,%
      muskip_gzero_new,muskip_if_exist,muskip_if_exist_p,muskip_log,%
      muskip_new,muskip_set,muskip_set_eq,muskip_show,muskip_sub,%
      muskip_use,muskip_zero,muskip_zero_new,pdf_destination,%
      pdf_object_if_exist,pdf_object_if_exist_p,pdf_object_new,%
      pdf_object_ref,pdf_object_ref_last,pdf_object_unnamed_write,%
      pdf_object_write,pdf_pageobject_ref,pdf_pagobject_ref,pdf_uncompress,%
      pdf_version,pdf_version_compare,pdf_version_compare_p,%
      pdf_version_gset,pdf_version_major,pdf_version_min_gset,%
      pdf_version_minor,peek_N_type,peek_after,peek_analysis_map_break,%
      peek_analysis_map_inline,peek_catcode,peek_catcode_collect_inline,%
      peek_catcode_remove,peek_charcode,peek_charcode_collect_inline,%
      peek_charcode_remove,peek_gafter,peek_meaning,%
      peek_meaning_collect_inline,peek_meaning_remove,peek_regex,%
      peek_regex_remove_once,peek_regex_replace_once,peek_remove_filler,%
      peek_remove_spaces,prg_break,prg_break_point,prg_do_nothing,%
      prg_generate_conditional_variant,prg_map_break,prg_new_conditional,%
      prg_new_eq_conditional,prg_new_protected_conditional,prg_replicate,%
      prg_return_false,prg_return_true,prg_set_conditional,%
      prg_set_eq_conditional,prg_set_protected_conditional,prop_clear,%
      prop_clear_new,prop_concat,prop_const_from_keyval,prop_count,%
      prop_gclear,prop_gclear_new,prop_gconcat,prop_get,prop_gpop,%
      prop_gput,prop_gput_from_keyval,prop_gput_if_new,prop_gremove,%
      prop_gset_eq,prop_gset_from_keyval,prop_if_empty,prop_if_empty_p,%
      prop_if_exist,prop_if_exist_p,prop_if_in,prop_if_in_p,prop_item,%
      prop_log,prop_map_break,prop_map_function,prop_map_inline,%
      prop_map_tokens,prop_new,prop_pop,prop_put,prop_put_from_keyval,%
      prop_put_if_new,prop_rand_key_value,prop_remove,prop_set_eq,%
      prop_set_from_keyval,prop_show,prop_to_keyval,q_mark,q_nil,%
      q_no_value,q_recursion_stop,q_recursion_tail,q_stop,quark_if_nil,%
      quark_if_nil_p,quark_if_no_value,quark_if_no_value_p,%
      quark_if_recursion_tail_break,quark_if_recursion_tail_stop,%
      quark_if_recursion_tail_stop_do,quark_new,regex_const,regex_count,%
      regex_extract_all,regex_extract_once,regex_gset,regex_log,%
      regex_match,regex_match_case,regex_new,regex_replace,%
      regex_replace_all,regex_replace_case_all,regex_replace_case_once,%
      regex_replace_once,regex_set,regex_show,regex_split,reverse_if,%
      s_stop,scan_new,scan_stop,seq_clear,seq_clear_new,seq_concat,%
      seq_const_from_clist,seq_count,seq_gclear,seq_gclear_new,%
      seq_gconcat,seq_get,seq_get_left,seq_get_right,seq_gpop,%
      seq_gpop_item,seq_gpop_left,seq_gpop_right,seq_gpush,seq_gput_left,%
      seq_gput_right,seq_gremove_all,seq_gremove_duplicates,seq_greverse,%
      seq_gset_eq,seq_gset_filter,seq_gset_from_clist,%
      seq_gset_from_function,seq_gset_from_inline_x,seq_gset_item,%
      seq_gset_map,seq_gset_map_x,seq_gset_split,%
      seq_gset_split_keep_spaces,seq_gshuffle,seq_gsort,seq_if_empty,%
      seq_if_empty_p,seq_if_exist,seq_if_exist_p,seq_if_in,seq_item,%
      seq_log,seq_map_break,seq_map_function,seq_map_indexed_function,%
      seq_map_indexed_inline,seq_map_inline,seq_map_tokens,%
      seq_map_variable,seq_mapthread_function,seq_new,seq_pop,%
      seq_pop_item,seq_pop_left,seq_pop_right,seq_push,seq_put_left,%
      seq_put_right,seq_rand_item,seq_remove_all,seq_remove_duplicates,%
      seq_reverse,seq_set_eq,seq_set_filter,seq_set_from_clist,%
      seq_set_from_function,seq_set_from_inline_x,seq_set_item,seq_set_map,%
      seq_set_map_x,seq_set_split,seq_set_split_keep_spaces,seq_show,%
      seq_shuffle,seq_sort,seq_use,skip_add,skip_const,skip_eval,%
      skip_gadd,skip_gset,skip_gset_eq,skip_gsub,skip_gzero,%
      skip_gzero_new,skip_horizontal,skip_if_eq,skip_if_eq_p,%
      skip_if_exist,skip_if_exist_p,skip_if_finite,skip_if_finite_p,%
      skip_log,skip_new,skip_set,skip_set_eq,skip_show,skip_sub,%
      skip_use,skip_vertical,skip_zero,skip_zero_new,sort_return_same,%
      sort_return_swapped,str_case,str_case_e,str_clear,str_clear_new,%
      str_compare,str_compare_p,str_concat,str_const,str_convert_pdfname,%
      str_count,str_count_ignore_spaces,str_count_spaces,str_foldcase,%
      str_gclear,str_gconcat,str_gput_left,str_gput_right,str_gremove_all,%
      str_gremove_once,str_greplace_all,str_greplace_once,str_gset,%
      str_gset_convert,str_gset_eq,str_head,str_head_ignore_spaces,%
      str_if_empty,str_if_empty_p,str_if_eq,str_if_eq_p,str_if_exist,%
      str_if_exist_p,str_if_in,str_item,str_item_ignore_spaces,str_log,%
      str_lowercase,str_map_break,str_map_function,str_map_inline,%
      str_map_tokens,str_map_variable,str_new,str_put_left,str_put_right,%
      str_range,str_range_ignore_spaces,str_remove_all,str_remove_once,%
      str_replace_all,str_replace_once,str_set,str_set_convert,str_set_eq,%
      str_show,str_tail,str_tail_ignore_spaces,str_uppercase,str_use,%
      sys_finalise,sys_get_shell,sys_gset_rand_seed,sys_if_engine_luatex,%
      sys_if_engine_luatex_p,sys_if_engine_pdftex,sys_if_engine_pdftex_p,%
      sys_if_engine_ptex,sys_if_engine_ptex_p,sys_if_engine_uptex,%
      sys_if_engine_uptex_p,sys_if_engine_xetex,sys_if_engine_xetex_p,%
      sys_if_output_dvi,sys_if_output_dvi_p,sys_if_output_pdf,%
      sys_if_output_pdf_p,sys_if_platform_unix,sys_if_platform_unix_p,%
      sys_if_platform_windows,sys_if_platform_windows_p,sys_if_rand_exist,%
      sys_if_rand_exist_p,sys_if_shell,sys_if_shell_p,%
      sys_if_shell_restricted,sys_if_shell_restricted_p,%
      sys_if_shell_unrestricted,sys_if_shell_unrestricted_p,%
      sys_load_backend,sys_load_debug,sys_rand_seed,sys_shell_now,%
      sys_shell_shipout,sys_timer,text_declare_expand_equivalent,%
      text_declare_purify_equivalent,text_expand,text_lowercase,%
      text_purify,text_titlecase,text_titlecase_first,text_uppercase,%
      tl_analysis_log,tl_analysis_map_inline,tl_analysis_show,%
      tl_build_begin,tl_build_clear,tl_build_end,tl_build_gbegin,%
      tl_build_gclear,tl_build_gend,tl_build_get,tl_build_gput_left,%
      tl_build_gput_right,tl_build_put_left,tl_build_put_right,tl_case,%
      tl_clear,tl_clear_new,tl_concat,tl_const,tl_count,tl_count_tokens,%
      tl_gclear,tl_gclear_new,tl_gconcat,tl_gput_left,tl_gput_right,%
      tl_gremove_all,tl_gremove_once,tl_greplace_all,tl_greplace_once,%
      tl_greverse,tl_gset,tl_gset_eq,tl_gset_rescan,tl_gsort,%
      tl_gtrim_spaces,tl_head,tl_if_blank,tl_if_blank_p,tl_if_empty,%
      tl_if_empty_p,tl_if_eq,tl_if_eq_p,tl_if_exist,tl_if_exist_p,%
      tl_if_head_eq_catcode,tl_if_head_eq_catcode_p,tl_if_head_eq_charcode,%
      tl_if_head_eq_charcode_p,tl_if_head_eq_meaning,%
      tl_if_head_eq_meaning_p,tl_if_head_is_N_type,tl_if_head_is_N_type_p,%
      tl_if_head_is_group,tl_if_head_is_group_p,tl_if_head_is_space,%
      tl_if_head_is_space_p,tl_if_in,tl_if_novalue,tl_if_novalue_p,%
      tl_if_single,tl_if_single_p,tl_if_single_token,tl_if_single_token_p,%
      tl_item,tl_log,tl_map_break,tl_map_function,tl_map_inline,%
      tl_map_tokens,tl_map_variable,tl_new,tl_put_left,tl_put_right,%
      tl_rand_item,tl_range,tl_range_braced,tl_range_unbraced,%
      tl_remove_all,tl_remove_once,tl_replace_all,tl_replace_once,%
      tl_rescan,tl_reverse,tl_reverse_items,tl_set,tl_set_eq,%
      tl_set_rescan,tl_show,tl_sort,tl_tail,tl_to_str,tl_trim_spaces,%
      tl_trim_spaces_apply,tl_use,token_case_catcode,token_case_charcode,%
      token_case_meaning,token_if_active,token_if_active_p,%
      token_if_alignment,token_if_alignment_p,token_if_chardef,%
      token_if_chardef_p,token_if_cs,token_if_cs_p,token_if_dim_register,%
      token_if_dim_register_p,token_if_eq_catcode,token_if_eq_catcode_p,%
      token_if_eq_charcode,token_if_eq_charcode_p,token_if_eq_meaning,%
      token_if_eq_meaning_p,token_if_expandable,token_if_expandable_p,%
      token_if_font_selection,token_if_font_selection_p,%
      token_if_group_begin,token_if_group_begin_p,token_if_group_end,%
      token_if_group_end_p,token_if_int_register,token_if_int_register_p,%
      token_if_letter,token_if_letter_p,token_if_long_macro,%
      token_if_long_macro_p,token_if_macro,token_if_macro_p,%
      token_if_math_subscript,token_if_math_subscript_p,%
      token_if_math_superscript,token_if_math_superscript_p,%
      token_if_math_toggle,token_if_math_toggle_p,token_if_mathchardef,%
      token_if_mathchardef_p,token_if_muskip_register,%
      token_if_muskip_register_p,token_if_other,token_if_other_p,%
      token_if_parameter,token_if_parameter_p,token_if_primitive,%
      token_if_primitive_p,token_if_protected_long_macro,%
      token_if_protected_long_macro_p,token_if_protected_macro,%
      token_if_protected_macro_p,token_if_skip_register,%
      token_if_skip_register_p,token_if_space,token_if_space_p,%
      token_if_toks_register,token_if_toks_register_p,token_to_meaning,%
      token_to_str,unvcopy,use,use_i,use_i_delimit_by_q_nil,%
      use_i_delimit_by_q_recursion_stop,use_i_delimit_by_q_stop,use_i_ii,%
      use_ii,use_ii_i,use_iii,use_iv,use_none,use_none_delimit_by_q_nil,%
      use_none_delimit_by_q_recursion_stop,use_none_delimit_by_q_stop,%
      use_none_delimit_by_s_stop,vbox,vbox_gset,vbox_gset_end,%
      vbox_gset_split_to_ht,vbox_gset_to_ht,vbox_gset_top,vbox_set,%
      vbox_set_end,vbox_set_split_to_ht,vbox_set_to_ht,vbox_set_top,%
      vbox_to_ht,vbox_to_zero,vbox_top,vbox_unpack,vbox_unpack_drop,%
      vcoffin_gset,vcoffin_gset_end,vcoffin_set,vcoffin_set_end,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      name,alternative-model,alternative-values,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
      cmyk,%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
      D,N,Nn,NF,NN,Nx,NT,NTF,NNn,NnV,Nnn,Npn,Nnnn,V,c,e,en,f,n,nF,%
      nn,nT,nnn,nnF,nnV,nTF,nnnn,nNnF,nNnT,nnVV,o,p,v,w,x,nnTF,%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      expl3,%
    },
    otherkeywords={:,~},%
    alsoletter={_-.},%
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[pdftex]{TeX}{%
    % Control sequences names
    moretexcs={%
      pdfinfo,pdfcatalog,pdfpageattr,pdfpagesattr,pdfpageresources,%
      pdfcolorstack,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      pdftex,%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[luatex]{TeX}{%
    % Control sequences names
    moretexcs={%
      pdfextension,ifluatex,directlua,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      colorstack },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      luatex,%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[dvips]{TeX}{%
    % Control sequences names
    moretexcs={%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      color,push,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      dvips,%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[xetex]{TeX}{%
    % Control sequences names
    moretexcs={%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      pdfcolorstack,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      xetex,%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[inputenc]{TeX}{%
    % Control sequences names
    moretexcs={%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      latin1 },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      inputenc,%
    },%
    % otherkeywords={},%
    alsoletter={1},%
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[pdfmanagement-testphase]{TeX}{%
    % Control sequences names
    moretexcs={%
      pdfmanagement_add,DeclareDocumentMetadata,AddToDocumentProperties,%
      ShowDocumentProperties,GetDocumentProperties,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{% Keys or optional arguments
      pdfmanagement-testphase,uncompress,geometry,top-level,backend,Info,%
      ThisPage,pdfversion,pdfstandard,paper,topic,Title,Rotate,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
      dvipdfmx,%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
      nnn,%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      pdfmanagement-testphase,%
    },
    otherkeywords={:},%
    alsoletter={_-},%
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[rotating]{TeX}{%
    % Control sequences names
    moretexcs={%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
      sidewaystable,%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      rotating,%
    },%
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[fontenc]{TeX}%
  {%
    % Control sequences names
    moretexcs={%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      T1 },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      fontenc,%
    },%
    % otherkeywords={},
    % alsoletter={1},%
    alsodigit={1},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[babel]{TeX}%
  {%
    % Control sequences names
    moretexcs={%
      foreignlanguage,selectlanguage,iflanguage,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
      otherlanguage,%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
      UKenglish,USenglish,acadian,afrikaans,american,arabic,australian,%
      austrian,azerbaijani,bahasa,bahasai,basque,bgreek,brazil,%
      brazilian,breton,british,bulgarian,canadian,canadien,catalan,%
      croatian,czech,danish,dutch,english,esperanto,estonian,ethiop,%
      farsi,finnish,francais,french,frenchle,friulan,galician,german,%
      germanb,greek,hebrew,hindi,ibygreek,icelandic,indon,indonesian,%
      interlingua,irish,italian,japanese,latin,latvian,lithuanian,%
      lowersorbian,magyar,malay,melayu (bahasam),mongolian,naustrian,%
      newzealand,ngerman,norsk,nynorsk,pinyin,polish,polutonikogreek,%
      portuges,portuguese,romanian,romansh,russian,samin,scottish,%
      serbian,serbianc,slovak,slovene,spanglish,spanish,swedish,thai,%
      thaicjk,turkish,turkmen,ukrainian,uppersorbian,vietnamese,%
      welsh,%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      babel,%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[babel-french]{TeX}%
  {%
    % Control sequences names
    moretexcs={%
      og,fg,up,bsc,ier,iers,iere,ieres,ieme,iemes,primo,secundo,%
      tertio,quarto,FrenchEnumerate,No,Nos,no,nos,degre,nombre,%
      frenchabstractname,frenchbibname,frenchrefname,frenchprefacename,%
      frenchchaptername,frenchappendixname,frenchcontentsname,%
      frenchlistfigurename,frenchlisttablename,frenchindexname,%
      frenchglossaryname,frenchfigurename,frenchtablename,frenchpartname,%
      frenchenclname,frenchccname,frenchheadtoname,frenchpagename,%
      frenchseename,frenchalsoname,frenchproofname%,%
      frquote,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      babel-french,%
    },%
    % otherkeywords={},%
    alsoletter={-},%
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[kantlipsum]{TeX}{%
    % Control sequences names
    moretexcs={%
      kant,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      kantlipsum,%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[hyperxmp]{TeX}{%
    % Control sequences names
    moretexcs={%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      hyperxmp,%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[hyperref]{TeX}{%
    % Control sequences names
    moretexcs={%
      hypersetup,href,phantomsection,pdfstringdefDisableCommands,url,%
      nolinkurl,hyperbaseurl,hyperimage,hyperdef,hyperref,hyperlink,%
      hypertarget,hyperget,autoref,autopageref,ref*,pageref*,autoref*,%
      autopageref*,pdfstringdef,pdfbookmark,currentpdfbookmark,%
      subpdfbookmark,belowpdfbookmark,texorpdfstring,thispdfpagelabel,%
      hypercalcbp,nameref,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      allbordercolors,allcolors,anchorcolor,backref,baseurl,bookmarks,%
      bookmarksnumbered,bookmarksopen,bookmarksopenlevel,bookmarkstype,%
      breaklinks,CJKbookmarks,citebordercolor,citecolor,colorlinks,debug,%
      destlabel,draft,driverfallback,dvipdfm,dvipdfmx,dvips,dvipsone,%
      dviwindo,encap,extension,filebordercolor,filecolor,final,%
      frenchlinks,hidelinks,hyperfigures,hyperfootnotes,hyperindex,%
      hypertex,hypertexnames,implicit,latex2html,linkbordercolor,%
      linkcolor,linktoc,linktocpage,menubordercolor,menucolor,nativepdf,%
      naturalnames,nesting,next-anchor,pageanchor,pagebackref,pdfauthor,%
      pdfborder,pdfborderstyle,pdfcenterwindow,pdfcreator,pdfdirection,%
      pdfdisplaydoctitle,pdfduplex,pdffitwindow,pdfhighlight,pdfinfo,%
      pdfkeywords,pdflang,pdfmark,pdfmenubar,pdfnewwindow,%
      pdfnonfullscreenpagemode,pdfnumcopies,pdfpagelabels,pdfpagelayout,%
      pdfpagemode,pdfpagescrop,pdfpagetransition,pdfpicktraybypdfsize,%
      pdfprintarea,pdfprintclip,pdfprintpagerange,pdfprintscaling,%
      pdfproducer,pdfremotestartview,pdfstartpage,pdfstartview,pdfsubject,%
      pdftex,pdftitle,pdftoolbar,pdftrapped,pdfview,pdfviewarea,%
      pdfviewclip,pdfwindowui,plainpages,ps2pdf,psdextra,raiselinks,%
      runbordercolor,runcolor,setpagesize,tex4ht,textures,unicode,%
      urlbordercolor,urlcolor,verbose,vtex,xetex,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      hyperref,%
    },%
    % otherkeywords={},%
    alsoletter={*},%
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[graphicx]{TeX}{%
    % Control sequences names
    moretexcs={%
      includegraphics,includegraphics*,definecolor,color,textcolor,%
      mathcolor,pagecolor,nopagecolor,colorbox,fcolorbox,rotatebox,%
      scalebox,reflectbox,resizebox,resizebox*,graphicspath,%
      DeclareGraphicsExtensions,DeclareGraphicsRule },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      draft,final,hiresbb,demo,setpagesize,nosetpagesize,dvips,xdvi,%
      dvipdf,dvipdfm,dvipdfmx,xetex,pdftex,luatex,dvisvgm,dvipsone,%
      dviwindo,emtex,dviwin,oztex,textures,pctexps,pctexwin,pctexhp,%
      pctex32,truetex,tcidvi,vtex,debugshow,hiderotate,hidescale,alt,%
      %
      bb,bbllx,bblly,bburx,bbury,natwidth,natheight,hiresbb,pagebox,%
      viewport,trim,angle,origin,width,height,totalheight,%
      keepaspectratio,scale,clip,draft,type,ext,read,command,quiet,%
      page,interpolate,decodearray,origin,x,y,units,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
      mediabox,cropbox,bleedbox,trimbox,artbox,true,false,%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      graphicx,%
    },%
    % otherkeywords={},%
    alsoletter={23},%
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[geometry]{TeX}{%
    % Control sequences names
    moretexcs={%
      geometry,newgeometry,restoregeometry,savegeometry,loadgeometry,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      paper,papername,paperwidth,paperheight,papersize,landscape,%
      portrait,layout,layoutwidth,layoutheight,layoutsize,layouthoffset,%
      layoutvoffset,layoutoffset,hscale,vscale,scale,width,totalwidth,%
      height,totalheight,total,textwidth,textheight,text,body,lines,%
      includehead,includefoot,includeheadfoot,includemp,includeall,%
      ignorehead,ignorefoot,ignoreheadfoot,ignoremp,ignoreall,%
      heightrounded,hdivide,vdivide,divide,left,lmargin,inner,right,%
      rmargin,outer,top,tmargin,bottom,bmargin,hmargin,vmargin,margin,%
      hmarginratio,vmarginratio,marginratio,ratio,hcentering,vcentering,%
      centering,twoside,asymmetric,headheight,head,headsep,footskip,%
      foot,nohead,nofoot,noheadfoot,footnotesep,marginparwidth,%
      marginparsep,nomarginpar,columnsep,hoffset,voffset,offset,%
      twocolumn,onecolumn,reversemp,reversemarginpar,verbose,reset,mag,%
      truedimen,pass,showframe,showcrop,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
      a0paper,a1paper,a2paper,a3paper,a4paper,a5paper,a6paper,b0paper,%
      b1paper,b2paper,b3paper,b4paper,b5paper,b6paper,c0paper,c1paper,%
      c2paper,c3paper,c4paper,c5paper,c6paper,b0j,b1j,b2j,b3j,b4j,%
      b5j,b6j,ansiapaper,ansibpaper,ansicpaper,ansidpaper,ansiepaper,%
      letterpaper,executivepaper,legalpaper,screen,dvips,dvipdfm,pdftex,%
      luatex,xetex,vtex,dvipdfmx,xdvipdfmx,%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      geometry,%
    },%
    % otherkeywords={},%
    alsoletter={0123456},%
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[newpax]{TeX}{%
    % Control sequences names
    moretexcs={%
      newpaxsetup,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      addannots,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
      false,%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      newpax,%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[tikz]{TeX}{%
    % Control sequences names
    moretexcs={%
      usetikzlibrary,draw,node,matrix,fill,foreach,tikz,pgfmathsetmacro,%
      path,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
      tikzpicture,%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      pic,rotate,xshift,yshift,every node,inner sep,blend mode,fill,%
      fit,circle,anchor,in,count,x,y,matrix,of,math,nodes,above right,%
      at,--,-|,|-,thick,size,angle,circle,through,intersection,of,%
      draw,coordinate,shift,and,cycle,cs:A,node,barycentric,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
      multiply,lightgray,base,red%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      tikz,%
    },%
    % otherkeywords={},%
    alsoletter={-| \ :},%
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[tikzducks]{TeX}{%
    % Control sequences names
    moretexcs={%
      duck,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      alien,aodai,baguette,basket,beard,beret,bill,body,book,%
      bookcolour,bowtie,bubblecolour,bunny,buttons,cake,cap,cape,%
      cheese,chef,cocktail,conicalhat,crazyhair,cricket,crown,crozier,%
      crystalball,darthvader,devil,easter,egga,eggb,eggc,eye,eyebrow,%
      flavoura,flavourb,flavourc,football,glasses,graduate,grumpy,%
      handbag,harlequin,hat,head,helmet,hockey,horsetail,icecream,%
      inear,invisible,jacket,kingcrown,lapel,laughing,lightsaber,%
      longhair,magichat,magicstars,magicwand,mask,milkshake,mohican,%
      mullet,name,neckerchief,necklace,niuqelrah,overleaf,parrot,%
      parting,peakedcap,pickaxe,pizza,prison,queencrown,recedinghair,%
      ribbon,rollingpin,sailor,santa,sheep,shorthair,shovel,signback,%
      signcolour,signpost,snowduck,speech,squareglasses,stethoscope,%
      strawhat,sunglasses,tail,tassel,think,tie,tophat,torch,tshirt,%
      umbrella,umbrellaclosed,unicorn,vampire,viking,water,wine,wing,%
      witch,woggle,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
      blue,green,red,yellow,%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      tikzducks,%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[tikzlings]{TeX}{%
    % Control sequences names
    moretexcs={%
      anteater,bear,bee,cat,chicken,coati,elephant,hippo,koala,%
      marmot,mole,mouse,owl,panda,penguin,pig,rhino,sheep,sloth,%
      squirrel,snowman,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      3D,eye,contour,back,globalwarming,whiskers,schroedinger,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      tikzlings,%
    },%
    % otherkeywords={},%
    alsoletter={3},%
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[amsmath]{TeX}{%
    % Control sequences names
    moretexcs={%
      cdots,ddots,vdots,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
      pmatrix,%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      amsmath,%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % xparse
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  \lst@definelanguage[xparse]{TeX}{%
    % Control sequences names
    moretexcs={%
      NewDocumentCommand,RenewDocumentCommand,ProvideDocumentCommand,%
      DeclareDocumentCommand,NewDocumentEnvironment,%
      RenewDocumentEnvironment,ProvideDocumentEnvironment,%
      DeclareDocumentEnvironment,NewExpandableDocumentCommand,%
      RenewExpandableDocumentCommand,ProvideExpandableDocumentCommand,%
      DeclareExpandableDocumentCommand,IfNoValueT,IfNoValueF,IfNoValueTF,%
      IfValueT,IfValueF,IfValueTF,IfBooleanT,IfBooleanF,IfBooleanTF,%
      BooleanTrue,BooleanFalse,ProcessedArgument,ReverseBoolean,%
      SplitArgument,SplitList,ProcessList,TrimSpaces,%
      GetDocumentCommandArgSpec,GetDocumentEnvironmentArgSpec,%
      ShowDocumentCommandArgSpec,ShowDocumentEnvironmentArgSpec,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      log-declarations,%
      m,r,R,v,b,o,d,O,D,s,t,e,E,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      xparse,%
    },%
    % otherkeywords={},%
    alsoletter={-},%
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % colortbl
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  \lst@definelanguage[colortbl]{TeX}{%
    % Control sequences names
    moretexcs={%
      columncolor,rowcolor,cellcolor,arrayrulecolor,doublerulesepcolor,%
      minrowclearance,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      colortbl,%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % multirow
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  \lst@definelanguage[multirow]{TeX}%
  {%
    % Control sequences names
    moretexcs={%
      multirow,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      multirow,%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % nicematrix
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  \lst@definelanguage[nicematrix]{TeX}%
  {%
    % Control sequences names
    moretexcs={%
      Cdots,Ddots,Vdots,Body,CodeBefore,CodeAfter,Block,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
      pNiceMatrix,NiceMatrix,NiceTabular,bNiceArray,%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      hvlines,rules/width,baseline,colortbl-like,margin,right-margin,%
      create-cell-nodes,rounded-corners,draw,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      nicematrix,%
    },
    otherkeywords={&},%
    alsoletter={/},%
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % booktabs
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  \lst@definelanguage[booktabs]{TeX}%
  {%
    % Control sequences names
    moretexcs={%
      toprule,midrule,bottomrule,cmidrule,addlinespace,morecmidrules,%
      specialrule,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      booktabs,%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % strands
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  \lst@definelanguage[strands]{TeX}%
  {%
    % Control sequences names
    moretexcs={%
      strands,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      strands,%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % cartonaugh
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  \lst@definelanguage[cartonaugh]{TeX}%
  {%
    % Control sequences names
    moretexcs={%
      maxterms,minterms,terms,implicant,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
      cartonaugh,%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      cartonaugh,%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % xistercian
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  \lst@definelanguage[xistercian]{TeX}%
  {%
    % Control sequences names
    moretexcs={%
      cisterciannum,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
      xistercian,%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      xistercian,%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % aboensis
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  \lst@definelanguage[aboensis]{TeX}%
  {%
    % Control sequences names
    moretexcs={%
      abcursivefamily,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      aboensis,%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % tabularray
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  \lst@definelanguage[tabularray]{TeX}%
  {%
    % Control sequences names
    moretexcs={%
      ,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
      tblr,%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      width,colspec,row,bg,fg,font,column,hlines,X,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
      odd,%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      tabularray,%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % ninecolors
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  \lst@definelanguage[ninecolors]{TeX}%
  {%
    % Control sequences names
    moretexcs={%
      NineColors,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      gray1,red1,brown1,yellow1,olive1,green1,teal1,cyan1,azure1,%
      blue1,violet1,magenta1,purple1,gray2,red2,brown2,yellow2,olive2,%
      green2,teal2,cyan2,azure2,blue2,violet2,magenta2,purple2,gray3,%
      red3,brown3,yellow3,olive3,green3,teal3,cyan3,azure3,blue3,%
      violet3,magenta3,purple3,gray4,red4,brown4,yellow4,olive4,%
      green4,teal4,cyan4,azure4,blue4,violet4,magenta4,purple4,gray5,%
      red5,brown5,yellow5,olive5,green5,teal5,cyan5,azure5,blue5,%
      violet5,magenta5,purple5,gray6,red6,brown6,yellow6,olive6,%
      green6,teal6,cyan6,azure6,blue6,violet6,magenta6,purple6,gray7,%
      red7,brown7,yellow7,olive7,green7,teal7,cyan7,azure7,blue7,%
      violet7,magenta7,purple7,gray8,red8,brown8,yellow8,olive8,%
      green8,teal8,cyan8,azure8,blue8,violet8,magenta8,purple8,gray9,%
      red9,brown9,yellow9,olive9,green9,teal9,cyan9,azure9,blue9,%
      violet9,magenta9,purple9,gray1,red1,brown1,yellow1,olive1,%
      green1,teal1,cyan1,azure1,blue1,violet1,magenta1,purple1,gray2,%
      red2,brown2,yellow2,olive2,green2,teal2,cyan2,azure2,blue2,%
      violet2,magenta2,purple2,gray3,red3,brown3,yellow3,olive3,%
      green3,teal3,cyan3,azure3,blue3,violet3,magenta3,purple3,gray4,%
      red4,brown4,yellow4,olive4,green4,teal4,cyan4,azure4,blue4,%
      violet4,magenta4,purple4,gray5,red5,brown5,yellow5,olive5,%
      green5,teal5,cyan5,azure5,blue5,violet5,magenta5,purple5,gray6,%
      red6,brown6,yellow6,olive6,green6,teal6,cyan6,azure6,blue6,%
      violet6,magenta6,purple6,gray7,red7,brown7,yellow7,olive7,%
      green7,teal7,cyan7,azure7,blue7,violet7,magenta7,purple7,gray8,%
      red8,brown8,yellow8,olive8,green8,teal8,cyan8,azure8,blue8,%
      violet8,magenta8,purple8,gray9,red9,brown9,yellow9,olive9,%
      green9,teal9,cyan9,azure9,blue9,violet9,magenta9,purple9,%
      saturation,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
      low,medium,high,%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      ninecolors,%
    },%
    % otherkeywords={},%
    alsoletter={123456789},%
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[fontspec]{TeX}{%
    % Control sequences names
    moretexcs={%
      EncodingAccent,EncodingCommand,EncodingComposite,%
      EncodingCompositeCommand,EncodingSymbol,IfFontExistsTF,%
      IfFontFeatureActiveTF,UndeclareAccent,UndeclareCommand,%
      UndeclareComposite,UndeclareSymbol,addfontfeature,addfontfeatures,%
      aliasfontfeature,aliasfontfeatureoption,defaultfontfeatures,fontspec,%
      liningnums,newAATfeature,newfontface,newfontfamily,newfontfeature,%
      newfontlanguage,newfontscript,newopentypefeature,oldstylenums,%
      providefontface,providefontfamily,renewfontface,renewfontfamily,%
      setboldmathrm,setfontface,setfontfamily,setmainfont,setmathrm,%
      setmathsf,setmathtt,setmonofont,setromanfont,setsansfont,strong,%
      strongfontdeclare,strongresetsetmainfont,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      Alternate,Annotation,AutoFakeBold,AutoFakeSlant,BoldFeatures,%
      BoldFont,BoldItalicFeatures,BoldItalicFont,BoldSlantedFeatures,%
      BoldSlantedFont,BoldSwashFeatures,BoldSwashFont,CJKShape,ItalicFeatures,%
      CharacterVariant,CharacterWidth,Color,Colour,Contextuals,%
      Diacritics,Extension,FakeBold,FakeSlant,FakeStretch,Font,FontFace,%
      Fractions,HyphenChar,IgnoreFontspecFileItalicFeatures,ItalicFont,%
      Kerning,Language,LetterSpace,Letters,Ligatures,LocalForms,%
      NFSSFamily,Numbers,OpticalSize,Ornament,Path,PunctuationSpace,%
      RawFeature,Scale,ScaleAgain,Script,Size,SizeFeatures,%
      SlantedFeatures,SlantedFont,SmallCapsFeatures,SmallCapsFont,Style,%
      StylisticAlternates,StylisticSet,SwashFeatures,SwashFont,%
      UprightFeatures,UprightFont,Variant,Vertical,VerticalPosition,%
      WordSpace,Mapping,Renderer,Traditional,Simplified,JIS1978,JIS1983,%
      JIS1990,Expert,NLC,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
      AboveBase,Alternate,AlternateHalf,AlternateMetrics,%
      AlternateProportional,Alternates,AlternatesForRotation,Arabic,%
      ArabicOff,BelowBase,Common,Contextual,Cursive,Denominator,%
      Discretionary,Expert,Full,Half,HalfMetrics,Historic,%
      HorizontalKana,Inferior,Inner,Italic,JIS1978,JIS1983,JIS1990,%
      KanaAlternates,Kerning,LineFinal,Lining,LiningOff,Lowercase,%
      LowercaseOff,MarkToBase,MarkToMark,Monospaced,MonospacedOff,NLC,%
      Numerator,Off,OldStyle,OldStyleOff,On,Ordinal,PetiteCaps,%
      Proportional,ProportionalMetrics,ProportionalOff,Quarter,Rare,%
      Required,Reset,ResetAll,RotatedGlyphs,Ruby,ScientificInferior,%
      Simplified,SlashedZero,SlashedZeroOff,SmallCaps,Superior,Swash,%
      TeX,Thurd,Titling,Traditional,Unicase,Uppercase,UppercaseOff,%
      UppercasePetiteCaps,UppercaseSmallCaps,VerticalKana,WordFinal,%
      WordInitial,ResetAll,c2sc,scmp,sinf,sups,zero,ss06,ss01,%
      ss04,-liga,frac,titl,swsh,hist,hlig,MatchUppercase,MatchLowercase,%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      fontspec%
    },%
    % otherkeywords={},%
    alsoletter={20614-},%
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[ProfCollege]{TeX}{%
    % Control sequences names
    moretexcs={%
      Thales,Pourcentage,ResolEquation%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
      Twitter,Scratch,%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      Auteur,Logo,Calculer,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
      Place,Drapeau,Avancer,Repeter,Tournerg,FinBlocRepeter,%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      ProfCollege,%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[tkz-euclide]{TeX}{%
    % Control sequences names
    moretexcs={%
      tkzDefPoint,tkzInterCC,tkzGetPoints,tkzDrawCircles,tkzDrawPolygon,%
      tkzDrawPoints,tkzMarkSegments,tkzLabelSegments,tkzLabelPoints,%
      tkzLabelPoints,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
      tikzpicture,%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      mark,swap,above,scale,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      tkz-euclide },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[tkz-fct]{TeX}{%
    % Control sequences names
    moretexcs={%
      tkzInit,tkzDrawX,tkzDrawY,tkzFct,tkzDefPoint,tkzDrawPoint,%
      tkzPointShowCoord,tkzDefPoint,tkzDrawPoint,tkzPointShowCoord,%
      tkzRep,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
      tikzpicture,%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      xmin,xmax,ymin,ymax,samples,domain,xlabel,ylabel,xscale,yscale%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      tkz-fct },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[tkz-tab]{TeX}{%
    % Control sequences names
    moretexcs={%
      tkzTabInit,tkzTabLine,tkzTabVar,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
      tikzpicture,%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      lgt,espcl,t,d,z,+,-,-D+/,+/,-/,+D/,scale,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      tkz-tab },%
    % otherkeywords={},%
    alsoletter={+-/},%
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[mecaso]{TeX}{%
    % Control sequences names
    moretexcs={%
      KineticT,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      mecaso },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[hanzibox]{TeX}{%
    % Control sequences names
    moretexcs={%
      hanzibox*,hanziboxset,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      frametype,pinyinline,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
      none,true,%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      hanzibox },%
    % otherkeywords={},%
    % alsoletter={},%
    % alsodigit={},%
    alsoother={*},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[tikz-bagua]{TeX}{%
    % Control sequences names
    moretexcs={%
      Bagua*,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      tikz-bagua },%
    % otherkeywords={},%
    % alsoletter={},%
    % alsodigit={},%
    alsoother={*},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[bodeplot]{TeX}{%
    % Control sequences names
    moretexcs={%
      addBodeZPKPlots },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
      BodePlot,%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      ylabel,ytick,distance,height,width,magnitude,z,p,k,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
      true,black,thick,linear,red,dashed,thick,asymptotic,blue,%
      dotted,thick,%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      bodeplot },%
    % otherkeywords={},%
    alsoletter={/},%
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[formal-grammar]{TeX}{%
    % Control sequences names
    moretexcs={%
      highlight,firstcase,gralt,nonterm },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
      grammar },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      formal-grammar },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[numerica-plus]{TeX}{%
    % Control sequences names
    moretexcs={%
      nmcRecur,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      do,see1,f_,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      numerica-plus },%
    % otherkeywords={},%
    alsoletter={_1},%
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[pascaltriangle]{TeX}{%
    % Control sequences names
    moretexcs={%
      pascal,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      pascaltriangle },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[pgf-interference]{TeX}{%
    % Control sequences names
    moretexcs={%
      pgfinterferencepattern,%
    },%
    % Keywords of class 1 : keywords that contain other characters
    % (since of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      slits,wavelength,slit-distance,intensity,ruler,scale,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      pgf-interference%
    },%
    % otherkeywords={},%
    alsoletter={-},%
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[clistmap]{TeX}{%
    % Control sequences names
    moretexcs={%
      ExplSyntaxOn,ExplSyntaxOff,clistmap,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      first_math,serial_rest_math_and,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
      nnn,N,%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      clistmap },%
    % otherkeywords={},%
    alsoletter={_},%
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[hexboard]{TeX}{%
    % Control sequences names
    moretexcs={%
      hexmove,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
      hexgamelabels,%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      hexboard },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[robotarm]{TeX}{%
    % Control sequences names
    moretexcs={%
      robotArm,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
      tikzpicture },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      config,q1,q2,q3,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      robotarm },%
    % otherkeywords={},%
    alsoletter={123},%
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[amsfonts]{TeX}{%
    % Control sequences names
    moretexcs={%
      mathbb,mathfrak,angle,Box,dasharrow,dashleftarrow,dashrightarrow,%
      Diamond,hbar,Join,leadsto,lhd,llcorner,lozenge,lrcorner,mho,%
      rhd,rightleftharpoons,rightsquigarrow,sqsubset,sqsupset,square,%
      trianglelefteq,trianglerighteq,ulcorner,unlhd,unrhd,urcorner,%
      vartriangleleft,vartriangleright,widehat{arg},widetilde{arg},yen,%
      checkmark,circledR,maltese,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      amsfonts },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[biolinum]{TeX}{%
    % Control sequences names
    moretexcs={%
      biolinum,biolinumOsF,biolinumLF,biolinumkey,sufigures,textsu,%
      textsuperior,oldstylenums,liningnums,oldstylenumsf,liningnumsf,%
      tabularnums,proportionalnums,tabularnumsf,proportionalnumsf,%
      DeclareTextGlyphY,biolinumGlyph,biolinumKeyGlyph,LKey,LKeyPad,%
      LKeyF,LKeyAltF,LKeyStrgAltF,LKeyCtrlAltF,LKeyStrgX,LKeyCtrlX,%
      LKeyShiftX,LKeyAltX,LKeyAltGrX,LKeyShiftStrgX,LKeyShiftCtrlX,%
      LKeyShiftAltX,LKeyShiftAltGrX,LKeyStrgAltX,LKeyCtrlAltX,%
      LKeyStrgAltEnt,LKeyCtrlAltEnt,LKeyReset,LKeyTux,LKeyWin,LKeyMenu,%
      LKeyStrg,LKeyCtrl,LKeyAlt,LKeyAltGr,LKeyShift,LKeyTab,LKeyEnter,%
      LKeyCapsLock,LKeyPos,LKeyEntf,LKeyEinf,LKeyLeer,LKeyEsc,LKeyEnde,%
      LKeyCommand,LKeyOptionKey,LKeyBack,LKeyUp,LKeyDown,LKeyLeft,%
      LKeyRight,LKeyPgUp,LKeyPgDown,LKeyAt,LKeyFn,LKeyHome,LKeyDel,%
      LKeySpace,LKeyScreenUp,LKeyScreenDown,LKeyIns,LKeyEnd,LKeyGNU,%
      LKeyPageUp,LKeyPageDown,LMouseEmpty,LMouseN,LMouseL,LMouseM,%
      LMouseR,LMouseLR,LMouseIIEmpty,LMouseIIN,LMouseIIL,LMouseIIR,%
      LMouseIILR,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      sfdefault,type1,nofontspec,lining,nf,lf,oldstyle,osf,sflining,%
      sflf,sfoldstyle,sfosf,osfss,tabular,t,p,sftabular,sft,%
      sfproportional,sfp,scaled,scale,defaultfeatures,space,uni0020,%
      exclam,uni0021,quotedbl,uni0022,numbersign,uni0023,dollar,%
      uni0024,percent,uni0025,ampersand,uni0026,quotesingle,uni0027,%
      parenleft,uni0028,parenright,uni0029,asterisk,uni002A,plus,%
      uni002B,comma,uni002C,hyphen,uni002D,period,uni002E,slash,%
      uni002F,zero,uni0030,one,uni0031,two,uni0032,three,uni0033,%
      four,uni0034,five,uni0035,six,uni0036,seven,uni0037,eight,%
      uni0038,nine,uni0039,colon,uni003A,semicolon,uni003B,less,%
      uni003C,equal,uni003D,greater,uni003E,question,uni003F,at,%
      bracketleft,uni005B,backslash,uni005C,bracketright,uni005D,%
      asciicircum,uni005E,underscore,uni005F,grave,uni0060,uni007A,%
      braceleft,uni007B,bar,uni007C,braceright,uni007D,asciitilde,%
      uni007E,exclamdown,uni00A1,cent,uni00A2,sterling,uni00A3,%
      currency,uni00A4,yen,uni00A5,brokenbar,uni00A6,section,uni00A7,%
      dieresis,uni00A8,guillemotleft,uni00AB,uni00AD,degree,uni00B0,%
      plusminus,uni00B1,acute,uni00B4,uni00B5,periodcentered,uni00B7,%
      cedilla,uni00B8,guillemotright,uni00BB,Agrave,uni00C0,Aacute,%
      uni00C1,Acircumflex,uni00C2,Atilde,uni00C3,Adieresis,uni00C4,%
      Aring,uni00C5,Ccedilla,uni00C7,Egrave,uni00C8,Eacute,uni00C9,%
      Ecircumflex,uni00CA,Edieresis,uni00CB,Igrave,uni00CC,Iacute,%
      uni00CD,Icircumflex,uni00CE,Idieresis,uni00CF,Eth,uni00D0,Ntilde,%
      uni00D1,Ograve,uni00D2,Oacute,uni00D3,Ocircumflex,uni00D4,Otilde,%
      uni00D5,Odieresis,uni00D6,multiply,uni00D7,Oslash,uni00D8,Ugrave,%
      uni00D9,Uacute,uni00DA,Ucircumflex,uni00DB,Udieresis,uni00DC,%
      Yacute,uni00DD,Thorn,uni00DE,germandbls,uni00DF,agrave,uni00E0,%
      aacute,uni00E1,acircumflex,uni00E2,atilde,uni00E3,adieresis,%
      uni00E4,aring,uni00E5,ae,uni00E6,ccedilla,uni00E7,egrave,%
      uni00E8,eacute,uni00E9,ecircumflex,uni00EA,edieresis,uni00EB,%
      igrave,uni00EC,iacute,uni00ED,icircumflex,uni00EE,idieresis,%
      uni00EF,eth,uni00F0,ntilde,uni00F1,ograve,uni00F2,oacute,%
      uni00F3,ocircumflex,uni00F4,otilde,uni00F5,odieresis,uni00F6,%
      divide,uni00F7,oslash,uni00F8,ugrave,uni00F9,uacute,uni00FA,%
      ucircumflex,uni00FB,udieresis,uni00FC,yacute,uni00FD,thorn,%
      uni00FE,ydieresis,uni00FF,Amacron,uni0100,amacron,uni0101,Abreve,%
      uni0102,abreve,uni0103,Aogonek,uni0104,aogonek,uni0105,Cacute,%
      uni0106,cacute,uni0107,Ccircumflex,uni0108,ccircumflex,uni0109,%
      Cdotaccent,uni010A,cdotaccent,uni010B,Ccaron,uni010C,ccaron,%
      uni010D,Dcaron,uni010E,dcaron,uni010F,Dcroat,uni0110,dcroat,%
      uni0111,Emacron,uni0112,emacron,uni0113,Ebreve,uni0114,ebreve,%
      uni0115,Edotaccent,uni0116,edotaccent,uni0117,Eogonek,uni0118,%
      eogonek,uni0119,Ecaron,uni011A,ecaron,uni011B,Gcircumflex,%
      uni011C,gcircumflex,uni011D,Gbreve,uni011E,gbreve,uni011F,%
      Gdotaccent,uni0120,gdotaccent,uni0121,Gcommaaccent,uni0122,%
      gcommaaccent,uni0123,Hcircumflex,uni0124,hcircumflex,uni0125,Hbar,%
      uni0126,hbar,uni0127,Itilde,uni0128,itilde,uni0129,Imacron,%
      uni012A,imacron,uni012B,Ibreve,uni012C,ibreve,uni012D,Iogonek,%
      uni012E,iogonek,uni012F,Idotaccent,uni0130,dotlessi,uni0131,IJ,%
      uni0132,ij,uni0133,Jcircumflex,uni0134,jcircumflex,uni0135,%
      Kcommaaccent,uni0136,kcommaaccent,uni0137,kgreenlandic,uni0138,%
      Lacute,uni0139,lacute,uni013A,Lcommaaccent,uni013B,lcommaaccent,%
      uni013C,Lcaron,uni013D,lcaron,uni013E,Ldot,uni013F,ldot,uni0140,%
      Lslash,uni0141,lslash,uni0142,Nacute,uni0143,nacute,uni0144,%
      Ncommaaccent,uni0145,ncommaaccent,uni0146,Ncaron,uni0147,ncaron,%
      uni0148,napostrophe,uni0149,Omacron,uni014C,omacron,uni014D,%
      Obreve,uni014E,obreve,uni014F,Ohungarumlaut,uni0150,ohungarumlaut,%
      uni0151,Racute,uni0154,racute,uni0155,Rcommaaccent,uni0156,%
      rcommaaccent,uni0157,Rcaron,uni0158,rcaron,uni0159,Sacute,%
      uni015A,sacute,uni015B,Scircumflex,uni015C,scircumflex,uni015D,%
      Scedilla,uni015E,scedilla,uni015F,Scaron,uni0160,scaron,uni0161,%
      Tcedilla,uni0162,tcedilla,uni0163,Tcaron,uni0164,tcaron,uni0165,%
      Tbar,uni0166,tbar,uni0167,Utilde,uni0168,utilde,uni0169,Umacron,%
      uni016A,umacron,uni016B,Ubreve,uni016C,ubreve,uni016D,Uring,%
      uni016E,uring,uni016F,Uhungarumlaut,uni0170,uhungarumlaut,uni0171,%
      Uogonek,uni0172,uogonek,uni0173,Wcircumflex,uni0174,wcircumflex,%
      uni0175,Ycircumflex,uni0176,ycircumflex,uni0177,Ydieresis,uni0178,%
      Zacute,uni0179,zacute,uni017A,Zdotaccent,uni017B,zdotaccent,%
      uni017C,Zcaron,uni017D,zcaron,uni017E,h.superior,uni02B0,%
      hhook.superior,uni02B1,j.superior,uni02B2,r.superior,uni02B3,%
      rturned.superior,uni02B4,rhookturned.superior,uni02B5,%
      Rsmallinverted.superior,uni02B6,w.superior,uni02B7,y.superior,%
      uni02B8,uni02B9,uni02BA,uni02BB,afii57929,uni02BC,afii64937,%
      uni02BD,uni02BE,uni02BF,uni02C0,uni02C1,uni02C2,uni02C3,uni02C4,%
      uni02C5,circumflex,uni02C6,caron,uni02C7,uni02C8,uni02C9,uni02CA,%
      uni02CB,uni02CC,uni02CD,uni02CE,uni02CF,uni02D0,uni02D1,uni02D2,%
      uni02D3,uni02D4,uni02D5,uni02D6,uni02D7,breve,uni02D8,dotaccent,%
      uni02D9,ring,uni02DA,ogonek,uni02DB,tilde,uni02DC,hungarumlaut,%
      uni02DD,uni02DE,uni02DF,gammalatin.superior,uni02E0,l.superior,%
      uni02E1,s.superior,uni02E2,x.superior,uni02E3,%
      glottalstopreversed.superior,uni02E4,uni02EC,uni02ED,uni02EE,%
      gravecomb,uni0300,acutecomb,uni0301,uni0302,tildecomb,uni0303,%
      uni0304,uni0305,uni0306,uni0307,uni0308,hookabovecomb,uni0309,%
      uni030A,uni030B,uni030C,uni030D,uni030E,uni030F,uni0310,uni0311,%
      uni0312,uni0313,uni0314,uni0315,uni0316,uni0317,uni0318,uni0319,%
      uni031A,uni031B,uni031C,uni031D,uni031E,uni031F,uni0320,uni0321,%
      uni0322,dotbelowcomb,uni0323,uni0324,uni0325,uni0326,uni0327,%
      uni0328,uni0329,uni032A,uni032B,uni032C,uni032D,uni032E,uni032F,%
      uni0330,uni0331,uni0338,uni0342,uni0343,uni0351,uni0357,uni0358,%
      uni0359,uni035A,uni035B,uni035C,uni035D,uni035E,uni035F,uni0360,%
      uni0361,uni0362,uni0363,uni0374,uni0375,afii57799,uni05B0,%
      afii57801,uni05B1,afii57800,uni05B2,afii57802,uni05B3,afii57793,%
      uni05B4,afii57794,uni05B5,afii57795,uni05B6,afii57798,uni05B7,%
      afii57797,uni05B8,afii57806,uni05B9,uni05BA,afii57796,uni05BB,%
      afii57807,uni05BC,afii57839,uni05BD,afii57645,uni05BE,afii57841,%
      uni05BF,afii57842,uni05C0,afii57804,uni05C1,afii57803,uni05C2,%
      afii57658,uni05C3,uni05C6,afii57664,uni05D0,afii57665,uni05D1,%
      afii57666,uni05D2,afii57667,uni05D3,afii57668,uni05D4,afii57669,%
      uni05D5,afii57670,uni05D6,afii57671,uni05D7,afii57672,uni05D8,%
      afii57673,uni05D9,afii57674,uni05DA,afii57675,uni05DB,afii57676,%
      uni05DC,afii57677,uni05DD,afii57678,uni05DE,afii57679,uni05DF,%
      afii57680,uni05E0,afii57681,uni05E1,afii57682,uni05E2,afii57683,%
      uni05E3,afii57684,uni05E4,afii57685,uni05E5,afii57686,uni05E6,%
      afii57687,uni05E7,afii57688,uni05E8,afii57689,uni05E9,afii57690,%
      uni05EA,afii57716,uni05F0,afii57717,uni05F1,afii57718,uni05F2,%
      arrowleft,uni2190,arrowup,uni2191,arrowright,uni2192,arrowdown,%
      uni2193,arrowboth,uni2194,arrowupdn,uni2195,uni2196,uni2197,%
      uni2198,uni2199,uni219A,uni219B,uni21A5,uni21A7,uni21BC,uni21BD,%
      uni21C0,uni21C1,arrowdblleft,uni21D0,arrowdblup,uni21D1,%
      arrowdblright,uni21D2,arrowdbldown,uni21D3,arrowdblboth,uni21D4,%
      uni21D5,Nwarrow,uni21D6,Nearrow,uni21D7,Searrow,uni21D8,Swarrow,%
      uni21D9,uni2318,uni2325,uni2326,uni2327,uni232B,uni237D,uni2380,%
      uni2423,filledbox,uni25A0,H22073,uni25A1,triagup,uni25B2,uni25B3,%
      uni25B6,uni25B7,triagdn,uni25BC,uni25BD,uni25C0,uni25C1,uni25C6,%
      uni25C7,uni25C9,lozenge,uni25CA,circle,uni25CB,uni25CE,H18533,%
      uni25CF,uni25D0,uni25D1,uni25D2,uni25D3,uni25D4,uni25D5,uni25D6,%
      uni25D7,openbullet,uni25E6,uni2605,uni2619,uni261B,uni261E,%
      uni2627,uni262F,uni2639,uni263A,uni263B,uni263C,uni263D,uni263E,%
      uni263F,female,uni2640,uni2641,male,uni2642,uni2643,uni2644,%
      uni2645,uni2646,uni2647,uni2648,uni2649,uni264A,uni264B,uni264C,%
      uni264D,uni264E,uni264F,uni2650,uni2651,uni2652,uni2653,uni2660,%
      uni2663,uni2665,uni2666,uni2669,musicalnote,uni266A,%
      musicalnotedbl,uni266B,uni266C,uni2695,uni2698,uni26A2,uni26A3,%
      uni26A4,uni26A5,uni26AD,uni2767,uni2776,uni2777,uni2778,uni2779,%
      uni277A,uni277B,uni277C,uni277D,uni277E,uni277F,T_u_x,uniE000,%
      uniE104,uniE128,uniE129,uniE12A,uniE130,uniE131,uniE132,uniE133,%
      uniE134,uniE135,uniE138,uniE139,uniE13A,uniE13C,uniE13D,uniE168,%
      B_a_c_k,uniE16E,S_t_r_g,uniE170,A_l_t,uniE171,A_l_t_G_r,uniE172,%
      C_t_r_l,uniE173,S_h_i_f_t,uniE174,T_a_b,uniE175,E_n_t_e_r,%
      uniE176,C_a_p_s_l_o_c_k,uniE177,F_1,uniE178,F_2,uniE179,F_3,%
      uniE17A,F_4,uniE17B,F_5,uniE17C,F_6,uniE17D,F_7,uniE17E,F_8,%
      uniE17F,F_9,uniE180,F_1_0,uniE181,F_1_1,uniE182,F_1_2,uniE183,%
      F_1_3,uniE184,F_1_4,uniE185,F_1_5,uniE186,F_1_6,uniE187,uniE188,%
      H_o_m_e,uniE189,D_e_l,uniE18A,I_n_s,uniE18B,uniE18C,E_n_d,%
      uniE18E,G_N_U,uniE190,P_o_s_1,uniE191,E_n_t_f,uniE192,E_i_n_f,%
      uniE193,L_e_e_r,uniE194,E_s_c,uniE195,E_n_d_e,uniE196,uniE198,%
      uniE199,uniE19A,uniE19B,uniE1A0,uniE1A1,uniE1A2,uniE1A3,uniE1A4,%
      uniE1A5,uniE1A6,uniE1A7,uniE1A8,uniE1A9,uniE1AA,uniE1AB,uniE1AC,%
      uniE1AD,uniE1AE,uniE1B0,uniE1B1,grave.cap,uniE358,acute.cap,%
      uniE359,circumflex.cap,uniE35A,caron.cap,uniE35B,breve.cap,%
      uniE35C,hungarumlaut.cap,uniE35D,space_uni030F.cap,uniE35E,%
      breveinvertedcmb.cap,uniE35F,breve.cyrcap,uniE360,breve.cyr,%
      uniE361,dieresis.cap,uniE362,hookabovecomb.cap,uniE363,uniFFFD,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      biolinum },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[biblatex]{TeX}{%
    % Control sequences names
    moretexcs={%
      cite,Cite,parencite,Parencite,footcite,footcitetext,smartcite,%
      Smartcite,textcite,Textcite,supercite,cites,Cites,parencites,%
      Parencites,footcitesfootcitetexts,textcites,Textcites,supercites,%
      autocite,Autocite,autocite*,Autocite*,autocites,Autocites,%
      citeauthor,Citeauthor,citetitle,citetitle*,citeyear,citeurl,%
      parentext,brackettext,nocite,fullcite,footfullcite,volcite,%
      Volcite,pvolcite,Pvolcite,fvolcite,ftvolcite,tvolcite,Tvolcite,%
      avolcite,Avolcite,notecite,Notecite,pnotecite,Pnotecite,fnotecite,%
      citename,citelist,citefield,printbibliography,bibliography,%
      citedate,ExecuteBibliographyOptions,defbibnote,psq,psqq,%
      addbibresource,AtNextCite,DeclareNameAlias,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      abstract,addendum,afterword,annotation,annotator,author,%
      authortype,bookauthor,bookpagination,booksubtitle,booktitle,%
      booktitleaddon,chapter,commentator,date,doi,edition,editor,%
      editora,editorb,editorc,editortype,editoratype,editorbtype,%
      editorctype,eid,eprint,eprintclass,eprinttype,eventdate,%
      eventtitle,file,foreword,holder,howpublished,indextitle,%
      institution,introduction,isan,isbn,ismn,isrn,issn,issue,%
      issuesubtitle,issuetitle,iswc,journalsubtitle,journaltitle,label,%
      language,library,location,mainsubtitle,maintitle,maintitleaddon,%
      month,nameaddon,note,number,organization,origdate,origlanguage,%
      origlocation,origpublisher,origtitle,pages,pagetotal,pagination,%
      part,publisher,pubstate,reprinttitle,series,shortauthor,%
      shorteditor,shorthand,shorthandintro,shortjournal,shortseries,%
      shorttitle,subtitle,title,titleaddon,translator,type,url,urldate,%
      venue,version,volume,volumes,year,crossref,entryset,entrysubtype,%
      execute,gender,hyphenation,indexsorttitle,keywords,options,%
      presort,sortkey,sortname,sorttitle,sortyear,xref,annote,%
      archiveprefix,journal,key,pdf,primaryclass,school,address,%
      datamodel,%
      %
      backend,style,citestyle,bibstyle,sorting,maxnames,minnames,%
      maxitems,minitems,backref,abbreviate,firstinits,prenote,postnote,%
      useprefix,autopunct,giveninits,labelname,given-family,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
      submitted,inpress,danish dutch,american,USenglish,english,british,%
      UKenglish,canadian,australian,newzealand,finnish,french,francais,%
      canadien,german,ngerman,austrian,naustrian,greek,italian,norsk,%
      nynorsk,brazil,portuges,spanish,swedish,%
      %
      biber,numeric,numeric-comp,numeric-verb,alphabetic,alphabetic-verb,%
      authoryear,authoryear-comp,authoryear-ibid,authoryear-icomp,%
      authortitle,authortitle-comp,authortitle-ibid,authortitle-icomp,%
      authortitle-terse,authortitle-tcomp,authortitle-ticomp,verbose,%
      verbose-ibid,verbose-note,verbose-inote,verbose-trad1,verbose-trad2,%
      verbose-trad3,reading,draft,debug,and,inline,footnote,%
      superscript,plain,nyt,ynt,none,false,true,%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      biblatex },%
    % directives
    directives={%
      article,book,inbook,bookinbook,suppbook,booklet,collection,%
      conference,incollection,suppcollection,manual,misc,online,patent,%
      periodical,suppperiodical,proceedings,inproceedings,reference,%
      inreference,report,thesis,unpublished,masterthesis,phdthesis,%
      string,comment,%
    },%
    % otherkeywords={},%
    alsoletter={-},%
    % alsodigit={},%
    delim=*[directive]@,sensitive=false,%
  }[keywords,directives,tex,comments]%

  \lst@definelanguage[lthooks]{TeX}{%
    % Control sequences names
    moretexcs={%
      AddToHook,BeforeBeginEnvironment,AtBeginEnvironment,AtEndEnvironment,%
      AfterEndEnvironment,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      % begin,end,
      before,after,begindocument,begindocument/before,%
      begindocument/end,enddocument,enddocument/afterlastpage,%
      enddocument/afteraux,enddocument/info,enddocument/end,env,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      lthooks },%
    % otherkeywords={},%
    alsoletter={/},%
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[l3keys2e]{TeX}{%
    % Control sequences names
    moretexcs={%
      ProcessKeysOptions,ProcessKeysPackageOptions,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      l3keys2e },%
    % otherkeywords={},%
    alsoletter={23},%
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[varioref]{TeX}{%
    % Control sequences names
    moretexcs={%
      vref,vpageref,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      varioref },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[hologo]{TeX}{%
    % Control sequences names
    moretexcs={%
      hologo },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=va ,lue)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      hologo%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[acro]{TeX}{%
    % Control sequences names
    moretexcs={%
      Ac,Aca,Acap,Acf,Acfp,Acl,Aclp,Acp,AcroAcronymsMap,AcroAddRow,%
      AcroMapBreak,AcroNeedPackage,AcroPropertiesMap,AcroPropertiesSet,%
      AcroRerun,AcroStyle,AcroTemplateName,AcroTemplateType,AcronymID,%
      AcronymTable,Acs,Acsp,BeginAccSupp,Dacs,DeclareAcroArticle,%
      DeclareAcroEnding,DeclareAcroPreset,DeclareAcroProperty,%
      DeclareAcroPropertyAlias,DeclareAcroTranslation,DeclareAcronym,Iac,%
      Iaca,Iacf,Iacl,Iacs,MakeAcroPropertyAlias,NewAcroCommand,%
      NewAcroPreset,NewAcroTemplate,RenewAcroCommand,RenewAcroPreset,%
      RenewAcroTemplate,SetupAcroTemplate,SetupNextAcroTemplate,%
      UseAcroTemplate,abbrdot,ac,aca,acap,acbarrier,acdot,acf,acfg,%
      acflike,acfootnote,acfp,acg,aciftrailing,acl,aclg,aclp,acp,%
      acreset,acresetall,acrocite,acrodefinite,acrodonotuse,acrodotfill,%
      acroendfootnote,acroformat,acrofull,acrogroupcite,acroheading,%
      acroifT,acroifTF,acroifallTF,acroifanyT,acroifanyTF,%
      acroifbooleanTF,acroifchapterF add,acroifchapterTF,acroiffirstT,%
      acroiffirstTF addchap,acroifpagesTF,acroifsingleTF,acroifstarredTF,%
      acroiftagTF,acroifusedTF,acroindefinite,acrolistname,acroneedpages,%
      acronopagerange,acronymsmap,acronymsmapF,acronymsmapTF,acropagefill,%
      acropages,acroplural,acropossessive,acropreamble,acroshow,%
      acrotranslate,acroupper,acrowrite,acs,acsetup,acsp,acspace,%
      acswitchoff,acswitchon,acuse,dacs,declareAcronym,iac,iaca,iacf,%
      iacl,iacs,iacsg,printacronyms,%
      %
      acro_locale,acro_if_foreign,acro_if_locale,__acro_foreign_language,%
      acro_property_get,acro_property_if_set,acro_property_get,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      activate,addsec,addsec*,all,alt,alt,alt-acc,alt-format,%
      alt-indefinite,alt-plural,alt-plural-form,barriers,before-citation,%
      caption,%
      case-insensitive,%case-sensitive,%chapter,chapter*,cite,clear,cmd,%
      deactivate,define,description,disable,display,exclude,extra,%
      extra-acc,extra-foreign,extra-format,extra-long,fill,first,%
      first-long,first-long-format,first-style,first-style ,floats,%
      footnote,foreign,foreign,foreign-acc,foreign-babel,foreign-format ,%
      foreign-locale,foreign-plural,foreign-plural-form,format,format,%
      group,heading,id,include,index,index,index-cmd,index-sort,%
      language,link-only-first,list,list,list-acc,list-format,%
      list/display,lists,load-style,local,locale,lof,long,long,%
      long-acc,long-format,long-indefinite,long-plural,long-plural-ending,%
      long-plural-form,long-post,long-short,longtable,longtabu,lppl,%
      ltxtable,make-links,maketitle,method,name,no-index,none,options,%
      pages,pdf,pdf,pdfcomment,pdfcomment/cmd,pdfcomment/use,pdfstring,%
      post,pre,preamble,preset,replace,reset,section,section*,short,%
      short,short,short-acc,short-format,short-indefinite,short-long,%
      short-plural,short-plural-ending,short-plural-form ,show,single,%
      single,single,single-acc threshold,single-format
      title,single-style,%
      single-style,sort,sort,subsequent-style,subsequent-style,%
      supertabular,tabular,tabularx,tag,upgrade,use,use-id-as-short,%
      uselist,version,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      acro%
    },%
    % otherkeywords={},%
    alsoletter={-_},%
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  \lst@definelanguage[csquotes]{TeX}{%
    % Control sequences names
    moretexcs={%
      enquote,%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
      displayquote,%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      csquotes%
    },%
    % otherkeywords={},
    % alsoletter={},
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % tcolorbox
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  \lst@definelanguage[tcolorbox]{TeX}%
  {%
    % Control sequences names
    moretexcs={%
      tcbuselibrary,newtcbtheorem,tcbset%
    },%
    % Keywords of class 1 : keywords that contain other characters (since
    % of the same class as the ones specified as 'otherkeywords')
    morekeywords={%
      %
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
      absquote,boxarraystore,dispExample,dispExample*,dispListing,%
      dispListing*,docCommand,docCommand*,docCommands,docEnvironment,%
      docEnvironment*,docEnvironments,docKey,docKey*,docKeys,%
      docPathOperation,docPathOperation*,docPathOperations,extcolorbox,%
      extikzpicture,fooauxenv,foocolorbox,foocolorbox*,posterboxenv,%
      tcbclipframe,tcbclipinterior,tcbcliptitle,tcbexternal,%
      tcbinvclipframe,tcbitemize,tcblisting,tcboutputlisting,%
      tcboxeditemize,tcboxedraster,tcbposter,tcbraster,tcbverbatimwrite,%
      tcbwritetemp,tcolorbox,%
    },%
    % Keywords of class 3 : mandatory arguments (not environments) &
    % optional arguments which are keys (in key=value)
    morekeywords=[3]{%
      Crefname,IfBooleanF,IfBooleanT,IfBooleanTF,IfNoValueF,IfNoValueT,%
      IfNoValueTF,IfValueF,IfValueT,IfValueTF,PassOptionsToClass,%
      PassOptionsToPackage,above*,above,actual,adapt,add,adjust,%
      adjusted,after,alert,alerted,algorithm,align*,align,all,ams,%
      and,angular,annotate,app,arara,arc,array,as,at,attach,auto,%
      autoparskip,balanced,base,basedim,baseline,beamer,bean,before,%
      beforeafter,% begin,
      below,between,biber,bibtex,bicolor,blank,%
      blanker,blankest,blend,body,bold,bookmark*,bookmark,borderline,%
      both,bottom*,bottom,bottomrule,bottomsep,bottomtitle,bounding,%
      box,boxed,boxes,boxrule,boxsep,break*,break,breakable,broken,%
      by,caption,capture,center,check,circular,clear,clip,code,%
      colback,colbacklower,colbacktitle,colframe,collower,colon,color,%
      colorize,colors,colspacing,coltext,coltitle,column*,column,%
      columns,colupper,command,comment,compilable,compiler,compress,%
      content,corner,corners,counter*,counter,counters,coverage,%
      crefname,current,curved,dash,default,definition,delimiters,%
      description,detach,directory,do,doc,docexample,documentation,%
      downwards,draft,draftmode,draw,drop,dvips,east,empty,% end,
      %
      enforce,engine,english,enhanced,enlarge,enlargement,enlargepage,%
      entry,environment,environments,equal,equation*,equation,error,%
      even,every,example!,example,extend,extension,external,%
      externalize,extras,extrude,fade,fading,file,fill,filled,finally,%
      finish,first,fit,fitting,fixed,flexible,flip,float*,float,%
      floatplacement,flush,flushleft,flushright,font,fontlower,fontsize,%
      fonttitle,fontupper,for,force,format,formatter,frame,freelance,%
      freelancefirst,freelancelast,freelancemiddle,freestyle,freeze,from,%
      full,fuzzy,gap,gather*,gather,geometry,german,goal,graphical,%
      graphics,group,grow,halign,halo,hanging,hbox,head,height,%
      hidden,hide,higher,highlight,hooks,horizontal,hyperlink,hyperref,%
      hypertarget,hyperurl*,hyperurl,hyphenationfix,if,ignore,image,in,%
      indent,index*,index,inherit,initially,input,inputencoding,inside,%
      interior,into,invisible,inwards,is,jigsaw,jpg,key,keypath,keys,%
      keywords,label,language,large,last,latex,layer,layers,left*,%
      left,lefthand,leftlower,leftright,leftrule,lefttitle,leftupper,%
      length,lengths,level,lifted,limit,line*,line,lines,list,%
      listing!,listing,listings,listingsutf,lower*,lower,lowerbox,%
      lowered,lualatex,m,macros,magazine,makeindex,many,marginnote,%
      marker,math,maxfontdiff,maxfontdiffgap,maxstep,maxwidthdiff,%
      maxwidthdiffgap,method,midday,middle,minimum,minipage,minted,%
      most,move,multicolumn,multirow,n,name,nameref,natural,new,%
      nirvana,no,nobeforeafter,nobreak,node,nodes,nodisplayskip,%
      nofloat,none,noparskip,nophantom,north,northeast,northwest,not,%
      notitle,number,octogon,odd,of,offset,on,oneside*,oneside,only,%
      opacity,opacityback,opacitybacklower,opacitybacktitle,opacityfill,%
      opacityframe,opacitylower,opacitytext,opacitytitle,opacityupper,%
      option,options,or,orientation,out,outer,outside,outwards,over,%
      overlay,overlays,oversize,overzoom,pad,page*,page,pages,%
      pageshort,parameter,parbox,parenthesis,parfillskip,parskip,path,%
      paths,pdf,pdflatex,percent,phantom,phantomlabel,placeholder,%
      plain,plus,png,poster,pre,preamble,preclass,prefix,process,%
      pspdf,quote,raise,raised,raster,ratio,record,recording,remake,%
      remember,remove,reset,restore,right*,right,righthand,rightlower,%
      rightrule,righttitle,rightupper,rotate,rounded,row,rows,%
      rowspacing,rowspan,run,runner,runs,safety,savedelimiter,%
      savelowerto,saveto,scale,scope,segmentation,semi,separated,%
      separator,sequence,settings,shade,shading,shadow,sharp,sharpish,%
      shield,show,showframe,shrink,side,sidebyside,sidewards,sign,%
      size,skin,skins,skip,small,smart,sort,source,south,southeast,%
      southwest,space,spacing,span,spartan,split,spread,square,%
      squeezed,stack,standard,step,store,stretch,style,subskin,%
      subtitle,supplement,switch,system,tabulars*,tabulars,tabularx*,%
      tabularx,tcbimage,tcbox,preamble tcbset,tempfile,terminator,text,%
      theorem,theorems,tight,tikz,tikznode,tile,title*,title,titlebox,%
      titled,titlerule,to,toggle,top*,top,toprule,topsep,toptitle,%
      type,unbreakable,unbroken,underlay,updated,upper*,upper,upperbox,%
      upwards*,upwards,use,utf,valign,value,values,varwidth,verbatim,%
      vertical,vfill,vignette,visible,void,warning,watermark,west,%
      widget,width,with,within,xelatex,xmax,xmin,xparse,xshift,ymax,%
      ymin,yshift*,yshift,yshifttext,zoom,%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
      all,and,apart,areasize*,areasize,as-is,auto,base,baselineskip,%
      beamer,beamerfirst,beamerlast,beamermiddle,bicolor,bicolorfirst,%
      bicolorlast,bicolormiddle,both,bottom,break,broken,center,change,%
      clipped,colon,copy,dash,direct,doc,downhill,draft,east,empty,%
      emptyfirst,emptylast,emptymiddle,enhanced,enhancedfirst,%
      enhancedlast,enhancedmiddle,evenpage,false,fbox,figures,final,%
      first,fitbox,flush,fontsize*,fontsize,forced,freelance,%
      freelancefirst,freelancelast,freelancemiddle,hang,hbox,hybrid*,%
      hybrid,ignored,invisible,jigsaw,justify,landscape*,landscape,%
      last,left,limited,listings,margin,maximum,middle,minimal,%
      minimum,minipage,minted,none,normal,north,northeast,northwest,%
      off,on,path,pathfirst,pathfirstjigsaw,pathjigsaw,pathlast,%
      pathlastjigsaw,pathmiddle,pathmiddlejigsaw,pgf,pgfchapter,%
      pgfsection,plain,portrait*,portrait,right,rows,scale*,scale,%
      seam,small,south,southeast,southwest,spartan,squeeze,standard,%
      tables,tight,tile,tilefirst,tilelast,tilemiddle,title,top,true,%
      unbroken,unlimited,uphill,visible,west,widget,widgetfirst,%
      widgetlast,widgetmiddle,red,black,white,none,%
    },%
    % Keywords of class 5 : arguments specifications (after ":" in expl3
    % syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly derived
    % packages)
    morekeywords=[6]{%
      tcolorbox%
    },%
    % otherkeywords={},%
    alsoletter={ \ },%
    % alsodigit={},%
    % alsoother={},%
    sensitive,%
  }[keywords,tex,comments]%

  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  % Classes (La)TeX
  %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  \lst@definelanguage[classes]{TeX}{%
    % Control sequences
    moretexcs={%
    },%
    % Keywords of class 1 : keywords that contain other characters
    % (since of the same class as the ones specified as
    % 'otherkeywords')
    morekeywords={%
      %
    },%
    % Keywords of class 2 : environments names
    morekeywords=[2]{%
    },%
    % Keywords of class 3 : mandatory arguments (not environments)
    % & optional arguments which are keys (in key=value)
    morekeywords=[3]{%
    },%
    % Keywords of class 4 : values of keys (in key=value)
    morekeywords=[4]{%
    },%
    % Keywords of class 5 : arguments specifications (after “:”
    % in expl3 syntax)
    morekeywords=[5]{%
    },%
    % Keywords of class 6 : current package name (and possibly
    % derived packages)
    morekeywords=[6]{%
      a0poster,aalok,aastex631,abntex2,achemso,acmart,acmconf,
      active-conf,adfathesis,afparticle,afthesis,aguplus,aiaa-tc,
      akklecture,akkscript,akktecdoc,akletter,myletter,ametsoc,
      amsart,amsbook,amsdtx,amsldoc,amsproc,aomart,apa,apa6,
      apa6e,apa7,arabart,arabbook,arabrep,arabrep1,articleingud,
      asaetr,ascelike,asmeconf,asmejour,assignment,aucklandthesis,
      bangorcsthesis,bangorexam,barticle,bbook,bletter,
      bankstatement,article,book,letter,ltnews,ltxdoc,ltxguide,
      minimal,proc,report,slides,source2edoc,basque-book,beamer,
      beamerswitch,beaulivre,beilstein,argetabelle,bewerbung,
      bgteubner,BHCexam,bitart,bitbook,bjfuthesis,BMSTU-IU8,
      bookcover,bookest,bookshelf,br-lex,brandeis-dissertation,
      brandeis-problemset,brandeis-thesis,buctcover,buctthesis,
      bxjsarticle,bxjsbook,bxjsreport,bxjsslide,cascadilla,cd,
      cd-cover,articoletteracdp,letteracdp,cesenaexam,cheatsheet,
      chemmacros-manual,chletter,cje,cnbwp,cnltx-doc,codedoc,
      colorart,colorbook,combine,cc,ConcProg,confproc,contracard,
      courseoutline,coursepaper,cquthesis,csbulletin,csbulobalka,
      csbulv1,ctexart,ctexbeamer,ctexbook,ctexrep,ctxdoc,curve,
      cv4tw,cweb,idcc,ijdc-v14,ijdc-v9,dinbrief,disser,gost732,
      dithesis,droit-fr,dtk,dvdcoll,easybook,ebsthesis,agecon,
      ajae,apecon,ecca,erae,itaxpf,jrurstud,njf,oegatb,pocoec,
      regstud,worlddev,ecv,einfart,ejpecp,elbioimp,elegantbook,
      elegantnote,elegantpaper,elpres,cas-dc,cas-sc,elsarticle,
      elteikthesis,emisa,emulateapj,erdc,eskd,eskdgraph,eskdtab,
      eskdtext,estcpmm,europasscv,europecv,exam,exam-n,examdesign,
      exesheet,extarticle,extbook,extletter,extproc,extreport,
      facsimile,factura,fancyhandout,fancyslides,fbithesis,fcavtex,
      fdudoc,fduthesis-en,fduthesis,fei,ffslides,fithesis,
      fithesis2,fithesis3,fithesis4,flacards,flashcards,frletter,
      g-brief,g-brief2,gaceta,gammas,gatech-thesis,gmdocc,
      gradstudentresume,grant-afosr,grant-aro,grant-darpa,grant-doe,
      grant-nih,grant-nrl,grant-nsf,grant-onr,grant,graphpaper,
      gridslides,gsemthesis,guitartabs,gzt,gztarticle,h2020proposal,
      hgbarticle,hgbreport,hgbthesis,harnon-cv,hausarbeit-jura,
      hcart,hcletter,hcreport,hcslides,hecthese,hepthesis,hitec,
      hithesis,hitreport,hitszthesis,hletter,hpsdiss,fsbispit,
      huawei,hustthesis,icsv,IEEEconf,IEEEtran,ijmart,ijsra,
      image-gallery,IMTEKda,inkpaper,invoice-class,iodhbwm,iscram,
      isov2,isodoc,iwhdp,jacow,jlreq,jmlr,jmlrbook,jnuexam,jpsj2,
      jura,jurabook,juraovw,juraurtl,kdgcoursetext,kdgmasterthesis,
      kdpcover,kerntest,kluwer,knittingpattern,scrartcl,scrarticle,
      scrbook,scrdoc,scrletter,scrlttr2,scrreport,scrreprt,komacv,
      oblivoir-utf,oblivoir-xl,oblivoir,xoblivoir,ksp-thesis,l3doc,
      labbook,leadsheet,leaflet,lebhart,lectures,letgut,lettre,limap,
      limecv,lion-msc,lni,lps,lt3graph-packagedoc,ltxdockit,
      ltxguidex,abstbook,beletter,flashcard,iagproc,cours,fiche,
      matapli,matc3mem,mcmthesis,ltxmdf,medstarbeamer,meetingmins,
      memoir,mensa-tex,mentis,metanorma,milog,minimart,minimbook,
      mla,mluexercise,mnras,moderncv,modernposter,msu-thesis,
      mucproc,mugsthesis,muling,musuos,muthesis,third-rep,mwart,
      mwbk,mwrep,mycv,nature,ncc,nccproc,sibjnm,nddiss2e,
      ndsu-thesis,newlfm,nih,nihbiosketch,njurepo,nlctdoc,nostarch,
      nrc1,nrc2,artikel1,artikel2,artikel3,boek,boek3,brief,
      rapport1,rapport3,nwejm,nwejmart,octavo,onrannual,
      oup-authoring-template,journal,paper,papertex,pbsheet,pecha,
      petiteannonce,philosophersimprint,pittetd,pkuthss,plari,play,
      postcards,powerdot,FUpowerdot,ppr-prv,pracjourn,pressrelease,
      proposal,reporting,dfgproposal,dfgreporting,euproposal,
      eureporting,prosper,protocol,prtec,upmgr,wkmgr,pst-doc,
      ptptex,qcm,quantumarticle,qyxf-book,ReadableCV,recipe,
      RecipeBook,recipecard,refart,refrep,resphilosophica,revtex4-2,
      revtex4,revtex4-1,rtklage,ryersonSGSThesis,ryethesis,sageep,
      sapthesis,schuleab,schulein,schuleit,schulekl,schuleub,
      schuleue,schullsg,schullzk,schulma-ab,schulma-gutachten,
      schulma-klausur,schulma-komp,schulma-mdlprf,schulma-praes,
      schwalbe,sciposter,screenplay,scrjrnl,sdapsclassic,sduthesis,
      seminar,semproc,sesamanuel,seuthesix,sffms,cassete,etiketka,
      shtthesis,caesar_book,sides,simplecv,simplivre,skbarticle,
      skbbeamer,skbbook,skblncsbeamer,skblncsppt,skbmoderncv,skdoc,
      skeyval-testclass,skrapport,smfart,smfbook,SPhdThesis,spie,
      sr-vorl,sslides,stage,standalone,usthesis,hwexam,mikoslides,
      omdoc,smglom,subfiles,suftesi,sugconf,tabriz-thesis,talk,
      tcldoc,tclldoc,powersem,thesis-ekf,thesis-gwu,thuthesis,
      tikz-kalender,tikzposter,tlc-article,TOPletter,toptesi,
      tudabeamer,tudaexercise,tudaleaflet,tudaletter,tudaposter,
      tudapub,tudasciposter,tudscrartcl,tudscrbook,tudscrdoc,
      tudscrmanual,tudscrposter,tudscrreprt,tufte-book,tufte-handout,
      ltugboat,ltugproc,tui,turabian,turabian-researchpaper,
      turabian-thesis,my-thesis,ua-thesis,uafthesis,
      uantwerpenbamathesis,uantwerpencoursetext,uantwerpenexam,
      uantwerpenletter,uantwerpenphdthesis,uantwerpenreport,
      ucalgmthesis,ucbthesis,ucdavisthesis,ucsmonograph,ucthesis,
      udesoftec,uebungsblatt,uestcthesis,uhhassignment,uiucredborder,
      uiucthesis,ulthese,legislation,umich-thesis,umthesis,
      unam-thesis,unifith,unitn-bimrep,univie-ling-expose,
      univie-ling-paper,univie-ling-thesis,univie-ling-wlg,
      unizgklasa,uothesis,UoWthesis,upmethodology-document,URbeamer,
      URletter,uspatent,ut-thesis,utexasthesis,uwmslide,uwthesis,
      verifica,webquiz,willowtreebook,withargs-packagedoc,
      wsemclassic,xduthesis,xebaposter,xmuthesis,xsim-manual,
      yaletter,yathesis,ycbook,ydoc,york-thesis,
    },%
    % otherkeywords={},%
    alsoletter={0123456789-},%
    % alsodigit={},%
    sensitive%
  }[keywords,tex,comments]%
  #+end_src
