% Created 2024-10-30 Wed 17:28
% Intended LaTeX compiler: lualatex
\documentclass{letgut}
                                \setmainfont{KpRoman}
\setsansfont{KpSans}
\setmonofont[Scale = MatchLowercase]{RobotoMono}
\letgutsetup{editorial=false}
\input{listings-conf}
\letgutsetup{detailedtoc}
\author{Association GUTenberg}
\date{\today}
\title{Support for the newsletter “La Lettre GUTenberg”}
\begin{document}


\section{Identification}
\label{Identification-mn5g55h0jlj0}
\begin{lstlisting}
% 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-2024 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{lstlisting}

\section{Debugging}
\label{Debugging-846g55h0jlj0}
\begin{lstlisting}
% \RequirePackage[
%   , check-declarations
%   , enable-debug
%   , backend=luatex
% ]{expl3}
\end{lstlisting}

\section{Implementation}
\label{Implementation-vy6g55h0jlj0}
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{lstlisting}
\NeedsTeXFormat{LaTeX2e}[2020-10-01]
\end{lstlisting}

We define some constant token lists immediately useful.

\begin{lstlisting}
\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{lstlisting}

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

\begin{lstlisting}
\ProvidesExplClass{letgut}
{2024-10-30}
{0.9.12}
{
  Class for the newsletter “The GUTenberg Letter”
}
\end{lstlisting}

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

\begin{lstlisting}
\prop_gput:Nnn \g_msg_module_type_prop { letgut } { Class }
\end{lstlisting}

Some messages are declared for future use.

\begin{lstlisting}
\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{lstlisting}

\subsection{Engine checking}
\label{ImplementationEnginechecking-lz7g55h0jlj0}
\begin{lstlisting}
\sys_if_engine_luatex:F {
  \msg_fatal:nn{letgut}{Wrong~engine}
}
\end{lstlisting}

\subsection{Declarations}
\label{ImplementationDeclarations-3j8g55h0jlj0}
\begin{enumerate}
\item Scratch variables
\label{ImplementationDeclarationsScratchvariables-onuajq01p4k0}
\begin{lstlisting}
\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{lstlisting}
\end{enumerate}

\subsubsection{Booleans}
\label{ImplementationDeclarationsBooleans-s09g55h0jlj0}
\begin{itemize}
\item For testing the emptyness of the title.
\begin{lstlisting}
\bool_new:N \g__letgut_title_empty_bool
\end{lstlisting}
\item For the paper (or not) output.
\begin{lstlisting}
\bool_new:N \g__letgut_paper_bool
\end{lstlisting}
\item For testing whether we currently are in a footnote or not.
\begin{lstlisting}
\bool_new:N \l__letgut_in_footnote_bool
\end{lstlisting}
\item For testing whether we currently ask the draft or the final version.
\begin{lstlisting}
\bool_new:N \g__letgut_draft_bool
\end{lstlisting}
\item For the included files to (not) be attached.
\begin{lstlisting}
\bool_new:N \g__letgut_included_files_attached_bool
\end{lstlisting}
\item For the acronym definitions file to (not) be attached.
\begin{lstlisting}
\bool_new:N \g__letgut_acronyms_file_attached_bool
\end{lstlisting}
\item For the listings language file to (not) be attached.
\begin{lstlisting}
\bool_new:N \g__letgut_lstlanguage_file_attached_bool
\end{lstlisting}
\end{itemize}

\subsubsection{Dimensions}
\label{ImplementationDeclarationsDimensions-gj9g55h0jlj0}
\begin{itemize}
\item Geometry of the document
\begin{lstlisting}
\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{lstlisting}
\item Horizontal offset of the headers and the sections titles:
\begin{lstlisting}
\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{lstlisting}
\item Distance between the baseline of the header text and the decorative line:
\begin{lstlisting}
\dim_const:Nn \c__letgut_head_rule_skip_dim { 0.115cm }
\end{lstlisting}
\item Head rule width:
\begin{lstlisting}
\dim_const:Nn \c__letgut_head_rule_width_dim { 0.03cm }
\end{lstlisting}
\item Dimensions of the banner.
\begin{itemize}
\item Thickness of the “L”.
\begin{lstlisting}
\dim_const:Nn \c__letgut_banner_thickness_dim { 4cm }
\end{lstlisting}
\item Height of the “L” (that of the text area plus 3cm).
\begin{lstlisting}
\dim_const:Nn \c__letgut_banner_height_dim  {
  \c__letgut_textheight_dim
  +
  3cm
}
\end{lstlisting}
\end{itemize}
\item Height of the membership reminder box.
\begin{lstlisting}
\dim_new:N \g__letgut_membership_reminder_box_height_dim
\end{lstlisting}
\item Horizontal space for the frontcover in the margin in book reviews.
\begin{lstlisting}
\dim_const:Nn \c__letgut_bookreview_frontcover_margin_sep_dim {
  4mm
 }
\end{lstlisting}
\item Dimensions used by the listings and the examples.
\end{itemize}
\begin{lstlisting}
\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{lstlisting}

\subsubsection{Skips (lengths with rubber components)}
\label{ImplementationDeclarationsSkipslengthswithrubbercomponents-a4ag55h0jlj0}
The following skips, borrowed from the standard classes, are specified in
\lstinline+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 \lstinline+\setmainfont+).

\begin{lstlisting}
\AddToHook{begindocument/before}{%
\end{lstlisting}

Before and after:

\begin{itemize}
\item “titles titles”:
\begin{lstlisting}
\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{lstlisting}
\item subtitles titles:
\begin{lstlisting}
\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{lstlisting}
\item sections titles:
\begin{lstlisting}
\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{lstlisting}
\item subsections titles (identical to the sections ones):
\begin{lstlisting}
\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{lstlisting}
\item paragraphs titles:
\begin{lstlisting}
\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{lstlisting}
\item paragraphs titles (identical to the subsubsection ones):
\begin{lstlisting}
\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{lstlisting}
\item subparagraphs titles (identical to the paragraph ones):
\begin{lstlisting}
\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{lstlisting}
\end{itemize}

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

\begin{lstlisting}
}
\end{lstlisting}

\subsubsection{Integers}
\label{ImplementationDeclarationsIntegers-7pag55h0jlj0}
\begin{lstlisting}
\int_new:N \g__letgut_ltx_example_int
\end{lstlisting}

