% Created 2022-03-18 ven. 19:02
% Intended LaTeX compiler: lualatex
\documentclass{letgut}
                                \setmainfont{KpRoman}
\setsansfont{KpSans}
\setmonofont[Scale = MatchLowercase]{RobotoMono}
\letgutsetup{editorial=false}
\input{listings-conf}
\author{Association GUTenberg}
\date{\today}
\title{Support for the newsletter “La Lettre GUTenberg”}
\begin{document}


\section{Identification}
\label{sec:org4c9ba67}

\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.eu.org
% License:| Released under the LaTeX Project Public License
%         | v1.3c or later
%     See:| http://www.latex-project.org/lppl.txt
%
% Copyright (C) 1994-2022 by Association GUTenberg
%                   <secretariat@gutenberg.eu.org>
%
% 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{sec:org09b0cd2}

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

\section{Implementation}
\label{sec:orga99a9b5}

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_tl { \emph{ Lettre } }
\tl_const:Nn \c__letgut_gutenberg_tl { GUTenberg }
\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_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}
{2022-03-18}
{0.9}
{
  Class~ for~ the~ newsletter~
  “\c__letgut_La_lettre_gutenberg_tl”
}
\end{lstlisting}

\subsection{Messages}
\label{sec:org447090b}

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{sec:org5711d86}

\begin{lstlisting}
\sys_if_engine_luatex:F {
  \msg_fatal:nn{letgut}{Wrong~engine}
}
\end{lstlisting}

\subsection{Declarations}
\label{sec:orga63e6a8}

\subsubsection{Booleans}
\label{sec:orge5b5c6b}

\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}
\end{itemize}

\subsubsection{Dimensions}
\label{sec:org61842b5}

\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{sec:orgbda0ae2}

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{sec:orgb3e9382}
\begin{lstlisting}
\int_new:N \g__letgut_ltx_example_int
\end{lstlisting}

\subsubsection{Strings}
\label{sec:orgdd18dd8}

\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{sec:orgaf6d8ec}

\begin{enumerate}
\item Constant ones
\label{sec:orgb1ea800}

\begin{lstlisting}
\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_tugboat_tl { \emph{ TUGboat } }
\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_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{http://gutenberg.eu.org/?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é~ dans~ le~ dossier~ courant)
}
\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{sec:org4c5e60d}

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

\subsubsection{Comma separated lists}
\label{sec:org158b7a3}

\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{sec:orgaa04440}

\begin{lstlisting}
\seq_new:N \l__letgut_first_last_names_items_seq
\end{lstlisting}

\subsection{Class options}
\label{sec:orgef3017c}

In order to provide class options, we load the \package{l3keys2e} which provides
\LaTeXe{} option processing using \LaTeX3 keys:

\begin{lstlisting}
\RequirePackage{l3keys2e}
\end{lstlisting}

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}

\begin{lstlisting}
\keys_define:nn { letgut }
{
  , for-readers .bool_gset:N = \g__letgut_for_readers_bool
  , for-readers .initial:n = { true }
  , for-readers .default:n = { true }
  , for-authors .bool_gset_inverse:N = \g__letgut_for_readers_bool
}
\ProcessKeysOptions { letgut }
\end{lstlisting}

\subsection{Class and package loading}
\label{sec:org464c4b7}

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 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 Several logos and ornaments.
\begin{lstlisting}
\RequirePackage{fourier-orns}
\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 A collection of logos with bookmark support.
\begin{lstlisting}
\RequirePackage{hologo}
\end{lstlisting}
\item Driver-independent color extensions.
\begin{lstlisting}
\RequirePackage[table]{xcolor}
\end{lstlisting}
\item Coloured boxes, for \LaTeX{} examples and theorems, etc.
\begin{lstlisting}
\RequirePackage{tcolorbox}
\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}
\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{sec:orgbefd239}

\begin{itemize}
\item We switch to the French typographic conventions for \package{siunitx}.
\begin{lstlisting}
\sisetup{
  , locale=FR
  , mode=text
}
\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 fix some defaults for the listings : we define a style for all the listings
which resets all the \TeX{} control sequences/keywords and then load all the
basic (La)\TeX{} dialects of \TeX{}. But we start with a dialect which is missing in
the \package*{listings}.
\begin{lstlisting}
\lstdefinelanguage[classes]{TeX}[LaTeX]{TeX}{%
  % Control sequences
  moretexcs={%
    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,Huge,
    indexname,indexspace,interlinepenalty,intextsep,it,jot,
    labelenumi,labelenumii,labelenumiii,labelenumiv,labelitemfont,
    labelitemi,labelitemii,labelitemiii,labelitemiv,labelsep,
    labelwidth,large,Large,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,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,description,figure,quotation,quote,table,
    thebibliography,theindex,titlepage,verse%
  },%
  % 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}

