diff options
Diffstat (limited to 'Master/texmf-dist/doc/lualatex/letgut/letgut-code.tex')
-rw-r--r-- | Master/texmf-dist/doc/lualatex/letgut/letgut-code.tex | 3361 |
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 |