\subsubsection{Strings}
\label{ImplementationDeclarationsStrings-t7bg55h0jlj0}
\begin{lstlisting}
\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{lstlisting}

\subsubsection{Token lists}
\label{ImplementationDeclarationsTokenlists-grbg55h0jlj0}
\begin{enumerate}
\item Constant ones
\label{ImplementationDeclarationsTokenlistsConstantones-obcg55h0jlj0}
\begin{lstlisting}
\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_cahier_tl { \emph{ Cahier } }
\tl_const:Nn \c__letgut_cahiers_tl {
  \c__letgut_cahier_tl \emph{ s }
}
\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_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
}
\end{lstlisting}

\item Variables ones
\label{ImplementationDeclarationsTokenlistsVariablesones-pxcg55h0jlj0}
\begin{lstlisting}
\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
\end{lstlisting}
\end{enumerate}

\subsubsection{Comma separated lists}
\label{ImplementationDeclarationsCommaseparatedlists-vhdg55h0jlj0}
\begin{lstlisting}
\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{lstlisting}

\subsubsection{Sequences}
\label{ImplementationDeclarationsSequences-m2eg55h0jlj0}
\begin{lstlisting}
\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{lstlisting}

\subsection{Class options}
\label{ImplementationClassoptions-4meg55h0jlj0}
We define the 2 load time options for the target audience:

\begin{itemize}
\item \lstinline+for-readers+ (the default), for the “normal” “Lettre”,
\item \lstinline+for-authors+, (only) the author(s) of an article of the “Lettre”.
\end{itemize}

\subsection{Date handling}
\label{ImplementationDatehandling-c5fg55h0jlj0}
\begin{lstlisting}
\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{lstlisting}

\begin{lstlisting}
}{
  \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{lstlisting}

\begin{lstlisting}
    }
    {\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{lstlisting}

\subsection{Class and package loading}
\label{ImplementationClassandpackageloading-aqfg55h0jlj0}
The \letgutcls{} is based on the \lstinline+article+ class. It is by default two sided
because of the alternating headers, and will by typeset with \lstinline+11pt+ as global
font size.

\begin{lstlisting}
\LoadClass[twoside,11pt]{article}
\end{lstlisting}

We now load some packages.

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

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{lstlisting}
\AddToHook{begindocument/before}{
\end{lstlisting}
\begin{itemize}
\item Extensive support for hypertext in \LaTeX{}
\begin{lstlisting}
\RequirePackage{hyperref}
\end{lstlisting}
\item Adjusting the anchors of captions
\begin{lstlisting}
\RequirePackage[all]{hypcap}
\end{lstlisting}
\item Intelligent cross-referencing
\begin{lstlisting}
\RequirePackage[french]{cleveref}
\end{lstlisting}
\end{itemize}
We close the \lstinline+\AddToHook{begindocument/before}+ argument.
\begin{lstlisting}
}
\end{lstlisting}

\subsection{Settings for the loaded packages}
\label{ImplementationSettingsfortheloadedpackages-cdgg55h0jlj0}
\begin{itemize}
\item We switch to the French typographic conventions for \package{siunitx}.
\begin{lstlisting}
\sisetup{
  , locale=FR
  , mode=match
}
\end{lstlisting}
\item Concerning floats, we ask:
\begin{itemize}
\item the caption text will be justified,
\item the figures and their captions to be boxed (in order to distiguish them from
the current text),
\item the tables to have their captions above them.
\begin{lstlisting}
\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{lstlisting}
\end{itemize}
Moreover, the tables will be entitled \enquote{tableau} instead of
\enquote{table}.
\begin{lstlisting}
\renewcommand*\frenchtablename{Tableau}
\end{lstlisting}
\item We load a \package{tabularray}'s library.
\begin{lstlisting}
\UseTblrLibrary{booktabs}
\end{lstlisting}
\item The \lstinline+\printbibliography+ command is redefined in order its \lstinline+heading+ is by
default set to \lstinline+subbibliography+.
\begin{lstlisting}
\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:nTF {##1}{
        \seq_gput_right:Nn \g__letgut_included_files_seq {
          \attachfile[
            description={
              Fichier~ bibliographique~ utilisé~ dans~ le~
              présent~ article~ (fichier~ `\tl_to_str:n{##1}`)
            },
            mimetype=application/x-bib
          ]
          {\tl_to_str:n{##1}}
        }
      }
    }
  }
}
\end{lstlisting}
 For printing the bibliography, we define two new bibheadings for the