\begin{lstlisting}
\lstdefinestyle{__letgut_all_reset}{
  basicstyle=\ttfamily,
  language=TeX,%
  texcs={},%
  keywords={},%
  keywords=[2]{},%
  keywords=[3]{},%
  keywords=[4]{},%
  keywords=[5]{},%
  otherkeywords={},%
  alsoletter={},%
  alsodigit={},%
  alsolanguage=[AlLaTeX]TeX,%
  alsolanguage=[LaTeX]TeX,%
  alsolanguage=[plain]TeX,%
  alsolanguage=[common]TeX,%
  alsolanguage=[primitive]TeX,%
  alsolanguage=[classes]TeX,%
\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 zero length.
\begin{lstlisting}
belowskip=0pt,
}
\lstset{
  style=__letgut_all_reset
}
\end{lstlisting}
This style is applied automatically at the beginning of each \lstinline+\input+
file. 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.
\begin{lstlisting}
\AddToHook{cmd/input/before}{
  \lstset{%
    style=__letgut_all_reset,%
  }
}
\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]
}
\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 footnote, with small caps shape. When they are
(English) foreign, it will be specified and the translation will be added.
\begin{lstlisting}
\acsetup{
  first-style=footnote,
  format/short = {\scshape},
  format/foreign = {\em},
  foreign/display,
  locale/format = {\upshape},
  locale/display,
}
\end{lstlisting}
 Moreover, we redefine the private macro \lstinline+\acro_footnote:n+ of the
\package*{acro} in order to make the footnotes displaying the long forms of the
acronyms ended by a period (like ordinary footnotes).
\begin{lstlisting}
\cs_undefine:N \acro_footnote:n
\cs_new_protected:Npn \acro_footnote:n #1
{
  \tl_set:Ne \l__acro_tmpa_tl {
     \l__acro_fnpct_check_tl
     }
  \exp_last_unbraced:Nno
  \footnote {#1.}
  \l__acro_tmpa_tl
}
\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.
\end{itemize}

\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{draft}
}{
  \hypersetup{%
    colorlinks,%
    allcolors={letgut_allcolors_links},%
  }%
}
\end{lstlisting}

