summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/lualatex/letgut/letgut-code.tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/doc/lualatex/letgut/letgut-code.tex')
-rw-r--r--Master/texmf-dist/doc/lualatex/letgut/letgut-code.tex3361
1 files changed, 3361 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/lualatex/letgut/letgut-code.tex b/Master/texmf-dist/doc/lualatex/letgut/letgut-code.tex
new file mode 100644
index 00000000000..347a2a5c798
--- /dev/null
+++ b/Master/texmf-dist/doc/lualatex/letgut/letgut-code.tex
@@ -0,0 +1,3361 @@
+% 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} \ No newline at end of file