structure levels \lstinline+\title+ and \lstinline+\subtitle+.
\begin{lstlisting}
\defbibheading{title}[\refname]{%
  \title{#1}}
\defbibheading{subtitle}[\refname]{%
  \subtitle{#1}}
\end{lstlisting}
\item 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{lstlisting}
\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{lstlisting}

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

\begin{lstlisting}
\AddToHook{cmd/printacronyms/before}{\bool_set_false:N\l__acro_link_only_first_bool}
\end{lstlisting}

In case the long form of an acronym is explicited in footnote, we want this
footnot to be ended with a period.
\begin{lstlisting}
\ProvideDocumentCommand \acroendfootnote {} {.}
\end{lstlisting}

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

\item (Temporary?) workaround that moves `standalone` code in hook `begindocument`
to `begindocument/before` in order to get rid of the issue
\url{https://tex.stackexchange.com/q/670638/18401}.
\end{itemize}

\begin{lstlisting}
\RemoveFromHook{begindocument}[standalone]
\ExpandArgs{nv}\AddToHook{begindocument/before}{l__hook_return_tl}
\end{lstlisting}

\begin{lstlisting}
\AddToHook{begindocument/before}{
\end{lstlisting}

\begin{itemize}
\item We want the hyperlinks to be as unobtrusive as possible.
\begin{lstlisting}
\bool_if:NTF \g__letgut_paper_bool {
  \hypersetup{hidelinks}
}{
  \hypersetup{%
    colorlinks,%
    allcolors={letgut_allcolors_links},%
  }%
}
\end{lstlisting}

A preset of acronyms is input (if found, firstly in the current directory,
secondly in the parent directory, thirdly in the TDS).
\begin{lstlisting}
\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{lstlisting}

\item Depending on some chosen class options, some packages have to be loaded,
notably before \package*{hyperref} is loaded, and actions are taken
accordingly.
\begin{itemize}
\item If the `draft` mode (default) is on, we load the \package*{lua-typo} which
highlights typographical flaws with LuaLaTeX. For the moment,

the \package*{lua-typo} isn't loaded since  the `luacolor`
package it loads

currently does not work well in \lstinline+shipout/background+ (see
\url{https://github.com/ho-tex/luacolor/issues/4}).
\begin{lstlisting}
% % \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{lstlisting}
Currently, we can't use \package{l3color}'s \lstinline+\color_fill:n+ (see
\url{https://github.com/ho-tex/luacolor/issues/4\#issuecomment-848774260})
and we have to rely on \package{xcolor}'s \lstinline+\color+.
\begin{lstlisting}
% \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{lstlisting}
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{lstlisting}
\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{lstlisting}
	    Moreover, we want all the overfull boxes to be shown (as with
\lstinline+draft+ option of the standard classes).
\begin{lstlisting}
\setlength\overfullrule{5pt}
}
% % }
\end{lstlisting}
\end{itemize}
\end{itemize}

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

\begin{lstlisting}
}
\end{lstlisting}

\subsection{Page color default settings}
\label{ImplementationPagecolordefaultsettings-c1hg55h0jlj0}
By default, the page color will be the one linked to the \lstinline+screen+ option.

\begin{lstlisting}
\pagecolor[rgb]{\c__letgut_default_pagecolor_screen_clist}
\clist_set_eq:NN \g__letgut_pagecolor_clist
  \c__letgut_default_pagecolor_screen_clist
\end{lstlisting}

\subsection{Options}
\label{ImplementationOptions-imhg55h0jlj0}
We now define the options of the class:

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

\begin{lstlisting}
\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{lstlisting}

\begin{lstlisting}
\definecolor{letgut_pagecolor}{rgb}{\g__letgut_pagecolor_clist}
\end{lstlisting}

\subsection{Headers}
\label{ImplementationHeaders-78ig55h0jlj0}
We now define the headers.

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

\subsection{Marginal notes}
\label{ImplementationMarginalnotes-1uig55h0jlj0}
We want the marginal notes to be in the left margin.

\begin{lstlisting}
\reversemarginpar
\end{lstlisting}

\subsection{Table of contents}
\label{ImplementationTableofcontents-rhjg55h0jlj0}
The table of contents is customized:

\begin{itemize}
\item layout:
\begin{lstlisting}
\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{lstlisting}
\item its title is dropped:
\end{itemize}
\begin{lstlisting}
\renewcommand*\frenchcontentsname{}
\end{lstlisting}

\subsection{Geometry of the document}
\label{ImplementationGeometryofthedocument-mqkg55h0jlj0}
\begin{lstlisting}
\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{lstlisting}

\subsection{Alert box}
\label{ImplementationAlertbox-rblg55h0jlj0}
\begin{lstlisting}
\cs_new_protected:Nn \__letgut_alert_box:nn
{
  \noindent
  \begin{tblr}{
      width=\linewidth,
      rowspec={Q[c,m,#1]},
      colspec={|
\end{lstlisting}

\begin{lstlisting}
        >{\bfseries}X|
      },
      vlines,
      hlines,
      rowsep=2.5mm,
      colsep=2.5mm
    }
    #2
  \end{tblr}
  \skip_vertical:N \c_zero_dim
}
\end{lstlisting}

\subsection{Announcements}
\label{ImplementationAnnounces-nahckb909pj0}
\begin{lstlisting}
\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{lstlisting}

\subsection{Rebus}
\label{ImplementationRebus-osw8m3f0cpj0}
\begin{lstlisting}
\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{lstlisting}

\subsection{“Title” and marks}
\label{ImplementationTitleandmarks-5ylg55h0jlj0}
We redefine \lstinline+\@title+ in order to make it empty. Hence we can later test if
the \lstinline+\title+ has been populated by the user (thanks to \lstinline+\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{lstlisting}
\tl_gclear:N \@title
\end{lstlisting}

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

The number is added only if it is

\(>0\).

\begin{lstlisting}
\tl_gset:Nn \g__letgut_title_tl {
   \int_compare:nNnT
   \g__letgut_number_int
\end{lstlisting}

\begin{lstlisting}
   > \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{lstlisting}

\subsection{First page handling}
\label{ImplementationFirstpagehandling-nmmg55h0jlj0}
The first page is special as it should automatically contain certain elements:
\begin{itemize}
\item the banner,
\item either the number and the date of the issue, or a given title,
\item the table of contents,
\item the editorial,
\item the membership reminder.
\end{itemize}

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

\begin{lstlisting}
\AddToHook{begindocument/before}{
  \bool_if:NT \g__letgut_for_readers_bool {
\end{lstlisting}

\begin{lstlisting}
\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{lstlisting}

The \lstinline+pagecolor+ option is possibly set (with \lstinline+\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
\lstinline+\AddToHook{begindocument}+ and with \lstinline+\AddToHook{begindocument/before}+).

\begin{lstlisting}
  \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{lstlisting}

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

\begin{lstlisting}
\AddToHook{begindocument/end}
{
\end{lstlisting}

\begin{itemize}
\item 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{lstlisting}
\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{lstlisting}
\item We want the text on the first page to not encroach on the horizontal bar of
the banner.
\begin{lstlisting}
\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{lstlisting}
\item 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{lstlisting}
\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{lstlisting}
\end{itemize}

\begin{lstlisting}
      > \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{lstlisting}
Here, we insert the title, but don't rely on \lstinline+\maketitle+ because it
lets to \lstinline+\relax+ the command \lstinline+\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 \lstinline+\maketitle+ command (borrowed from \file{article.cls}).
\begin{lstlisting}
\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{lstlisting}
\begin{itemize}
\item No headers on the first page. This has to be inserted after the previous
(customized) \lstinline+\maketitle+ since this command inserts a \lstinline+\newpage+ which would
ruin the effort of \lstinline+\thispagestyle{empty}+ if inserted before.
\begin{lstlisting}
\thispagestyle{empty}
\end{lstlisting}
\item 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 \lstinline+detailedtoc+ option make its depth until
subpargraphs (which may be useful in order to check the structure of the
Lettre).
\begin{lstlisting}
\etocsetnexttocdepth{\g__letgut_detailedtoc_level_str}
\pdfbookmark[1]{
  \c__letgut_contents_name_tl
}{
  \c__letgut_contents_name_tl
}
\tableofcontents
\etocsetnexttocdepth{1}
\end{lstlisting}
Should a title be displayed, the table of contents would be added after it,
followed by a new page (otherwise, if \lstinline+\title+ used after \lstinline+\begin{document}+
sees its title on the front page, it will overflow onto the banner).
\begin{lstlisting}
\bool_if:NTF \g__letgut_title_empty_bool {
  \vspace*{1.5cm}
}{
  \newpage
}
\end{lstlisting}
\item Conditionally to the fact the \lstinline+editorial+ option is not set to \lstinline+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{lstlisting}
\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{lstlisting}
\end{itemize}

\begin{lstlisting}
    % \if\count{\pagenumber}>1
    % \else
    % \newpage
    % \fi
  }{
    \msg_warning:nn{letgut}{Editorial~file~missing}
    \alertbox{ \c__letgut_missing_editorial_tl }
    \newpage
  }
}{
  % \newpage
}
\end{lstlisting}

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

\begin{lstlisting}
}
\end{lstlisting}

Membership reminder.

\begin{lstlisting}
\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{lstlisting}

\subsection{Last page handling}
\label{ImplementationLastpagehandling-jbng55h0jlj0}
The last pages are special: they should automatically contain

some informations about \gutenberg.

\begin{lstlisting}
\AddToHook{enddocument}
{
  % \clearpage
  % \printacronyms[heading=title,display=used]
\end{lstlisting}
Conditionally to the fact the \lstinline+informations+ option is not set to \lstinline+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{lstlisting}
\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{lstlisting}

We close the \lstinline+\AddToHook{enddocument}+ argument.

\begin{lstlisting}
}
\end{lstlisting}

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

\begin{lstlisting}
}
}
\end{lstlisting}

\subsection{Sections, subsections, etc.}
\label{ImplementationSectionssubsectionsetc-vzng55h0jlj0}
\subsubsection{Numbering}
\label{ImplementationSectionssubsectionsetcNumbering-lmog55h0jlj0}
We want all the sections to be unnumbered.

\begin{lstlisting}
\setcounter{secnumdepth}{-10}
\end{lstlisting}

\subsubsection{Format}
\label{ImplementationSectionssubsectionsetcFormat-tapg55h0jlj0}
When used in titles, \lstinline+\hologo+ needs to be protected. In order to not bother the
user with this peticularity, we make this the default for it.

\begin{lstlisting}
% \AddToHook{cmd/hologo/before}{\protect}
\NewCommandCopy{\__letgut_old_hologo}{\hologo}
\RenewDocumentCommand {\hologo} { m }{
  \protect\__letgut_old_hologo { #1 }
}
\end{lstlisting}

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

\begin{lstlisting}
\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{lstlisting}

\begin{itemize}
\item We create the new level \lstinline+\title+ for the titles of the articles. They are
displayed uppercased.

\begin{lstlisting}
\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{lstlisting}
\item We also create the new level \lstinline+\subtitle+ for the subtitles of the
articles. They are dispayed uppercased (but in a smaller size than \lstinline+\title+).
\begin{lstlisting}
\titleclass{\subtitle}{straight}[\title]
\titleformat{\subtitle}{
  \normalfont
  \Large
  \bfseries
  \text_uppercase:n
}{}{1em}{}{}
\etocsetlevel{subtitle}{1}
\def\toclevel@subtitle{1}%
\def\toclevel@subtitle{1}
\end{lstlisting}
\item By default (that is when \lstinline+\subtitle+ is not used), the toc levels of the
sections, subsections, etc. are set to \lstinline+1+, \lstinline+2+, etc. But, when \lstinline+\subtitle+ is
used, since this level has toc level \lstinline+1+, the toc levels of the sections,
subsections, etc. have to be set to \lstinline+2+, \lstinline+3+, etc. And this has to be reset
each time \lstinline+\title+ and  \lstinline+\subtitle+ are used.
\begin{lstlisting}
\AddToHook{cmd/title/before}{
  \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}%
}
\AddToHook{cmd/subtitle/before}{
  \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}%
}
\end{lstlisting}

\begin{itemize}
\item The (sub)paragraphs have the usual format, except that they are not
“runin” (\package{titlesec}'s package's terminology).
\end{itemize}
\begin{lstlisting}
  \titleformat{\paragraph}{
    \normalfont
    \normalsize
    \bfseries
  }{\theparagraph}{1em}{}
  \titleformat{\subparagraph}{
    \normalfont
    \normalsize
    \bfseries
  }{\thesubparagraph}{1em}{}
}
\end{lstlisting}
\item We modify the spacing, mainly by shifting the titles in the left margin (the
rest is borrowed from the standard classes).
\begin{lstlisting}
\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{lstlisting}
\end{itemize}

\subsection{Document commands}
\label{ImplementationDocumentcommands-s1qg55h0jlj0}
\subsubsection{Setup}
\label{ImplementationDocumentcommandsSetup-roqg55h0jlj0}
We define the command that lets us specify the newsletter setup.

\begin{lstlisting}
\NewDocumentCommand \letgutsetup { m } {
  \keys_set:nn { letgut } { #1 }
}
\end{lstlisting}

\subsubsection{For the rubric dedicated to new stuffs appeared on \acs{ctan}}
\label{ImplementationDocumentcommandsFortherubricdedicatedtonewstuffsappearedonacsctan-jerg55h0jlj0}
\begin{itemize}
\item 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 \lstinline+\item+ is automatically an argument of the
\lstinline+\package+ command).
\begin{lstlisting}
\cs_new_protected:Nn \__letgut_ctan_news_item:n {
  \package{#1}~:
}
\newlist{ctannews}{description}{1}
\setlist[ctannews]{format=\__letgut_ctan_news_item:n}
\end{lstlisting}
The stuffs created by French speaking people are highlighted in a special
way and, for this, a starred variant of the \lstinline+\item+ command is provided. We
insert a systematic \lstinline+\phantomsection+ in order the cross-references to such
items are correct.
\begin{lstlisting}
\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]{}
  }
}
\NewCommandCopy{\__letgut_old_item}{\item}
\RenewDocumentCommand {\item} { s O{} } {
  \__letgut_item:nn {#1}{#2}
}
\end{lstlisting}
\end{itemize}
\begin{itemize}
\item Command that inserts the \enquote{francophony} logo.
\begin{lstlisting}
\NewDocumentCommand {\francophony} {  } {
  \raisebox{-1.5pt}{
    \__letgut_orig_includegraphics*[width=\f@size pt]{
      letgut-francophony-icon
    }
  }
}
\end{lstlisting}
\end{itemize}

\subsubsection{Persons, authors and list of participants}
\label{ImplementationDocumentcommandsPersonsandauthors-h5sg55h0jlj0}
For both persons and authors, the argument of:
\begin{itemize}
\item a single individual is given as:
\begin{itemize}
\item \meta{Last name}, \meta{First name}
\item and possibly \meta{Last name}, \meta{First name}, \meta{Title}
\end{itemize}
\item multiple individuals, the schemes for each of the individuals are the same of
a single one, separated by a semicolon.
\end{itemize}

\begin{lstlisting}
\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{lstlisting}

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

\begin{lstlisting}
\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{lstlisting}

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

\begin{lstlisting}
\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{lstlisting}

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{lstlisting}
\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{lstlisting}

\subsubsection{Horizontal rule}
\label{ImplementationDocumentcommandsHorizontalrule-8vsg55h0jlj0}
\begin{lstlisting}
\NewDocumentCommand {\separator} {  } {
  \par
  \skip_vertical:N 1em
  \hrule
  \skip_vertical:N 1em
}
\end{lstlisting}

\subsubsection{Alert boxes}
\label{ImplementationDocumentcommandsAlertboxes-ijtg55h0jlj0}
\begin{lstlisting}
\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{lstlisting}

\subsubsection{Typesetting of packages, classes, files and softwares.}
\label{ImplementationDocumentcommandsTypesettingofpackagesclassesfilesandsoftwares-09ug55h0jlj0}
The \lstinline+\c__letgut_httpsprefix_tl+ comes from:

\url{https://github.com/latex3/hyperref/issues/188\#issuecomment-826302843}.

\begin{lstlisting}
\tl_const:Nx \c__letgut_httpsprefix_tl
{https\char_generate:nn{58}{12}//}
\end{lstlisting}
We define the font switches dediacted to each of packages and classes
(\TeX{} stuff), files and softwares.
\begin{lstlisting}
\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 {\ttfamily}
\end{lstlisting}

\begin{lstlisting}
\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{lstlisting}

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

\begin{lstlisting}
  \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{lstlisting}

\subsubsection{Names, expressions, etc.}
\label{ImplementationDocumentcommandsNamesexpressionsetc-11vg55h0jlj0}
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{lstlisting}
\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 { \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 { \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{lstlisting}

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

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

\begin{lstlisting}
\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{lstlisting}

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

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

\begin{lstlisting}
\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{lstlisting}

The \lstinline+\lettre+ and \lstinline+\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 \url{https://tex.stackexchange.com/q/427557/18401}).

\subsubsection{Foreign locutions}
\label{ImplementationDocumentcommandsForeignlocutions-1svg55h0jlj0}
\begin{lstlisting}
\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{lstlisting}

\subsubsection{Unicode code points}
\label{ImplementationDocumentcommandsUnicodecodes-30lksfa0nlj0}
\begin{lstlisting}
\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{lstlisting}

\subsubsection{Bookmarks handling}
\label{ImplementationDocumentcommandsBookmarkshandling-zbxg55h0jlj0}
We disabling some commands when their arguments have to go to bookmarks.

\begin{lstlisting}
\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{lstlisting}

\subsubsection{Acronyms}
\label{ImplementationDocumentcommandsAcronyms-93yg55h0jlj0}
The following command let us define acronyms. The arguments are as follows:
\begin{itemize}
\item \lstinline+#1+: optional argument that let us override the default settings of this
command,
\item \lstinline+#2+: the uppercase version of both the id and the short form of the acronym,
\item \lstinline+#3+: the long form (in French if \#4 has \lstinline+-NoValue-+, in English otherwise),
\item \lstinline+#4+: the French translation of an English acronym.
\end{itemize}

\begin{lstlisting}
\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{lstlisting}
The ⟨id⟩ of the acronym will automatically be the name of a public command
(\lstinline+\+​⟨id⟩) acting as \lstinline+\ac{id}+.
\begin{lstlisting}
\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{lstlisting}
We want the command \lstinline+\+​⟨id⟩ to work also in bookmarks (the resulting string will
be the uppercased acronym).
\begin{lstlisting}
\pdfstringdefDisableCommands
  {
    \exp_after:wN
    \def\cs:w \text_lowercase:n {#2} \cs_end: { #2 }
  }
}
}
\end{lstlisting}

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 \lstinline+\footnote+ command
to know whether we currently are in a footnote or not and display the acronym
accordingly.

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

\begin{lstlisting}
\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{lstlisting}
We change a bit both the \lstinline+footnote+ acro template, the \lstinline+description+ list
template, and the macro which prints the locale.
\begin{lstlisting}
\DeclareAcroProperty{extra-foreign}
\DeclareAcroProperty{extra-long}
\RenewAcroTemplate {footnote}
{
  \acrowrite {short}
  \acroiffirstT
  {
\end{lstlisting}
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{lstlisting}
      \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{lstlisting}
Now, the document command that let the user create acronyms.
\begin{lstlisting}
\NewDocumentCommand{\letgutacro}{ O{} m m o }
{
  \__letgut_acronym:nnnn {#1} {#2} {#3} {#4}
}
\end{lstlisting}
For printing the acronyms, we define two new heading templates for the structure
levels \lstinline+\title+ and \lstinline+\subtitle+.
\begin{lstlisting}
\NewAcroTemplate[heading] {title}
  { \title { \acrolistname } }
\NewAcroTemplate[heading] {subtitle}
  { \subtitle { \acrolistname } }
\end{lstlisting}
We make \lstinline+\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 \lstinline+\ac+).
\begin{lstlisting}
\@onlypreamble\letgutacro
\end{lstlisting}

\subsection{Bibliography}
\label{ImplementationBibliography-ruyg55h0jlj0}
We want the \lstinline+\citeauthor+ command to display, not only the last, but the
full name of the authors.

\begin{lstlisting}
\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{lstlisting}

\subsection{Book reviews}
\label{ImplementationBookreviews-ekzg55h0jlj0}
\begin{lstlisting}
\tl_new:N \l__letgut_bookreview_frontcover_tl
\tl_new:N \g__letgut_bookreview_bibkey_tl
\end{lstlisting}
The keys options are created.
\begin{lstlisting}
\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{lstlisting}

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

\begin{lstlisting}
  title .value_required:n = true,
  frontcover .value_required:n = true,
  bibkey .value_required:n = true,
  reviewer .value_required:n = true,
}
\end{lstlisting}

We create the new environment for the book reviews.

\begin{lstlisting}
\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{lstlisting}

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

\begin{lstlisting}
\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 {
          \attachfile[
            description={
              Fichier~ bibliographique~ utilisé~ dans~ le~
              présent~ article~ (fichier~ `\tl_to_str:n{##1}`)
            },
            mimetype=application/x-bib
          ]
          {\tl_to_str:n{##1}}
        }
      }
    }
  }
}
\end{lstlisting}

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

\begin{lstlisting}
\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{lstlisting}

\subsection{Miscellanous}
\label{ImplementationMiscellanous-r11h55h0jlj0}
\begin{itemize}
\item We specify the possible hyphenations of \enquote{\gutenberg}.
\end{itemize}
\begin{lstlisting}
\hyphenation{GUTen-berg}
\end{lstlisting}

\subsubsection{ISSN}
\label{ImplementationMiscellanousISSN-cr1h55h0jlj0}
\begin{lstlisting}
\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{lstlisting}

\subsubsection{Non selectable text}
\label{ImplementationMiscellanousNonselectabletext-wh2h55h0jlj0}
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{lstlisting}
\cs_new_protected:Npn \__letgut_unselectable:n #1
{
  \BeginAccSupp{ActualText={}}#1\EndAccSupp{}
}
\end{lstlisting}

\subsubsection{Typesetting of code, etc.}
\label{ImplementationMiscellanousTypesettingofcodeetc-f83h55h0jlj0}
We provide a \lstinline+\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{lstlisting}
\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{lstlisting}

\subsubsection{Input of articles}
\label{ImplementationMiscellanousInputofarticles-aqok3ja00pj0}
We create our own \lstinline+\input+ command for the articles of the Lettre with the
following characteristics:

\begin{itemize}
\item 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.
\item All the acronyms are reset (each acronym is developped at its first occurrence).
\item The source file of the article is attached to the \pdf{} (if desired,
otherwise, use the starred version).
\end{itemize}

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{lstlisting}
\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 {
          \attachfile[
            description={Source~ nécessaire~ (fichier~ `#1.tex`)},
            mimetype=application/x-tex]
          {#1.tex}
        }
      }
    }
  }
}
\end{lstlisting}

\begin{lstlisting}
\cs_new_protected:Npn \__letgut_input_article:nn #1 #2
{
  \FloatBarrier
  \lstset{ style=__letgut_reset_listings_styles }
  \acresetall%
  \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 {
        \attachfile[
        description={Source~ du~ présent~ article~ (fichier~ `#2.tex`)},
        mimetype=application/x-tex]
        {#2.tex}
      }
      \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{lstlisting}

\subsubsection{Included graphics attached to the PDF}
\label{ImplementationMiscellanousIncludedgraphicsattachedtothePDF-xoc34ja00pj0}
We hack the \lstinline+\includegraphics+ command in order to attach the included graphics
to the \pdf{} (if desired, otherwise, use the starred version).

\begin{lstlisting}
\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 {
          \attachfile[
          description={
            Fichier~ image~ inclus~ dans~ le~
            présent~ article~ (fichier~ `#3`)
          },
          mimetype=image
          ]{./#3}
        }
      }
    }
    \__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 {
                \attachfile[
                description={Fichier~ image~ inclus~ dans~ le~ présent~ article~ (fichier~ `#3##1`)},
                mimetype=image/##1
                ]{./#3##1}
              }
            }
          }
          \__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{lstlisting}

\subsubsection{Added bibliographic ressources attached to the PDF}
\label{ImplementationMiscellanousAddedbibliographicressourcesattachedtothePDF-l4e34ja00pj0}
We hack the \lstinline+\addbibresource+ command in order to attach the bibliographic
ressources to the \pdf{}.

\begin{lstlisting}
\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{lstlisting}

\subsubsection{Added acronym definitions file attached to the PDF}
\label{ImplementationMiscellanousAddedbibliographicressourcesattachedtothePDF-l4e34ja00pj0}
We hack the \lstinline+\ac+ and \lstinline+\acs+ commands in order to attach the acronym definitions
file to the \pdf{}.

\begin{lstlisting}
\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}{
      \attachfile[
        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}%
    }
  }
  \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{lstlisting}

\subsubsection{Added letgut listings language file attached to the PDF}
\label{ImplementationMiscellanousAddedbibliographicressourcesattachedtothePDF-l4e34ja00pj0}
We hack the \lstinline+\ac+ and \lstinline+\acs+ commands in order to attach the acronym definitions
file to the \pdf{}.

\begin{lstlisting}
\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 {
      \attachfile[
        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}%
    }
  }{
    \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{lstlisting}

\subsection{Listings}
\label{ImplementationListings-514h55h0jlj0}
We define a style for all the listings which resets all the \TeX{} control
sequences and keywords, and fix some defaults.

\begin{lstlisting}
\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{lstlisting}

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

\begin{lstlisting}
numbersep=\c__letgut_number_sep_dim,
numberstyle=\scriptsize\ttfamily
\color{__letgut_foregroundLinenumber}
\__letgut_unselectable:n,
\end{lstlisting}

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{lstlisting}
  aboveskip={0\p@ \@plus 6\p@},
  belowskip={0\p@ \@plus 6\p@},
}
\end{lstlisting}

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

\begin{lstlisting}
\lstMakeShortInline[breaklines=false]™
\end{lstlisting}

We start with an empty listings style.

\begin{lstlisting}
\lstset{ style=__letgut_reset_listings_styles }
\end{lstlisting}

\subsubsection{\LaTeX{} listings and examples}
\label{ImplementationListingsLaTeXlistingsandexamples-xt4h55h0jlj0}
We define the colors for the syntax highlighting of \LaTeX{} listings.

\begin{lstlisting}
\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{lstlisting}

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{lstlisting}
\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{lstlisting}

We define a listing style specific to \LaTeX{} listings.

\begin{lstlisting}
\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{lstlisting}

The \lstinline+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
\lstinline+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 \lstinline+extendedLaTeX+ dialect
that we load by default).

\begin{lstlisting}
deletekeywords={%
  array,center,displaymath,document,enumerate,eqnarray,%
  equation,flushleft,flushright,itemize,list,lrbox,math,minipage,%
  picture,sloppypar,tabbing,tabular,trivlist,verbatim,%
},%
\end{lstlisting}

\begin{lstlisting}
  literate=*%
  {\\\\}{{{\color{__letgut_texcs}\textbackslash\textbackslash}}}{2}%
  {\\[}{{\textcolor{__letgut_math}{\textbackslash[}}}{2}%
  {\\]}{{\textcolor{__letgut_math}{\textbackslash]}}}{2}%
  {$}{{\textcolor{__letgut_math}{\$}}}{1}%$
}
\end{lstlisting}

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

\begin{lstlisting}
\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{lstlisting}

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

\begin{lstlisting}
\tcbuselibrary{listings,breakable,skins,hooks,documentation}
\end{lstlisting}

We want some common settings for all the \textasciitilde{}tcolorbox\textasciitilde{}es.

\begin{lstlisting}
\tcbset{
  breakable,
  sharp~ corners,
  fonttitle=\sffamily\bfseries,
}
\end{lstlisting}

The functions:

\begin{itemize}
\item \lstinline+\__letgut_code_result_mention_box:n+ draws the mentions “code” and “résultat”
in the codes boxes and the possible corresponding results boxes,
\item \lstinline+\__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 \lstinline+title addon+
option is provided, the specified title addon.
\end{itemize}

\begin{lstlisting}
\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 :~#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{lstlisting}

We define the style of the codes.

\begin{lstlisting}
\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{lstlisting}
We define a custom \package*{tcolorbox}'s \lstinline+title addon+ option that let us
specify an addon to the title which will added after the automatically
generated title “Exemple \meta{number}”.
\begin{lstlisting}
title~ addon/.store~ in=\l__letgut_title_addon_tl,
title=\__letgut_title_code_result_box:n {\l__letgut_title_addon_tl},
\end{lstlisting}
We define a custom \package*{tcolorbox}'s \lstinline+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{lstlisting}
reference~ text/.code={
    \tl_set:Nn \l__letgut_reference_text_tl {##1}
},
\end{lstlisting}
We define a custom \package*{tcolorbox}'s \lstinline+result width+ option that let us
specify the width of the result which is \lstinline+\linewidth+ by default.
\begin{lstlisting}
result~ width/.store~ in=\l__letgut_result_width_dim,
result~ width=\linewidth,
},
\end{lstlisting}
We define more specifically the style of the codes with results.
\begin{lstlisting}
__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{lstlisting}
We want the side by side code/result examples to automatically be floating.
\begin{lstlisting}
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{lstlisting}

\begin{lstlisting}
  \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{lstlisting}

\begin{lstlisting}
\int_compare:nNnT {\thetcbbreakpart} > {1} {~(suite)}
}
\fi
\fi
},
},
}
\end{lstlisting}

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