A preset of acronyms is input (if found).
\begin{lstlisting}
\file_if_exist:nT {\c__letgut_acronyms_file_tl}{
  \file_input:n {\c__letgut_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+\footnote{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_tmpa_box {
  \fontsize{0.25\paperwidth}{0.3\paperwidth}
  \selectfont
  \c__letgut_draftwatermark_text_tl
}
\hbox_set:Nn \l_tmpb_box {
  \hbox_overlap_center:n {
    \box_use:N \l_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_tmpb_box {
  \fp_eval:n {
    atand (
    \dim_to_fp:n {\paperheight}
    /
    \dim_to_fp:n {\paperwidth}
    )
  }
}
\box_use:N \l_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{Date handling}
\label{sec:org5c102e6}

\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{Page color default settings}
\label{sec:orgbdbe3de}

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{sec:orgc4ef889}

These options look to need to be specified rather at the end (throws an error if
defined before the \lstinline+\__letgut_date_parse:n+'s definition):

\begin{itemize}
\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,
\item \lstinline+membership-reminder+ that typesets a membership reminder on the first page,
\end{itemize}

\begin{lstlisting}
\keys_define:nn { letgut/setup }
{
  , 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
  , number .int_gset:N = \g__letgut_number_int
  , date .code:n = { \__letgut_date_parse:n { #1 } }
  , date .initial:x = {\the\year-\the\month}
  , 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 .bool_gset_inverse:N = \g__letgut_paper_bool
  , 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}
      }
    }
  }
  , 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 }
}
\end{lstlisting}

\subsection{Headers}
\label{sec:org0244c68}

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]{\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{sec:org56c8ec1}
We want the marginal notes to be in the left margin.

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

\subsection{Table of contents}
\label{sec:org861e968}

The table of contents is customized:

\begin{itemize}
\item only the titles of the articles are shown (but the bookmarks have their natural depth):
\end{itemize}
\begin{lstlisting}
\etocsetnexttocdepth{0}
\end{lstlisting}
\begin{itemize}
\item layout:
\begin{lstlisting}
\etocsetstyle {section}
{}
{\leavevmode\leftskip 2cm\relax}
{\normalsize%
  \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{sec:org282c9ab}

\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{sec:org1d5f02b}

\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{“Title” and marks}
\label{sec:org7f25fee}

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 {
     \textit{\c__letgut_La_lettre_gutenberg_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{sec:org30496fe}

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}
\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){
	\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}]{
    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.
\begin{lstlisting}
\pdfbookmark[1]{
  \c__letgut_contents_name_tl
}{
  \c__letgut_contents_name_tl
}
\tableofcontents
\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{ m } {
      \__letgut_author:n { #1 }
    }
    \pdfbookmark[1]{Éditorial}{
      \c__letgut_editorial_file_tl
    }
    \file_input:n {./\c__letgut_editorial_file_tl}
    % % \int_set:N \l_tmpa_int {\pagenumber}
    % % \int_compare:nNnT \l_tmpa_int = 1 { \newpage }
\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{sec:org4d6bc37}

The last page is special: it should automatically contain some informations about
\gutenberg.

\begin{lstlisting}
\AddToHook{enddocument}
{
\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. 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}{
    \file_input:n {./\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{sec:org4d2fa9d}

\subsubsection{Numbering}
\label{sec:orge3d86f9}
We want all the sections to be unnumbered.

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

\subsubsection{Format}
\label{sec:org36330f3}

\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
    \text_uppercase:n
  }{}{1em}{
    \aldineleft\c_space_tl
    }{}
  \etocsetlevel{title}{0}
  \def\toclevel@title{0}%
  \etocsetstyle {title}
  {}
  {
    \leavevmode\leftskip 2cm\relax
  }
  {\mdseries\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{sec:orga7db03b}

\subsubsection{Setup}
\label{sec:org35e852f}

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

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

\subsubsection{For the rubric dedicated to new stuffs appeared on \acs{ctan}}
\label{sec:orga18e077}

\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}{
    \includegraphics[width=\f@size pt]{
      Flag_of_La_Francophonie-crop
    }
  }
}
\end{lstlisting}
\end{itemize}

\subsubsection{Persons and authors}
\label{sec:org73bd77f}

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} { m } {
  \__letgut_process_list:n {#1}
}
\cs_new_protected:Npn \__letgut_author:n #1
{
  \nopagebreak
  \begin{flushright}
    \__letgut_process_list:n {#1}
  \end{flushright}
}
\AddToHook{begindocument/end}{%
  \RenewDocumentCommand\author{ m } {
    \__letgut_author:n { #1 }
  }
}
\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_tmpa_seq { - }  {#1}
  \seq_set_map_x:NNn \l_tmpb_seq \l_tmpa_seq {
    \text_titlecase_first:n{ \text_lowercase:n {##1} }
  }
  \tl_set:Nx \l_tmpa_tl {\seq_use:Nn \l_tmpb_seq {-}}
  \seq_clear:N \l_tmpa_seq
  \seq_set_split:NnV \l_tmpa_seq { ~ }  { \l_tmpa_tl }
  \seq_set_map_x:NNn \l_tmpb_seq \l_tmpa_seq {
    \text_titlecase_first:n{##1}
  }
  \seq_use:Nn \l_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:n #1
{
  \seq_clear:N \l__letgut_items_seq
  \seq_set_split:Nnn \l_tmpa_seq {and} {#1}
  \seq_map_inline:Nn \l_tmpa_seq {
    \seq_set_from_clist:Nn \l_tmpb_seq {##1}
    \seq_pop_left:NN \l_tmpb_seq \l_letgut_last_name_tl
    \seq_pop_left:NN \l_tmpb_seq \l_letgut_first_name_tl
    \seq_pop_left:NN \l_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}

\subsubsection{Horizontal rule}
\label{sec:orgc866c8e}

\begin{lstlisting}
\NewDocumentCommand {\separator} {  } {
  \par
  \skip_vertical:N 1em
  \hrule
  \skip_vertical:N 1em
}
\end{lstlisting}

\subsubsection{Alert boxes}
\label{sec:org7e6600e}

\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{sec:orgaf32b00}

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
{
  \tl_if_empty:nTF {#1}
  {
    {\l__letgut_softwares_font_switch_tl #2}
  }{
    \href{#1}{{\l__letgut_softwares_font_switch_tl #2}}
  }
}
\cs_new_protected:Nn \__letgut_file:n
{
  {\l__letgut_files_font_switch_tl #1}
}
\NewDocumentCommand{\package}{ s o m O{package} } {
  \IfBooleanT{#1}{
    #4
    \c_space_tl
  }
  \__letgut_tex_stuff:nn {#2}{#3}
}
\NewDocumentCommand{\class}{ s o m O{classe} } {
  \IfBooleanT{#1}{
    #4
    \c_space_tl
  }
  \__letgut_tex_stuff:nn {#2}{#3}
}
\NewDocumentCommand{\file}{ s m O{fichier} } {
  \IfBooleanT{#1}{
    #3
    \c_space_tl
  }
  \__letgut_file:n {#2}
}
\NewDocumentCommand {\software} { s O{} m O{logiciel} } {
  \IfBooleanT{#1}{
    #4
    \c_space_tl
  }
  \__letgut_software:nn {#2}{#3}
}
\end{lstlisting}

\subsubsection{Names, etc.}
\label{sec:org45141b1}

\begin{lstlisting}
 \NewExpandableDocumentCommand { \gutenberg } {  } {
   \c__letgut_gutenberg_tl
 }
 \NewExpandableDocumentCommand { \gut } {  } {
   \c__letgut_gutenberg_tl
 }
\NewExpandableDocumentCommand { \lettre } { } {
  \c__letgut_Lettre_tl
 }
 \NewExpandableDocumentCommand { \lettregut } { } {
   \lettre \c_space_tl \gutenberg
 }
 \NewExpandableDocumentCommand { \Cahier } { } {
   \c__letgut_cahier_tl
 }
 \NewExpandableDocumentCommand { \Cahiers } { } {
   \c__letgut_cahiers_tl
 }
 \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}
 }
\end{lstlisting}

\subsubsection{Foreign locutions}
\label{sec:org32f4b23}

\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{Bookmarks handling}
\label{sec:org2ee5370}

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

\begin{lstlisting}
\AddToHook{begindocument/end}{
  \pdfstringdefDisableCommands{
    \def\person#1{#1}
    \def\author#1{#1}
    \def\package#1{#1}
    % \def\package*#1{package~#1}
    \def\class#1{#1}
    % \def\class*#1{classe~#1}
    \def\file#1{#1}
    % \def\file*#1{fichier~#1}
    \def\software#1{#1}
    % \def\software*#1{logiciel~#1}
    \def\foreignloc#1{#1}
    \def\lettre{Lettre}
    \def\gutenberg{GUTenberg}
    \def\gut{\gutenberg}
    \def\lettregut{\lettre\c_space_tl\gutenberg}
    \def\Cahier{Cahier}
    \def\Cahiers{\Cahier s}
    \def\letgut{letgut}
    \def\letgutcls{classe~ letgut}
    \def\knuth{Donald~ E.~ Knuth}
    \def\lamport{Leslie~ Lamport}
    \def\latinloc#1{#1}
  }
}
\end{lstlisting}

\subsubsection{Acronyms}
\label{sec:orgd329484}

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 the 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.

\begin{lstlisting}
\NewCommandCopy{\__letgut_old_footnote}{\footnote}
\RenewDocumentCommand {\footnote} { m }{
  \bool_set_true:N \l__letgut_in_footnote_bool
  \__letgut_old_footnote { #1 }
  \bool_set_false:N \l__letgut_in_footnote_bool
}
\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{sec:orgc523238}

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}}
  \__letgut_old_citeauthor[#1][#2]{#3}
}
\end{lstlisting}

\subsection{Book reviews}
\label{sec:org2fd9b20}

\begin{lstlisting}
\tl_new:N \g__letgut_bookreview_frontcover_tl
\tl_new:N \g__letgut_bookreview_bibkey_tl
\end{lstlisting}
The keys options are created.
\begin{lstlisting}
\keys_define:nn { gzt/bookreview }
{
  title .tl_gset:N = \g__letgut_bookreview_title_tl,
  frontcover .tl_gset:N = \g__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 }
{
  \keys_set:nn { gzt/bookreview } { #1 }
  \section{\g__letgut_bookreview_title_tl}
  \tl_if_empty:NTF \g__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{\g__letgut_bookreview_frontcover_tl##1}{
	\bool_set_true:N \l_tmpa_bool
	\clist_map_break:
      }
    }
    \bool_if:NTF \l_tmpa_bool {
      \marginpar{
	\hspace*{\c__letgut_bookreview_frontcover_margin_sep_dim}
	% \raggedleft
	\raisebox{-\totalheight}{
	  \fbox{
	    \includegraphics[width=-\c__letgut_title_hoffset_dim]{
	      \g__letgut_bookreview_frontcover_tl
	    }
	  }
	}
      }
    }{
      \msg_error:nnVV
      {letgut}
      {frontcover-file-not-found}
      {\g__letgut_bookreview_title_tl}
      {\g__letgut_bookreview_frontcover_tl}
    }
  }
  \noindent
  \textsf{\fullcite{\g__letgut_bookreview_bibkey_tl}}
  \tl_if_empty:NF \g__letgut_bookreview_price_tl{
    .\c_space_tl\EUR{\g__letgut_bookreview_price_tl}
  }
  \par
}{
  \exp_args:NV \author{\g__letgut_bookreview_reviewer_tl}
}
\end{lstlisting}

\subsection{Miscellanous}
\label{sec:org00f0870}

\begin{itemize}
\item We specify the possible hyphenations of \enquote{\gutenberg}.
\end{itemize}
\begin{lstlisting}
\hyphenation{GUT-enberg}
\end{lstlisting}

\subsubsection{Non selectable text}
\label{sec:org4c4b60b}

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{sec:org61c4abd}

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 a better 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/before}{
  \ProvideDocumentCommand{\meta}{ O{__letgut_meta} m } {
    \__letgut_meta:nn {#1}{#2}
  }
}
\end{lstlisting}

\subsection{\LaTeX{} listings and examples}
\label{sec:org371597a}

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}

We now define the colors for the syntax highlighting and define the style of our
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}
\lstset{%
  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}},
  escapechar=£,
  literate=*%
  {\\\\}{{{\color{__letgut_texcs}\textbackslash\textbackslash}}}{2}%
  {\\[}{{\textcolor{__letgut_math}{\textbackslash[}}}{2}%
  {\\]}{{\textcolor{__letgut_math}{\textbackslash]}}}{2}%
  {$}{{\textcolor{__letgut_math}{\$}}}{1}%$
}
\end{lstlisting}

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

\begin{lstlisting}
\tcbuselibrary{listings,xparse,breakable,skins}
\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~ \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_tmpa_int {\getpagerefnumber{#1}}
  \tl_set:Nn \l_tmpb_int {\thepage}
  \int_compare:nNnF {\l_tmpa_int} = {\l_tmpb_int}
  {#2}
}
\end{lstlisting}

We define the style of the codes and the results boxes.

\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=tcblatex,
      numbers=left,
      numbersep=\c__letgut_number_sep_dim,
\end{lstlisting}
We want the line numbers to not be selectable, hence the \lstinline+\__letgut_unselectable:n+:.
\begin{lstlisting}
numberstyle=
  \scriptsize
  \ttfamily
  \color{__letgut_foregroundLinenumber}
  \__letgut_unselectable:n,
},
every~ float=\raggedleft,
colback=__letgut_backgroundCode,
breakable,
sharp~ corners,
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,
},
__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_tmpa_tl {
    \getpagerefnumber {
      \g__letgut_callout_label_ltx_example_str
    }
  }
  \tl_set:Nx \l_tmpb_tl {
    \getpagerefnumber {
      \g__letgut_label_ltx_example_str
    }
  }
  \tl_if_eq:NNF \l_tmpa_tl \l_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_tmpa_tl {
    \getpagerefnumber {
      \g__letgut_callout_label_ltx_example_str
    }
  }
  \tl_set:Nx \l_tmpb_tl {
    \getpagerefnumber {
      \g__letgut_label_ltx_example_str
    }
  }
  \tl_if_eq:NNF \l_tmpa_tl \l_tmpb_tl
  {
    \skip_set_eq:NN \intextsep \c__letgut_reduced_intextsep_skip
  }
}
\end{lstlisting}

\subsection{Local config file}
\label{sec:org562c2a3}

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 of the end of 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}{
  \AddToHook { file/before/./\c__letgut_local_config_file_tl } {
    \ExplSyntaxOff
  }
  \file_input:n {./\c__letgut_local_config_file_tl}
}
\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{sec:org14731c9}

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}[2022-03-18 v0.9 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}[2022-03-18 v0.9 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}[2022-03-18 v0.9 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{sec:org59fbe1b}

\subsection{Example file of an issue of the newsletter}
\label{sec:org4b9a54d}

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

\setmainfont{TeX Gyre Schola} % Par exemple

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

% \addbibresource{biblio.bib}

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

%%% Local Variables:
%%% mode: latex
%%% TeX-engine: luatex
%%% TeX-master: t
%%% End:
\end{lstlisting}

\subsection{Example of an editorial}
\label{sec:orgf79a2c2}

\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{sec:orgcc0dfe6}

\begin{lstlisting}
\enlargethispage{1.5cm}
\small
\vspace*{-1cm}
\hspace*{-1.5cm}%
\raisebox{-\height+0.7\baselineskip}{%
  \begin{minipage}[t]{.6\textwidth}%\vspace{0pt}%
    \includegraphics[width=\linewidth]{logo-gut.pdf}
  \end{minipage}%
}%
\hfill%
\begin{minipage}[t]{.4\textwidth}%\vspace{0pt}%
  \footnotesize\raggedleft%
  Association \gut{}\\
  15 rue des Halles -- \textsc{bp} 74\\
  75001 Paris\\
  France\\
  \nolinkurl{secretariat@gutenberg.eu.org}
\end{minipage}%

\begin{description}
\item[Site internet :] \url{https://www.gutenberg.eu.org/}
\item[\Cahiers{} :] \url{http://cahiers.gutenberg.eu.org/}
\item[Problèmes techniques :]
  \leavevmode
  \begin{description}
  \item[la liste \texttt{gut} :]
    \url{https://www.gutenberg.eu.org/-Listes-de-diffusion-}
  \item[le site \TeX nique de questions et réponses :]
    \url{https://texnique.fr/}
  \item[la foire aux questions :]
    \url{https://faq.gutenberg.eu.org}
  \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 \nolinkurl{secretariat@gutenberg.eu.org}.%
}

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

\section{Tarifs \the\year}

Les membres de \gut\ peuvent adhérer à l'association
internationale, le \acf{tug}, et recevoir son bulletin
\emph{\acs{tug}boat} à un tarif préférentiel :
\begin{description}
\item[tarif normal :] \EUR{65} (au lieu de 85~\$)
\item[tarif étudiant :] \EUR{40} (au lieu de 55~\$)
\end{description}
% (\EUR{49,50}, étudiants et demandeurs d'emploi :
% \EUR{29}, au lieu de 85\$ et % 65\$).  Voir
% \url{%
% https://www.gutenberg.eu.org/?Adherer-a-l-association%
% }.

\footnotesize
\begin{center}
  \begin{tabular}{lr}
    \toprule
    \textbf{Type d'adhésion}                        & \textbf{Prix} \\
    \midrule
    Membre individuel                               & \EUR{30}      \\
    Membre individuel + adhésion \acs{tug}          & \EUR{95}      \\
    Membre individuel étudiant/demandeur d'emploi   & \EUR{15}      \\
    Membre individuel étudiant + adhésion \acs{tug} & \EUR{55}      \\
    Association d'étudiants                         & \EUR{65}      \\
    Organisme à but non lucratif                    & \EUR{130}     \\
    Organisme à but lucratif                        & \EUR{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}} (IBAN :
  FR76 1870 7000 3003 0191 3568 475)%
  \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.eu.org/?Adherer-en-ligne}
\item bulletin et chèque\footnotemark[\value{footnote}] :
  \url{https://www.gutenberg.eu.org/?Adherer-a-l-association}
\end{itemize}

\vfill

\begin{center}
  \begin{tblr}{
      width=.75\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 \bsc{Bideault}, Denis \bsc{Bitouzé},  \\
      Céline \bsc{Chevalier} \& Maxime \bsc{Chupin}} \\
    Adresse de la rédaction : &
    {
      Association \gut\\
      15 rue des Halles -- \textsc{bp} 74\\
      75001 Paris
    }
    \\
    \acs{issn} : & 2742-6149 (version numérique)
  \end{tblr}
\end{center}
\vfill
\mbox{}
\clearpage

%%% Local Variables:
%%% mode: latex
%%% End:
\end{lstlisting}
\end{document}