\begin{lstlisting}
\AddToHook{begindocument/before}{
\end{lstlisting}

We now define the environments that let us display:

\begin{enumerate}
\item only \LaTeX{} code:
\end{enumerate}
\begin{lstlisting}
\DeclareTCBListing[
  auto~ counter,
  crefname={exemple}{exemples}
]{ltx-code}{ !O{} }{%
  __letgut_code,
  listing~ only,
  #1%
}
\end{lstlisting}
\begin{enumerate}
\item both \LaTeX{} code and its result:
\begin{enumerate}
\item ordinary:
\end{enumerate}
\end{enumerate}
\begin{lstlisting}
\DeclareTCBListing[
  use~ counter~ from=ltx-code,
  crefname={exemple}{exemples}
]{ltx-code-result}{ !O{} }{%
  __letgut_code_result,
  #1%
}
\end{lstlisting}
\begin{enumerate}
\item with the result obtained externally:
\end{enumerate}
\begin{lstlisting}
\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{lstlisting}

\begin{lstlisting}
}
\end{lstlisting}

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 (\lstinline+\g__letgut_reduced_intextsep_dim+). Hence we store the original
glue (\lstinline+\intextsep+) in a custom one (\lstinline+\g__letgut_orig_intextsep_dim+) in order
to retrieve the original skip for floats other than these ones.

\begin{lstlisting}
\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{lstlisting}

We now use hooks in order to\ldots{}

\begin{lstlisting}
\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{lstlisting}

Since the syntax highlighting is reset at each \lstinline+\input+, the \lstinline+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 \lstinline+listings+ package syntax) in
the `lstlang0.sty` or \lstinline+letgut-lstlang.sty+ files.

\begin{lstlisting}
\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{lstlisting}
To reduce syntax highlighting conflicts, we reset all previous ones each
time a new one is asked.
\begin{lstlisting}
  \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{lstlisting}

\subsubsection{Terminal listings}
\label{ImplementationListingsTerminallistings-fq5h55h0jlj0}
We define a command dedicated to terminal stdin and stdout.

\begin{lstlisting}
\AddToHook{begindocument/before}{
\end{lstlisting}

We define a listing style specific to these terminal commands.

\begin{lstlisting}
\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{lstlisting}

\begin{lstlisting}
\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{lstlisting}

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

\begin{lstlisting}
\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{lstlisting}

We define some colors used in the terminal listings.

\begin{lstlisting}
\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{lstlisting}

\begin{lstlisting}
\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{lstlisting}

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

\begin{lstlisting}
\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{lstlisting}

We now define the command.

\begin{lstlisting}
\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{lstlisting}

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

\begin{lstlisting}
}
\end{lstlisting}

\subsubsection{Unicode characters with positions above 256}
\label{ImplementationListingsUnicodecharacterswithpositionsabove256-4l6h55h0jlj0}
Unicode characters with positions above 256 cause troubles in
listings. Here is a workaround for some of them (see
\url{https://tex.stackexchange.com/a/25396}).

\begin{lstlisting}
\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{lstlisting}

\subsection{Local config file}
\label{ImplementationLocalconfigfile-me7h55h0jlj0}
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 (\lstinline+\ExplSyntaxOn+), a \lstinline+\ExplSyntaxOff+ is automatically inserted
at its beginning.

\begin{lstlisting}
\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{lstlisting}

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

\begin{lstlisting}
\ExecuteBibliographyOptions[bookreview]{skipbib,skiplab}
\end{lstlisting}

\begin{lstlisting}
\endinput
\end{lstlisting}

\section{(biblatex) Data model}
\label{biblatexDatamodel-vx7h55h0jlj0}
We give the (\package{biblatex}) data model that enriches the default one for
several purposes:
\begin{itemize}
\item the books reviews,
\item the books advertisements.
\end{itemize}

\begin{lstlisting}
\ProvidesFile{letgut.lbx}[2024-10-30 v0.9.12 letgut localization]
\InheritBibliographyExtras{french}
\DeclareBibliographyStrings{
  inherit          = {french},
  number           = {{\no}{\no}},
  volume           = {{volume}{vol\adddot}},
  volumes          = {{volumes}{vol\adddot}},
}
\end{lstlisting}

We create the new bibliography driver \lstinline+bookreview+ (that seems to
create the corresponding new entry).

\begin{lstlisting}
\ProvidesFile{letgut.dbx}[2024-10-30 v0.9.12 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{lstlisting}

We provide a specific \lstinline+biblatex+ citation style .

\begin{lstlisting}
\ProvidesFile{letgut.cbx}[2024-10-30 v0.9.12 letgut base citation style]
\RequireCitationStyle{numeric}
\end{lstlisting}

The books reviewed have their titles not only emphasized, but in bold face as
well\ldots{}

\begin{lstlisting}
\DeclareFieldFormat[bookreview]{title}{\textbf{\emph{#1}}}
\end{lstlisting}

\ldots{} but not their subtitles.

\begin{lstlisting}
\renewbibmacro*{title}{%
  \ifboolexpr{
    test {\iffieldundef{title}}
    and
    test {\iffieldundef{subtitle}}
  }
  {}
  {\printtext[title]{%
      \printfield[titlecase]{title}%
      \setunit{\subtitlepunct}}%
    \printfield[emph]{subtitle}%
    \newunit}%
  \printfield{titleaddon}}
\end{lstlisting}

\section{Provided files}
\label{Providedfiles-g09h55h0jlj0}
\subsection{Example file of an issue of the newsletter}
\label{ProvidedfilesExamplefileofanissueofthenewsletter-ak9h55h0jlj0}
\begin{lstlisting}
% 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{lstlisting}

\subsection{Example of an editorial}
\label{ProvidedfilesExampleofaneditorial-06ah55h0jlj0}
\begin{lstlisting}
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{lstlisting}

\subsection{Informations about \gutenberg}
\label{ProvidedfilesInformationsabout\gutenberg-hqah55h0jlj0}
\begin{lstlisting}
% 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\\
  \url{secretariat[at]gutenberg-asso[dot]fr}
\end{minipage}%

\begin{description}
\item[Site Internet :] \url{https://www.gutenberg-asso.fr/}
\item[\Cahiers{} :] \url{http://www.numdam.org/journals/CG/}
\item[Problèmes techniques :]
  \leavevmode
  \begin{description}
  \item[la liste \texttt{gut} :]
    \url{https://www.gutenberg-asso.fr/-Listes-de-diffusion-}
  \item[le site \hologo{TeX}nique de questions et réponses :]
    \url{https://texnique.fr/}
  \item[la foire aux questions :]
    \url{https://faq.gutenberg-asso.fr/}
  \end{description}
\end{description}
%
\alertbox{%
  Cette association est la vôtre : faites-nous part de
  vos idées, de vos envies, de vos préoccupations
  à l'adresse \url{secretariat[at]gutenberg-asso[dot]fr}.%
}

% \section[Association GUTenberg (tout sur l')]
% {Adhésion à l'association}
\title{Adhésion à l'association}
\label{letgut_label_adhesions}

\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}

\vspace*{-0.7cm}
\section{Tarifs \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 :
\begin{description}
\item[tarif normal :] 65~€ (au lieu de 85~\$)
\item[tarif étudiant :] 40~€ (au lieu de 55~\$)
\end{description}
% (49~€50}, étudiants et demandeurs d'emploi :
% 29~€, au lieu de 85\$ et % 65\$).  Voir
% \url{%
% https://www.gutenberg-asso.fr/?Adherer-en-ligne%
% }.

\footnotesize
\begin{center}
  \begin{tabular}{lr}
    \toprule
    \textbf{Type d'adhésion}                        & \textbf{Prix} \\
    \midrule
    Membre individuel                               & 30~€      \\
    Membre individuel + adhésion \acs{tug}          & 95~€      \\
    Membre individuel étudiant/demandeur d'emploi   & 15~€      \\
    Membre individuel étudiant + adhésion \acs{tug} & 55~€      \\
    Association d'étudiants                         & 65~€      \\
    Organisme à but non lucratif                    & 130~€     \\
    Organisme à but lucratif                        & 229~€     \\
    \bottomrule
  \end{tabular}
\end{center}

\section{Règlements}

Les règlements peuvent s'effectuer par :
\begin{itemize}
\item \textbf{virement bancaire}%
  \footnote{Nous vous remercions de \textbf{privilégier}
    le \textbf{virement bancaire}.\label{fn:1}} (\textsc{iban} :
  FR76 3000 3001 0900 0372 6086 280)%
  \leavevmode

  \alertbox{%
    Veillez à bien \emph{indiquer vos nom et prénom}
    dans les références du virement !%
  }
\item Paypal\footnotemark[\value{footnote}] :
  \url{https://www.gutenberg-asso.fr/?Adherer-en-ligne}
\item bulletin et chèque\footnotemark[\value{footnote}] :
  \url{https://www.gutenberg-asso.fr/?Adherer-a-l-association}
\end{itemize}

\vfill

\mbox{}

\vfill{}

\begin{center}
  \begin{tblr}{
      width=.9\linewidth,
      colspec={
        % < (Just not to disturb the parentheses
        % balancing detection of my editor.)
        >{\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
    de l'association \gut\\
    Directeur de la publication :
    & \person{Bideault, Patrick} \\
    Comité de rédaction :
    & {Patrick Bideault, Denis Bitouzé,  \\
      Céline Chevalier, Maxime Chupin \& Bastien Dumont} \\
    Adresse de la rédaction : &
    {
      Association \gut\\
      15 rue des Halles -- \textsc{bp} 74\\
      75001 Paris
    }
    \\
    \acs{issn} : & \letgutissn
  \end{tblr}
\end{center}
\clearpage
\end{lstlisting}

\subsection{Acronyms}
\label{ProvidedfilesAcronyms-8cbh55h0jlj0}
\begin{lstlisting}
% 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{lstlisting}

\subsection{Language driver file}
\label{ProvidedfilesLanguagedriverfile-4cch55h0jlj0}
\begin{lstlisting}
% \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{lstlisting}
\end{document}
