From e959bf768ba654cf95f09ea8922f2e558a9d3dd3 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Mon, 21 Mar 2022 21:48:14 +0000 Subject: letgut (21mar22) git-svn-id: svn://tug.org/texlive/trunk@62879 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/lualatex/letgut/CHANGELOG.md | 12 + Master/texmf-dist/doc/lualatex/letgut/README.md | 17 + .../doc/lualatex/letgut/exemple-nouveautes.pdf | Bin 0 -> 19444 bytes Master/texmf-dist/doc/lualatex/letgut/latexmkrc | 27 + .../texmf-dist/doc/lualatex/letgut/letgut-code.pdf | Bin 0 -> 444403 bytes .../texmf-dist/doc/lualatex/letgut/letgut-code.tex | 3361 +++++++++++++++++++ Master/texmf-dist/doc/lualatex/letgut/letgut.bib | 9 + Master/texmf-dist/doc/lualatex/letgut/letgut.pdf | Bin 0 -> 309781 bytes Master/texmf-dist/doc/lualatex/letgut/letgut.tex | 1435 +++++++++ .../doc/lualatex/letgut/listings-conf.tex | 40 + .../texmf-dist/doc/lualatex/letgut/localconf.tex | 187 ++ .../doc/lualatex/letgut/xindex-letgut.lua | 94 + Master/texmf-dist/source/lualatex/letgut/HOWTO.md | 33 + .../source/lualatex/letgut/letgut-banner.org | 804 +++++ .../texmf-dist/source/lualatex/letgut/letgut.org | 3405 ++++++++++++++++++++ .../letgut/Flag_of_La_Francophonie-crop.pdf | Bin 0 -> 2148 bytes .../tex/lualatex/letgut/informations-gut.tex | 155 + .../tex/lualatex/letgut/letgut-acronyms.tex | 198 ++ .../tex/lualatex/letgut/letgut-banner.sty | 450 +++ Master/texmf-dist/tex/lualatex/letgut/letgut.cbx | 16 + Master/texmf-dist/tex/lualatex/letgut/letgut.cls | 1865 +++++++++++ Master/texmf-dist/tex/lualatex/letgut/letgut.dbx | 50 + Master/texmf-dist/tex/lualatex/letgut/letgut.lbx | 8 + Master/texmf-dist/tex/lualatex/letgut/logo-gut.pdf | Bin 0 -> 6708 bytes Master/tlpkg/bin/tlpkg-ctan-check | 2 +- Master/tlpkg/tlpsrc/collection-langfrench.tlpsrc | 1 + Master/tlpkg/tlpsrc/letgut.tlpsrc | 0 27 files changed, 12168 insertions(+), 1 deletion(-) create mode 100644 Master/texmf-dist/doc/lualatex/letgut/CHANGELOG.md create mode 100644 Master/texmf-dist/doc/lualatex/letgut/README.md create mode 100644 Master/texmf-dist/doc/lualatex/letgut/exemple-nouveautes.pdf create mode 100644 Master/texmf-dist/doc/lualatex/letgut/latexmkrc create mode 100644 Master/texmf-dist/doc/lualatex/letgut/letgut-code.pdf create mode 100644 Master/texmf-dist/doc/lualatex/letgut/letgut-code.tex create mode 100644 Master/texmf-dist/doc/lualatex/letgut/letgut.bib create mode 100644 Master/texmf-dist/doc/lualatex/letgut/letgut.pdf create mode 100644 Master/texmf-dist/doc/lualatex/letgut/letgut.tex create mode 100644 Master/texmf-dist/doc/lualatex/letgut/listings-conf.tex create mode 100644 Master/texmf-dist/doc/lualatex/letgut/localconf.tex create mode 100644 Master/texmf-dist/doc/lualatex/letgut/xindex-letgut.lua create mode 100644 Master/texmf-dist/source/lualatex/letgut/HOWTO.md create mode 100644 Master/texmf-dist/source/lualatex/letgut/letgut-banner.org create mode 100644 Master/texmf-dist/source/lualatex/letgut/letgut.org create mode 100644 Master/texmf-dist/tex/lualatex/letgut/Flag_of_La_Francophonie-crop.pdf create mode 100644 Master/texmf-dist/tex/lualatex/letgut/informations-gut.tex create mode 100644 Master/texmf-dist/tex/lualatex/letgut/letgut-acronyms.tex create mode 100644 Master/texmf-dist/tex/lualatex/letgut/letgut-banner.sty create mode 100644 Master/texmf-dist/tex/lualatex/letgut/letgut.cbx create mode 100644 Master/texmf-dist/tex/lualatex/letgut/letgut.cls create mode 100644 Master/texmf-dist/tex/lualatex/letgut/letgut.dbx create mode 100644 Master/texmf-dist/tex/lualatex/letgut/letgut.lbx create mode 100644 Master/texmf-dist/tex/lualatex/letgut/logo-gut.pdf create mode 100644 Master/tlpkg/tlpsrc/letgut.tlpsrc diff --git a/Master/texmf-dist/doc/lualatex/letgut/CHANGELOG.md b/Master/texmf-dist/doc/lualatex/letgut/CHANGELOG.md new file mode 100644 index 00000000000..3aa86a94252 --- /dev/null +++ b/Master/texmf-dist/doc/lualatex/letgut/CHANGELOG.md @@ -0,0 +1,12 @@ +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic +Versioning](http://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +## [0.9] - 2022-03-18 + +### Added First public testing release diff --git a/Master/texmf-dist/doc/lualatex/letgut/README.md b/Master/texmf-dist/doc/lualatex/letgut/README.md new file mode 100644 index 00000000000..83e3c69e9d6 --- /dev/null +++ b/Master/texmf-dist/doc/lualatex/letgut/README.md @@ -0,0 +1,17 @@ +letgut-banner - Support for the banner of the newsletter + “La Lettre de GUTenberg” +============================================================= + +About +------- +This package automatically draw the banner of the newsletter “La Lettre de +GUTenberg” with the current main font. + +Release +------- +2022-03-18 v0.9 + +Development +----------- +Follow development, submit issues, and suggest improvements at +https://framagit.org/gutenberg/classe-lettre-gut. diff --git a/Master/texmf-dist/doc/lualatex/letgut/exemple-nouveautes.pdf b/Master/texmf-dist/doc/lualatex/letgut/exemple-nouveautes.pdf new file mode 100644 index 00000000000..276d417350e Binary files /dev/null and b/Master/texmf-dist/doc/lualatex/letgut/exemple-nouveautes.pdf differ diff --git a/Master/texmf-dist/doc/lualatex/letgut/latexmkrc b/Master/texmf-dist/doc/lualatex/letgut/latexmkrc new file mode 100644 index 00000000000..4f0bd48a74f --- /dev/null +++ b/Master/texmf-dist/doc/lualatex/letgut/latexmkrc @@ -0,0 +1,27 @@ +$pdf_mode = 4; + +$bibtex_use = 1; +$bibtex = 'biber %O %B'; + +$makeindex = 'xindex -c letgut -l "*"'; + +$quote_filenames = 0; + +$clean_ext .= ' synctex.gz* run.xml tex.bak out sta bbl bcf fdb_latexmk run tdo + listing *~ lo* xdy vrb ain atfi nav snm thm iny xref db* listing tcbtemp aux + idx ind lof lot out toc acn acr alg glg* glo* gls* ins sbl slg sym ist + run.xml xdy lol fls unq synctex.gz mw *~ aux bcf frm msk nlg nls ntn tcbtemp + thm nav nlo not idx ilg ind lof lot out toc acn acr alg glg glo gls glg2 gls2 + glo2 sbl slg slo sls sym glsdefs ist run.xml xdy lol fls unq synctex.gz *~ + listing png tkzfct.gnuplot tkzfct.table mw snm tns sta vrb xref 4ct 4tc idv + lg pre tmp *.typo upa' ; + +@generated_exts = qw(db* listing tcbtemp aux idx ind lof lot out toc acn acr alg +glg* glo* gls* ins sbl slg sym ist run.xml xdy lol fls unq synctex.gz mw *~ aux +bcf frm msk nlg nls ntn tcbtemp thm nav nlo not i dx ind lof lot out toc acn acr +alg glg glo gls glg2 gls2 glo2 sbl slg slo sls sym glsdefs ist run.xml xdy lol +fls unq synctex.gz *~ listing png tkzfct.gnuplot tkzfct.table mw snm tns sta +vrb xref *.typo upa); + +push @generated_exts, 'acn', 'acr', 'alg', 'bcf', 'fls', 'gl*', 'sbl*', 'sl*', 'sym*' ; + diff --git a/Master/texmf-dist/doc/lualatex/letgut/letgut-code.pdf b/Master/texmf-dist/doc/lualatex/letgut/letgut-code.pdf new file mode 100644 index 00000000000..bf4c676520e Binary files /dev/null and b/Master/texmf-dist/doc/lualatex/letgut/letgut-code.pdf differ 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 +% +% +% 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 diff --git a/Master/texmf-dist/doc/lualatex/letgut/letgut.bib b/Master/texmf-dist/doc/lualatex/letgut/letgut.bib new file mode 100644 index 00000000000..0593f3c1763 --- /dev/null +++ b/Master/texmf-dist/doc/lualatex/letgut/letgut.bib @@ -0,0 +1,9 @@ + +@online{AssociationGUTenbergLettreGUTenberg, + title = {Lettre GUTenberg}, + author = {{Association GUTenberg}}, + url = {https://www.gutenberg.eu.org/-Lettre-GUTenberg-}, + organization = {Groupe francophone des Utilisateurs de \TeX, \LaTeX{} et logiciels compagnons} +} + + diff --git a/Master/texmf-dist/doc/lualatex/letgut/letgut.pdf b/Master/texmf-dist/doc/lualatex/letgut/letgut.pdf new file mode 100644 index 00000000000..76847e9bce9 Binary files /dev/null and b/Master/texmf-dist/doc/lualatex/letgut/letgut.pdf differ diff --git a/Master/texmf-dist/doc/lualatex/letgut/letgut.tex b/Master/texmf-dist/doc/lualatex/letgut/letgut.tex new file mode 100644 index 00000000000..4d8c219baa4 --- /dev/null +++ b/Master/texmf-dist/doc/lualatex/letgut/letgut.tex @@ -0,0 +1,1435 @@ +\documentclass{letgut} + +% On compose la présente documentation en Kp-Fonts, sauf en ce qui concerne la +% fonte à chasse fixe qui n'est pas ce qu'il y a de plus réussi chez elle. +\setmainfont{KpRoman} +\setsansfont{KpSans} +% \setmonofont{TeX Gyre Cursor} +\setmonofont[Scale = MatchLowercase]{RobotoMono} + +% On ne veut pas d'éditorial dans cette « Lettre » et on veut que sa couleur de +% fond ne soit pas la couleur ivoire par défaut, mais du blanc. +\letgutsetup{ + , editorial=false + , pagecolor= {1,1,1} + % ,final +} + +\lstset{ + language=TeX,% + alsolanguage=[geometry]TeX,% + alsolanguage=[LaTeX]TeX,% + alsolanguage=[plain]TeX,% + alsolanguage=[common]TeX,% + alsolanguage=[primitive]TeX,% + alsolanguage=[xcolor]TeX,% + alsolanguage=[listings]TeX,% + alsolanguage=[biblatex]TeX,% + alsolanguage=[hyperref]TeX,% + alsolanguage=[extLaTeX]TeX,% + alsolanguage=[letgut]TeX,% + alsolanguage=[hologo]TeX,% + alsolanguage=[acro]TeX,% + alsolanguage=[tcolorbox]TeX,% + alsolanguage=[csquotes]TeX,% + alsolanguage=[varioref]TeX,% + alsolanguage=[babel-french]TeX,% +} + +% Bibliographie +\addbibresource{letgut.bib} + +% On définit quelques commandes (utiles seulement pour la présente +% documentation), par exemple celle permettant d'accéder à la couleur de fond du +% papier lorsque l'option `paper' n'est pas employée. +\ExplSyntaxOn +\NewDocumentCommand { \letgutdefaultpagecolor } { } { + \c__letgut_default_pagecolor_screen_clist +} +\definecolor{letgutdefaultpagecolor}{rgb}{\c__letgut_default_pagecolor_screen_clist} + +\NewDocumentCommand { \letgutalertboxdefaultcolor } { } { + \c__letgut_default_alert_box_color_tl +} + +\NewDocumentCommand { \letgutallcolorslinks } { } { + \c__letgut_default_allcolors_links_color_tl +} + +\NewDocumentCommand { \docker } { s } { + \IfBooleanTF{#1}% + {\software{docker}}% + {\software[https://docs.docker.com/]{Docker}}% +} + +\pdfstringdefDisableCommands{% + \def\docker{Docker} +} +\ExplSyntaxOff + +% Acronymes +\letgutacro[tag=thisdocument]{LD}{\LaTeX{} dépendant} +\letgutacro[tag=thisdocument]{CD}{Compact Disc}[] +\letgutacro[tag=thisdocument]{TLMGR}{\TeX~Live Manager}[gestionnaire \TeX~Live] +\letgutacro[tag=thisdocument,short=no-op,short-format=\upshape] % Désactive les petites capitales +{NOOP} +{No Operation} +[instruction nulle] +\letgutacro{CPGÉ}{Classes Préparatoires aux Grandes Écoles} + +% Éléments du titre +\title{% + Documentation de la + \texorpdfstring{% + \letgutcls% + }{% + classe letgut% + }% +} +\author{Association GUTenberg} +\date{% + Version 0.9 en date du \today% + \texorpdfstring{% + \\ + \url{https://framagit.org/gutenberg/classe-lettre-gut}% + }{% + }% +} + +% \tcbset{index command name=\jobname-commands} +% \makeindex[name=\jobname-commands,title=Index des commandes,extout=odx,extin=ond,columnseprule] +% \makeindex[title=Index des concepts,extout=pdx,extin=pnd,columnseprule] +\begin{document} + +\title{Introduction} +\label{sec:introduction} +L'association \gutenberg{} publie la \lettregut{}, son bulletin irrégulomestriel, +depuis février 1993 \autocite{AssociationGUTenbergLettreGUTenberg}. + +Pour ce faire, une classe \hologo{(La)TeX} dédiée, maison, a peu à peu vu le +jour\footnote{Notamment grâce au concours de \person{André, Jacques}, + \person{Flipo, Daniel} et \person{Chupin, Maxime}.} mais, au gré des +nouveaux besoins et des personnes qui ont assuré la publication de la \lettre{}, +son développement a été quelque peu erratique ; il n'aurait notamment pas été +possible de publier son code en l'état. En outre, sa documentation était +inexistante. + +Le \ca{} de l'association élu en novembre 2020 a souhaité fournir une classe +mieux structurée, davantage pérenne et documentée, à même d'être publiée sur le +\ctan{}. C'est désormais chose faite avec la présente \letgutcls\footnote{À + cette occasion, la classe a été légèrement renommée de \class[]{let-gut} en + \letgut{}.}. + +\title{Usage de la classe \letgut} +\label{sec:usage-de-la} + +\section{Compilation} +\label{sec:compilation} + +\begin{dbwarning}{\hologo{LuaLaTeX} (récent) et UTF-8 nécessaires}{lualatex-recent} + Les documents recourant à la \letgutcls{} doivent : + \begin{itemize} + \item être compilés avec le moteur \hologo{LuaLaTeX}\footnote{Dans une version + au minimum \texttt{1.13.2}, le format \software{lualatex} devant être dans + une version au minimum \texttt{2021.6.6}.} ; + \item avoir (de ce fait) comme codage d'entrée l'UTF-8\footnote{Y compris les + fichiers sources auxiliaires tels que les \file{.bib}.}. + \end{itemize} +\end{dbwarning} + +La section \enquote{\nameref{recours-docker}}, \vpageref{recours-docker}, +détaille un moyen de de disposer d'une telle version de \hologo{LuaLaTeX} sans +risque de perturber une installation de \hologo{(La)TeX} déjà existante. + +\section{Options} +\label{sec:options} + +La \letgutcls{} fournit deux types d'\meta{options} : + +\begin{description} +\item[\foreignloc{load-time} :] à spécifier \emph{exclusivement} au chargement + de la classe, selon la syntaxe usuelle + ×\documentclass[×\meta{options}×]{letgut}× +\item[\emph{non} \foreignloc{load-time} :] à spécifier \emph{exclusivement} en + argument de la commande dédiée \refCom{letgutsetup}. +\end{description} + +\subsection{Options \foreignloc{load-time}} +\label{sec:fore-time-meta} + +Ces options, au nombre de deux, sont \enquote{contraires} l'une de l'autre. + +\begin{docKeys} + { + { + doc name = for-readers, + doc description = {\valinitdef[\docValue*{true}][\docValue*{true}]}, + }, + { + doc name = for-authors, + doc description = {\valinitdef[\docValue*{false}][\docValue*{true}]}, + }, + }% + % + Ces clés booléennes, contraires l'une de l'autre, activent les versions + respectivement \enquote{pour lecteurs} (par défaut) et \enquote{pour auteurs} + de la \lettre{}. Celles-ci mettent en page la \lettre{} respectivement : + \begin{itemize} + \item telle que les lecteurs finaux la liront ; + \item telle que les auteurs d'articles de la \lettre{} peuvent le souhaiter au + cours de leur rédaction, notamment sans : + \begin{itemize} + \item titre ; + \item (r)appel à cotisation (cf. clé \refKey{membership-reminder}) ; + \item éditorial\footnote{Ou avertissement s'il n'est pas trouvé.} (cf. clé + \refKey{editorial}) ; + \item informations sur \gut{}\footnote{Ou avertissement si elles ne sont pas + trouvées.} (cf. clé \refKey{informations}). + \end{itemize} + \end{itemize} +\end{docKeys} + +\subsection{Options non \foreignloc{load-time}} +\label{sec:emphn-fore-time} + +\begin{docCommand}{letgutsetup}{\marg{options}} + \index{configuration}% + Cette commande permet de spécifier les \meta{options} \emph{non} \foreignloc{load-time} de la \letgutcls{}. +\end{docCommand} + +Ces \meta{options} sont les suivantes : + +\begin{docKeys} + { + { + doc name = draft, + doc description = {\valinitdef[\docValue*{true}][\docValue*{true}]}, + }, + { + doc name = final, + doc description = {\valinitdef[\docValue*{false}][\docValue*{true}]}, + }, + }% + % + Ces clés booléennes, contraires l'une de l'autre, activent les versions + respectivement \enquote{brouillon} (par défaut) et \enquote{final} de la + \lettre{}. + + En version \enquote{brouillon}, et seulement dans cette version% \footnote{Avec + % la version actuelle, une conséquence supplémentaire mais temporaire est + % que } + : + \begin{enumerate} + \item le \package*{lua-typo} est chargé\footnote{En fait, cela est + momentanément désactivé car le \package*{luacolor}, chargé en sous-main + par \package{lua-typo}, ne fonctionne actuellement pas bien avec une + fonctionnalité du noyau \hologo{LaTeX} utilisée par la classe (plus de + détails + \href{https://github.com/ho-tex/luacolor/issues/4}{ici}.)}. Celui-ci met + en lumière, par un changement de couleur, les lignes typographiquement + imparfaites d’un fichier \pdf*{} produit par \hologo{LuaLaTeX} ; + \item le mot \enquote{Brouillon} figure en filigrane sur chaque page ; + \item les boîtes trop pleines (\foreignloc{Overfull \docAuxCommand*{hbox}}) + sont mises en évidence comme avec les classes standards. + \end{enumerate} +\end{docKeys} + +\begin{docKeys} + { + { + doc name = screen, + doc description = {\valinitdef[\docValue*{true}][\docValue*{true}]}, + }, + { + doc name = paper, + doc description = {\valinitdef[\docValue*{false}][\docValue*{true}]}, + }, + }% + % + Ces clés booléennes, contraires l'une de l'autre, activent les formats de + sortie respectivement \enquote{écran} (par défaut) et \enquote{papier} de la + \lettre{}. + + En version \enquote{écran}, et seulement dans cette version, la couleur de + fond du papier est par défaut non pas le blanc mais celle spécifiée (et + modifiable) par \refKey{pagecolor}. +\end{docKeys} + +\begin{docKey}{number}{=\meta{numéro}}{\valinitdef} + Cette clé permet de spécifier le \meta{numéro} de la \lettre{}. +\end{docKey} + +{% + % \tcbset{before lower=\vspace*{.5\baselineskip}\par} + \begin{docKey}{date}{=\meta{année}\texttt{-}\meta{mois} ou \meta{texte}}{\valinitdef[année et mois en cours]} + Cette clé permet de spécifier la date de la \lettre{}. Celle-ci est affichée sous + la forme : + \begin{itemize} + \item \enquote{\meta{Mois} \meta{année}} dans les cas où l'option : + \begin{itemize} + \item n'est pas employée (les mois et année en cours sont alors + utilisés) ; + \item est employée sous la forme \refKey*{date}×=×\meta{année}×-×\meta{mois} + où \meta{année} et \meta{mois} doivent être des nombres entiers + positifs. Les garde-fous suivants sont mis en place : + \begin{itemize} + \item si \meta{année} n'est pas celle en cours ou la suivante, elle est + remplacée par l'année en cours ; + \item si \meta{mois} n'est pas entre $1$ et $12$, il est remplacé par le + mois en cours ; + \end{itemize} + \end{itemize} + \item \enquote{\meta{texte}} si l'option est employée sous la forme + \refKey*{date}×=×\meta{texte}. + \end{itemize} + \end{docKey} +} + +\begin{docKey}{pagecolor}{=\marg{couleur}}{\valinitdef[\docValue*{letgut_pagecolor}]} + Cette clé permet, si (et seulement) l'option \refKey{paper} \emph{n'}est + \emph{pas} employée, de spécifier (selon le modèle \enquote{rgb}) une + \meta{couleur} de fond du papier autre que celle appliquée par + défaut\footnote{C'est-à-dire \colorbox{letgutdefaultpagecolor}{celle-ci}% , dont + % la valeur \enquote{rgb} est \docValue*{\letgutdefaultpagecolor} + .}. +\end{docKey} + +\begin{docKey}{allcolorslinks}{=\meta{couleur}}{\valinitdef[\docValue*{letgut_allcolors_links}]} + Cette clé permet de spécifier (selon le modèle \enquote{\foreignloc{named}}) + une \meta{couleur} pour (tous) les liens hypertextes autre que celle + \docColor{letgut_allcolors_links} par défaut\footnote{C'est-à-dire + \textcolor{letgut_allcolors_links}{celle-ci}% , égale + % à \docValue*{\letgutallcolorslinks} + .}. +\end{docKey} + +\begin{docKey}{membership-reminder}{}{\valinitdef[\docValue*{true}][\docValue*{true}]} + Cette clé booléenne affiche automatiquement un (r)appel à cotisation en bas de + 1\iere{} page de la \lettre{}. +\end{docKey} + +\begin{docKey}{editorial}{}{\valinitdef[\docValue*{true}][\docValue*{true}]} + Cette clé booléenne importe automatiquement en tout début de la \lettre{} + (néanmoins après le titre et le sommaire) le \file*{editorial.tex} contenant + l'éditorial. Si aucun \file*{editorial.tex} n'est trouvé dans le répertoire + courant, un avertissement est émis lors de la compilation et une boîte + d'alerte est affichée en 1\iere{} page. +\end{docKey} + +\begin{docKey}{informations}{}{\valinitdef[\docValue*{true}][\docValue*{true}]} + Cette clé booléenne importe automatiquement en dernière page de la \lettre{} + le \file*{informations-gut.tex} contenant toutes les informations sur + \gut{}. Si aucun \file*{informations-gut.tex} n'est trouvé dans le + répertoire courant, un avertissement est émis lors de la compilation et une + boîte d'alerte est affichée en dernière page. +\end{docKey} + +\section{Titre et titres courants} +\label{sec:titre} +Si la commande \docAuxCommand{title}\marg{titre} est +\begin{description} +\item[\emph{non} utilisée :] le titre du document est construit à partir du + \meta{numéro} et de la \meta{date} spécifiés (cf. clés \refKey{number} et + \refKey{date}). Il figure alors automatiquement en 1\iere{} page sous la forme + \enquote{Numéro \meta{numéro} -- \meta{date}}. Le titre courant est alors + \enquote{La \lettregut{}, \meta{date}} ; +\item[\phantom{\emph{non}} utilisée\footnotemark{} :]\footnotetext{Ainsi que les + habituelles commandes \docAuxCommand{author} et \docAuxCommand{date}.} et + ce, \emph{avant \lstinline+\\begin\{document\}+}, le \meta{titre} du document + figure alors automatiquement en 1\iere{} page sous sa forme habituelle et est + suivie d'un changement de page. Le titre courant est alors + \enquote{\meta{titre}, \meta{date}}. +\end{description} + +\begin{dbwarning}{\docAuxCommand{title} et \docAuxCommand{author} + $\neq$ avant et après \lstinline+\\begin\{document\}+}{} + Les commandes \docAuxCommand{title} et \docAuxCommand{author} ne se comportent + pas de la même façon avant et après \lstinline+\begin{document}+ (cf. sections + \nameref{sec:structuration} \vpageref{sec:structuration} et + \nameref{sec:sign-des-articl} \vpageref{sec:sign-des-articl}). +\end{dbwarning} + +\begin{dbwarning}{Commande \docAuxCommand{maketitle} à \emph{ne pas} employer}{} + La commande \docAuxCommand{maketitle} est à \emph{ne pas} employer car elle + l'est en sous-main par la classe. +\end{dbwarning} + +\section{Structuration} +\label{sec:structuration} + +\begin{docCommands}[ + doc parameter = \oarg{intitulé alternatif}\marg{intitulé} + ] + { + { doc name = title }, + { doc name = subtitle }, + { doc name = section }, + { doc name = subsection }, + { doc name = subsubsection }, + { doc name = paragraph }, + { doc name = subparagraph }, + } + % + Ces commandes permettent de structurer le contenu de la \lettre{} : + \begin{itemize} + \item \refCom{title} est celle de plus haut niveau, introduisant + l'\meta{intitulé} de chaque article (automatiquement composé en grandes + capitales et précédé de l'ornement \aldineleft) ; + \item \refCom{subtitle}, de niveau suivant et facultative, introduisant un + \meta{intitulé} d'éventuel sous-titre d'article (automatiquement composé en + grandes capitales). Ceci peut être utile par exemple pour distinguer des + parties indépendantes d'un même article ; + \item celles de niveaux suivants sont les habituelles commandes de + structuration fournies par la \class*{article}. + \end{itemize} +\end{docCommands} + +\begin{dbremark}{Structure non numérotée}{} + Les titres, sous-titres, sections, sous-sections, etc. de la \lettre{} ne sont + pas numérotés. Aussi pourra-t-on, pour faire référence à l'une de ces + rubriques, recourir aux commandes : + \begin{itemize} + \item \docAuxCommand{nameref} pour en citer l'\meta{intitulé} ; + \item \docAuxCommand{vpageref} pour en citer la page ; + \item \docAuxCommand{enquote} pour, le cas échéant, faire figurer + l'\meta{intitulé} entre guillemets ; + % \item \docAuxCommand{namecref} (fournie par le \package*{cleveref}, chargé par + % \letgut{}) pour en citer la nature (le cas échéant). + \end{itemize} + ces trois commandes étant directement utilisables puisque fournies par les + packages respectivement \package{hyperref}, \package{varioref} et + \package{csquotes}, chargés en sous-main par la \letgutcls{}. +\end{dbremark} + +\bgroup +\lstset{deletekeywords=[3]{section,nameref}} +\begin{ltx-code-result}[title addon=références croisées aux rubriques] +On lira avec intérêt la section \enquote{\nameref{sec:acronymes}} +\vpageref{sec:acronymes}. +\end{ltx-code-result} +\egroup + +\section[Personnes et auteurs]{Noms de personnes et d'auteurs d'articles} +\label{sec:sign-des-articl} + +% Les prénom, nom et titre d'une personne peuvent être affichés au moyen de la +% commande \refCom{person} suivante. + +\begin{docCommands}[ + doc name = person, + doc name = author, + ] + { + { + doc name = person, + doc parameter = \marg{données} + }, + { + doc name = person, + doc parameter = \brackets{\meta{données$_1$} and \meta{données$_2$}[ and ...]} + }, + { + doc name = author, + doc parameter = \marg{données} + }, + { + doc name = author, + doc parameter = \brackets{\meta{données$_1$} and \meta{données$_2$}[ and ...]} + }, + } + \index{auteur} + \index{personne} + % + Ces commandes affichent\footnote{Au fer à droite pour \refCom{author}.} les + \meta{données} (noms et éventuels prénoms et titres) d'une ou plusieurs + personnes ou d'un ou plusieurs auteurs d'articles, ces \meta{données} + étant spécifiées : + \begin{description} + \item[pour un individu unique] selon l'un des formats suivants : + \begin{itemize} + \item \meta{nom} + \item \meta{nom}×, ×\meta{prénom} + \item \meta{nom}×, ×\meta{prénom}×, ×\meta{titre} + \end{itemize} +\item[pour des individus multiples :]\leavevmode + \begin{itemize} + \item selon le même schéma que pour un individu unique ; + \item les \meta{données} de chacun des individus étant séparées par le mot clé + \lstinline+and+. + \end{itemize} + \end{description} +\end{docCommands} + +Indépendamment de la casse utilisée en entrée, pour chaque \meta{nom} et +\meta{prénom} : +\begin{itemize} +\item chacune des initiales et des premières lettres après un espace ou un tiret + est affiché en grande capitale ; +\item le reste est affiché en : + \begin{itemize} + \item petites capitales pour un \meta{nom} ; + \item bas de casse pour un \meta{prénom}. + \end{itemize} +\end{itemize} + +\begin{ltx-code-result}[title addon=personnes] +On peut dire merci à +\person{Knuth, Donald E., dieu and Lamport, Leslie} ! +\end{ltx-code-result} + +\bgroup +\lstset{deletekeywords=[3]{author},deletekeywords=[4]{TeX,},deletekeywords=[5]{e}} +\begin{ltx-code-result}[title addon=auteur] +\begin{displayquote} % Fourni par `csquotes' chargé par `letgut' + Wait, wait, I never said that. + \author{knuth, dONALD e.} +\end{displayquote} +\end{ltx-code-result} + % The \TeX{} family of programs seems to be nice and healthy + % as it continues to approach perfection. +\egroup + +\section{Aide à la saisie et homogénéisation de la mise en forme} +\label{sec:aide-la-saisie} + +Les articles de la \lettre{} sont émaillés de concepts (packages ou classes +\hologo{(La)TeX}, logiciels, etc.) et de termes et expressions +(\enquote{\gut{}}, \enquote{\lettre{}}, etc.) employés de façon +récurrente. Aussi des commandes spécifiques sont-elles prévues de façon à en +faciliter la saisie et à en homogénéiser la mise en forme. + +\subsection{Packages et classes, logiciels, fichiers, locutions étrangères} +\label{sec:classes-packages-et} + +\begin{docCommands} + { + { + doc name = package, + doc parameter = \oarg{URL}\marg{nom}, + }, + { + doc name = package*, + doc parameter = \oarg{URL}\marg{nom}\oarg{préfixe}, + }, + { + doc name = class, + doc parameter = \oarg{URL}\marg{nom}, + }, + { + doc name = class*, + doc parameter = \oarg{URL}\marg{nom}\oarg{préfixe}, + }, + } + % + Ces commandes affichent le \meta{nom} d'un package ou d'une classe + \hologo{(La)TeX}. Le \meta{nom} affiché est un lien hypertexte si et seulement + si l'argument optionnel est : + \begin{description} + \item[\emph{non} employé] la cible étant alors + \url{https://ctan.org/pkg/}\meta{nom} ; + \item[\phantom{\emph{non}} employé] mais non vide, la cible étant alors + \meta{URL}. + \end{description} + Pour que le \meta{nom} affiché ne soit pas un lien hypertexte, il suffit + d'employer un argument optionnel vide. + + Les versions étoilées font précéder le \meta{nom} d'un \meta{préfixe} qui, par + défaut, est respectivement \enquote{package} et \enquote{classe}. +\end{docCommands} + +\bgroup +\lstset{deletekeywords=[4]{tables,}} +\begin{ltx-code-result}[title addon=packages et classes] +La \class*{letgut} s'appuie entre autres sur le \package*{etoc} +(qui permet de personnaliser les tables des matières). + +Une des classes s'appuyant sur le \package*[]{etoc} est +\class[https://framagit.org/gutenberg/classe-lettre-gut]{letgut}. +\end{ltx-code-result} +\egroup + +\begin{docCommands} + { + { + doc name = software, + doc parameter = \oarg{URL}\marg{nom}, + }, + { + doc name = software*, + doc parameter = \oarg{URL}\marg{nom}\oarg{préfixe}, + }, + } + % + Ces commandes affichent le \meta{nom} d'un logiciel qui est optionnellement un + lien hypertexte vers \meta{URL}. La version étoilée fait précéder le + \meta{nom} d'un \meta{préfixe} qui, par défaut, est \enquote{logiciel}. +\end{docCommands} + +\begin{docCommands} + { + { + doc name = file, + doc parameter = \marg{nom}, + }, + { + doc name = file*, + doc parameter = \marg{nom}\oarg{préfixe}, + }, + } + % + Ces commandes affichent le \meta{nom} d'un fichier. La version étoilée fait + précéder le \meta{nom} d'un \meta{préfixe} qui, par défaut, est + \enquote{fichier}. +\end{docCommands} + +\bgroup +\lstset{deletekeywords=[3]{file,plus,l}} +\begin{ltx-code-result}[title addon=logiciels et fichiers] +Le \file*{test.tex} a été ouvert dans le +\software*[https://www.gnu.org/software/emacs/]{Emacs}, plus +précisément dans \software*{Emacs}[l'éditeur de texte]. +\end{ltx-code-result} +\egroup + +\begin{dbwarning}{Commandes pas toutes bienvenues en \docAuxCommand{title} et + \docAuxCommand{subtitle}}{} + Lorsqu'elles sont employées en argument des commandes \refCom{title} et + \refCom{subtitle}, les versions étoilées de ces commandes ont des effets + indésirables (préfixes pas en grandes capitales et signets non conformes). +\end{dbwarning} + +\begin{docCommand}{foreignloc}{\marg{locution}} + Cette commande est conçue pour afficher une \meta{locution} étrangère. +\end{docCommand} + +\begin{docCommand}{latinloc}{\marg{locution}} + Cette commande est conçue pour afficher une \meta{locution} latine. +\end{docCommand} + +\bgroup +\lstset{deletekeywords=[3]{options}} +\begin{ltx-code-result}[title addon=locutions étrangères] +Ce ne sont pas toutes des \foreignloc{load-time options} : +\latinloc{errare humanum est} ! +\end{ltx-code-result} +\egroup + +\subsection{Termes et expressions} +\label{sec:termes} + +\begin{docCommands} + { + { doc name = gutenberg }, + { doc name = gut }, + { doc name = lettre }, + { doc name = lettregut }, + { doc name = Cahier }, + { doc name = Cahiers }, + { doc name = letgut }, + { doc name = letgutcls }, + { doc name = knuth }, + { doc name = lamport }, + { doc name = tugboat }, + } + % + Ce que ces commandes affichent est répertorié dans le \vref{tab:raccourcis}. +\end{docCommands} + +\begin{table}[htb] + \centering + \begin{tabular}{ll} + \toprule + \refCom{gutenberg} & \gutenberg \\ + \refCom{gut} & \gut \\ + \refCom{lettre} & \lettre \\ + \refCom{lettregut} & \lettregut \\ + \refCom{Cahier} & \Cahier \\ + \refCom{Cahiers} & \Cahiers \\ \midrule + \refCom{letgut} & \letgut \\ + \refCom{letgutcls} & \letgutcls \\ \midrule + \refCom{knuth} & \knuth \\ + \refCom{lamport} & \lamport \\ + \refCom{tugboat} & \tugboat \\ \bottomrule + \end{tabular} + \caption{Effet des commandes de raccourcis} + \label{tab:raccourcis} +\end{table} + +Par homogénéité avec les commandes \refCom{class} et \refCom{class*}, on aurait +pu souhaiter que les terme et expression \enquote{\letgut} et +\enquote{\letgutcls} soient produits par \refCom{letgut} et +\docAuxCommand*{letgut*}. Mais cette dernière commande, étoilée, a dû être +remplacée par une commande non étoilée (\refCom{letgutcls}), sans quoi un +problème technique aurait empêché l'utilisation de \refCom{letgut} en argument +de \docAuxCommand{section}% +\footnote{Plus de détails + \href{https://tex.stackexchange.com/q/493017/18401}{ici}.}. + +\begin{dbwarning}{Commande \refCom{letgutcls} pas bienvenue en \docAuxCommand{title} et + \docAuxCommand{subtitle}}{} + Lorsqu'elle est employée en argument des commandes \refCom{title} et + \refCom{subtitle}, la commande \refCom{letgutcls} a un effet indésirable + (préfixe pas en grandes capitales). +\end{dbwarning} + +\section{Exemples de codes \hologo{(La)TeX}, possiblement avec résultats} +\label{sec:exemples-de-codes} + +Afin de présenter aisément et de façon homogène les exemples de codes +\hologo{(La)TeX}, possiblement avec leurs résultats, la \letgutcls{} fournit les +environnements \enquote{verbatim} suivants. + +\begin{docEnvironments}[ + doc parameter = \oarg{options}, + doclang/environment content = code, + ]{ + { + doc name = ltx-code, + % doc description = code (seulement), + }, + { + doc name = ltx-code-result, + % doc description = % code + % $+$ résultat (interne), + }, + { + doc name = ltx-code-external-result, + doc parameter = \oarg{options}\marg{fichier}, + % doc description = % code + % $+$ résultat (externe), + }, + } + Ces environnements affichent le \meta{code} \hologo{(La)TeX} qui y est inséré et + pour : + \begin{description} + \item[\refEnv{ltx-code}] seulement ce \meta{code} ; + \item[\refEnv{ltx-code-result}] également le résultat, compilé en même temps + que la \lettre{} ; + \item[\refEnv{ltx-code-external-result}] également le résultat, compilé + indépendamment de la \lettre{} et dont le \meta{fichier} image est spécifié. + \end{description} +\end{docEnvironments} + +\begin{dbremark}{Mise en page des exemples de codes}{} + \begin{enumerate} + \item Les exemples de codes (avec ou sans résultats) sont par défaut + automatiquement coupés en frontière de page. + \item Les exemples de codes avec résultats (environnements + \refEnv{ltx-code-result} et \refEnv{ltx-code-external-result}), présentent + ces codes et résulats : + \begin{itemize} + \item l'un sous l'autre par défaut ; + \item l'un à gauche de l'autre si l'option \lstinline+sidebyside+ est + employée. + \end{itemize} + \end{enumerate} +\end{dbremark} + +\begin{dbwarning}{Exemples de codes avec résultats : possiblement + flottants}{exemples-flottants} + Si l'option \lstinline+sidebyside+ est passée à l'un ou l'autre des + environnements \refEnv{ltx-code-result} et \refEnv{ltx-code-external-result}, + l'exemple : + \begin{itemize} + \item présente ses code et résultat en regard ce qui rend impossible sa + coupure en frontière de page ; + \item est alors automatiquement flottant. + \end{itemize} + Dans le cas où cet exemple (\no\meta{n}) s'avère se trouver sur une page + (\meta{q}) autre que celle (\meta{p}) de son point d'insertion, deux + références croisées sont automatiquement insérées : + \begin{description} + \item[une \enquote{avant} :] au point d'insertion de l'exemple pour indiquer + qu'il est à consulter plus loin ; son texte, \emph{par défaut} + \enquote{Cf. exemple \meta{n} page \meta{q}.}, peut être surchargé au moyen + de l'option \refKey{reference text} ; + \item[une \enquote{arrière} :] à la fin du titre de l'exemple ; son texte est + \enquote{ (cf. page \meta{p})}. + \end{description} +\end{dbwarning} + +Ces trois environnements admettent des \meta{options} : +\begin{itemize} +\item (toutes) celles acceptées par l'environnement + \docAuxEnvironment{tcblisting} et la commande \docAuxCommand{newtcblisting} + fournis par la bibliothèque \lstinline+listings+ du + \package*{tcolorbox}\footnote{Et, aussi, les commandes + \docAuxCommand{DeclareTCBListing} et assimilées fournies par la bibliothèque + \lstinline+xparse+ de ce package.}. Elles permettent notamment de surcharger + les réglages par défaut, par exemple : + \begin{itemize} + \item de faire figurer l'éventuel résultat, non pas sous le code comme c'est + le cas par défaut, mais en regard (à droite) au moyen de l'option + \lstinline+sidebyside+ ; + \item de supprimer les numéros de ligne au moyen de l'option +\bgroup +\lstset{deletekeywords=[3]{none},morekeywords=[4]{none},morekeywords=[3]{listing}} +\begin{ltx-code} +listing options={numbers=none} +\end{ltx-code} +\egroup + \end{itemize} +\item trois spécifiques à ces environnements : + \begin{docKey*}{title addon}{=\meta{supplément au titre}}{\valinitdef} + Cette option permet d'adjoindre un \meta{supplément au titre} de ces + exemples, qui sont par défaut et automatiquement \enquote{Exemple \meta{n}}. + \end{docKey*} + \begin{docKey*}{result width}{=\meta{longueur}}{\valinitdef[\docAuxCommand*{linewidth}]} + Cette option, utile seulement pour l'environnement + \refEnv{ltx-code-external-result}, permet de spécifier une largeur autre que + celle initiale pour le fichier image du résultat, compilé indépendamment de + la \lettre{}. + \end{docKey*} + \begin{docKey*}{reference text}{=\meta{texte}}{\valinitdef[Cf. exemple \meta{n} page \meta{q}.]} + Cette option n'a d'effet que : + \begin{itemize} + \item avec l'un ou l'autre des environnements \refEnv{ltx-code-result} et + \refEnv{ltx-code-external-result} ; + \item lorsque l'option \lstinline+sidebyside+ leur est passée ; + \item lorsque l'exemple s'avère se trouver sur une page autre que + celle de son point d'insertion. + \end{itemize} + Elle permet alors de surcharger le texte \enquote{Cf. exemple \meta{n} page + \meta{q}.} automatiquement inséré au point d'insertion de l'exemple + (cf.~\vref{wa-exemples-flottants})\footnote{Il est par exemple possible de + s'affranchir de ce texte en recourant à \lstinline+reference text=\{\}+.}. + \begin{dbwarning}{\refKey{reference text} avant \lstinline+sidebyside+}{} + Pour qu'elle soit prise en compte, l'option \refKey{reference text} doit + être passée \emph{avant} l'option \lstinline+sidebyside+. + \end{dbwarning} + \end{docKey*} +\end{itemize} + +\begin{dbwarning}{Caractère d'échappement}{} + \lstset{escapechar=}% + La \letgutcls{} définit ×£× comme caractère d'échappement dans \LaTeX{} au + sein d'un code \LaTeX{}. +\end{dbwarning} + +\section{Nouveautés apparues sur le \ctan} +\label{sec:rubr-cons-aux} + +Afin de pouvoir plus aisément lister les nouveautés (packages et classes +\hologo{(La)TeX}, etc.) apparues sur le \ctan{}, la \letgutcls{} fournit le +nouvel environnement de liste \refEnv{ctannews}, similaire à l'environnement +\docAuxEnvironment{description}. +% +\begin{docEnvironment}[doclang/environment content=liste des nouveautés]{ctannews}{} + Cet environnement permet de dresser la \meta{liste des nouveautés} apparues + sur le \ctan{}. +\end{docEnvironment} +% +Chaque \meta{nouveauté} est introduite au moyen de la commande \refCom{item} +suivante. +\begin{docCommands}[ + doc parameter = \oarg{nom}, + ] + { + { doc name = item }, + { doc name = item* }, + } + % + Cette commande affiche le \meta{nom} de la \meta{nouveauté} comme ce serait le + cas pour le \enquote{label} d'une liste de description, ce qui permet ensuite + de décrire la \meta{nouveauté} en question. Le \meta{nom} est en outre un lien + hypertexte vers sa page sur le \ctan{} + (\url{https://ctan.org/pkg/}\meta{nom}). + + La version étoilée \refCom{item*} est dédiée aux nouveautés œuvres de + contributeurs francophones et le logo de la francophonie, alors + automatiquement situé en regard dans la marge, les signale comme telles. +\end{docCommands} + +\bgroup +\lstset{deletekeywords=[3]{l},deletekeywords=[6]{hologo,matapli}} +\begin{ltx-code-external-result}[title addon=nouveautés]{exemple-nouveautes} +\begin{ctannews} +\item[nl-interval] vise à simplifier le processus de représentation + graphique des intervalles de l'axe réel. +\item*[matapli] classe \hologo{LaTeX} destinée à la composition + de la revue Matapli (conçue par \person{Chupin, Maxime}, + secrétaire adjoint de \gutenberg{}). +\end{ctannews} +\end{ltx-code-external-result} +\egroup + +\begin{docCommand}{francophony}{} + Cette commande affiche le logo de la francophonie, ainsi : \francophony. +\end{docCommand} + +\section{Fiches de lecture} +\label{sec:fiches-de-lecture} + +Les fiches de lecture d'un livre sont créées au moyen de l'environnement +\refEnv{bookreview} suivant. + +\begin{docEnvironment}[doclang/environment content=fiche de lecture]{bookreview}{\marg{caractéristiques}} + Cet environnement permet de mettre en page une \meta{fiche de lecture} + caractérisée par les \meta{caractéristiques} suivantes qui sont, selon les + cas : + \begin{description} + \item[obligatoires :] + \begin{docKey}{title}{=\meta{titre}}{\valinitdef} + Cette clé permet de spécifier le \meta{titre} introductif de la fiche. + \end{docKey} + \begin{docKey}{reviewer}{=\meta{rapporteur}}{\valinitdef} + Cette clé permet de spécifier le \meta{rapporteur} de la fiche, à spécifier + selon la syntaxe de la commande \refCom{author}. + \end{docKey} + \begin{docKey}{bibkey}{=\meta{clé}}{\valinitdef} + Cette clé permet de spécifier la \meta{clé} identifiant l'entrée d'un + \file*{.bib} contenant les données bibliographiques du document rapporté. + \end{docKey} + \item[fortement conseillée :] + \begin{docKey}{frontcover}{=\meta{fichier}}{\valinitdef} + Cette clé permet de spécifier le \meta{fichier} image de la couverture du + document rapporté. + \end{docKey} + \item[facultative :] + \begin{docKey}{price}{=\meta{prix}}{\valinitdef} + Cette clé permet le cas échéant de spécifier le \meta{prix} du document rapporté. + \end{docKey} + \end{description} +\end{docEnvironment} + +\section{Acronymes} +\label{sec:acronymes} + +Nombreux sont les articles de la \lettre{} susceptibles de contenir des +acronymes peut-être pas connus de tous. Aussi est-il opportun que, lors de leur +première occurrence, ceux-ci soient explicités. + +Pour automatiser cela, la \letgutcls{} s'appuie sur le \package*{acro} ; +toutefois, pour à la fois simplifier la création desdits acronymes et étendre +(légèrement) les fonctionnalités offertes par \package{acro}, elle fournit la +commande dédiée \refCom{letgutacro}. + +\begin{docCommand}{letgutacro}{\oarg{options}\marg{COURT}\marg{long}\oarg{traduction + française}} + \index{acronyme}% + Cette commande permet de créer un nouvel acronyme en spécifiant : + \begin{itemize} + \item sa forme courte \meta{COURT}, \emph{obligatoirement en grandes + capitales} ; + \item sa forme longue \meta{long}. + \end{itemize} + En outre, le 1\ier{} et 2\ieme{} arguments \emph{optionnels} permettent de, + respectivement : + \begin{itemize} + \item passer à la commande \docAuxCommand{DeclareAcronym} (de création + d'acronymes du \package*{acro} agissant en sous-main) des \meta{options} qui + lui sont propres, permettant ainsi de surcharger les options par défaut + passées à cette commande par \refCom{letgutacro} ; + \item signaler que l'acronyme provient de l'anglais et d'en spécifier la + \meta{traduction française} (éventuellement vide si celle-ci n'est pas + pertinente). + \end{itemize} + + L'acronyme ainsi créé a pour identifiant \meta{court}, c'est-à-dire + la version \emph{en bas de casse} de \meta{COURT}, et peut donc + être employé au moyen des commandes fournies par le \package*{acro}, par + exemple : + \begin{itemize} + \item ×\ac{×\meta{court}×}×\footnote{Acronyme automatiquement affiché sous sa + forme complète à sa 1\iere{} occurrence, sous sa forme courte à ses + occurrences suivantes.} ; + \item ×\acs{×\meta{court}×}×\footnote{Acronyme affiché sous sa forme courte + seulement.}. + \end{itemize} + Toutefois, pour simplifier l'usage de ces acronymes, la \letgutcls{} crée + alors automatiquement une commande \docAuxCommand{\meta{court}}% + \footnote{% + Sauf si elle existe déjà, auquel cas la création d'une telle commande est + silencieusement escamotée. Ainsi par exemple, l'acronyme + % + \lstinline!\\letgutacro[...]\{TIKZ\}\{...\}[...]! + % + fourni par \letgut{} (cf. \vpageref{liste-acronymes}) ne surcharge-t-il + pas la commande \docAuxCommand{tikz} fournie notamment par le + \package*{tikz}.% + } + % + qui agit comme : + \begin{itemize} + \item ×\ac{×\meta{court}×}× en version non étoilée ; + \item ×\acs{×\meta{court}×}× en version étoilée. + \end{itemize} +\end{docCommand} +Ainsi, l'acronyme utilisé via \docAuxCommand{\meta{court}} figure, pour ses +occurrences : +\begin{description} +\item[première :] sous la forme \meta{\textsc{court}}\footnote{C'est-à-dire + \meta{court} en petites capitales.} suivi d'une note de bas de + page contenant \enquote{\meta{long}.} ; +\item[suivantes :] sous la forme \meta{\textsc{court}}. +\end{description} + +En outre : +\begin{itemize} +\item cette commande peut être utilisée sans restriction en argument des + commandes \refCom{title}, \refCom{subtitle}, \refCom{section}, + \refCom{subsection}, etc. et l'acronyme figure sous sa forme \meta{COURT} dans + les \foreignloc{bookmarks} (signets) ; +\item un copié de \meta{\textsc{court}} colle \meta{COURT}. +\end{itemize} + +\begin{dbwarning}{\refCom{letgutacro} : uniquement en préambule}{} + La définition d'acronymes au moyen de \refCom{letgutacro} ne peut se faire + qu'en préambule. +\end{dbwarning} + +Ainsi, avec les définitions suivantes en préambule : + +\bgroup +\lstset{deletekeywords={and},deletekeywords=[3]{and,emph,n,german},deletekeywords=[4]{and,TeX}} +\begin{ltx-code}[title addon=définition d'acronymes,drop lifted shadow] +% Acronyme français +\letgutacro{LD}{\LaTeX{} dépendant} + +% Acronyme anglais avec traduction française +\letgutacro{TLMGR}{\TeX~Live Manager}[gestionnaire \TeX~Live] + +% Acronyme anglais sans traduction française +\letgutacro{CD}{Compact Disc}[] + +% Acronyme anglais avec surcharge : +% - `short=no-op` : l'acronyme est « no-op » (en bas de casse) +% et le nom de la commande sous-jacente ne peut être \no-op +% (tiret interdit) +% - `short-format=\upshape` : les petites capitales sont +% désactivées +\letgutacro[short=no-op,short-format=\upshape] +{NOOP} +{No Operation} +[instruction nulle] + +% Acronyme en allemand : +\letgutacro[ + short=\emph{Ti\emph{k}Z}, + short-format=\em, + foreign-babel=german, + foreign-locale=allemand] +{TIKZ} +{Ti\emph{k}Z ist \emph{kein} Zeichenprogramm} +[Ti\emph{k}Z \emph{n'}est \emph{pas} un programme de dessin] +\end{ltx-code} +\egroup + +a-t-on : + +\bgroup +\lstset{deletekeywords=[3]{cd,tikz,on},deletekeywords=[4]{on},deletekeywords=[6]{cd}} +\begin{ltx-code-result}[title addon=utilisation d'acronymes] +On dispose désormais pour \enquote{\LaTeX{} dépendant} +d'un acronyme qu'on peut utiliser par exemple +\begin{itemize} +\item ainsi : \ac{ld} ou \acs{ld} ; +\item ou bien ainsi : \ld{} ou \ld*{}. +\end{itemize} + +On peut également employer les acronymes : +\begin{itemize} +\item \cd{}, \cd{} ; +\item \tlmgr{}, \tlmgr{} ; +\item \noop{}, \noop{} ; +\item \ac{tikz}, \ac{tikz}. % Noter le non emploi de `\tikz' +\end{itemize} +\end{ltx-code-result} +\egroup + +Les noms des commandes sous-jacentes ne doivent contenir que des lettres, mais +celles-ci peuvent être accentuées. Ainsi, avec la définition suivante en +préambule : + +\bgroup +\lstset{deletekeywords=[3]{and}} +\begin{ltx-code}[title addon=définition d'acronyme avec lettres + accentuées,drop lifted shadow] +\letgutacro{CPGÉ}{Classes Préparatoires aux Grandes Écoles} +\end{ltx-code} +\egroup + +a-t-on : + +\bgroup +\lstset{deletekeywords=[3]{l}} +\begin{ltx-code-result}[title addon=utilisation d'acronyme avec lettres accentuées] +On peut également employer l'acronyme \cpgé{}, \cpgé{}. +\end{ltx-code-result} +\egroup + +La \letgutcls{} fournit un \file*{letgut-acronyms.tex} dans lequel sont définis +plusieurs acronymes anglais et français, directement utilisables. Ceux-ci sont +répertoriés \vpageref{liste-acronymes}. + +\section{Séparateurs} +\label{sec:filets} + +Il est parfois utile d'accentuer la séparation entre les articles de la +\lettre. Ceci peut se faire au moyen de la commande \refCom{separator} qui +insère un filet horizontal. + +\begin{docCommand}{separator}{} + \index{séparateur}% + Cette commande permet d'accentuer la séparation entre deux articles. +\end{docCommand} + +\section{Boîtes d'alertes} +\label{sec:boites-dalertes} + +\begin{docCommand}{alertbox}{ \oarg{couleur}\marg{texte} } + \index{alerte}% + Cette commande insère une boîte d'alerte : + \begin{itemize} + \item optionnellement de \meta{couleur} de fond (à spécifier selon le modèle + \enquote{\foreignloc{named}}) autre que celle par défaut\footnote{C'est-à-dire + \colorbox{letgut_default_alert_box_color}{celle-ci}% , nommée + % \docColor{letgut_default_alert_box_color} et égale + % à \docValue*{\letgutalertboxdefaultcolor} + .} ; + \item contenant le \meta{texte} (qui peut contenir plusieurs paragraphes). + \end{itemize} +\end{docCommand} + +\bgroup +\lstset{deletekeywords=[5]{en}} +\begin{ltx-code-result}[title addon=boîtes d'alertes] +\alertbox{% + Adhérez, adhérez, il en restera toujours quelque chose !% +} +\alertbox[yellow]{% + Adhérez, adhérez ! + + Il en restera toujours quelque chose...% +} +\end{ltx-code-result} +\egroup + +\section{Fichier local de configuration} +\label{sec:fichier-local-de} + +Chaque numéro de la \lettre{} nécessite certaines configurations locales : +configuration dédiée au numéro en question, packages particuliers utilisés dans +les articles, configurations propres du \package*{listings}, etc. Afin de ne pas +encombrer le \file*{.tex} principal de la \lettre{}, un fichier de configuration +locale nommé +% +\ExplSyntaxOn +\file{ + \tl_use:N \c__letgut_local_config_file_tl.tex +}~ +\ExplSyntaxOff +% +est, si présent dans le répertoire courant, automatiquement inclus à la fin +du préambule. + +\title{Aspects de la 1\iere{} page} +\label{sec:mise-en-page} + +La première page de la \lettre{} comporte : +\begin{itemize} +\item une bannière sous forme d'un très grand \enquote{L} en noir sur lequel + figurent de la couleur de fond de la page, en gras, dans sa partie : + \begin{itemize} + \item verticale, \enquote{La} puis, chacune sur une ligne, les lettres du mot + \enquote{Lettre} en grandes capitales ; + \item horizontale, \enquote{\gut}. + \end{itemize} +\item un très grand \enquote{g}, en filigrane et en gris clair. +\end{itemize} +La fonte de ces deux éléments est la principale utilisée (spécifiée au moyen de +\docAuxCommand{setmainfont}). + +Pour ce faire, la classe charge le package maison \package{letgut-banner} qui +n'est pas décrit ici. + +\title{Les dinosaures, leur écosystème et \letgut} +\label{recours-docker} + +Pour à la fois : +\begin{itemize} +\item disposer d'une version suffisamment récente de \hologo{LuaLaTeX} + pour la présente \letgutcls{} (cf. \vref{wa-lualatex-recent}) ; +\item éviter de perturber une installation existante de \hologo{(La)TeX} ; +\end{itemize} +on pourra recourir à \docker{}\footnote{Cerise sur le gâteau : un temps de + compilation éventuellement réduit de façon significative. Ainsi, celui de la + présente documentation est-il sur la machine de \person{Bitouzé, Denis} d'un + peu plus de \SI{13}{\s} avec \docker{} et de plus de \SI{30}{\s} par le biais + habituel.} dont cette section est un mode d'emploi : +\begin{itemize} +\item express ; +\item axé sur Linux, mais qui devant s'appliquer au moins en partie aux autres + systèmes d'exploitation ; +\item axé sur la \tl{}. +\end{itemize} + +\begin{dbwarning}{Commande \software{sudo} peut-être nécessaire}{} + Les commandes \docker*{} ci-après ne sont pas précédées de \software{sudo} + mais, selon les systèmes d'exploitation, elles peuvent devoir l'être. +\end{dbwarning} + +On commence par installer \docker*{} puis à lancer le service +\docker*\footnote{Pour Ubuntu, cf. par exemple + \href{https://doc.ubuntu-fr.org/docker}{ce guide}.}. + +Ensuite, par exemple depuis un dossier où se trouve un \file*{mon-fichier.tex} (disons +à compiler avec \hologo{LuaLaTeX}), on lance la longue commande suivante +(\emph{qui doit être sur une seule ligne}\footnote{% + Pour la copier d'un seul bloc, il devrait suffire de \emph{copier} (et non de + \emph{cliquer sur}) l'icône suivante +% \marginpar{% + \BeginAccSupp{method=plain,ActualText={% + docker run -i --rm --name latex -v "$PWD":/usr/src/app -w /usr/src/app registry.gitlab.com/islandoftex/images/texlive:latest-with-cache lualatex mon-fichier + }% + }% + \faCopy[regular]%$$ + \EndAccSupp{}% +% }% +}) : + +% \begin{listingshell} +% docker run --rm -it -v $(pwd):/workdir danteev/texlive lualatex mon-fichier +% \end{listingshell} + +\begin{listingshell} +docker run -i --rm --name latex -v "$PWD":/usr/src/app -w /usr/src/app registry.gitlab.com/islandoftex/images/texlive:latest-with-cache lualatex mon-fichier +\end{listingshell} + +La toute première fois, cela provoque le téléchargement de plusieurs fichiers, +dont celui assez lourd de l'image d'une version allégée de la \tl{}~2021 +(délestée des sources et des documentations) puis lance la compilation +demandée. + +Pour simplifier les compilations ultérieures, on aura intérêt à créer dans son +\file*{.bashrc} (ou \file{.zshrc}, etc.) un ou plusieurs alias de la forme : + +\begin{tcblisting}{listing only,breakable,listing options={style=tcblatex,language=bash}} +alias docker-texlive='docker run -i --rm --name latex -v "$PWD":/usr/src/app -w /usr/src/app registry.gitlab.com/islandoftex/images/texlive:latest-with-cache' +alias docker-pdflatex='docker-texlive pdflatex' +alias docker-xelatex='docker-texlive xelatex' +alias docker-lualatex='docker-texlive lualatex' +alias docker-biber='docker-texlive biber' +alias docker-makeglossaries='docker-texlive makeglossaries' +alias docker-latexmk-pdf='docker-texlive latexmk -pdf' +alias docker-latexmk-xe='docker-texlive latexmk -pdfxe' +alias docker-latexmk-lua='docker-texlive latexmk -pdflua' +\end{tcblisting} + +pour pouvoir compiler au moyen de seulement\footnote{En lançant préalablement + \lstinline[language=bash]+source ~/.bashrc+ (ou assimilé) afin de pouvoir en + bénéficier dans un terminal déjà ouvert.} : + +\begin{listingshell} +docker-latexmk-lua mon-fichier +\end{listingshell} + +\title{Packages chargés par \letgut{}} +\label{sec:packages-charges-par} + +La \letgutcls{} charge en sous-main un certain nombre de packages utiles, voire +nécessaires, à son codage. Elle en charge également certains pas indispensables, +mais considérés comme \enquote{incontournables} pour que les auteurs de la +\lettre{} puissent (aisément) composer un \enquote{joli} document. Nous en +dressons ci-après la liste en les regroupant selon ces deux catégories. + +\section{Packages utiles aux auteurs de la \lettre{}} +\label{sec:utiles-aux-auteurs} + +\begin{ctannews} +\item[fontspec] fontes \otf{}. +\item[microtype] raffinements subliminaux vers la perfection typographique. + \begin{description} + \item[Options :] \docAuxKey*{stretch=30}, \docAuxKey*{shrink=25}, + \docAuxKey*{letterspace=150}. + \end{description} +\item[graphicx] prise en charge améliorée des graphiques. +\item[array] extension des environnements \docAuxEnvironment*{array} et + \docAuxEnvironment*{tabular}. +\item[fancyvrb] notamment pour permettre l'usage de commandes \enquote{verbatim} + dans les notes de bas de page. +\item[booktabs] tableaux de qualité. +\item[csquotes] facilités de citations, en ligne et hors-texte, sensibles au + contexte. +\item[amsmath] nombreux outils utiles pour la composition mathématique. +\item[mathtools] étend les fonctionnalités et corrige certaines déficiences + d'\package{amsmath} et de \hologo{LaTeX}. + \begin{description} + \item[Option :] \docAuxKey*{fleqn}. + \end{description} +\item[siunitx] aide à la saisie et à l'affichage cohérent des nombres, unités et + quantités. + \begin{description} + \item[Options :] \docAuxKey*{locale=FR}, \docAuxKey*{mode=text}. + \end{description} +\item[hologo] collection de logos habituels (\hologo{LaTeX}, \hologo{LaTeX2e}, + etc.) avec support pour les signets. +\item[xcolor] accès facile, indépendant du pilote, à plusieurs types de teintes, + de nuances, de tons et de mélanges de couleurs arbitraires. + \begin{description} + \item[Option :] \docAuxKey*{table}. + \end{description} +\item[ninecolors] sélection de couleurs avec contraste \wcag{} approprié. +\item[tabularray] mise en page de tableaux et de matrices offrant une séparation + complète des contenus et styles. Ce package très récent (sorti le 14 mai 2021) + est utilisé dans le code de la classe pour la création de boîtes d'alertes + \enquote{légères}, c.-à-d. ne nécessitant notamment pas le chargement + (indirect) du package \ac{tikz} qui augmente significativement le temps de + compilation ; mais il pourrait (devrait) être utile également aux auteurs de + la \lettre{}. +\item[babel] support multilingue. + \begin{description} + \item[Options :] \docAuxKey*{english}, \docAuxKey*{french} ; + \item[Configuration] \lstinline+\renewcommand*\frenchtablename{Tableau}+. + \end{description} +\item[varioref] références de pages intelligentes. + \begin{description} + \item[Options :] \docAuxKey*{nospace}, \docAuxKey*{french}. + \end{description} +\item[eurosym] symbole et montants en \euro{}. + \begin{description} + \item[Option :] \docAuxKey*{right}. + \end{description} +\item[listings] composition des listings informatiques. + \begin{description} + \item[Options :] \docAuxKey*{basicstyle=\ttfamily}, \docAuxKey*{frame=single}, + \docAuxKey*{belowskip=0pt}\footnote{Cette dernière option du fait + d'\href{https://github.com/FrankMittelbach/fmitex-parskip/issues/3}{un + problème actuel} impliquant les packages \package{parskip} et + \package{listings}.}. + \end{description} +\item[floatrow] nombreuses possibilités de personnalisation de la disposition + des flottants. + \begin{description} + \item[Options :]\leavevmode{} + \begin{itemize} + \item \docAuxKey*{objectset=justified} ; + \item \docAuxKey*{style=__letgut_ruled}\footnote{Style propre à la classe.} + et \docAuxKey*{margins=hangleft} pour les figures ; + \item \docAuxKey*{capposition=top} pour les tableaux. + \end{itemize} + \end{description} +\item[biblatex] bibliographies sophistiquées. + \begin{description} + \item[Option :] \docAuxKey*{sorting=none}. + \end{description} +\item[acro] création simple d'acronymes\footnote{Pour la gestion des acronymes, + il était initialement prévu de recourir au \package*{glossaries-extra} mais + celui-ci augmente significativement le temps de compilation.}. + \begin{description} + \item[Options :]\leavevmode{} + \begin{itemize} + \item \docAuxKey*{first-style=footnote} ; + \item \docAuxKey*{format/short=}\lstinline|\scshape| ; + \item \docAuxKey*{format/foreign=}\lstinline|\em| ; + \item \docAuxKey*{foreign/display} ; + \item \docAuxKey*{locale/display} ; + \item \docAuxKey*{locale/format=}\lstinline|\upshape|. + \end{itemize} + \end{description} +\item[hyperref] prise en charge étendue de l'hypertexte. + \begin{description} + \item[Options :]\leavevmode{} + \begin{itemize} + \item \docAuxKey*{draft} si l'option de classe \refKey{paper} est utilisée ; + \item \docAuxKey*{colorlinks}, \docAuxKey*{allcolors={letgut_allcolors_links}} + sinon. + \end{itemize} + \end{description} +\item[hypcap] ajustement des ancres des légendes. + \begin{description} + \item[Option :] \docAuxKey*{all}. + \end{description} +\item[cleveref] détermination automatique du format des références en fonction + du type de référence. + \begin{description} + \item[Option :] \docAuxKey*{french}. + \end{description} +\item[lua-typo] mise en lumière, par un changement de couleur, des lignes + typographiquement imparfaites avec \hologo{LuaLaTeX}. + \begin{description} + \item[Option :] \docAuxKey*{All}. + \end{description} +\end{ctannews} + +\section{Packages utiles au codage de la classe \letgut} +\label{sec:utiles-au-codage} + +\begin{ctannews} +\item[l3keys2e] traitement \hologo{LaTeX2e} des options de classe en utilisant + les clés \hologo{LaTeX3}. +\item[parskip] mise en page de paragraphes séparés par un blanc vertical au lieu + (ou en plus) d'un retrait. +\item[fancyhdr] contrôle étendu des en-têtes et des pieds de page. +\item[geometry] interface flexible et complète pour les dimensions des + documents. + \begin{description} + \item[Options :] \docAuxKey*{a4paper}, \docAuxKey*{asymmetric}. + \end{description} +\item[etoc] tables des matières entièrement personnalisables. +\item[enumitem] contrôle de la mise en page de \docAuxEnvironment*{itemize}, + \docAuxEnvironment*{enumerate}, \docAuxEnvironment*{description} et permet de + cloner les environnements standards et créer de nouveaux + environnements. Utilisé pour la création de l'environnement \refEnv{ctannews}. +\item[titlesec] personnalisation aisée des titres de sections, etc. +\item[placeins] contrôle du placement des flottants permettant de s'assurer que + ceux d'une section (donc d'un article dans le cas de la \lettre{}) + apparaissent avant la commande \docAuxCommand*{section} suivante. + \begin{description} + \item[Options :] \docAuxKey*{section}, \docAuxKey*{above}. + \end{description} +\item[accsupp] notamment remplacement de texte lors des copiés-collés, utilisé + en particulier pour que les acronymes, composés en petites capitales par + \letgut{}, une fois copiés, soient collés en grandes capitales. +\item[letgut-banner] bannière de la 1\iere{} page de la \lettre{}. +\end{ctannews} + +\printacronyms[ +, heading=title +% , template=longtable +, preamble={\label{liste-acronymes}} +, display=all +, exclude=thisdocument +, name={Liste des acronymes prédéfinis par \letgut} +] + +\printbibliography[heading=title] + +% \listoffigures +% \listoftables +\tcblistof[\title]{dbwarninglist}{Table des avertissements}% +% \tcblistof[\title]{dbremarklist}{Table des remarques}% +% +\phantomsection +\indexprologue{% + Afin de différencier leurs natures, les entrées de cet index sont affichées + en couleurs (variées) lorsqu'elles correspondent à des : + \begin{itemize} + \item commandes ; + \item environnements ; + \item clés ; + \item valeurs de clé ; + \end{itemize} +}% +% \renewcommand{\indexname}{Index des commandes} +% \printindex[\jobname-commands] +% % +% \phantomsection +% \indexprologue{% +% Dans cet index, un numéro de page : +% \begin{description} +% \item[en gras] indique une page contenant une information importante sur +% l'entrée correspondante, par exemple sa définition ; +% \item[en italique] indique une page contenant un exemple qui illustre +% l'entrée correspondante. +% \end{description} +% }% +% \renewcommand{\indexname}{Index des concepts} +\printindex +\end{document} + +%%% Local Variables: +%%% mode: latex +%%% TeX-engine: luatex +%%% TeX-master: t +%%% End: diff --git a/Master/texmf-dist/doc/lualatex/letgut/listings-conf.tex b/Master/texmf-dist/doc/lualatex/letgut/listings-conf.tex new file mode 100644 index 00000000000..dd58a107163 --- /dev/null +++ b/Master/texmf-dist/doc/lualatex/letgut/listings-conf.tex @@ -0,0 +1,40 @@ +\lstset{ + backgroundcolor=\color{__letgut_backgroundCode}, + rulecolor=\color{__letgut_borderCode}, + frame=single, + aboveskip=\medskipamount, + breaklines=false, +} + +\lstset{ + language=TeX,% + alsolanguage=[geometry]TeX,% + alsolanguage=[LaTeX]TeX,% + alsolanguage=[plain]TeX,% + alsolanguage=[common]TeX,% + alsolanguage=[primitive]TeX,% + alsolanguage=[classes]TeX,% + alsolanguage=[xcolor]TeX,% + alsolanguage=[listings]TeX,% + alsolanguage=[biblatex]TeX,% + alsolanguage=[hyperref]TeX,% + alsolanguage=[xparse]TeX,% + alsolanguage=[lthooks]TeX,% + alsolanguage=[extLaTeX]TeX,% + alsolanguage=[letgut]TeX,% + alsolanguage=[hologo]TeX,% + alsolanguage=[acro]TeX,% + alsolanguage=[tcolorbox]TeX,% + alsolanguage=[graphicx]TeX,% + alsolanguage=[csquotes]TeX,% + alsolanguage=[varioref]TeX,% + alsolanguage=[babel-french]TeX,% + alsolanguage=[l3keys2e]TeX,% + alsolanguage=[expl3]TeX,% +} + +% We need to disable `escapechar=£' enabled by the class in order to avoid this +% to make a mess in the listing which contains it. +\lstset{ + escapechar=,% +} diff --git a/Master/texmf-dist/doc/lualatex/letgut/localconf.tex b/Master/texmf-dist/doc/lualatex/letgut/localconf.tex new file mode 100644 index 00000000000..d7834205ee0 --- /dev/null +++ b/Master/texmf-dist/doc/lualatex/letgut/localconf.tex @@ -0,0 +1,187 @@ +% Pour de jolies icônes +\usepackage{fontawesome5} + +% Pour l'index +\usepackage[imakeidx]{xindex} +\makeindex +% Commande sans laquelle les numéros de pages de l'index ne seraient pas des +% hyperliens +\DeclareHookRule{env/document/begin}{xindex}{before}{hyperref} + +% La librairie suivante doit nécessairement être chargée après `imakeidx` +\tcbuselibrary{% + documentation,theorems% +} + +% Nous voulons que la commande \meta, fournie par la librairie `documentation' +% du package `tcolorbox' affiche son argument en fonte à châsse fixe, en couleur +% et sans correction d'italique. +\AddToHook{cmd/meta@font@select/after}{% + \ttfamily% + \color{brown}% + \let\/\relax% +} + +\makeatletter +\lst@InputCatcodes +\def\lst@DefEC{% + \lst@CCECUse \lst@ProcessLetter + ^^80^^81^^82^^83^^84^^85^^86^^87^^88^^89^^8a^^8b^^8c^^8d^^8e^^8f% + ^^90^^91^^92^^93^^94^^95^^96^^97^^98^^99^^9a^^9b^^9c^^9d^^9e^^9f% + ^^a0^^a1^^a2^^a3^^a4^^a5^^a6^^a7^^a8^^a9^^aa^^ab^^ac^^ad^^ae^^af% + ^^b0^^b1^^b2^^b3^^b4^^b5^^b6^^b7^^b8^^b9^^ba^^bb^^bc^^bd^^be^^bf% + ^^c0^^c1^^c2^^c3^^c4^^c5^^c6^^c7^^c8^^c9^^ca^^cb^^cc^^cd^^ce^^cf% + ^^d0^^d1^^d2^^d3^^d4^^d5^^d6^^d7^^d8^^d9^^da^^db^^dc^^dd^^de^^df% + ^^e0^^e1^^e2^^e3^^e4^^e5^^e6^^e7^^e8^^e9^^ea^^eb^^ec^^ed^^ee^^ef% + ^^f0^^f1^^f2^^f3^^f4^^f5^^f6^^f7^^f8^^f9^^fa^^fb^^fc^^fd^^fe^^ff% + ^^^^201c^^^^201d% nouveaux pour “ et ” + ^^00} +\lst@RestoreCatcodes +\makeatother + +\ExplSyntaxOn + +\lstMakeShortInline× + +\lstdefinelanguage{extrabash}{% + morekeywords={% + docker,docker-pdflatex,docker-lualatex + },% + alsoletter={-},% + sensitive% +} + +\tcbset{% + doclang/environment~ content=contenu~ de~ l'environnement,% + doclang/color=~ (couleur),% + doclang/colors=Couleurs,% + doclang/environments=Environnements,% + doclang/keys=Clés,% + doclang/values=Valeurs,% + doclang/pageshort=p.,% + documentation~ listing~ style=dbtex,% + color~ command=__letgut_texcs,% + color~ environment=__letgut_environment,% + color~ key=__letgut_key,% + color~ value=__letgut_value,% + doc~ head={interior~ style={fill,color=yellow!20!white}},% + % index~ format=pgfchapter,% + index~ format=off,% + index~ colorize,% + index~ annotate=false,% + enhanced,% + % listing~ style=dbtex,% + % every~ box/.style={documentation~ listing~ style=dbtex},% + % index~ actual={},% + % doc~ left~ indent=-15mm,% + % doc~ right~ indent=-15mm+2em + keywords~ bold=false +}% + +\DeclareTotalTCBox{\commandshell}{ v }{ commandshell}{#1} +\newtcblisting{listingshell}[1][]{% + % colback=black, + % colupper=white, + colback=white, + colupper=black, + colframe=yellow!75!black, + breakable, + listing~ only, + listing~ options={% + style=tcblatex, + language=bash, + alsolanguage=extrabash,% + basicstyle=\footnotesize\ttfamily, + escapeinside={(*@}{@*)}, + upquote=true, + showstringspaces=false + }, + every~ listing~ line={% + \textcolor{red}{% + \small\ttfamily\bfseries% + \BeginAccSupp{method=plain,ActualText={}} + \$~ + \EndAccSupp{}% + } + }, + #1 +} + +\renewcommand*{\tcbdocnew}[1]{ + \scriptsize\sffamily\textcolor{green!50!black}{\bfseries +Nouv. :} #1} +\renewcommand*{\tcbdocupdated}[1]{\scriptsize\sffamily\textcolor{blue!75!black}{\bfseries +\textsc{m.-à-j.} :} #1} +% + +\NewDocumentCommand \valinit { o } +{ + % valeurs~ :~ + init.~ + { + \em + \IfNoValueTF {#1} + { vide } + { #1 } + } +} + +\NewDocumentCommand \valdef { o } +{ + par~ déf.~ + { + \em + \IfNoValueTF {#1} + { aucune } + { #1 } + } +} + +\NewDocumentCommand{\valinitdef}{ O{} o } { + \tl_if_blank:nTF {#1} + { + \valinit,~ \valdef[#2] + } + { + \valinit[#1],~ \valdef[#2] + } +} + +\tcbset{dbtcb/.style={% + breakable, + fonttitle=\bfseries, + enlarge~ top~ by=1mm, + separator~ sign~ dash, + label~ separator=-, + before~ title={% + \hypersetup{hidelinks}% + \tcbset{% + color~ definition=white, + color~ hyperlink=white, + }% + },% + keywords~ bold=false, + }% +}% + +\AddToHook{begindocument/before}{ + \newtcbtheorem[list~inside=dbwarninglist,crefname={avertissement}{avertissements}]{dbwarning}{Avertissement}{% + colback=red!5!white, + colframe=red!75!black, + dbtcb + }{wa} + \newtcbtheorem[list~inside=dbremarklist,crefname={remarque}{remarques}]{dbremark}{Remarque}{% + colback=blue!5!white, + colframe=blue!75!black, + dbtcb + }{rq} +} +% +\ExplSyntaxOff + + +%%% Local Variables: +%%% mode: latex +%%% TeX-engine: luatex +%%% TeX-master: letgut +%%% End: diff --git a/Master/texmf-dist/doc/lualatex/letgut/xindex-letgut.lua b/Master/texmf-dist/doc/lualatex/letgut/xindex-letgut.lua new file mode 100644 index 00000000000..3bd7e7cd02d --- /dev/null +++ b/Master/texmf-dist/doc/lualatex/letgut/xindex-letgut.lua @@ -0,0 +1,94 @@ +----------------------------------------------------------------------- +-- FILE: xindex-letgut.lua +-- DESCRIPTION: configuration file for xindex.lua +-- REQUIREMENTS: +-- AUTHOR: Denis Bitouzé +-- LICENSE: LPPL1.3 +-- +-- $Id: xindex-letgut.lua 22 2022-03-11 dbitouze $ +----------------------------------------------------------------------- + +if not modules then modules = { } end modules ['xindex-cfg'] = { + version = 0.41, + comment = "French configuration to xindex.lua", + author = "Denis Bitouzé", + copyright = "Denis Bitouzé", + license = "LPPL 1.3" +} + +itemPageDelimiter = "," -- Hello, 14 +compressPages = true -- something like 12--15, instead of 12,13,14,15. the |( ... |) syntax is still valid +fCompress = false -- 3f -> page 3, 4 and 3ff -> page 3, 4, 5 +minCompress = 2 -- 14--17 or +rangeSymbol = "-" +numericPage = true -- for non numerical pagenumbers, like "VI-17" +sublabels = {"", "\\,", "\\,", "\\,"} -- for the (sub(sub(sub-items first one is for item +pageNoPrefixDel = "" -- a delimiter for page numbers like "VI-17" -- not used !!! +indexOpening = "" -- commands after envStart +idxnewletter = "\\textbf" -- Only valid if -n is not set +envStart = "\\begin{theindex}" +envStop = "\\end{theindex}" + +--[[ + Each character's position in this array-like table determines its 'priority'. + Several characters in the same slot have the same 'priority'. +]] +alphabet_lower = { -- for sorting + { ' ' }, -- only for internal tests + { 'a', 'á', 'à', 'ä', 'â', 'å', 'æ', }, + { 'b' }, + { 'c', 'ç' }, + { 'd' }, + { 'e', 'é', 'è', 'ë', 'ê' }, + { 'f' }, + { 'g' }, + { 'h' }, + { 'i', 'í', 'ì', 'î', 'ï' }, + { 'j' }, + { 'k' }, + { 'l' }, + { 'm' }, + { 'n', 'ñ' }, + { 'o', 'ó', 'ò', 'ö', 'ô', 'ø', 'œ', 'ø'}, + { 'p' }, + { 'q' }, + { 'r' }, + { 's', 'š' }, + { 'ss', 'ß' }, + { 't' }, + { 'u', 'ú', 'ù', 'ü' , 'û'}, + { 'v' }, + { 'w' }, + { 'x' }, + { 'y', 'ý', 'ÿ' }, + { 'z', 'ž' } +} +alphabet_upper = { -- for sorting + { ' ' }, + { 'A', 'Á', 'À', 'Ä', 'Å', 'Æ', 'Â' }, + { 'B' }, + { 'C', 'Ç' }, + { 'D' }, + { 'E', 'È', 'É', 'Ë', 'Ê' }, + { 'F' }, + { 'G' }, + { 'H' }, + { 'I', 'Í', 'Ì', 'Ï', 'Î' }, + { 'J' }, + { 'K' }, + { 'L' }, + { 'M' }, + { 'N', 'Ñ' }, + { 'O', 'Ó', 'Ò', 'Ö', 'Ø','Œ', 'Ø', 'Ô'}, + { 'P' }, + { 'Q' }, + { 'R' }, + { 'S', 'Š' }, + { 'T' }, + { 'U', 'Ú', 'Ù', 'Ü', 'Û' }, + { 'V' }, + { 'W' }, + { 'X' }, + { 'Y', 'Ý', 'Ÿ' }, + { 'Z', 'Ž' } +} diff --git a/Master/texmf-dist/source/lualatex/letgut/HOWTO.md b/Master/texmf-dist/source/lualatex/letgut/HOWTO.md new file mode 100644 index 00000000000..678ece4f0c1 --- /dev/null +++ b/Master/texmf-dist/source/lualatex/letgut/HOWTO.md @@ -0,0 +1,33 @@ +In order to: + +- tangle the `letgut.cls` and `letgut-banner.sty` files, +- build the documentations `letgut-code.pdf` and `letgut-banner-code.pdf` of the + codes, + +from the Org Mode source files `letgut.org` and `letgut-banner.org`: + +- it is necessary a reasonably recent version of Emacs, +- it is then sufficient to run (in a directory containing the `letgut.el` file + to be found in the current directory): + - for the `letgut` class: + + emacs -Q letgut.org --batch -l letgut.el -f org-babel-tangle --kill + emacs -Q letgut.org --batch -l letgut.el -f org-latex-export-to-pdf --kill + + - for the `letgut-banner` package: + + emacs -Q letgut-banner.org --batch -l letgut.el -f org-babel-tangle --kill + emacs -Q letgut-banner.org --batch -l letgut.el -f org-latex-export-to-pdf --kill + +This creates the files `letgut.cls`, `letgut-banner.sty`, `letgut-code.tex` and +`letgut-banner-code.tex`. + +One can then build the PDF files `letgut-code.pdf` and `letgut-banner-code.pdf` +by running `latexmk` on each of the corresponding `.tex` files in a directory +containing the following files to be found in the `.../doc/lualatex/letgut` +directory: `latexmkrc`, `letgut.bib`, `letgut-code.pdf`, `letgut-code.tex`, +`letgut.pdf`, `letgut.tex`, `listings-conf.tex`, `localconf.tex`, `README.md`, +`xindex-letgut.lua`. + +Likewise, the user documentation `letgut.pdf` is built by running `latexmk` on +the corresponding `.tex` file (which doesn't derive from an Org Mode file). diff --git a/Master/texmf-dist/source/lualatex/letgut/letgut-banner.org b/Master/texmf-dist/source/lualatex/letgut/letgut-banner.org new file mode 100644 index 00000000000..44fa5fdec9b --- /dev/null +++ b/Master/texmf-dist/source/lualatex/letgut/letgut-banner.org @@ -0,0 +1,804 @@ +# Hey, Emacs! This is a -*- mode: org -*- file! + +#+TITLE: Support for the banner of the newsletter “La Lettre de GUTenberg” +#+AUTHOR: Association GUTenberg +#+EMAIL: secretariat@gutenberg.eu.org +#+DESCRIPTION: ... +#+KEYWORDS: ... +#+LANGUAGE: en +#+OPTIONS: num:t toc:nil title:nil + +#+LATEX_COMPILER: lualatex + +#+LaTeX_CLASS: letgut +#+LaTeX_HEADER: \setmainfont{KpRoman} +#+LaTeX_HEADER: \setsansfont{KpSans} +#+LaTeX_HEADER: \setmonofont[Scale = MatchLowercase]{RobotoMono} +#+LaTeX_HEADER: \letgutsetup{editorial=false} +#+LaTeX_HEADER: \input{listings-conf} +# #+LaTeX_HEADER: \input{codehigh-conf} +# #+LaTeX_HEADER: \letgutsetup{editorial=false,final} + +#+PROPERTY: header-args :padline no :tangle letgut-banner.sty :exports both :noweb yes :eval always +#+export_file_name: letgut-banner-code + +* Readme file :noexport: + +#+begin_src markdown :tangle README.md :exports none + letgut-banner - Support for the banner of the newsletter + “La Lettre de GUTenberg” + ============================================================= + + About + ------- + This package automatically draw the banner of the newsletter “La Lettre de + GUTenberg” with the current main font. + + Release + ------- + 2022-03-18 v0.9 + + Development + ----------- + Follow development, submit issues, and suggest improvements at + https://framagit.org/gutenberg/classe-lettre-gut. +#+end_src + +* Identification + +#+begin_src latex +% This is file `letgut.cls', +% generated with the Emacs Org-babel utility. +% +% The original source file is letgut-banner.org +% +% -------------:| --------------------------------------------------- +% letgut-banner:| Package for the banner of 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 +% +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License (LPPL), either +% version 1.3c of this license or (at your option) any later +% version. The latest version of this license is in the file: +% +% http://www.latex-project.org/lppl.txt +% +% This work is “maintained” (as per LPPL maintenance status) +% by Association GUTenberg. +#+end_src + +* Implementation + +These document classes can only be used with \LaTeXe, so we make +sure that an appropriate message is displayed when another \TeX{} +format is used. + +#+begin_src latex +\NeedsTeXFormat{LaTeX2e}[2020-10-01] +#+end_src + +Now, we can announce the package name and its version: + +#+begin_src latex +\ProvidesExplPackage{letgut-banner} +{2022-03-18} +{0.9} +{ + Package for the banner of the newsletter “La Lettre de GUTenberg” +} +#+end_src + +** Packages loaded + +In order to provide class options, we load the \package{l3keys2e} which provides +\LaTeXe{} option processing using \LaTeX3 keys: + + #+begin_src latex +\RequirePackage{l3keys2e} + #+end_src + +Till the Lua-based color will be added to the core \package{l3color} approach, +we have to rely on \package{xcolor} + +#+begin_src latex +\RequirePackage{xcolor} +#+end_src + +We want the material added to the first page to be not selectable in order to let the +reader who wants to copy the interesting text be able to select it (see below). + +#+begin_src latex +\RequirePackage{accsupp} +#+end_src + +What follows has to be done at this end of the preamble, otherwise the font set +with ~\setmainfont~ in the preamble isn't taken in account in the banner. + +We define an option for the color of the text in the “L” (that has to be the +same as the page color of the document). + +#+begin_src latex + \keys_define:nn { letgut-banner } + { + , pagecolor .clist_gset:N = \g__letgutbanner_pagecolor_clist + , pagecolor .initial:n = { 1,1,1 } + } + \ProcessKeysOptions { letgut-banner } +#+end_src + +#+begin_src latex +\AddToHook{begindocument}{ +#+end_src + +#+begin_src latex + \cs_generate_variant:Nn \color_fill:nn { nV } +#+end_src + +** Declarations + +*** Dimensions + + #+begin_src latex + \dim_new:N \g__letgutbanner_area_height_dim + \dim_new:N \g__letgutbanner_La_height_dim + \dim_new:N \g__letgutbanner_La_depth_dim + \dim_new:N \g__letgutbanner_La_yoffset_dim + \dim_new:N \g__letgutbanner_banner_vertical_contents_width_dim + \dim_new:N \g__letgutbanner_largest_LETR_box_height_dim + \dim_new:N \g__letgutbanner_between_letters_yoffset_dim + \dim_new:N \g__letgutbanner_between_letters_vertical_space_dim + \dim_new:N \g__letgutbanner_banner_padding_dim + \dim_if_exist:NF \g__letgutbanner_first_page_shrink_dim { + \dim_new:N \g__letgutbanner_first_page_shrink_dim + } + #+end_src + +- Dimensions of the page. If the present package is used with the + \class*{letgut}, they are borrowed from it. Otherwise, they are set to default + values. For this, we first generate a variant of ~\dim_const:Nn~ (see + https://github.com/latex3/latex3/issues/947#issuecomment-860950569). + #+begin_src latex + \cs_generate_variant:Nn \dim_const:Nn { NV } + \dim_if_exist:NTF \c__letgut_textheight_dim { + \dim_const:NV \c__letgutbanner_textheight_dim + \c__letgut_textheight_dim + }{ + \dim_const:Nn \c__letgutbanner_textheight_dim + { 25cm } + } + \dim_if_exist:NTF \c__letgut_textwidth_dim { + \dim_const:NV \c__letgutbanner_textwidth_dim + \c__letgut_textwidth_dim + }{ + \dim_const:Nn \c__letgutbanner_textwidth_dim + { 14cm } + } + \dim_if_exist:NTF \c__letgut_lmargin_dim { + \dim_const:NV \c__letgutbanner_lmargin_dim + \c__letgut_lmargin_dim + }{ + \dim_const:Nn \c__letgutbanner_lmargin_dim + { 5cm } + } + \dim_if_exist:NTF \c__letgut_tmargin_dim { + \dim_const:NV \c__letgutbanner_tmargin_dim + \c__letgut_tmargin_dim + }{ + \dim_const:Nn \c__letgutbanner_tmargin_dim + { 2.92cm } + % \dim_const:Nn \c__letgutbanner_tmargin_dim + % { 3cm } + } + \dim_if_exist:NTF \c__letgut_head_dim { + \dim_const:NV \c__letgutbanner_head_dim + \c__letgut_head_dim + }{ + \dim_const:Nn \c__letgutbanner_head_dim + { 0.6cm } + } + \dim_if_exist:NTF \c__letgut_headsep_dim { + \dim_const:NV \c__letgutbanner_headsep_dim + \c__letgut_headsep_dim + }{ + \dim_const:Nn \c__letgutbanner_headsep_dim + { 0.82cm } + % \dim_const:Nn \c__letgutbanner_headsep_dim + % { 0.9cm } + } + \dim_if_exist:NTF \c__letgut_marginparwidth_dim { + \dim_const:NV \c__letgutbanner_marginparwidth_dim + \c__letgut_marginparwidth_dim + }{ + \dim_const:Nn \c__letgutbanner_marginparwidth_dim + { 3.74cm } + } + #+end_src +- Dimensions of the banner. If the present package is used with the + \class*{letgut}, they are borrowed from it. Otherwise, they are set to + default values. + - Thickness of the “L”. + #+begin_src latex + \dim_if_exist:NTF \c__letgut_banner_thickness_dim { + \dim_const:NV \c__letgutbanner_banner_thickness_dim + \c__letgut_banner_thickness_dim + }{ + \dim_const:Nn \c__letgutbanner_banner_thickness_dim + { 4cm } + } + #+end_src + - Height of the “L” (that of the text area plus 3cm). + #+begin_src latex + \dim_if_exist:NTF \c__letgut_banner_height_dim { + \dim_const:NV \c__letgutbanner_banner_height_dim + \c__letgut_banner_height_dim + }{ + \dim_const:Nn \c__letgutbanner_banner_height_dim { + \c__letgutbanner_textheight_dim + + + 3cm + } + } + #+end_src + - Initial padding of the text embedded in the vertical bar of the “L”. + #+begin_src latex + \dim_const:Nn \c__letgutbanner_banner_padding_dim { .25cm } + #+end_src + - Width of the “L” (the width ($w$) of the text zone plus the width ($l$) of + the left margin minus half the difference between the width of the left + margin and the width ($d$) of the “L”: $=w+l-(l-d)/2=w+(l+d)/2$). + #+begin_src latex + \dim_const:Nn \c__letgutbanner_banner_width_dim { + \c__letgutbanner_textwidth_dim + + + ( + \c__letgutbanner_banner_thickness_dim + + + \c__letgutbanner_lmargin_dim + )/2 + } + #+end_src + - Initial width of the text embedded in the “L” vertical bar. + #+begin_src latex + \dim_const:Nn + \c__letgutbanner_banner_vertical_contents_width_dim { + \c__letgutbanner_banner_thickness_dim + - + 2\c__letgutbanner_banner_padding_dim + } + #+end_src + - Width of the text embedded in the horizontal bar of the “L” (of the text + area plus half the difference between that of the left margin and that of + the thickness of the “L”, minus the padding -- and not 2 times the + padding because this text will be stuck to its left “margin”). + #+begin_src latex + \dim_const:Nn + \c__letgutbanner_banner_horizontal_contents_width_dim { + \c__letgutbanner_textwidth_dim + - ( + \c__letgutbanner_banner_thickness_dim + - + \c__letgutbanner_lmargin_dim + )/2 + - + \c__letgutbanner_banner_padding_dim + } + #+end_src + +*** Boxes + +New boxes, for each of the letters in the word “LETTRE” (!), and then for the +rest of the content listed in the banner. +#+begin_src latex +\box_new:N \g__letgutbanner_L_box +\box_new:N \g__letgutbanner_E_box +\box_new:N \g__letgutbanner_T_box +\box_new:N \g__letgutbanner_R_box +\box_new:N \g__letgutbanner_La_box +\box_new:N \g__letgutbanner_GUTenberg_box +\box_new:N \g__letgutbanner_largest_LETR_box +\box_new:N \g__letgutbanner_g_box +#+end_src + +*** Floating point numbers + +- Minimum percentage of the common height of the letters of the word “LETTRE” + that their line spacing must represent. +#+begin_src latex +\fp_const:Nn \c__letgutbanner_leading_minimum_percent_fp { 0.15 } +#+end_src +- Factor applied to the line spacing between “La” and the 1st letter of + “LETTRE” compared to that between the letters of “LETTRE”. +#+begin_src latex +\fp_const:Nn \c__letgutbanner_leading_La_factor_fp { 1.5 } +#+end_src + +** Application des dimensions de la page + +#+begin_src latex + \geometry{ + asymmetric, + textheight = \c__letgutbanner_textheight_dim, + textwidth = \c__letgutbanner_textwidth_dim, + lmargin = \c__letgutbanner_lmargin_dim, + tmargin = \c__letgutbanner_tmargin_dim, + head = \c__letgutbanner_head_dim, + headsep = \c__letgutbanner_headsep_dim, + marginparwidth= \c__letgutbanner_marginparwidth_dim, + % showframe, + % verbose, + } +#+end_src + +** Filling of the boxes +#+begin_src latex + \hbox_gset:Nn \g__letgutbanner_L_box { \textbf{L} } + \hbox_gset:Nn \g__letgutbanner_E_box { \textbf{E} } + \hbox_gset:Nn \g__letgutbanner_T_box { \textbf{T} } + \hbox_gset:Nn \g__letgutbanner_R_box { \textbf{R} } + \hbox_gset:Nn \g__letgutbanner_La_box { \textbf{\textit{La}} } + \hbox_gset:Nn \g__letgutbanner_GUTenberg_box { + \textbf{\textit{GUTenberg}} + } + \hbox_gset:Nn \g__letgutbanner_g_box { \textbf{g} } +#+end_src + +** Computations + +Determination of the widths of each of the letter boxes of the word “LETTRE”. +#+begin_src latex + \dim_const:Nn \c__letgutbanner_L_width_dim { + \box_wd:N \g__letgutbanner_L_box + } + \dim_const:Nn \c__letgutbanner_E_width_dim { + \box_wd:N \g__letgutbanner_E_box + } + \dim_const:Nn \c__letgutbanner_T_width_dim { + \box_wd:N \g__letgutbanner_T_box + } + \dim_const:Nn \c__letgutbanner_R_width_dim { + \box_wd:N \g__letgutbanner_R_box + } +#+end_src +Determination of the largest of these widths, stored in the scratch dimension +~\g_tmpa_dim~. +#+begin_src latex +\dim_gset:Nn \g_tmpa_dim { + \fp_eval:n { + max ( + \c__letgutbanner_L_width_dim, + \c__letgutbanner_E_width_dim, + \c__letgutbanner_T_width_dim, + \c__letgutbanner_R_width_dim, + ) + }pt +} +#+end_src +Determination of the (1st) box whose width is the largest of all (~argmax~, as +it were). +#+begin_src latex +\box_gset_eq:NN \g__letgutbanner_largest_LETR_box \dim_case:nnF +{ \g_tmpa_dim } +{ + { \c__letgutbanner_L_width_dim } { \g__letgutbanner_L_box } + { \c__letgutbanner_E_width_dim } { \g__letgutbanner_E_box } + { \c__letgutbanner_T_width_dim } { \g__letgutbanner_T_box } + { \c__letgutbanner_R_width_dim } { \g__letgutbanner_R_box } +} +{ No~ idea! } +#+end_src +Resize the box containing “GUTenberg” to the width of the text embedded in the +horizontal bar of the “L”. +#+begin_src latex + \box_gresize_to_wd:Nn \g__letgutbanner_GUTenberg_box { + \c__letgutbanner_banner_horizontal_contents_width_dim + } +#+end_src +Determination of the height and depth of the box containing “GUTenberg” resized. +#+begin_src latex + \dim_const:Nn \c__letgutbanner_GUTenberg_height_dim { + \box_ht:N \g__letgutbanner_GUTenberg_box + } + \dim_const:Nn \c__letgutbanner_GUTenberg_depth_dim { + \box_dp:N \g__letgutbanner_GUTenberg_box + } +#+end_src +Determining the size of the vertical offset of the box containing the resized +“GUTenberg”, so that it is vertically centered in the horizontal bar of the “L”: +the box positioned in $0$ would be at the very bottom of the box containing the +banner so with base line at the bottom the horizontal bar of the “L” so we raise +it first by its depth ($d$) and then by half the difference between the heights +($H$) of the horizontal bar of the “L” and ($h+d$) total of the box containing +“GUTenberg” resized ($=d+H/2-(h+d)/2=(H-h+d)/2$). +#+begin_src latex + \dim_const:Nn \c__letgutbanner_GUTenberg_yoffset_dim { + ( + \c__letgutbanner_banner_thickness_dim + - + \c__letgutbanner_GUTenberg_height_dim + + + \c__letgutbanner_GUTenberg_depth_dim + )/2 + } +#+end_src +Once the height of the zone devoted to “La LETTRE” in the vertical bar of the +“L” has been fixed, the line spacing between the letters of the word “LETTRE” +depends in fact only on the width occupied by the widest of them, by definition +equal to the width allocated to the text embedded in the vertical bar of the +“L”. The latter, stored in ~\g__letgutbanner_banner_vertical_contents_width_dim~, is +initially fixed: +#+begin_src latex + \dim_gset:Nn + \g__letgutbanner_banner_vertical_contents_width_dim + \c__letgutbanner_banner_vertical_contents_width_dim +#+end_src +but, to avoid this line spacing being too small (or even negative), we test that +it is greater than a certain threshold, equal to a certain minimum percentage of +the height common to the letters of the word “LETTRE”, stored in: + +~\c__letgutbanner_leading_minimum_percent_fp~ + +and fixed at 0.15. If this is not the +case, we reduce (by 1pt): + +~\g__letgutbanner_banner_vertical_contents_width_dim~ + +and loop until it is the case. +#+begin_src latex + \dim_do_until:nNnn { + \g__letgutbanner_between_letters_vertical_space_dim + } + > + { + \fp_use:N\c__letgutbanner_leading_minimum_percent_fp + \g__letgutbanner_largest_LETR_box_height_dim + }{ +#+end_src +Resize the largest of these boxes to the width of the text embedded in the “L”. +#+begin_src latex + \box_gresize_to_wd:Nn \g__letgutbanner_largest_LETR_box { + \g__letgutbanner_banner_vertical_contents_width_dim + } +#+end_src +Height of this resized larger box. +#+begin_src latex + \dim_gset:Nn \g__letgutbanner_largest_LETR_box_height_dim { + \box_ht:N \g__letgutbanner_largest_LETR_box + } +#+end_src +Resize the boxes for each of the letters in the word “LETTRE” so that they are +all the same height as the widest of them. +#+begin_src latex + \box_gresize_to_ht:Nn \g__letgutbanner_L_box { + \g__letgutbanner_largest_LETR_box_height_dim + } + \box_gresize_to_ht:Nn \g__letgutbanner_E_box { + \g__letgutbanner_largest_LETR_box_height_dim + } + \box_gresize_to_ht:Nn \g__letgutbanner_T_box { + \g__letgutbanner_largest_LETR_box_height_dim + } + \box_gresize_to_ht:Nn \g__letgutbanner_R_box { + \g__letgutbanner_largest_LETR_box_height_dim + } +#+end_src +Resize the box containing “La” to the width of the text embedded in the “L” +vertical bar. +#+begin_src latex + \box_gresize_to_wd:Nn \g__letgutbanner_La_box { + \g__letgutbanner_banner_vertical_contents_width_dim + } +#+end_src +Determine the height ($h$) and depth ($d$) of the resized box containing “La”. +#+begin_src latex + \dim_gset:Nn \g__letgutbanner_La_height_dim { + \box_ht:N \g__letgutbanner_La_box + } + \dim_gset:Nn \g__letgutbanner_La_depth_dim { + \box_dp:N \g__letgutbanner_La_box + } +#+end_src +Determining the size of the vertical offset of the resized box containing “La” +so that its top is, relative to the top of the “L”, offset by the same amount as +the bottom of the box containing “GUTenberg” is offset from the bottom of the +“L” (i.e., the distance from the top of the page to the top of “La” and the +distance from the bottom of the page to the baseline of “GUTenberg” are +identical). +#+begin_src latex + \dim_gset:Nn \g__letgutbanner_La_yoffset_dim { + \c__letgutbanner_banner_height_dim + - + \c__letgutbanner_GUTenberg_yoffset_dim + - + \g__letgutbanner_La_height_dim + + + \g__letgutbanner_La_depth_dim + } +#+end_src +For the following, the area containing the letters of the word “LETTRE” aligned +vertically is fixed, defined as follows: + - its top is the baseline of “La”, + - its bottom is the baseline of “GUTenberg”. +Determination of the height of this area. +#+begin_src latex + \dim_gset:Nn \g__letgutbanner_area_height_dim { + \g__letgutbanner_La_yoffset_dim + - + \g__letgutbanner_La_depth_dim + - + \c__letgutbanner_GUTenberg_yoffset_dim + } +#+end_src +Determining the vertical jump ($s$) between the letters in the word “LETTRE” +with the constraints that: + - the top of the 1st letter (“L”) is $3e/2$ below the top of the area (where + $e$ is the common vertical space separating the letters of the word + “LETTRE”), + - the baseline of the last letter (“E”) is merged with the bottom of the area, + - this jump must not be less than 20 % of the common height $h$ to all these + letters i.e.: + + ~\g__letgutbanner_largest_LETR_box_height_dim~ + + otherwise the size of the largest of these boxes is reduced to less than the + width of the text embedded in the “L”. + +The sum of : + - the 5 vertical spaces ($5e$) between the letters in the word “LETTRE”, + - the 6 common heights ($6h$) to all these letters, + - $3e/2$, +must equal the height ($H$) of the zone. So we have $H=3e/2+5e+6h$, that is +$e=2(H-6h)/13$. Once initialized, the vertical jump between the letters is +$s=e+h$ that is $s=(2H+h)/13$. Therefore: + +1. Determine the vertical half-space between the letters. + #+begin_src latex + \dim_set:Nn \l_tmpa_dim { + ( + \g__letgutbanner_area_height_dim + - + 6\g__letgutbanner_largest_LETR_box_height_dim + )/13 + } + #+end_src +2. Vertical space between letters. + #+begin_src latex + \dim_gset:Nn \g__letgutbanner_between_letters_vertical_space_dim { + 2\l_tmpa_dim + } + #+end_src +3. If this space does not check the condition explained above, we reduce: + + ~\g__letgutbanner_banner_vertical_contents_width_dim~ + + and loop. + #+begin_src latex + \dim_gsub:Nn \g__letgutbanner_banner_vertical_contents_width_dim { + 1pt + } + } + #+end_src +The width allocated to the text embedded in the vertical bar of the “L” may have +been re-evaluated, so the padding (which must be symmetrical) may have changed +as well. + #+begin_src latex + \dim_gset:Nn \g__letgutbanner_banner_padding_dim { + ( + \c__letgutbanner_banner_thickness_dim + - + \g__letgutbanner_banner_vertical_contents_width_dim + )/2 + } + #+end_src +4. Determination of the vertical offset of the 1st letter (“L”). + #+begin_src latex + \dim_const:Nn \c__letgutbanner_first_letter_yoffset_dim { + \g__letgutbanner_La_yoffset_dim + - + \g__letgutbanner_largest_LETR_box_height_dim + - + \fp_use:N \c__letgutbanner_leading_La_factor_fp + \g__letgutbanner_between_letters_vertical_space_dim + } + #+end_src +5. Determination of the vertical jump between letters. + #+begin_src latex + \dim_gset:Nn \g__letgutbanner_between_letters_yoffset_dim { + \g__letgutbanner_between_letters_vertical_space_dim + + + \g__letgutbanner_largest_LETR_box_height_dim + } + #+end_src +Resize the box containing “g” to the width of the text. +#+begin_src latex + \box_gresize_to_wd:Nn \g__letgutbanner_g_box { + \c__letgutbanner_textwidth_dim + } +#+end_src +Calculates the size by which the height of the text box on the 1st page must be +reduced so that the banner does not encroach on the text. Relative to the top of +the page: + - the top of the horizontal bar of “L” is at a distance equal to the sum of : + - the distance between this top of page and the top of the vertical bar of + “L”, equal to the height ($p$) of the paper minus the height ($l$) of “L” +#+begin_src latex + \dim_gset:Nn \g__letgutbanner_first_page_shrink_dim { + \c__letgutbanner_tmargin_dim + + + \c__letgutbanner_textheight_dim + + + \c__letgutbanner_banner_thickness_dim + - + .5\paperheight + - + .5\c__letgutbanner_banner_height_dim + + + .5\baselineskip + } +#+end_src +Automatic addition on the 1st page (only) of the banner. +#+begin_src latex +\AddToHookNext{shipout/background}{ +#+end_src +We want the material added to this page to be not selectable in order to let the +reader who wants to copy the interesting text be able to select it. +#+begin_src latex + \BeginAccSupp{ActualText={}} +#+end_src +We put now the big “L” at the right place. +#+begin_src latex + \put( + .5\c__letgutbanner_lmargin_dim-.5\c__letgutbanner_banner_thickness_dim + , + -.5\paperheight-.5\c__letgutbanner_banner_height_dim + ){ + \put(0,0){ + \rule{ + \c__letgutbanner_banner_width_dim + }{ + \c__letgutbanner_banner_thickness_dim + } + } + \put(0,0){ + \rule{ + \c__letgutbanner_banner_thickness_dim + }{ + \c__letgutbanner_banner_height_dim + } + } + #+end_src +The color should not be systematically white, but should be identical to the one +chosen for the page background. +#+begin_src latex + % \color_fill:nV {rgb}{ \g__letgutbanner_pagecolor_clist } + \color[rgb]{ \g__letgutbanner_pagecolor_clist } + \put( + \g__letgutbanner_banner_padding_dim + , + \g__letgutbanner_La_yoffset_dim + ){ + \box_use:N \g__letgutbanner_La_box + } + \put( + \g__letgutbanner_banner_padding_dim + , + \c__letgutbanner_first_letter_yoffset_dim + -0\g__letgutbanner_between_letters_yoffset_dim + ){ + \box_use:N \g__letgutbanner_L_box + } + \put( + \g__letgutbanner_banner_padding_dim + , + \c__letgutbanner_first_letter_yoffset_dim + -1\g__letgutbanner_between_letters_yoffset_dim + ){ + \box_use:N \g__letgutbanner_E_box + } + \put( + \g__letgutbanner_banner_padding_dim + , + \c__letgutbanner_first_letter_yoffset_dim + -2\g__letgutbanner_between_letters_yoffset_dim + ){ + \box_use:N \g__letgutbanner_T_box + } + \put( + \g__letgutbanner_banner_padding_dim + , + \c__letgutbanner_first_letter_yoffset_dim + -3\g__letgutbanner_between_letters_yoffset_dim + ){ + \box_use:N \g__letgutbanner_T_box + } + \put( + \g__letgutbanner_banner_padding_dim + , + \c__letgutbanner_first_letter_yoffset_dim + -4\g__letgutbanner_between_letters_yoffset_dim + ){ + \box_use:N \g__letgutbanner_R_box + } + \put( + \g__letgutbanner_banner_padding_dim + , + \c__letgutbanner_first_letter_yoffset_dim + -5\g__letgutbanner_between_letters_yoffset_dim + ){ + \box_use:N \g__letgutbanner_E_box + } + \put( + \c__letgutbanner_banner_thickness_dim + , + \c__letgutbanner_GUTenberg_yoffset_dim + ){ + \box_use:N \g__letgutbanner_GUTenberg_box + } + % \color_fill:n {black!10} + \color{ black!10 } + \put( + .5\c__letgutbanner_lmargin_dim+.5\c__letgutbanner_banner_thickness_dim + , + .5\paperheight + + + .5\c__letgutbanner_banner_height_dim + - + \c__letgutbanner_tmargin_dim + ){ + \box_move_down:nn {.5\c__letgutbanner_textheight_dim} + {\box_use:N \g__letgutbanner_g_box} + } +} + #+end_src + We end the part which isn't selectable. + #+begin_src latex + \EndAccSupp{} + } +#+end_src + +We close ~\AddToHook{begindocument}~. + +#+begin_src latex +} +#+end_src + +If the package is used with another class than \class{letgut}, we reduce the +textheight of the first page of the height of the horizontal bar of the “L”. + +#+begin_src latex +\@ifclassloaded{letgut}{ +}{ + \AddToHook{begindocument/end}{% + \enlargethispage{ + - \g__letgutbanner_first_page_shrink_dim + } + \thispagestyle{empty} + } +} +#+end_src + +* Example file (=letgut-banner-example.tex=) + +#+begin_src latex :tangle letgut-banner-example.tex :exports both + \documentclass[twoside]{article} + \usepackage{fontspec} + \usepackage[a4paper]{geometry} + \usepackage{fancyhdr} + \usepackage{letgut-banner} + \usepackage{lipsum} + \setmainfont{TeX Gyre Schola} + \fancyhf{} + \fancyhead[RO,LE]{\thepage} + \fancyhead[RE,LO]{Test~\textsf{letgut-banner}} + \pagestyle{fancy} + \begin{document} + \lipsum[1-20] + \end{document} +#+end_src diff --git a/Master/texmf-dist/source/lualatex/letgut/letgut.org b/Master/texmf-dist/source/lualatex/letgut/letgut.org new file mode 100644 index 00000000000..11bd545dec7 --- /dev/null +++ b/Master/texmf-dist/source/lualatex/letgut/letgut.org @@ -0,0 +1,3405 @@ +# Hey, Emacs! This is a -*- mode: org -*- file! + +#+TITLE: Support for the newsletter “La Lettre GUTenberg” +#+AUTHOR: Association GUTenberg +#+EMAIL: secretariat@gutenberg.eu.org +#+DESCRIPTION: ... +#+KEYWORDS: ... +#+LANGUAGE: en +#+OPTIONS: num:t toc:nil title:nil + +#+LATEX_COMPILER: lualatex + +#+LaTeX_CLASS: letgut +#+LaTeX_HEADER: \setmainfont{KpRoman} +#+LaTeX_HEADER: \setsansfont{KpSans} +#+LaTeX_HEADER: \setmonofont[Scale = MatchLowercase]{RobotoMono} +#+LaTeX_HEADER: \letgutsetup{editorial=false} +#+LaTeX_HEADER: \input{listings-conf} +# #+LaTeX_HEADER: \input{codehigh-conf} +# #+LaTeX_HEADER: \letgutsetup{editorial=false,final} + +#+PROPERTY: header-args :padline no :tangle letgut.cls :exports both :noweb yes :eval always +#+export_file_name: letgut-code + +* Changelog file :noexport: + +#+begin_src markdown :tangle CHANGELOG.md +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic +Versioning](http://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +## [0.9] - 2022-03-18 + +### Added First public testing release +#+end_src + +* Readme file :noexport: + +#+begin_src markdown :tangle README.md +letgut - Support for the newsletter “La Lettre GUTenberg” +========================================================= + +About +------- +This bundle includes a LaTeX class, a `.sty` file and an acronym file dedicated +to the newsletter “La Lettre GUTenberg” of GUTenberg, the French TeX User Group. + +Release +------- +2022-03-18 v0.9 + +Development +----------- +Follow development, submit issues and suggest improvements at +https://framagit.org/gutenberg/classe-lettre-gut. +#+end_src + +* How to :noexport: + +We explain in a \file*{HOWTO.md} file how to: + +- tangle the \file*{letgut.cls} and \file*{letgut-banner.sty}, +- build the: + - documented codes \file*{letgut-code.pdf} and \file*{letgut-banner-code.pdf} + of the classe and the package, + - \file*{letgut.pdf} of the class + +from the \software[https://orgmode.org/]{Org Mode} source files +\file*{letgut.org} and \file*{letgut-banner.org}. + +#+begin_src markdown :tangle HOWTO.md :exports none +In order to: + +- tangle the `letgut.cls` and `letgut-banner.sty` files, +- build the documentations `letgut-code.pdf` and `letgut-banner-code.pdf` of the + codes, + +from the Org Mode source files `letgut.org` and `letgut-banner.org`: + +- it is necessary a reasonably recent version of Emacs, +- it is then sufficient to run (in a directory containing the `letgut.el` file + to be found in the current directory): + - for the `letgut` class: + + emacs -Q letgut.org --batch -l letgut.el -f org-babel-tangle --kill + emacs -Q letgut.org --batch -l letgut.el -f org-latex-export-to-pdf --kill + + - for the `letgut-banner` package: + + emacs -Q letgut-banner.org --batch -l letgut.el -f org-babel-tangle --kill + emacs -Q letgut-banner.org --batch -l letgut.el -f org-latex-export-to-pdf --kill + +This creates the files `letgut.cls`, `letgut-banner.sty`, `letgut-code.tex` and +`letgut-banner-code.tex`. + +One can then build the PDF files `letgut-code.pdf` and `letgut-banner-code.pdf` +by running `latexmk` on each of the corresponding `.tex` files in a directory +containing the following files to be found in the `.../doc/lualatex/letgut` +directory: `latexmkrc`, `letgut.bib`, `letgut-code.pdf`, `letgut-code.tex`, +`letgut.pdf`, `letgut.tex`, `listings-conf.tex`, `localconf.tex`, `README.md`, +`xindex-letgut.lua`. + +Likewise, the user documentation `letgut.pdf` is built by running `latexmk` on +the corresponding `.tex` file (which doesn't derive from an Org Mode file). +#+end_src + +* Identification + +#+begin_src latex +% This is file `letgut.cls', +% generated with the Emacs Org-babel utility. +% +% The original source file is letgut.org +% +% -------:| ---------------------------------------------------- +% letgut:| Class for the newsletter “La Lettre GUTenberg” +% Author:| Association GUTenberg +% E-mail:| secretariat@gutenberg.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 +% +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License (LPPL), either +% version 1.3c of this license or (at your option) any later +% version. The latest version of this license is in the file: +% +% http://www.latex-project.org/lppl.txt +% +% This work is “maintained” (as per LPPL maintenance status) +% by Association GUTenberg. +% +#+end_src + +* Debugging + +#+begin_src latex +% \RequirePackage[ +% , check-declarations +% , enable-debug +% , backend=luatex +% ]{expl3} +#+end_src + +* Implementation + +These document classes can only be used with \LaTeXe, so we make +sure that an appropriate message is displayed when another \TeX{} +format is used. + +#+begin_src latex +\NeedsTeXFormat{LaTeX2e}[2020-10-01] +#+end_src + +We define some constant token lists immediately useful. + +#+begin_src latex + \ExplSyntaxOn + \tl_const:Nn \c__letgut_Lettre_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_src + +Now, we can announce the class name and its version: + +#+begin_src latex + \ProvidesExplClass{letgut} + {2022-03-18} + {0.9} + { + Class~ for~ the~ newsletter~ + “\c__letgut_La_lettre_gutenberg_tl” + } +#+end_src + +** Messages + +We specify the messages come from a class, which is letgut (see +\url{https://github.com/latex3/latex3/issues/887}). + +#+begin_src latex + \prop_gput:Nnn \g_msg_module_type_prop { letgut } { Class } +#+end_src + +Some messages are declared for future use. + +#+begin_src latex + \msg_new:nnn{letgut}{Wrong~engine}{ + The~ letgut~ class~ requires~ LuaTeX.\\\\ + You~ must~ change~ your~ typesetting~ engine~ to~ + “lualatex”~ instead~ of~ “latex”~ or~ “pdflatex” + or~ “xelatex”. + } + \msg_new:nnn{letgut}{Existing~command}{ + The~ command~ \c_backslash_str \text_lowercase:n{#1}~ + already~ exists~ and~ has~ not~ be~ overwritten~ by~ + \token_to_str:N \letgutacro{#1}{...}.~ + The~ corresponding~ acronym~ has~ to~ be~ used~ e.g.~ + like~ this:~ + \token_to_str:N \ac{ \text_lowercase:n{#1} }. + } + \msg_new:nnn{letgut}{Not~month~iso~date}{ + The~ supplied~ date~(“#1”)~ isn't~ at~ the~ month~ iso~ + date~ format~ (YYYY-MM):~ it~ will~ be~ printed~ as~ + it~ is. + } + \msg_new:nnn{letgut}{Banner~file~not~provided}{ + No~ `\c__letgut_banner_file_tl.pdf'~ file~ provided:~ + the~ banner~ will~ be~ automatically~ created. + } + \msg_new:nnn{letgut}{Editorial~file~missing}{ + File~`\c__letgut_editorial_file_tl.tex'~missing!~ + The~ editorial~ will~ be~ missing. + } + \msg_new:nnn{letgut}{Informations~file~missing}{ + File~ `\c__letgut_informations_gutenberg_file_tl.tex'~ + missing!~ The~ informations~ about~ + \c__letgut_gutenberg_tl\c_space_tl~ will~ be~ missing. + } + \msg_new:nnn{letgut}{pagecolor~inoperative~with~paper~option}{ + The~ `pagecolor=#1`~ option~ is~ inoperative~ with~ the~ `paper`~ + option:~ the~ color~ of~ the~ page~ will~ remain~ white. + } + \msg_new:nnn{letgut}{frontcover-missing}{ + You~ didn't~ use~ the~ `frontcover`~ option~ for~ the~ + bookreview~ “#1”,~ so~ the~ book~ cover~image~ will~ be~ missing:~ + are~ you~ sure? + } + \msg_new:nnn{letgut}{frontcover-file-not-found}{ + The~ book~ cover~ image~ `#2`~ you~ specified~ via~ the~ + `frontcover`~ option~ for~ the~ bookreview~ “#1”~ cannot~ be~ found. + } +#+end_src + +** Engine checking + +#+begin_src latex + \sys_if_engine_luatex:F { + \msg_fatal:nn{letgut}{Wrong~engine} + } +#+end_src + +** Declarations + +*** Booleans + +- For testing the emptyness of the title. + #+begin_src latex + \bool_new:N \g__letgut_title_empty_bool + #+end_src +- For the paper (or not) output. + #+begin_src latex + \bool_new:N \g__letgut_paper_bool + #+end_src +- For testing whether we currently are in a footnote or not. + #+begin_src latex + \bool_new:N \l__letgut_in_footnote_bool + #+end_src + +*** Dimensions + +- Geometry of the document + #+begin_src latex + \dim_const:Nn \c__letgut_textheight_dim { 25cm } + \dim_const:Nn \c__letgut_textwidth_dim { 14cm } + \dim_const:Nn \c__letgut_lmargin_dim { 5cm } + \dim_const:Nn \c__letgut_tmargin_dim { 2.92cm } + % \dim_const:Nn \c__letgut_tmargin_dim { 3cm } + \dim_const:Nn \c__letgut_head_dim { 0.6cm } + \dim_const:Nn \c__letgut_headsep_dim { 0.82cm } + % \dim_const:Nn \c__letgut_headsep_dim { 0.9cm } + \dim_const:Nn \c__letgut_marginparwidth_dim { 3.74cm } + #+end_src +- Horizontal offset of the headers and the sections titles: + #+begin_src latex + \dim_const:Nn \c__letgut_hoffset_dim { 3cm } + \dim_const:Nn \c__letgut_title_hoffset_dim { + -\c__letgut_hoffset_dim + } + \dim_const:Nn \c__letgut_subtitle_hoffset_dim { + \c__letgut_title_hoffset_dim + } + \dim_const:Nn \c__letgut_section_hoffset_dim { + \c__letgut_title_hoffset_dim + 1cm + } + \dim_const:Nn \c__letgut_subsection_hoffset_dim { + \c__letgut_title_hoffset_dim + 1.5cm + } + \dim_const:Nn \c__letgut_subsubsection_hoffset_dim { + \c__letgut_title_hoffset_dim + 2cm + } + \dim_const:Nn \c__letgut_paragraph_hoffset_dim { + \c__letgut_title_hoffset_dim + 2.5cm + } + \dim_const:Nn \c__letgut_subparagraph_hoffset_dim { + \c__letgut_title_hoffset_dim + 3cm + } + #+end_src +- Distance between the baseline of the header text and the decorative line: + #+begin_src latex + \dim_const:Nn \c__letgut_head_rule_skip_dim { 0.115cm } + #+end_src +- Head rule width: + #+begin_src latex + \dim_const:Nn \c__letgut_head_rule_width_dim { 0.03cm } + #+end_src +- Dimensions of the banner. + - Thickness of the “L”. + #+begin_src latex + \dim_const:Nn \c__letgut_banner_thickness_dim { 4cm } + #+end_src + - Height of the “L” (that of the text area plus 3cm). + #+begin_src latex + \dim_const:Nn \c__letgut_banner_height_dim { + \c__letgut_textheight_dim + + + 3cm + } + #+end_src +- Height of the membership reminder box. + #+begin_src latex + \dim_new:N \g__letgut_membership_reminder_box_height_dim + #+end_src +- Horizontal space for the frontcover in the margin in book reviews. + #+begin_src latex + \dim_const:Nn \c__letgut_bookreview_frontcover_margin_sep_dim { + 4mm + } + #+end_src +- Dimensions used by the listings and the examples. +#+begin_src latex + \dim_const:Nn \c__letgut_height_mentions_dim { 5mm } + \dim_const:Nn \c__letgut_from_left_boundingbox_to_text_dim { 5.5mm } + \dim_const:Nn \c__letgut_number_offset_dim { 1mm } + \dim_const:Nn \c__letgut_number_sep_dim { + \c__letgut_from_left_boundingbox_to_text_dim + + + \c__letgut_number_offset_dim + } +#+end_src + +*** Skips (lengths with rubber components) + + The following skips, borrowed from the standard classes, are specified in + ~ex~ unit, which depends on the font used and hence have to be specified + after the class has been loaded; in fact, we postpone this at the end of the + preamble, when the font is specified (thanks to ~\setmainfont~). + +#+begin_src latex + \AddToHook{begindocument/before}{% +#+end_src + +Before and after: + + - “titles titles”: + #+begin_src latex + \skip_const:Nn \c__letgut_before_title_title_skip + { + 3.5ex plus 1ex minus .2ex + } + \skip_const:Nn \c__letgut_after_title_title_skip + { + 2.3ex plus .2ex + } + #+end_src + - subtitles titles: + #+begin_src latex + \skip_const:Nn \c__letgut_before_subtitle_title_skip + { + \c__letgut_before_title_title_skip + } + \skip_const:Nn \c__letgut_after_subtitle_title_skip + { + \c__letgut_after_title_title_skip + } + #+end_src + - sections titles: + #+begin_src latex + \skip_const:Nn \c__letgut_before_section_title_skip + { + 3.25ex plus 1ex minus .2ex + } + \skip_const:Nn \c__letgut_after_section_title_skip + { + 1.5ex plus .2ex + } + #+end_src + - subsections titles (identical to the sections ones): + #+begin_src latex + \skip_const:Nn \c__letgut_before_subsection_title_skip + { + \c__letgut_before_section_title_skip + } + \skip_const:Nn \c__letgut_after_subsection_title_skip + { + \c__letgut_after_section_title_skip + } + #+end_src + - paragraphs titles: + #+begin_src latex + \skip_const:Nn \c__letgut_before_subsubsection_title_skip + { + 1.5ex plus .5ex minus .2ex + } + \skip_const:Nn \c__letgut_after_subsubsection_title_skip + { + 0.75ex plus 0.1ex + } + #+end_src + - paragraphs titles (identical to the subsubsection ones): + #+begin_src latex + \skip_const:Nn \c__letgut_before_paragraph_title_skip + { + \c__letgut_before_subsubsection_title_skip + } + \skip_const:Nn \c__letgut_after_paragraph_title_skip + { + \c__letgut_after_subsubsection_title_skip + } + #+end_src + - subparagraphs titles (identical to the paragraph ones): + #+begin_src latex + \skip_const:Nn \c__letgut_before_subparagraph_title_skip + { + \c__letgut_before_paragraph_title_skip + } + \skip_const:Nn \c__letgut_after_subparagraph_title_skip + { + \c__letgut_after_paragraph_title_skip + } + #+end_src + +We close the ~\AddToHook{begindocument/before}~ argument. + +#+begin_src latex +} +#+end_src + + +*** Integers + #+begin_src latex +\int_new:N \g__letgut_ltx_example_int + #+end_src + +*** Strings + + #+begin_src latex +\str_new:N \g__letgut_label_ltx_example_str +\str_new:N \g__letgut_callout_label_ltx_example_str +\str_const:Nn \c__letgut_label_ltx_example_str { + __letgut_label_ltx_example +} +\str_const:Nn \c__letgut_callout_label_ltx_example_str { + __letgut_callout_label_ltx_example +} + #+end_src + +*** Token lists + +**** Constant ones + + #+begin_src latex + \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_src + +**** Variables ones + + #+begin_src latex + \tl_new:N \g__letgut_mark_tl + \tl_new:N \g__letgut_title_tl + \tl_new:N \l_letgut_last_name_tl + \tl_new:N \l_letgut_first_name_tl + \tl_new:N \l_letgut_title_tl + \tl_new:N \l__letgut_title_addon_tl + \tl_new:N \l__letgut_reference_text_tl + #+end_src + +*** Comma separated lists + +#+begin_src latex + \clist_new:N \g__letgut_pagecolor_clist + \clist_const:Nn \c__letgut_default_pagecolor_screen_clist + {1.0, 0.98, 0.94} + \clist_const:Nn \c__letgut_default_pagecolor_paper_clist + {1, 1, 1} +#+end_src + +*** Sequences + +#+begin_src latex + \seq_new:N \l__letgut_first_last_names_items_seq +#+end_src + +** Class options + +In order to provide class options, we load the \package{l3keys2e} which provides +\LaTeXe{} option processing using \LaTeX3 keys: + + #+begin_src latex + \RequirePackage{l3keys2e} + #+end_src + +We define the 2 load time options for the target audience: + +- ~for-readers~ (the default), for the “normal” “Lettre”, +- ~for-authors~, (only) the author(s) of an article of the “Lettre”. + +#+begin_src latex + \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_src + +** Class and package loading + +The \letgutcls{} is based on the ~article~ class. It is by default two sided +because of the alternating headers, and will by typeset with ~11pt~ as global +font size. + +#+begin_src latex + \LoadClass[twoside,11pt]{article} +#+end_src + +We now load some packages. + +- The \letgutcls{} will have to be used with LuaLaTeX. Hence the font selection + package for XeLaTeX and LuaLaTeX. + #+begin_src latex + \RequirePackage{fontspec} + #+end_src +- For subliminal refinements towards typographical perfection. + #+begin_src latex + \RequirePackage[ + , stretch=30 + , shrink=25 + , letterspace=150 + ]{microtype} + #+end_src +- Help in implementing paragraph layouts where the paragraphs are separated by + a vertical space instead of (or in addition to) indenting them. + #+begin_src latex + \RequirePackage{parskip} + #+end_src +- Extensive control of page headers and footers in \LaTeXe. + #+begin_src latex + \RequirePackage{fancyhdr} + #+end_src +- Flexible and complete interface to document dimensions. + #+begin_src latex + \RequirePackage[a4paper]{geometry} + #+end_src +- Enhanced support for graphics. + #+begin_src latex +\RequirePackage{graphicx} + #+end_src +- Extending the array and tabular environments. + #+begin_src latex +\RequirePackage{array} + #+end_src +- Completely customisable TOCs. + #+begin_src latex +\RequirePackage{etoc} + #+end_src +- Control layout of itemize, enumerate, description, and design our own lists. + #+begin_src latex +\RequirePackage{enumitem} + #+end_src +- Select alternative section titles. + #+begin_src latex +\RequirePackage{titlesec} + #+end_src +- Several logos and ornaments. + #+begin_src latex +\RequirePackage{fourier-orns} + #+end_src +- Control float placement. + #+begin_src latex +\RequirePackage[section,above]{placeins} + #+end_src +- Sophisticated verbatim text. + #+begin_src latex +\RequirePackage{fancyvrb} + #+end_src +- Publication quality tables in LaTeX. + #+begin_src latex +\RequirePackage{booktabs} + #+end_src +- Context sensitive quotation facilities. + #+begin_src latex +\RequirePackage{csquotes} + #+end_src +- Mathematical tools to use with (and which loads) \package{amsmath}. + #+begin_src latex +\RequirePackage[fleqn]{mathtools} + #+end_src +- Better accessibility support for PDF files. This package is used because we + want the material added to the background (banner on the first page and draft + watermark) to be not selectable in order to let the reader who wants to copy + the interesting text be able to select it. +#+begin_src latex + \RequirePackage{accsupp} +#+end_src +- A comprehensive (SI) units package. + #+begin_src latex + \RequirePackage{siunitx} + #+end_src +- A collection of logos with bookmark support. + #+begin_src latex + \RequirePackage{hologo} + #+end_src +- Driver-independent color extensions. + #+begin_src latex + \RequirePackage[table]{xcolor} + #+end_src +- Coloured boxes, for LaTeX examples and theorems, etc. + #+begin_src latex +\RequirePackage{tcolorbox} + #+end_src +- Expandable macros to extract the data from references and allow counter + assignments or calculations. + #+begin_src latex +\RequirePackage{refcount} + #+end_src +- Select colors with proper WCAG color contrast. + #+begin_src latex + \RequirePackage{ninecolors} + #+end_src +- Typeset tabulars and arrays with LaTeX3 (for the alert boxes typeset as + simple tabulars). + #+begin_src latex +\RequirePackage{tabularray} + #+end_src +- Multilingual support for Plain TeX or LaTeX. + #+begin_src latex +\RequirePackage[english,french]{babel} + #+end_src +- Intelligent page references. + #+begin_src latex +\RequirePackage[nospace,french]{varioref} + #+end_src +- Macros for Euro sign. + #+begin_src latex +\RequirePackage[right]{eurosym} + #+end_src +- Typeset source code listings using LaTeX. + #+begin_src latex +\RequirePackage{listings} + #+end_src +- Modifying the layout of floats. + #+begin_src latex +\RequirePackage{floatrow} + #+end_src +- Sophisticated Bibliographies in LaTeX. + #+begin_src latex + \RequirePackage[ + sorting=none, + datamodel=letgut, + citestyle=letgut + ]{biblatex} + #+end_src +- Typeset acronyms. + #+begin_src latex +\RequirePackage{acro} + #+end_src + +The following packages have to be the last ones loaded. So we ensure this by +loading them just before the begining of the document: +#+begin_src latex +\AddToHook{begindocument/before}{ +#+end_src +- Extensive support for hypertext in LaTeX + #+begin_src latex + \RequirePackage{hyperref} + #+end_src +- Adjusting the anchors of captions + #+begin_src latex + \RequirePackage[all]{hypcap} + #+end_src +- Intelligent cross-referencing + #+begin_src latex + \RequirePackage[french]{cleveref} + #+end_src +We close the ~\AddToHook{begindocument/before}~ argument. +#+begin_src latex + } +#+end_src + +** Settings for the loaded packages + +- We switch to the French typographic conventions for \package{siunitx}. + #+begin_src latex + \sisetup{ + , locale=FR + , mode=text + } + #+end_src +- Concerning floats, we ask: + - the caption text will be justified, + - the figures and their captions to be boxed (in order to distiguish them from + the current text), + - the tables to have their captions above them. + #+begin_src latex + \DeclareMarginSet{hangleft}{ + \setfloatmargins{\hskip-\c__letgut_hoffset_dim}{\hfil} + } + \DeclareFloatVCode{__letgut_ruleabove}{ + \par\rule{\hsize}{.8pt}\vskip4pt\par + } + \DeclareFloatVCode{__letgut_rulebelow}{ + \par\vskip2pt\rule{\hsize}{.8pt}\par + } + \DeclareFloatStyle{__letgut_ruled}{ + precode=__letgut_ruleabove, + postcode=__letgut_rulebelow, + % heightadjust=all, + floatwidth=.8\linewidth + } + \floatsetup{objectset=justified} + \floatsetup[figure]{ + style=__letgut_ruled, + margins=hangleft, + capposition=beside, + capbesideposition={top,left}, + floatwidth=0.85\textwidth + } + \floatsetup[table]{capposition=top} + #+end_src + Moreover, the tables will be entitled \enquote{tableau} instead of + \enquote{table}. + #+begin_src latex + \renewcommand*\frenchtablename{Tableau} + #+end_src +- We 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_src latex + \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_src + + #+begin_src latex + \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_src + Because of a current issue involving \package{parskip} and + \package{listings} + (\url{https://github.com/FrankMittelbach/fmitex-parskip/issues/3}), we have to + set the skip below the displayed listings to a zero length. + #+begin_src latex + belowskip=0pt, + } + \lstset{ + style=__letgut_all_reset + } + #+end_src + This style is applied automatically at the beginning of each ~\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_src latex + \AddToHook{cmd/input/before}{ + \lstset{% + style=__letgut_all_reset,% + } + } + #+end_src +- The ~\printbibliography~ command is redefined in order its ~heading~ is by + default set to ~subbibliography~. + #+begin_src latex + \NewCommandCopy{\__letgut_old_printbibliography}{ + \printbibliography + } + \RenewDocumentCommand {\printbibliography} { O{} } { + \phantomsection + \__letgut_old_printbibliography[#1] + } + #+end_src + For printing the bibliography, we define two new bibheadings for the + structure levels ~\title~ and ~\subtitle~. + #+begin_src latex + \defbibheading{title}[\refname]{% + \title{#1}} + \defbibheading{subtitle}[\refname]{% + \subtitle{#1}} + #+end_src +- The acronyms will be typset in footnote, with small caps shape. When they are + (English) foreign, it will be specified and the translation will be added. + #+begin_src latex + \acsetup{ + first-style=footnote, + format/short = {\scshape}, + format/foreign = {\em}, + foreign/display, + locale/format = {\upshape}, + locale/display, + } + #+end_src + Moreover, we redefine the private macro ~\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_src latex + \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_src + + The following settings for packages that have to be the last ones loaded are + also done just before the begining of the document. + +#+begin_src latex + \AddToHook{begindocument/before}{ +#+end_src + +- We want the hyperlinks to be as unobtrusive as possible. + #+begin_src latex + \bool_if:NTF \g__letgut_paper_bool { + \hypersetup{draft} + }{ + \hypersetup{% + colorlinks,% + allcolors={letgut_allcolors_links},% + }% + } + #+end_src + + A preset of acronyms is input (if found). + #+begin_src latex + \file_if_exist:nT {\c__letgut_acronyms_file_tl}{ + \file_input:n {\c__letgut_acronyms_file_tl} + } + #+end_src + +- Depending on some chosen class options, some packages have to be loaded, + notably before \package*{hyperref} is loaded, and actions are taken + accordingly. + - If the `draft` mode (default) is on, we load the \package*{lua-typo} which + highlights typographical flaws with LuaLaTeX. For the moment, + # this option is disabled if the `paper` option is enabled since enabling + # both + the \package*{lua-typo} isn't loaded since the `luacolor` + package it loads + # + currently does not work well in ~shipout/background~ (see + https://github.com/ho-tex/luacolor/issues/4). + #+begin_src latex + % % \bool_if:NF \g__letgut_paper_bool { + \bool_if:NT \g__letgut_draft_bool { + % \RequirePackage[All]{lua-typo} + \AddToHook{shipout/background} + { + \__letgut_unselectable:n { + \put(0.5\paperwidth,-0.5\paperheight) + { + \Huge + #+end_src + Currently, we can't use \package{l3color}'s ~\color_fill:n~[fn:1] + and we have to rely on \package{xcolor}'s ~\color~. + #+begin_src latex + % \color_fill:n {black!10} + \color{black!10} + \hbox_set:Nn \l_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_src + The draft watermak is rotated in order to be parallely slanted to the first + diagonal of the page (angle $=\arctan(\text{paper height}/\text{paper + width})$). + #+begin_src latex + \box_rotate:Nn \l_tmpb_box { + \fp_eval:n { + atand ( + \dim_to_fp:n {\paperheight} + / + \dim_to_fp:n {\paperwidth} + ) + } + } + \box_use:N \l_tmpb_box + } + } + } + #+end_src + Moreover, we want all the overfull boxes to be shown (as with + ~draft~ option of the standard classes). + #+begin_src latex + \setlength\overfullrule{5pt} + } + % % } +#+end_src + +# - We proceed to some settings for the \package*{glossaries-extra}: +# - the acronyms will be displayed in small caps, in footnotes, +# - the acronym definitions in footnotes are terminated with a period, like +# other footnotes, +# - we load the file of the built-in glossaries and acronyms terms. +# +# Note that we don't make use of ~\makeglossaries~ since we don't need +# glossaries files, since we don't make use of ~\printglossary~ (and friends) +# since we don't need to display a glossary or a list of acronyms. +# #+begin_src latex +# \setabbreviationstyle[acronym]{short-sc-footnote} +# \glsdisablehyper +# \renewcommand*{\glsxtrabbrvfootnote}[2]{\footnote{#2.}} +# \loadglsentries{letgut-acronyms} +# #+end_src + +We close the ~\AddToHook{begindocument/before}~ argument. + +#+begin_src latex +} +#+end_src + +** Date handling + +#+begin_src latex + \int_new:N \g__letgut_date_month_int + \int_new:N \g__letgut_date_year_int + + \int_gset:Nn \g__letgut_date_month_int {\the\month} + \int_gset:Nn \g__letgut_date_year_int {\the\year} + + \tl_new:N \g__letgut_date_month_tl + \tl_new:N \g__letgut_date_tl + + \cs_new_protected:Npn \__letgut_date_parse:n #1 + { + \__letgut_if_is_iso_date:nTF {#1} + { + \__letgut_date_parse:www #1 \q_stop + }{ + \msg_term:nnn{letgut}{Not~month~iso~date}{#1} + \tl_gset:Nn \g__letgut_date_tl { #1 } + } + } + + \prg_new_protected_conditional:Npnn + \__letgut_if_is_iso_date:n #1 { T, F, TF } + { + \regex_match:nnTF { ^\d{4}-(\d{1,2}) } {#1} + { \prg_return_true: } + { \prg_return_false: } + } + + \prg_new_protected_conditional:Npnn + \__letgut_if_is_int:n #1 { T, F, TF } + { + \regex_match:nnTF { ^[\+\-]?[\d]+$ } {#1} + { \prg_return_true: } + { \prg_return_false: } + } + + \cs_new_protected:Npn \__letgut_month_name:n #1 + { + % \text_titlecase_first:n { + \int_case:nnF + { #1 } + { + { 1 }{ janvier } + { 2 }{ février } + { 3 }{ mars } + { 4 }{ avril } + { 5 }{ mai } + { 6 }{ juin } + { 7 }{ juillet } + { 8 }{ août } + { 9 }{ septembre } + { 10 }{ octobre } + { 11 }{ novembre } + { 12 }{ décembre } + } + { Month~ Error! } + % } + } + + \cs_new_protected:Npn \__letgut_date_parse:www #1-#2 + \q_stop + { + \int_compare:nTF + { + \the\year <= #1 <= \the\year+1 + #+end_src + +# >> (Just not to disturb the parentheses balancing +# detection of my editor.) + + #+begin_src latex + }{ + \int_gset:Nn \g__letgut_date_year_int {#1} + }{ + \int_gset:Nn \g__letgut_date_year_int {\the\year} + } + \__letgut_if_is_int:nTF {#2} + { + \int_compare:nTF + { + 1 <= #2 <= 12 + #+end_src + +# >> (Just not to disturb the parentheses balancing +# detection of my editor.) + + #+begin_src latex + } + {\int_gset:Nn \g__letgut_date_month_int {#2}} + {\int_gset:Nn \g__letgut_date_month_int {\the\month}} + }{ + \int_gset:Nn \g__letgut_date_month_int {\the\month} + } + \tl_gset:Nn \g__letgut_date_month_tl { + \__letgut_month_name:n { \g__letgut_date_month_int } + } + \tl_gset:Nn \g__letgut_date_tl { + \tl_use:N \g__letgut_date_month_tl + \c_space_tl + \int_use:N \g__letgut_date_year_int + } + } +#+end_src + +** Page color default settings + + By default, the page color will be the one linked to the ~screen~ option. + +#+begin_src latex + \pagecolor[rgb]{\c__letgut_default_pagecolor_screen_clist} + \clist_set_eq:NN \g__letgut_pagecolor_clist + \c__letgut_default_pagecolor_screen_clist +#+end_src + +** Options + +These options look to need to be specified rather at the end (throws an error if +defined before the ~\__letgut_date_parse:n~'s definition): + +- ~number~ for the number of the issue, +- ~date~ for the date of the issue, either empty (hence the current (month) + date) or at the format ~YYYY-MM~ or as free input, +- ~pagecolor~ (relevant only with the (default) ~screen~ load time option) for + a color of the page other than the default one, +- ~membership-reminder~ that typesets a membership reminder on the first page, + +#+begin_src latex + \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_src + +** Headers + +We now define the headers. + +- The distance between the baseline of the header text and the decorative line + in the header is made a little bit bigger. + #+begin_src latex + \renewcommand{\headruleskip}{ + \c__letgut_head_rule_skip_dim + } + #+end_src +- The decorative line width in the header is made a little bit bigger. + #+begin_src latex + \renewcommand{\headrulewidth}{ + \c__letgut_head_rule_width_dim + } + #+end_src +- The headers alternate between even and odd pages. + #+begin_src latex + \fancyhf{} + \fancyhead[RO,LE]{\thepage} + \fancyhead[RE,LO]{\g__letgut_mark_tl} + #+end_src +- The headers are left offset + #+begin_src latex + \fancyheadoffset[L]{\c__letgut_hoffset_dim} + #+end_src +- We load the default \package{fancyhdr}'s page style + #+begin_src latex + \pagestyle{fancy} +#+end_src + +** Marginal notes + We want the marginal notes to be in the left margin. + +#+begin_src latex + \reversemarginpar +#+end_src + +** Table of contents + + The table of contents is customized: + +- only the titles of the articles are shown (but the bookmarks have their natural depth): +#+begin_src latex + \etocsetnexttocdepth{0} + #+end_src +- layout: + #+begin_src latex + \etocsetstyle {section} + {} + {\leavevmode\leftskip 2cm\relax} + {\normalsize% + \etocname~\dotfill~\etocpage\par + } + {} +#+end_src +- its title is dropped: +#+begin_src latex + \renewcommand*\frenchcontentsname{} +#+end_src + +** COMMENT Alerts + + We create a box to display alerts. + +#+begin_src latex + \tcbuselibrary{xparse} + \DeclareTCBox{\alertbox}{}{ + nobeforeafter, + colback=red!5!white, + colframe=red!75!black, + title={Attention !}, + fonttitle=\bfseries, + before=\begin{center}, + after=\end{center} + } +#+end_src + +** Geometry of the document + +#+begin_src latex + \geometry{ + asymmetric, + textheight=\c__letgut_textheight_dim, + textwidth=\c__letgut_textwidth_dim, + lmargin=\c__letgut_lmargin_dim, + tmargin=\c__letgut_tmargin_dim, + head=\c__letgut_head_dim, + headsep=\c__letgut_headsep_dim, + marginparwidth=\c__letgut_marginparwidth_dim, + % verbose, + % showframe + } +#+end_src + +** Alert box + +#+begin_src latex + \cs_new_protected:Nn \__letgut_alert_box:nn + { + \noindent + \begin{tblr}{ + width=\linewidth, + rowspec={Q[c,m,#1]}, + colspec={| + #+end_src + +# < (Just not to disturb the parentheses balancing +# detection of my editor.) + + #+begin_src latex + >{\bfseries}X| + }, + vlines, + hlines, + rowsep=2.5mm, + colsep=2.5mm + } + #2 + \end{tblr} + \skip_vertical:N \c_zero_dim + } +#+end_src + +** “Title” and marks + + We redefine ~\@title~ in order to make it empty. Hence we can later test if + the ~\title~ has been populated by the user (thanks to ~\title~) and, if so, + we will (automatically) display on the first page and headers the provided + title instead of the number and the date (see below). +#+begin_src latex + \tl_gclear:N \@title +#+end_src + +At the end of preamble, we put the ~\@title~ (empty or populated by the +user) into ~\g__letgut_@title_str~ for later tests. +#+begin_src latex + \AddToHook{begindocument/before} + { + \str_set_eq:NN \g__letgut_@title_str \@title +#+end_src + +The number is added only if it is +# < (Just not to disturb the parentheses balancing +# detection of my editor.) +$>0$. + + #+begin_src latex + \tl_gset:Nn \g__letgut_title_tl { + \int_compare:nNnT + \g__letgut_number_int + #+end_src + +# < (Just not to disturb the parentheses balancing +# detection of my editor.) + + #+begin_src latex + > \c_zero_int + {numéro~ \int_use:N\g__letgut_number_int{}~ --~ } + \g__letgut_date_tl + } + \str_if_empty:NTF \g__letgut_@title_str { + \tl_gset:Nn \g__letgut_mark_tl { + \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_src + +** First page handling + +The first page is special as it should automatically contain certain elements: +- the banner, +- either the number and the date of the issue, or a given title, +- the table of contents, +- the editorial, +- the membership reminder. + +The first page is inserted only is the target audience is the readers of the +Lettre. + +#+begin_src latex + \bool_if:NT \g__letgut_for_readers_bool { +#+end_src + +#+begin_src latex + \file_if_exist:nTF {\c__letgut_banner_file_tl.pdf}{ + \AddToHookNext{shipout/background} + { + \begin{picture}(0,0) + \put(-2cm,-25.275cm){ + \includegraphics[scale=0.96]{ + \c__letgut_banner_file_tl.pdf + } + } + \end{picture} + } + }{ + #+end_src + +The ~pagecolor~ option is possibly set (with ~\AddToHook{begindocument/before}~) +and the page color chosen has to be used for the letters of the banner so the +following code has to be postponed after the former (hence here +~\AddToHook{begindocument}~ and with ~\AddToHook{begindocument/before}~). + +#+begin_src latex + \msg_term:nn{letgut}{Banner~file~not~provided} + \RequirePackage[pagecolor={\g__letgut_pagecolor_clist}]{ + letgut-banner + } + } + #+end_src + +Here starts what is automatically added at the beginning of the document. + +#+begin_src latex + \AddToHook{begindocument/end} + { +#+end_src + +- If a membership reminder is asked, we create an (alert) box containing the + corresponding text and reduce the textheight of this page of the height of + this box. + #+begin_src latex + \bool_if:NT \g__letgut_membership_reminder_bool { + \box_new:N \g__letgut_membership_reminder_box + \vbox_gset:Nn \g__letgut_membership_reminder_box { + \alertbox []{ \c__letgut_membership_reminder_tl } + } + \dim_gset:Nn + \g__letgut_membership_reminder_box_height_dim { + \box_ht:N \g__letgut_membership_reminder_box + } + \enlargethispage{ + - \g__letgut_membership_reminder_box_height_dim + } + } + #+end_src +- We want the text on the first page to not encroach on the horizontal bar of + the banner. + #+begin_src latex + \dim_const:Nn \c__letgut_first_page_shrink_dim { + \c__letgut_banner_thickness_dim + + + \c__letgut_tmargin_dim + + + \c__letgut_textheight_dim + - + .5\paperheight + - + .5\c__letgut_banner_height_dim + } + \enlargethispage{ + - \c__letgut_first_page_shrink_dim + } + \enlargethispage{ + - \baselineskip + } + #+end_src +- If the user has specified a title, we make a (our own) title and use it and + the possibly provided author(s) for the metadata of the PDF; otherwise we + display the number and the date of the newsletter. + #+begin_src latex + \str_if_empty:NTF \g__letgut_@title_str { + \bool_gset_true:N \g__letgut_title_empty_bool + \begin{flushright} + \Huge + \text_titlecase_first:n { \g__letgut_title_tl } + \end{flushright} + \hypersetup{ + pdftitle={ + \c__letgut_Lettre_gutenberg_tl + \int_compare:nNnT + \g__letgut_number_int + #+end_src + +# < (Just not to disturb the parentheses balancing +# detection of my editor.) + + #+begin_src latex + > \c_zero_int + { + \c_space_tl~ \int_use:N \g__letgut_number_int + } + }, + pdfauthor={ + Association~ + \c__letgut_gutenberg_tl + \c_space_tl + (éditeur) + }, + } + \vspace*{1cm} + }{ + \hypersetup{ + pdftitle={\g__letgut_@title_str} + } + \tl_if_empty:NF \@author { + \hypersetup{ + pdfauthor={\@author} + } + } + #+end_src + Here, we insert the title, but don't rely on ~\maketitle~ because it + lets to ~\relax~ the command ~\title~ which is used later as new sectionning + levels for the titles of the articles of the Lettre. So we emulate the + intersting part of the ~\maketitle~ command (borrowed from \file{article.cls}). + #+begin_src latex + \null + \vskip 2em% + \begin{center}% + \let \footnote \thanks + {\LARGE \@title \par}% + \vskip 1.5em% + {\large + \lineskip .5em% + \begin{tabular}[t]{c}% + \@author + \end{tabular}\par}% + \vskip 1em% + {\large \@date}% + \end{center}% + \par + \vskip 1.5em + } + #+end_src +- No headers on the first page. This has to be inserted after the previous + (customized) ~\maketitle~ since this command inserts a ~\newpage~ which would + ruin the effort of ~\thispagestyle{empty}~ if inserted before. + #+begin_src latex + \thispagestyle{empty} + #+end_src +- The table of contents is automatically added and has a bookmark entry. + #+begin_src latex + \pdfbookmark[1]{ + \c__letgut_contents_name_tl + }{ + \c__letgut_contents_name_tl + } + \tableofcontents + #+end_src + Should a title be displayed, the table of contents would be added after it, + followed by a new page (otherwise, if ~\title~ used after ~\begin{document}~ + sees its title on the front page, it will overflow onto the banner). + #+begin_src latex + \bool_if:NTF \g__letgut_title_empty_bool { + \vspace*{1.5cm} + }{ + \newpage + } + #+end_src +- Conditionally to the fact the ~editorial~ option is not set to ~false~: if the + \file*{editorial.tex} of the editorial is found, its content is input and + has a bookmark entry; otherwise, a warning is displayed. + #+begin_src latex + \bool_if:NTF \g__letgut_editorial_bool { + \file_if_exist:nTF {./\c__letgut_editorial_file_tl}{ + \RenewDocumentCommand\author{ 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_src + +# < (Just not to disturb the parentheses balancing +# detection of my editor.) + + #+begin_src latex + % \if\count{\pagenumber}>1 + % \else + % \newpage + % \fi + }{ + \msg_warning:nn{letgut}{Editorial~file~missing} + \alertbox{ \c__letgut_missing_editorial_tl } + \newpage + } + }{ + % \newpage + } +#+end_src + +We close the ~\AddToHook{begindocument/end}~ argument. + +#+begin_src latex + } +#+end_src + +Membership reminder. + +#+begin_src latex + \AddToHook{begindocument}{ + \bool_if:NT \g__letgut_membership_reminder_bool { + \AddToHookNext{shipout/background} + { + \put(1in,-1in){ + \put( + \oddsidemargin, + - \topmargin + - \headheight + - \headsep + - \textheight + + \c__letgut_first_page_shrink_dim + + .5\baselineskip + ){ + \box_use:N \g__letgut_membership_reminder_box + } + } + } + } + } +#+end_src + +** Last page handling + +The last page is special: it should automatically contain some informations about +\gutenberg. + +#+begin_src latex + \AddToHook{enddocument} + { +#+end_src +Conditionally to the fact the ~informations~ option is not set to ~false~: if the +\file*{informations-gut.tex} which contains the informations about +\gutenberg. Otherwise, a warning is displayed. + #+begin_src latex + \bool_if:NT \g__letgut_informations_bool { + \clearpage + \phantomsection + \file_if_exist:nTF + {./\c__letgut_informations_gutenberg_file_tl}{ + \file_input:n {./\c__letgut_informations_gutenberg_file_tl} + }{ + \msg_warning:nn{letgut}{Informations~file~missing} + \alertbox{ \c__letgut_missing_infomations_tl } + } + } + #+end_src + +We close the ~\AddToHook{enddocument}~ argument. + +#+begin_src latex + } +#+end_src + +We close the boolean which tests whether the target audience is the readers or +the author(s) of the “Lettre”. + +#+begin_src latex + } +#+end_src + +** Sections, subsections, etc. + +*** Numbering + We want all the sections to be unnumbered. + + #+begin_src latex + \setcounter{secnumdepth}{-10} + #+end_src + +*** Format + +- We create the new level ~\title~ for the titles of the articles. They are + displayed uppercased. + #+begin_src latex + \AddToHook{begindocument/before}{% + \titleclass{\title}{straight}[\part] + \titleformat{\title}{ + \normalfont + \LARGE + \bfseries + \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_src +- We also create the new level ~\subtitle~ for the subtitles of the + articles. They are dispayed uppercased (but in a smaller size than ~\title~). + #+begin_src latex + \titleclass{\subtitle}{straight}[\title] + \titleformat{\subtitle}{ + \normalfont + \Large + \bfseries + \text_uppercase:n + }{}{1em}{}{} + \etocsetlevel{subtitle}{1} + \def\toclevel@subtitle{1}% + \def\toclevel@subtitle{1} + #+end_src +- By default (that is when ~\subtitle~ is not used), the toc levels of the + sections, subsections, etc. are set to ~1~, ~2~, etc. But, when ~\subtitle~ is + used, since this level has toc level ~1~, the toc levels of the sections, + subsections, etc. have to be set to ~2~, ~3~, etc. And this has to be reset + each time ~\title~ and ~\subtitle~ are used. + #+begin_src latex + \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_src + # - The sections have the usual format, except that their titles are uppercase. + # #+begin_src latex + # \titleformat{\section}{ + # \normalfont + # \Large + # \bfseries + # \text_uppercase:n + # % }{\thesection}{1em}{}{} + # #+end_src + - The (sub)paragraphs have the usual format, except that they are not + “runin” (\package{titlesec}'s package's terminology). + #+begin_src latex + \titleformat{\paragraph}{ + \normalfont + \normalsize + \bfseries + }{\theparagraph}{1em}{} + \titleformat{\subparagraph}{ + \normalfont + \normalsize + \bfseries + }{\thesubparagraph}{1em}{} + } + #+end_src +- We modify the spacing, mainly by shifting the titles in the left margin (the + rest is borrowed from the standard classes). + #+begin_src latex + \titlespacing*{\title} + {\c__letgut_title_hoffset_dim} + {\c__letgut_before_title_title_skip} + {\c__letgut_after_title_title_skip} + \titlespacing*{\subtitle} + {\c__letgut_subtitle_hoffset_dim} + {\c__letgut_before_subtitle_title_skip} + {\c__letgut_after_subtitle_title_skip} + \titlespacing*{\section} + {\c__letgut_section_hoffset_dim} + {\c__letgut_before_section_title_skip} + {\c__letgut_after_section_title_skip} + \titlespacing*{\subsection} + {\c__letgut_subsection_hoffset_dim} + {\c__letgut_before_subsection_title_skip} + {\c__letgut_after_subsection_title_skip} + \titlespacing*{\subsubsection} + {\c__letgut_subsubsection_hoffset_dim} + {\c__letgut_before_subsubsection_title_skip} + {\c__letgut_after_subsubsection_title_skip} + \titlespacing*{\paragraph} + {\c__letgut_paragraph_hoffset_dim} + {\c__letgut_before_paragraph_title_skip} + {\c__letgut_after_paragraph_title_skip} + \titlespacing*{\subparagraph} + {\c__letgut_subparagraph_hoffset_dim} + {\c__letgut_before_subparagraph_title_skip} + {\c__letgut_after_subparagraph_title_skip} +#+end_src + +** Document commands + +*** Setup + +We define the command that lets us specify the newsletter setup. + +#+begin_src latex +\NewDocumentCommand \letgutsetup { m } { + \keys_set:nn { letgut/setup } { #1 } +} +#+end_src + +*** For the rubric dedicated to new stuffs appeared on \acs{ctan} + + - We create a new type of list, dedicated to the new stuffs (classes, packages, + etc.) on CTAN and similar to a description list (except the label provided in + the optional argument of ~\item~ is automatically an argument of the + ~\package~ command). + #+begin_src latex + \cs_new_protected:Nn \__letgut_ctan_news_item:n { + \package{#1}~: + } + \newlist{ctannews}{description}{1} + \setlist[ctannews]{format=\__letgut_ctan_news_item:n} + #+end_src + The stuffs created by French speaking people are highlighted in a special + way and, for this, a starred variant of the ~\item~ command is provided. We + insert a systematic ~\phantomsection~ in order the cross-references to such + items are correct. + #+begin_src latex + \cs_new_protected:Npn \__letgut_item:nn #1 #2 + { + \tl_if_empty:nTF {#2} + { + \__letgut_old_item + }{ + \__letgut_old_item[#2] + } + \phantomsection + \IfBooleanT {#1}{ + \mbox{}\marginpar[\mbox{}\hfill\francophony]{} + } + } + \NewCommandCopy{\__letgut_old_item}{\item} + \RenewDocumentCommand {\item} { s O{} } { + \__letgut_item:nn {#1}{#2} + } + #+end_src + +- Command that inserts the \enquote{francophony} logo. + #+begin_src latex + \NewDocumentCommand {\francophony} { } { + \raisebox{-1.5pt}{ + \includegraphics[width=\f@size pt]{ + Flag_of_La_Francophonie-crop + } + } + } + #+end_src + +*** Persons and authors + +For both persons and authors, the argument of: +- a single individual is given as: + - \meta{Last name}, \meta{First name} + - and possibly \meta{Last name}, \meta{First name}, \meta{Title} +- multiple individuals, the schemes for each of the individuals are the same of + a single one, separated by a semicolon. + +#+begin_src latex + \NewDocumentCommand {\person} { 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_src + + In the following ~\__letgut_titlecase_name~ control sequence, we parse last and + first names, splitting and unsplitting them at spaces and dashes (~-~) with + titlecasing in between. + + #+begin_src latex +\cs_new_protected:Npn \__letgut_titlecase_name:n #1 +{ + \seq_set_split:Nnn \l_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_src + + The following control sequence splits a semi-colon separated list and each item + is splitted as a comma separated list. + +#+begin_src latex + \cs_new_protected:Nn \__letgut_person_last_name:n + { + {\scshape \__letgut_titlecase_name:n {#1}} + } + \cs_new_protected:Nn \__letgut_person_first_name_last_name:nn + { + \__letgut_titlecase_name:n {#1} + \c_space_tl + \__letgut_person_last_name:n {#2} + } + \cs_new_protected:Nn + \__letgut_person_first_name_last_name_title:nnn + { + \__letgut_person_first_name_last_name:nn {#1} {#2} + \c_space_tl + (#3) + } + \seq_new:N \l__letgut_items_seq + \cs_new_protected:Npn \__letgut_process_list: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_src + +*** Horizontal rule + + #+begin_src latex + \NewDocumentCommand {\separator} { } { + \par + \skip_vertical:N 1em + \hrule + \skip_vertical:N 1em + } + #+end_src + +*** Alert boxes + + #+begin_src latex + \colorlet {letgut_default_alert_box_color} { + \c__letgut_default_alert_box_color_tl + } + \NewDocumentCommand \alertbox { + O{letgut_default_alert_box_color} +m + } { + \__letgut_alert_box:nn { #1 }{ #2 } + } + #+end_src + +*** Typesetting of packages, classes, files and softwares. + +The ~\c__letgut_httpsprefix_tl~ comes from: + +https://github.com/latex3/hyperref/issues/188#issuecomment-826302843. + + #+begin_src latex + \tl_const:Nx \c__letgut_httpsprefix_tl + {https\char_generate:nn{58}{12}//} + #+end_src + We define the font switches dediacted to each of packages and classes + (\TeX{} stuff), files and softwares. + #+begin_src latex + \tl_new:N \l__letgut__tex_stuff_font_switch_tl + \tl_new:N \l__letgut_files_font_switch_tl + \tl_new:N \l__letgut_softwares_font_switch_tl + \tl_set:Nn \l__letgut__tex_stuff_font_switch_tl {\sffamily} + \tl_set:Nn \l__letgut_files_font_switch_tl {\ttfamily} + \tl_set:Nn \l__letgut_softwares_font_switch_tl {\ttfamily} + #+end_src + + #+begin_src latex + \cs_new_protected:Nn \__letgut_tex_stuff:nn + { + \IfNoValueTF {#1} + { + \href{ + \c__letgut_httpsprefix_tl ctan.org/pkg/#2 + }{ + {\l__letgut__tex_stuff_font_switch_tl #2} + } + }{ + \tl_if_empty:nTF {#1} + { + {\l__letgut__tex_stuff_font_switch_tl #2} + }{ + \href{#1}{{\l__letgut__tex_stuff_font_switch_tl #2}} + } + } + } + \cs_new_protected:Nn \__letgut_software:nn + { + \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_src + +*** Names, etc. + +#+begin_src latex + \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_src + +*** Foreign locutions + +#+begin_src latex + \cs_new_protected:Npn \__letgut_emphasis:n #1 + { + \emph{#1} + } + \NewDocumentCommand { \foreignloc } { m } { + \__letgut_emphasis:n {#1} + } + \NewDocumentCommand { \latinloc } { m } { + \__letgut_emphasis:n {#1} + } +#+end_src + +*** Bookmarks handling + +We disabling some commands when their arguments have to go to bookmarks. + +#+begin_src latex + \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_src + +*** Acronyms + +The following command let us define acronyms. The arguments are as follows: +- ~#1~: optional argument that let us override the default settings of this + command, +- ~#2~: the uppercase version of both the id and the short form of the acronym, +- ~#3~: the long form (in French if #4 has ~-NoValue-~, in English otherwise), +- ~#4~: the French translation of an English acronym. + +#+begin_src latex + \cs_new_protected:Nn \__letgut_acronym:nnnn + { + \AddToHook{begindocument/before}{ + \IfValueTF {#4}{ + \tl_if_empty:nTF {#4}{ + \exp_args:Nx \DeclareAcronym{\text_lowercase:n {#2}}{ + short = \text_lowercase:n {#2}, + sort= #2, + long = {\emph{#3}}, + extra-long = {anglais}, + pdfstring = #2, + short-acc = #2, + #1 + } + }{ + \exp_args:Nx \DeclareAcronym{\text_lowercase:n {#2}}{ + short = \text_lowercase:n {#2}, + sort= #2, + long = {#4}, + foreign = {#3}, + foreign-babel = english, + foreign-locale = anglais, + pdfstring = #2, + short-acc = #2, + #1 + } + } + }{ + \exp_args:Nx \DeclareAcronym{\text_lowercase:n {#2}}{ + short = \text_lowercase:n {#2}, + sort= #2, + long = {#3}, + pdfstring = #2, + short-acc = #2, + #1 + } + } +#+end_src +The ⟨id⟩ of the acronym will automatically be the name of a public command +(~\~​⟨id⟩) acting as ~\ac{id}~. +#+begin_src latex + \exp_after:wN \cs_if_exist:cT { \text_lowercase:n {#2} } { + \msg_note:nnn{letgut}{Existing~command}{#2} + } + \exp_args:Nc \ProvideDocumentCommand + { \text_lowercase:n {#2} } { s } { + \IfBooleanTF {##1}{ + \exp_args:Nx \acs { \text_lowercase:n {#2} } + }{ + \exp_args:Nx \ac { \text_lowercase:n { #2 } } + } + } +#+end_src +We want the command ~\~​⟨id⟩ to work also in bookmarks (the resulting string will +be the uppercased acronym). +#+begin_src latex + \pdfstringdefDisableCommands + { + \exp_after:wN + \def\cs:w \text_lowercase:n {#2} \cs_end: { #2 } + } + } + } +#+end_src + +The first occurrences of the acronyms will be displayed in their short forms, +with the long ones in footnotes. But what about acronyms whom first occurrences +arise within footnotes? We want 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 ~\footnote~ command +to know whether we currently are in a footnote or not and display the acronym +accordingly. + +#+begin_src latex + \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_src +We change a bit both the ~footnote~ acro template, the ~description~ list +template, and the macro which prints the locale. +#+begin_src latex + \DeclareAcroProperty{extra-foreign} + \DeclareAcroProperty{extra-long} + \RenewAcroTemplate {footnote} + { + \acrowrite {short} + \acroiffirstT + { + #+end_src + If we are in a footnote, first occurrences of the acronyms are displayed + as “short (long)”. Otherwise, they are displayed as “short\footnote{long}”. + #+begin_src latex + \bool_if:NTF \l__letgut_in_footnote_bool { + \space + ( + \acroifT {alt} { \acrotranslate {or} ~ \acrowrite {alt} ~ } + \acroifT {foreign} { \acrowrite {foreign} :~ } + \acrowrite {long} + \acrogroupcite + ) + }{ + \acfootnote + { + \acroifT {alt} { + \acrotranslate {or} ~ \acrowrite {alt} :~ + } + \acroifT {foreign} { \acrowrite {foreign} } + \acrowrite {long} + \acroifT {extra-long} { ~ [\acrowrite {extra-long}] } + \acroifT {extra-foreign} { + \c_space_tl [\acrowrite {extra-foreign}] + } + \acrogroupcite + } + } + } + } + \RenewAcroTemplate[list]{description}{% + \acroheading + \acropreamble + \begin{description} + \acronymsmapF{% + \item[\acrowrite{short}\acroifT{alt}{/\acrowrite{alt}}] + \acroifT{foreign}{ + \acrowrite{foreign}\acroifT{extra}{, } + }% + \acroifT{extra}{\acrowrite{extra}}% + \acroifanyT{foreign,extra}{\acspace (}% + \acrowrite{list}% + \acroifT {extra-foreign} { + , \c_space_tl \acrowrite {extra-foreign} + } + \acroifanyT{foreign,extra}{)}% + \acropagefill + \acropages + {\acrotranslate{page}\nobreakspace} + {\acrotranslate{pages}\nobreakspace}% + } + {\item\AcroRerun} + \end{description} + } + % #1: id + % #2: property + % #3: text + \cs_set_protected:Npn \acro_locale:nnn #1#2#3 + { + \acro_if_foreign:nTF {#2} + { + \acro_if_locale:nnTF {#1} {#2} + { + \__acro_foreign_language:en + { \str_lowercase:e { + \acro_property_get:nn {#1} {foreign-babel} + } + } + {#3} + \bool_if:NTF \l__acro_list_bool + { \bool_if:NT \l__acro_list_show_locale_bool } + { \bool_if:NT \l__acro_show_locale_bool } + { + { + \l__acro_locale_format_tl + { + \acro_property_if_set:nnTF {#1} { + foreign-locale + } + { + \acspace + [ + \acro_property_get:nn {#1} { + foreign-locale + } + ] + }{ + \baselanguage + { + \acro_property_get:nn {#1} { + foreign-babel + } + } + } + } + } + :~ + } + } + {#3} + } + {#3} + } +#+end_src +Now, the document command that let the user create acronyms. +#+begin_src latex + \NewDocumentCommand{\letgutacro}{ O{} m m o } + { + \__letgut_acronym:nnnn {#1} {#2} {#3} {#4} + } +#+end_src +For printing the acronyms, we define two new heading templates for the structure +levels ~\title~ and ~\subtitle~. +#+begin_src latex +\NewAcroTemplate[heading] {title} + { \title { \acrolistname } } +\NewAcroTemplate[heading] {subtitle} + { \subtitle { \acrolistname } } +#+end_src +We make ~\letgutacro~ available only in the preamble part of the document +(otherwise, no warning from \package{acro} but only the long form of the acronym +is printed when used for the first time with ~\ac~). +#+begin_src latex +\@onlypreamble\letgutacro +#+end_src + +** Bibliography + +We want the ~\citeauthor~ command to display, not only the last, but the +full name of the authors. + +#+begin_src latex + \NewCommandCopy{\__letgut_old_citeauthor}{ + \citeauthor + } + \RenewDocumentCommand {\citeauthor} { O{} O{} m } { + \AtNextCite{\DeclareNameAlias{labelname}{given-family}} + \__letgut_old_citeauthor[#1][#2]{#3} + } + #+end_src + +** Book reviews + +#+begin_src latex + \tl_new:N \g__letgut_bookreview_frontcover_tl + \tl_new:N \g__letgut_bookreview_bibkey_tl + #+end_src +The keys options are created. + #+begin_src latex + \keys_define:nn { 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_src + +All these options, when used, must receive a value. + +#+begin_src latex + title .value_required:n = true, + frontcover .value_required:n = true, + bibkey .value_required:n = true, + reviewer .value_required:n = true, + } +#+end_src + +We create the new environment for the book reviews. + +#+begin_src latex + \cs_generate_variant:Nn \msg_warning:nnn { nnV } + \cs_generate_variant:Nn \msg_error:nnnn { nnVV } + \NewDocumentEnvironment{bookreview}{ m } + { + \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_src + +We check if the front cover file is available against the list of accepted +extensions of the ~graphicx~ package. + +#+begin_src latex + \clist_map_inline:Nn \Gin@extensions { + \file_if_exist:nT{\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_src + +** Miscellanous + +- We specify the possible hyphenations of \enquote{\gutenberg}. +#+begin_src latex + \hyphenation{GUT-enberg} +#+end_src + +*** Non selectable text + +We create a control sequence that makes its argument not selectable in the +PDF. This will be used notably for the line numbers of the listings and the +watermarks. +#+begin_src latex +\cs_new_protected:Npn \__letgut_unselectable:n #1 +{ + \BeginAccSupp{ActualText={}}#1\EndAccSupp{} +} +#+end_src + +*** Typesetting of code, etc. + + We provide a ~\meta~ macro that (poorly) mimics the one of the + \package*{doc}. It is added at the very end of the preamble since other + package that provide a better definition of this macro may have been loaded + (e.g. \package{tcolorbox}). + #+begin_src latex + \colorlet {__letgut_meta} { + brown + } + \cs_new_protected:Nn \__letgut_meta:nn + { + \bgroup + \normalfont + \ttfamily + \itshape + \textcolor{#1}{$\langle$#2$\rangle$} + \egroup + } + \AddToHook{begindocument/before}{ + \ProvideDocumentCommand{\meta}{ O{__letgut_meta} m } { + \__letgut_meta:nn {#1}{#2} + } + } + #+end_src + +** LaTeX listings and examples + +We first define some colors used in the listings and examples. + +#+begin_src latex + \definecolor{__letgut_backgroundCode}{cmyk}{0,0,0,0.04} + \definecolor{__letgut_borderCode}{cmyk}{0,0,0,0.2} + \definecolor{__letgut_foregroundLinenumber}{cmyk}{0,0,0,0.5} + \definecolor{__letgut_foregroundMention}{cmyk}{0,0,0,0} + \definecolor{__letgut_backgroundResult}{cmyk}{0,0,0,0} +#+end_src + +We now define the colors for the syntax highlighting and define the style of our +listings. + +#+begin_src latex + \colorlet{__letgut_texcs}{blue} + \colorlet{__letgut_comment}{gray} + \colorlet{__letgut_argument-specification-separator}{red} + \colorlet{__letgut_argument-specification}{cyan} + \colorlet{__letgut_mandatory-argument}{purple} + \colorlet{__letgut_environment}{teal} + \colorlet{__letgut_key}{__letgut_mandatory-argument} + \colorlet{__letgut_value}{violet} + \colorlet{__letgut_optional-argument}{__letgut_key} + \colorlet{__letgut_math}{green!50!black} + \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_src + +For the listings and examples, we rely on \package*{tcolorbox}, and more +specifically on some of its libraries. + +#+begin_src latex + \tcbuselibrary{listings,xparse,breakable,skins} +#+end_src + +The functions: + +- ~\__letgut_code_result_mention_box:n~ draws the mentions “code” and “résultat” + in the codes boxes and the possible corresponding results boxes, +- ~\__letgut_title_code_result_box:n~ for the title of codes and the results + boxes: “Exemple” followed by the number of the example and, if a ~title addon~ + option is provided, the specified title addon. + +#+begin_src latex + \cs_new_protected:Npn \__letgut_code_result_mention_box:nn #1 #2 + { + \node[ + minimum~ width=1cm, + minimum~ height=\c__letgut_height_mentions_dim, + outer~ sep=auto, + anchor=north~ east, + fill=__letgut_borderCode + ]~ at~ (#1) + { + \itshape + \small + \color{__letgut_foregroundMention} + \__letgut_unselectable:n {#2} + }; + } + \cs_new_protected:Npn \__letgut_title_code_result_box:n #1 + { + Exemple~ \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_src + +We define the style of the codes and the results boxes. + +#+begin_src latex + \tl_set:Nn \l__letgut_reference_text_tl { + Cf.~\vref{\g__letgut_label_ltx_example_str}. + } + \tcbset{ + __letgut_code/.style={ + listing~ options={ + % style=tcblatex, + numbers=left, + numbersep=\c__letgut_number_sep_dim, + #+end_src + We want the line numbers to not be selectable, hence the ~\__letgut_unselectable:n~:. + #+begin_src latex + 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_src +We define a custom \package*{tcolorbox}'s ~title addon~ option that let us +specify an addon to the title which will added after the automatically +generated title “Exemple \meta{number}”. + #+begin_src latex + title~ addon/.store~ in=\l__letgut_title_addon_tl, + title=\__letgut_title_code_result_box:n {\l__letgut_title_addon_tl}, + #+end_src +We define a custom \package*{tcolorbox}'s ~reference text~ option that let us +override the text of the reference for the examples with code and result side by +side that are floating and not being of their call out pages. + #+begin_src latex + reference~ text/.code={ + \tl_set:Nn \l__letgut_reference_text_tl {##1} + }, + #+end_src +We define a custom \package*{tcolorbox}'s ~result width~ option that let us +specify the width of the result which is ~\linewidth~ by default. + #+begin_src latex + result~ width/.store~ in=\l__letgut_result_width_dim, + result~ width=\linewidth, + }, + __letgut_code_result/.style={ + __letgut_code={#1}, + bicolor, + colbacklower=__letgut_backgroundResult, + segmentation~ at~ break=false, + top=\c__letgut_height_mentions_dim, + middle=\c__letgut_height_mentions_dim, + #+end_src + We want the side by side code/result examples to automatically be floating. + #+begin_src latex + sidebyside@true/.code={% + \tcb@sidebysidetrue% + \tcb@isbreakablefalse% + \pgfkeysalso{floatplacement=ht}% + \pgfkeysalso{float}% + \pgfkeysalso{label={\g__letgut_label_ltx_example_str}}% + \tl_set:Nx \l_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_src + +# < (Just not to disturb the parentheses balancing +# detection of my editor.) + + #+begin_src latex + \int_compare:nNnT {\thetcbbreakpart} > {1} {~(suite)} + } + \__letgut_code_result_mention_box:nn { + [yshift=.1mm]segmentation.east + } {résultat} + \else% + % 2 = Box contains only a lower part + \__letgut_code_result_mention_box:nn {interior.north~ east} {résultat + #+end_src + +# < (Just not to disturb the parentheses balancing +# detection of my editor.) + + #+begin_src latex + \int_compare:nNnT {\thetcbbreakpart} > {1} {~(suite)} + } + \fi + \fi + }, + }, + } +#+end_src + +The \package*{tcolorbox} listings defined below make use of +\package*{cleveref}'s features. But, since the latter package is loaded +~\AddToHook{begindocument/before}~, the same is needed for these listings. + +#+begin_src latex +\AddToHook{begindocument/before}{ +#+end_src + +We now define the environments that let us display: + +1. only LaTeX code: +#+begin_src latex + \DeclareTCBListing[ + auto~ counter, + crefname={exemple}{exemples} + ]{ltx-code}{ !O{} }{% + __letgut_code, + listing~ only, + #1% + } +#+end_src +1. both LaTeX code and its result: + 1. ordinary: +#+begin_src latex + \DeclareTCBListing[ + use~ counter~ from=ltx-code, + crefname={exemple}{exemples} + ]{ltx-code-result}{ !O{} }{% + __letgut_code_result, + #1% + } +#+end_src + 2. with the result obtained externally: +#+begin_src latex + \DeclareTCBListing[ + use~ counter~ from=ltx-code, + crefname={exemple}{exemples} + ]{ltx-code-external-result}{ O{} m }{% + __letgut_code_result, + listing~ and~ comment, + image~ comment={width=\l__letgut_result_width_dim}{#2}, + center~ lower, + #1% + } +#+end_src + +#+begin_src latex +} +#+end_src + +The examples with code and result side by side will be floating but we want the +ones being of their call out pages to have before and after them a reduced +vertical glue (~\g__letgut_reduced_intextsep_dim~). Hence we store the original +glue (~\intextsep~) in a custom one (~\g__letgut_orig_intextsep_dim~) in order +to retrieve the original skip for floats other than these ones. + +#+begin_src latex + \skip_const:Nn \c__letgut_orig_intextsep_skip {\intextsep} + \skip_const:Nn \c__letgut_reduced_intextsep_skip { + 4\p@ \@plus .667\p@ \@minus .667\p@ + } + #+end_src + +We now use hooks in order to... + + #+begin_src latex + \AddToHook{env/ltx-code-result/before}{ + \int_gincr:N \g__letgut_ltx_example_int + \str_set:Nx \g__letgut_label_ltx_example_str { + \c__letgut_label_ltx_example_str- + \int_use:N \g__letgut_ltx_example_int + } + \str_set:Nx \g__letgut_callout_label_ltx_example_str { + \c__letgut_callout_label_ltx_example_str- + \int_use:N \g__letgut_ltx_example_int + } + \label{\g__letgut_callout_label_ltx_example_str} + \tl_set:Nx \l_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_src + +** Local config file + +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 (~\ExplSyntaxOn~), a ~\ExplSyntaxOff~ is +automatically inserted at its beginning. + +#+begin_src latex + \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_src + +We don't want the book review entry types to be listed in the bibliography +(they appears only thanks to the ~bookreview~ environment). + +#+begin_src latex + \ExecuteBibliographyOptions[bookreview]{skipbib,skiplab} +#+end_src + +#+begin_src latex + \endinput +#+end_src + +* (biblatex) Data model + +We give the (\package{biblatex}) data model that enriches the default one for +several purposes: +- the books reviews, +- the books advertisements. + +#+begin_src latex :tangle letgut.lbx :exports both + \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_src + + We create the new bibliography driver ~bookreview~ (that seems to + create the corresponding new entry). + + #+begin_src latex :tangle letgut.dbx :exports both + \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_src + +We provide a specific ~biblatex~ citation style . + +#+begin_src latex :tangle letgut.cbx :exports both + \ProvidesFile{letgut.cbx}[2022-03-18 v0.9 letgut base citation style] + \RequireCitationStyle{numeric} +#+end_src + +The books reviewed have their titles not only emphasized, but in bold face as +well... + +#+begin_src latex :tangle letgut.cbx :exports both + \DeclareFieldFormat[bookreview]{title}{\textbf{\emph{#1}}} +#+end_src + +... but not their subtitles. + +#+begin_src latex :tangle letgut.cbx :exports both + \renewbibmacro*{title}{% + \ifboolexpr{ + test {\iffieldundef{title}} + and + test {\iffieldundef{subtitle}} + } + {} + {\printtext[title]{% + \printfield[titlecase]{title}% + \setunit{\subtitlepunct}}% + \printfield[emph]{subtitle}% + \newunit}% + \printfield{titleaddon}} +#+end_src + +* Provided files + +** Example file of an issue of the newsletter + + #+begin_src latex :tangle lettre-example.tex :exports both + \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_src + +** Example of an editorial + + #+begin_src latex :tangle editorial.tex :exports both + Ceci est un intéressant éditorial de la \lettregut{} + dans lequel on peut causer de l'\ag{} et du \ca{} + de l'association. Il peut aussi y être question du \ctan. + + \lipsum[1-5] + + \begin{figure}[ht] + \centering + \includegraphics[width=.7\linewidth]{example-image} + \caption{Ducks ?} + \label{fig:ducks} + \end{figure} + + \lipsum[6-10] + #+end_src + +** Informations about \gutenberg + + #+begin_src latex :tangle informations-gut.tex :exports both + \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_src + +* Footnotes + +[fn:1]See \url{https://github.com/ho-tex/luacolor/issues/4\#issuecomment-848774260}. diff --git a/Master/texmf-dist/tex/lualatex/letgut/Flag_of_La_Francophonie-crop.pdf b/Master/texmf-dist/tex/lualatex/letgut/Flag_of_La_Francophonie-crop.pdf new file mode 100644 index 00000000000..f57796b134a Binary files /dev/null and b/Master/texmf-dist/tex/lualatex/letgut/Flag_of_La_Francophonie-crop.pdf differ diff --git a/Master/texmf-dist/tex/lualatex/letgut/informations-gut.tex b/Master/texmf-dist/tex/lualatex/letgut/informations-gut.tex new file mode 100644 index 00000000000..def4a25fce0 --- /dev/null +++ b/Master/texmf-dist/tex/lualatex/letgut/informations-gut.tex @@ -0,0 +1,155 @@ +\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: diff --git a/Master/texmf-dist/tex/lualatex/letgut/letgut-acronyms.tex b/Master/texmf-dist/tex/lualatex/letgut/letgut-acronyms.tex new file mode 100644 index 00000000000..eb9026f8bff --- /dev/null +++ b/Master/texmf-dist/tex/lualatex/letgut/letgut-acronyms.tex @@ -0,0 +1,198 @@ +%%%%%%%%%%%%%%%%%%%%% +% Acronymes anglais % +%%%%%%%%%%%%%%%%%%%%% +\letgutacro +{CTAN} +{\href{https://www.ctan.org/}{Comprehensive \TeX{} Archive Network}} +[réseau complet d'archives \TeX{}] + +\letgutacro +{PDF} +{Portable Document Format} +[format de document portable] + +\letgutacro +{URL} +{Uniform Resource Locator} +[localisateur uniforme de ressource] + +\letgutacro +{ORCID} +{Open Researcher and Contributor \textsc{id}} +[identifiant ouvert pour chercheur et contributeur] + +\letgutacro[extra-foreign=souvent librement traduit en \enquote{foire aux questions}] +{FAQ} +{Frequently Asked Questions} +[questions fréquemment posées] + +\letgutacro +{SVG} +{Scalable Vector Graphics} +[graphiques vectoriels extensibles] + +\letgutacro +{DNS} +{Domain Name System} +[système de noms de domaine] + +\letgutacro +{VPS} +{Virtual Private Server} +[serveur dédié virtuel] + +\letgutacro +{LDAP} +{Lightweight Directory Access Protocol} +[protocole d'accès à répertoire léger, sytème garantissant l'authentification +d'utilisateurs de plusieurs services dispersés] + +\letgutacro +{OTF} +{Open Type Format} +[] + +\letgutacro +{DOI} +{Digital Object Identifier} +[identifiant numérique d'objet] + +\letgutacro +{ISSN} +{International Standard Serial Number} +[numéro international normalisé des publications en série] + +\letgutacro +{TUG} +{\TeX{} User Group} +[groupe (international) d'utilisateurs de \TeX{}] + +\letgutacro +{TL} +{\TeX{}~Live} +[] + +\letgutacro +{WCAG} +{Web Content Accessibility Guidelines} +[directives sur l'accessibilité du contenu Web] + +\letgutacro +{HTML} +{HyperText Markup Language} +[langage de balises pour l'hypertexte] + +\letgutacro +{CSS} +{Cascading Style Sheets} +[feuilles de style en cascade] + +\letgutacro +{UTF} +{Universal (Character Set) Transformation Format} +[format de transformation (du jeu) universel (de caractères codés)] + +\letgutacro[short=\emph{Ti\emph{k}Z},short-format=\em,foreign-babel=german,foreign-locale=allemand] +{TIKZ} +{Ti\emph{k}Z ist \emph{kein} Zeichenprogramm} +[Ti\emph{k}Z \emph{n'}est \emph{pas} un programme de dessin] + +\letgutacro +{PGF} +{Portable Graphics Format} +[format de graphiques portables] + +\letgutacro +{GPL} +{\textsc{gnu} General Public License} +[licence publique générale \textsc{gnu}] + +\letgutacro +{OFL} +{SIL Open Font License} +[] + +\letgutacro +{DVI} +{DeVice-Independent} +[indépendant du type de périphérique] + +\letgutacro +{PS} +{PostScript} +[] + +\letgutacro +{DVIPS} +{\acs{dvi}-to-\acs{ps} (translator)} +[(convertisseur) \acs{dvi} vers \acs{ps}] + +\letgutacro +{IPA} +{International Phonetic Alphabet} +[alphabet phonétique international] + +\letgutacro +{TIPA} +{\TeX{} \acs{ipa} or Tokyo \acs{ipa}} +[alphabet phonétique international] + +%%%%%%%%%%%%%%%%%%%%%% +% Acronymes français % +%%%%%%%%%%%%%%%%%%%%%% + +\letgutacro +{SMAI} +{\href{http://smai.emath.fr/}{Société de Mathématiques Appliquées et Industrielles}} + +\letgutacro +{AG} +{Assemblée Générale} + +\letgutacro +{CA} +{Conseil d'Administration} + +\letgutacro +{SHS} +{Sciences Humaines et Sociales} + +\letgutacro +{IREM} +{\href{https://www.univ-irem.fr/}{Instituts de Recherche sur l'Enseignement des Mathématiques}} + +\letgutacro +{MEEF} +{Métiers de l'Enseignement, de l'Éducation et de la Formation} + +\letgutacro +{ECM} +{\href{https://texnique.fr/osqa/faq/\#custom-id-ecm}{Exemple Complet Minimal}} + +\letgutacro +{INSPÉ} +{Instituts Nationaux Supérieurs du Professorat et de l'Éducation} + +\letgutacro[short=\textsc{gra}pp\textsc{a},short-format=\upshape] +{GRAppA} +{Groupe de recherche en Apprentissage Automatique} + +\letgutacro +{BBB} +{BigBlueButton} + +\letgutacro +{CV} +{Curriculum Vitæ} + +\letgutacro +{RGPD} +{Règlement Général sur la Protection des Données} + +\letgutacro +{NDLR} +{Notre de la Rédaction} + +%%% Local Variables: +%%% mode: latex +%%% End: diff --git a/Master/texmf-dist/tex/lualatex/letgut/letgut-banner.sty b/Master/texmf-dist/tex/lualatex/letgut/letgut-banner.sty new file mode 100644 index 00000000000..6fcb483dbac --- /dev/null +++ b/Master/texmf-dist/tex/lualatex/letgut/letgut-banner.sty @@ -0,0 +1,450 @@ +% This is file `letgut.cls', +% generated with the Emacs Org-babel utility. +% +% The original source file is letgut-banner.org +% +% -------------:| --------------------------------------------------- +% letgut-banner:| Package for the banner of 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 +% +% +% 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. +\NeedsTeXFormat{LaTeX2e}[2020-10-01] +\ProvidesExplPackage{letgut-banner} +{2022-03-18} +{0.9} +{ + Package for the banner of the newsletter “La Lettre de GUTenberg” +} +\RequirePackage{l3keys2e} +\RequirePackage{xcolor} +\RequirePackage{accsupp} +\keys_define:nn { letgut-banner } +{ + , pagecolor .clist_gset:N = \g__letgutbanner_pagecolor_clist + , pagecolor .initial:n = { 1,1,1 } +} +\ProcessKeysOptions { letgut-banner } +\AddToHook{begindocument}{ +\cs_generate_variant:Nn \color_fill:nn { nV } +\dim_new:N \g__letgutbanner_area_height_dim +\dim_new:N \g__letgutbanner_La_height_dim +\dim_new:N \g__letgutbanner_La_depth_dim +\dim_new:N \g__letgutbanner_La_yoffset_dim +\dim_new:N \g__letgutbanner_banner_vertical_contents_width_dim +\dim_new:N \g__letgutbanner_largest_LETR_box_height_dim +\dim_new:N \g__letgutbanner_between_letters_yoffset_dim +\dim_new:N \g__letgutbanner_between_letters_vertical_space_dim +\dim_new:N \g__letgutbanner_banner_padding_dim +\dim_if_exist:NF \g__letgutbanner_first_page_shrink_dim { + \dim_new:N \g__letgutbanner_first_page_shrink_dim +} +\cs_generate_variant:Nn \dim_const:Nn { NV } +\dim_if_exist:NTF \c__letgut_textheight_dim { + \dim_const:NV \c__letgutbanner_textheight_dim + \c__letgut_textheight_dim +}{ + \dim_const:Nn \c__letgutbanner_textheight_dim + { 25cm } +} +\dim_if_exist:NTF \c__letgut_textwidth_dim { + \dim_const:NV \c__letgutbanner_textwidth_dim + \c__letgut_textwidth_dim +}{ + \dim_const:Nn \c__letgutbanner_textwidth_dim + { 14cm } +} +\dim_if_exist:NTF \c__letgut_lmargin_dim { + \dim_const:NV \c__letgutbanner_lmargin_dim + \c__letgut_lmargin_dim +}{ + \dim_const:Nn \c__letgutbanner_lmargin_dim + { 5cm } +} +\dim_if_exist:NTF \c__letgut_tmargin_dim { + \dim_const:NV \c__letgutbanner_tmargin_dim + \c__letgut_tmargin_dim +}{ + \dim_const:Nn \c__letgutbanner_tmargin_dim + { 2.92cm } + % \dim_const:Nn \c__letgutbanner_tmargin_dim + % { 3cm } +} +\dim_if_exist:NTF \c__letgut_head_dim { + \dim_const:NV \c__letgutbanner_head_dim + \c__letgut_head_dim +}{ + \dim_const:Nn \c__letgutbanner_head_dim + { 0.6cm } +} +\dim_if_exist:NTF \c__letgut_headsep_dim { + \dim_const:NV \c__letgutbanner_headsep_dim + \c__letgut_headsep_dim +}{ + \dim_const:Nn \c__letgutbanner_headsep_dim + { 0.82cm } + % \dim_const:Nn \c__letgutbanner_headsep_dim + % { 0.9cm } +} +\dim_if_exist:NTF \c__letgut_marginparwidth_dim { + \dim_const:NV \c__letgutbanner_marginparwidth_dim + \c__letgut_marginparwidth_dim +}{ + \dim_const:Nn \c__letgutbanner_marginparwidth_dim + { 3.74cm } +} +\dim_if_exist:NTF \c__letgut_banner_thickness_dim { + \dim_const:NV \c__letgutbanner_banner_thickness_dim + \c__letgut_banner_thickness_dim +}{ + \dim_const:Nn \c__letgutbanner_banner_thickness_dim + { 4cm } +} +\dim_if_exist:NTF \c__letgut_banner_height_dim { + \dim_const:NV \c__letgutbanner_banner_height_dim + \c__letgut_banner_height_dim +}{ + \dim_const:Nn \c__letgutbanner_banner_height_dim { + \c__letgutbanner_textheight_dim + + + 3cm + } +} +\dim_const:Nn \c__letgutbanner_banner_padding_dim { .25cm } +\dim_const:Nn \c__letgutbanner_banner_width_dim { + \c__letgutbanner_textwidth_dim + + + ( + \c__letgutbanner_banner_thickness_dim + + + \c__letgutbanner_lmargin_dim + )/2 +} +\dim_const:Nn +\c__letgutbanner_banner_vertical_contents_width_dim { + \c__letgutbanner_banner_thickness_dim + - + 2\c__letgutbanner_banner_padding_dim +} +\dim_const:Nn +\c__letgutbanner_banner_horizontal_contents_width_dim { + \c__letgutbanner_textwidth_dim + - ( + \c__letgutbanner_banner_thickness_dim + - + \c__letgutbanner_lmargin_dim + )/2 + - + \c__letgutbanner_banner_padding_dim +} +\box_new:N \g__letgutbanner_L_box +\box_new:N \g__letgutbanner_E_box +\box_new:N \g__letgutbanner_T_box +\box_new:N \g__letgutbanner_R_box +\box_new:N \g__letgutbanner_La_box +\box_new:N \g__letgutbanner_GUTenberg_box +\box_new:N \g__letgutbanner_largest_LETR_box +\box_new:N \g__letgutbanner_g_box +\fp_const:Nn \c__letgutbanner_leading_minimum_percent_fp { 0.15 } +\fp_const:Nn \c__letgutbanner_leading_La_factor_fp { 1.5 } +\geometry{ + asymmetric, + textheight = \c__letgutbanner_textheight_dim, + textwidth = \c__letgutbanner_textwidth_dim, + lmargin = \c__letgutbanner_lmargin_dim, + tmargin = \c__letgutbanner_tmargin_dim, + head = \c__letgutbanner_head_dim, + headsep = \c__letgutbanner_headsep_dim, + marginparwidth= \c__letgutbanner_marginparwidth_dim, + % showframe, + % verbose, +} +\hbox_gset:Nn \g__letgutbanner_L_box { \textbf{L} } +\hbox_gset:Nn \g__letgutbanner_E_box { \textbf{E} } +\hbox_gset:Nn \g__letgutbanner_T_box { \textbf{T} } +\hbox_gset:Nn \g__letgutbanner_R_box { \textbf{R} } +\hbox_gset:Nn \g__letgutbanner_La_box { \textbf{\textit{La}} } +\hbox_gset:Nn \g__letgutbanner_GUTenberg_box { + \textbf{\textit{GUTenberg}} +} +\hbox_gset:Nn \g__letgutbanner_g_box { \textbf{g} } +\dim_const:Nn \c__letgutbanner_L_width_dim { + \box_wd:N \g__letgutbanner_L_box +} +\dim_const:Nn \c__letgutbanner_E_width_dim { + \box_wd:N \g__letgutbanner_E_box +} +\dim_const:Nn \c__letgutbanner_T_width_dim { + \box_wd:N \g__letgutbanner_T_box +} +\dim_const:Nn \c__letgutbanner_R_width_dim { + \box_wd:N \g__letgutbanner_R_box +} +\dim_gset:Nn \g_tmpa_dim { + \fp_eval:n { + max ( + \c__letgutbanner_L_width_dim, + \c__letgutbanner_E_width_dim, + \c__letgutbanner_T_width_dim, + \c__letgutbanner_R_width_dim, + ) + }pt +} +\box_gset_eq:NN \g__letgutbanner_largest_LETR_box \dim_case:nnF +{ \g_tmpa_dim } +{ + { \c__letgutbanner_L_width_dim } { \g__letgutbanner_L_box } + { \c__letgutbanner_E_width_dim } { \g__letgutbanner_E_box } + { \c__letgutbanner_T_width_dim } { \g__letgutbanner_T_box } + { \c__letgutbanner_R_width_dim } { \g__letgutbanner_R_box } +} +{ No~ idea! } +\box_gresize_to_wd:Nn \g__letgutbanner_GUTenberg_box { + \c__letgutbanner_banner_horizontal_contents_width_dim +} +\dim_const:Nn \c__letgutbanner_GUTenberg_height_dim { + \box_ht:N \g__letgutbanner_GUTenberg_box +} +\dim_const:Nn \c__letgutbanner_GUTenberg_depth_dim { + \box_dp:N \g__letgutbanner_GUTenberg_box +} +\dim_const:Nn \c__letgutbanner_GUTenberg_yoffset_dim { + ( + \c__letgutbanner_banner_thickness_dim + - + \c__letgutbanner_GUTenberg_height_dim + + + \c__letgutbanner_GUTenberg_depth_dim + )/2 +} +\dim_gset:Nn +\g__letgutbanner_banner_vertical_contents_width_dim +\c__letgutbanner_banner_vertical_contents_width_dim +\dim_do_until:nNnn { + \g__letgutbanner_between_letters_vertical_space_dim +} +> +{ + \fp_use:N\c__letgutbanner_leading_minimum_percent_fp + \g__letgutbanner_largest_LETR_box_height_dim +}{ +\box_gresize_to_wd:Nn \g__letgutbanner_largest_LETR_box { + \g__letgutbanner_banner_vertical_contents_width_dim +} +\dim_gset:Nn \g__letgutbanner_largest_LETR_box_height_dim { + \box_ht:N \g__letgutbanner_largest_LETR_box +} +\box_gresize_to_ht:Nn \g__letgutbanner_L_box { + \g__letgutbanner_largest_LETR_box_height_dim +} +\box_gresize_to_ht:Nn \g__letgutbanner_E_box { + \g__letgutbanner_largest_LETR_box_height_dim +} +\box_gresize_to_ht:Nn \g__letgutbanner_T_box { + \g__letgutbanner_largest_LETR_box_height_dim +} +\box_gresize_to_ht:Nn \g__letgutbanner_R_box { + \g__letgutbanner_largest_LETR_box_height_dim +} +\box_gresize_to_wd:Nn \g__letgutbanner_La_box { + \g__letgutbanner_banner_vertical_contents_width_dim +} +\dim_gset:Nn \g__letgutbanner_La_height_dim { + \box_ht:N \g__letgutbanner_La_box +} +\dim_gset:Nn \g__letgutbanner_La_depth_dim { + \box_dp:N \g__letgutbanner_La_box +} +\dim_gset:Nn \g__letgutbanner_La_yoffset_dim { + \c__letgutbanner_banner_height_dim + - + \c__letgutbanner_GUTenberg_yoffset_dim + - + \g__letgutbanner_La_height_dim + + + \g__letgutbanner_La_depth_dim +} +\dim_gset:Nn \g__letgutbanner_area_height_dim { + \g__letgutbanner_La_yoffset_dim + - + \g__letgutbanner_La_depth_dim + - + \c__letgutbanner_GUTenberg_yoffset_dim +} +\dim_set:Nn \l_tmpa_dim { + ( + \g__letgutbanner_area_height_dim + - + 6\g__letgutbanner_largest_LETR_box_height_dim + )/13 +} +\dim_gset:Nn \g__letgutbanner_between_letters_vertical_space_dim { + 2\l_tmpa_dim +} +\dim_gsub:Nn \g__letgutbanner_banner_vertical_contents_width_dim { + 1pt + } +} +\dim_gset:Nn \g__letgutbanner_banner_padding_dim { + ( + \c__letgutbanner_banner_thickness_dim + - + \g__letgutbanner_banner_vertical_contents_width_dim + )/2 +} +\dim_const:Nn \c__letgutbanner_first_letter_yoffset_dim { + \g__letgutbanner_La_yoffset_dim + - + \g__letgutbanner_largest_LETR_box_height_dim + - + \fp_use:N \c__letgutbanner_leading_La_factor_fp + \g__letgutbanner_between_letters_vertical_space_dim +} +\dim_gset:Nn \g__letgutbanner_between_letters_yoffset_dim { + \g__letgutbanner_between_letters_vertical_space_dim + + + \g__letgutbanner_largest_LETR_box_height_dim +} +\box_gresize_to_wd:Nn \g__letgutbanner_g_box { + \c__letgutbanner_textwidth_dim +} +\dim_gset:Nn \g__letgutbanner_first_page_shrink_dim { + \c__letgutbanner_tmargin_dim + + + \c__letgutbanner_textheight_dim + + + \c__letgutbanner_banner_thickness_dim + - + .5\paperheight + - + .5\c__letgutbanner_banner_height_dim + + + .5\baselineskip +} +\AddToHookNext{shipout/background}{ +\BeginAccSupp{ActualText={}} +\put( +.5\c__letgutbanner_lmargin_dim-.5\c__letgutbanner_banner_thickness_dim +, +-.5\paperheight-.5\c__letgutbanner_banner_height_dim +){ + \put(0,0){ + \rule{ + \c__letgutbanner_banner_width_dim + }{ + \c__letgutbanner_banner_thickness_dim + } + } + \put(0,0){ + \rule{ + \c__letgutbanner_banner_thickness_dim + }{ + \c__letgutbanner_banner_height_dim + } + } +% \color_fill:nV {rgb}{ \g__letgutbanner_pagecolor_clist } + \color[rgb]{ \g__letgutbanner_pagecolor_clist } + \put( + \g__letgutbanner_banner_padding_dim + , + \g__letgutbanner_La_yoffset_dim + ){ + \box_use:N \g__letgutbanner_La_box + } + \put( + \g__letgutbanner_banner_padding_dim + , + \c__letgutbanner_first_letter_yoffset_dim + -0\g__letgutbanner_between_letters_yoffset_dim + ){ + \box_use:N \g__letgutbanner_L_box + } + \put( + \g__letgutbanner_banner_padding_dim + , + \c__letgutbanner_first_letter_yoffset_dim + -1\g__letgutbanner_between_letters_yoffset_dim + ){ + \box_use:N \g__letgutbanner_E_box + } + \put( + \g__letgutbanner_banner_padding_dim + , + \c__letgutbanner_first_letter_yoffset_dim + -2\g__letgutbanner_between_letters_yoffset_dim + ){ + \box_use:N \g__letgutbanner_T_box + } + \put( + \g__letgutbanner_banner_padding_dim + , + \c__letgutbanner_first_letter_yoffset_dim + -3\g__letgutbanner_between_letters_yoffset_dim + ){ + \box_use:N \g__letgutbanner_T_box + } + \put( + \g__letgutbanner_banner_padding_dim + , + \c__letgutbanner_first_letter_yoffset_dim + -4\g__letgutbanner_between_letters_yoffset_dim + ){ + \box_use:N \g__letgutbanner_R_box + } + \put( + \g__letgutbanner_banner_padding_dim + , + \c__letgutbanner_first_letter_yoffset_dim + -5\g__letgutbanner_between_letters_yoffset_dim + ){ + \box_use:N \g__letgutbanner_E_box + } + \put( + \c__letgutbanner_banner_thickness_dim + , + \c__letgutbanner_GUTenberg_yoffset_dim + ){ + \box_use:N \g__letgutbanner_GUTenberg_box + } + % \color_fill:n {black!10} + \color{ black!10 } + \put( + .5\c__letgutbanner_lmargin_dim+.5\c__letgutbanner_banner_thickness_dim + , + .5\paperheight + + + .5\c__letgutbanner_banner_height_dim + - + \c__letgutbanner_tmargin_dim + ){ + \box_move_down:nn {.5\c__letgutbanner_textheight_dim} + {\box_use:N \g__letgutbanner_g_box} + } +} +\EndAccSupp{} +} +} +\@ifclassloaded{letgut}{ +}{ + \AddToHook{begindocument/end}{% + \enlargethispage{ + - \g__letgutbanner_first_page_shrink_dim + } + \thispagestyle{empty} + } +} diff --git a/Master/texmf-dist/tex/lualatex/letgut/letgut.cbx b/Master/texmf-dist/tex/lualatex/letgut/letgut.cbx new file mode 100644 index 00000000000..229c1f97c95 --- /dev/null +++ b/Master/texmf-dist/tex/lualatex/letgut/letgut.cbx @@ -0,0 +1,16 @@ +\ProvidesFile{letgut.cbx}[2022-03-18 v0.9 letgut base citation style] +\RequireCitationStyle{numeric} +\DeclareFieldFormat[bookreview]{title}{\textbf{\emph{#1}}} +\renewbibmacro*{title}{% + \ifboolexpr{ + test {\iffieldundef{title}} + and + test {\iffieldundef{subtitle}} + } + {} + {\printtext[title]{% + \printfield[titlecase]{title}% + \setunit{\subtitlepunct}}% + \printfield[emph]{subtitle}% + \newunit}% + \printfield{titleaddon}} diff --git a/Master/texmf-dist/tex/lualatex/letgut/letgut.cls b/Master/texmf-dist/tex/lualatex/letgut/letgut.cls new file mode 100644 index 00000000000..f1c93271986 --- /dev/null +++ b/Master/texmf-dist/tex/lualatex/letgut/letgut.cls @@ -0,0 +1,1865 @@ +% 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 +% +% +% 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. +% +% \RequirePackage[ +% , check-declarations +% , enable-debug +% , backend=luatex +% ]{expl3} +\NeedsTeXFormat{LaTeX2e}[2020-10-01] +\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 +\ProvidesExplClass{letgut} +{2022-03-18} +{0.9} +{ + Class~ for~ the~ newsletter~ + “\c__letgut_La_lettre_gutenberg_tl” +} +\prop_gput:Nnn \g_msg_module_type_prop { letgut } { Class } +\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. +} +\sys_if_engine_luatex:F { + \msg_fatal:nn{letgut}{Wrong~engine} +} +\bool_new:N \g__letgut_title_empty_bool +\bool_new:N \g__letgut_paper_bool +\bool_new:N \l__letgut_in_footnote_bool +\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 } +\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 +} +\dim_const:Nn \c__letgut_head_rule_skip_dim { 0.115cm } +\dim_const:Nn \c__letgut_head_rule_width_dim { 0.03cm } +\dim_const:Nn \c__letgut_banner_thickness_dim { 4cm } +\dim_const:Nn \c__letgut_banner_height_dim { + \c__letgut_textheight_dim + + + 3cm +} +\dim_new:N \g__letgut_membership_reminder_box_height_dim +\dim_const:Nn \c__letgut_bookreview_frontcover_margin_sep_dim { + 4mm + } +\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 +} +\AddToHook{begindocument/before}{% +\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 +} +\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 +} +\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 +} +\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 +} +\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 +} +\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 +} +\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 +} +} +\int_new:N \g__letgut_ltx_example_int +\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 +} +\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 +} +\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 +\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} +\seq_new:N \l__letgut_first_last_names_items_seq +\RequirePackage{l3keys2e} +\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 } +\LoadClass[twoside,11pt]{article} +\RequirePackage{fontspec} +\RequirePackage[ +, stretch=30 +, shrink=25 +, letterspace=150 +]{microtype} +\RequirePackage{parskip} +\RequirePackage{fancyhdr} +\RequirePackage[a4paper]{geometry} +\RequirePackage{graphicx} +\RequirePackage{array} +\RequirePackage{etoc} +\RequirePackage{enumitem} +\RequirePackage{titlesec} +\RequirePackage{fourier-orns} +\RequirePackage[section,above]{placeins} +\RequirePackage{fancyvrb} +\RequirePackage{booktabs} +\RequirePackage{csquotes} +\RequirePackage[fleqn]{mathtools} +\RequirePackage{accsupp} +\RequirePackage{siunitx} +\RequirePackage{hologo} +\RequirePackage[table]{xcolor} +\RequirePackage{tcolorbox} +\RequirePackage{refcount} +\RequirePackage{ninecolors} +\RequirePackage{tabularray} +\RequirePackage[english,french]{babel} +\RequirePackage[nospace,french]{varioref} +\RequirePackage[right]{eurosym} +\RequirePackage{listings} +\RequirePackage{floatrow} +\RequirePackage[ + sorting=none, + datamodel=letgut, + citestyle=letgut +]{biblatex} +\RequirePackage{acro} +\AddToHook{begindocument/before}{ +\RequirePackage{hyperref} +\RequirePackage[all]{hypcap} +\RequirePackage[french]{cleveref} +} +\sisetup{ + , locale=FR + , mode=text +} +\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} +\renewcommand*\frenchtablename{Tableau} +\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]% +\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,% +belowskip=0pt, +} +\lstset{ + style=__letgut_all_reset +} +\AddToHook{cmd/input/before}{ + \lstset{% + style=__letgut_all_reset,% + } +} +\NewCommandCopy{\__letgut_old_printbibliography}{ + \printbibliography +} +\RenewDocumentCommand {\printbibliography} { O{} } { + \phantomsection + \__letgut_old_printbibliography[#1] +} +\defbibheading{title}[\refname]{% + \title{#1}} +\defbibheading{subtitle}[\refname]{% + \subtitle{#1}} +\acsetup{ + first-style=footnote, + format/short = {\scshape}, + format/foreign = {\em}, + foreign/display, + locale/format = {\upshape}, + locale/display, +} +\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 +} +\AddToHook{begindocument/before}{ +\bool_if:NTF \g__letgut_paper_bool { + \hypersetup{draft} +}{ + \hypersetup{% + colorlinks,% + allcolors={letgut_allcolors_links},% + }% +} +\file_if_exist:nT {\c__letgut_acronyms_file_tl}{ + \file_input:n {\c__letgut_acronyms_file_tl} +} +% % \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 +% \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 + } +} +\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 +} +} +} +\setlength\overfullrule{5pt} +} +% % } +} +\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 +}{ + \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 +} + {\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 + } +} +\pagecolor[rgb]{\c__letgut_default_pagecolor_screen_clist} +\clist_set_eq:NN \g__letgut_pagecolor_clist + \c__letgut_default_pagecolor_screen_clist +\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 } +} +\renewcommand{\headruleskip}{ + \c__letgut_head_rule_skip_dim +} +\renewcommand{\headrulewidth}{ + \c__letgut_head_rule_width_dim +} +\fancyhf{} +\fancyhead[RO,LE]{\thepage} +\fancyhead[RE,LO]{\g__letgut_mark_tl} +\fancyheadoffset[L]{\c__letgut_hoffset_dim} +\pagestyle{fancy} +\reversemarginpar +\etocsetnexttocdepth{0} +\etocsetstyle {section} +{} +{\leavevmode\leftskip 2cm\relax} +{\normalsize% + \etocname~\dotfill~\etocpage\par +} +{} +\renewcommand*\frenchcontentsname{} +\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 +} +\cs_new_protected:Nn \__letgut_alert_box:nn +{ + \noindent + \begin{tblr}{ + width=\linewidth, + rowspec={Q[c,m,#1]}, + colspec={| +>{\bfseries}X| + }, + vlines, + hlines, + rowsep=2.5mm, + colsep=2.5mm + } + #2 + \end{tblr} + \skip_vertical:N \c_zero_dim +} +\tl_gclear:N \@title +\AddToHook{begindocument/before} +{ + \str_set_eq:NN \g__letgut_@title_str \@title +\tl_gset:Nn \g__letgut_title_tl { + \int_compare:nNnT + \g__letgut_number_int +> \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 + } +} +\bool_if:NT \g__letgut_for_readers_bool { +\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} + } +}{ +\msg_term:nn{letgut}{Banner~file~not~provided} + \RequirePackage[pagecolor={\g__letgut_pagecolor_clist}]{ + letgut-banner + } +} +\AddToHook{begindocument/end} +{ +\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 + } +} +\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 +} +\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 +> \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} + } + } +\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 +} +\thispagestyle{empty} +\pdfbookmark[1]{ + \c__letgut_contents_name_tl +}{ + \c__letgut_contents_name_tl +} +\tableofcontents +\bool_if:NTF \g__letgut_title_empty_bool { + \vspace*{1.5cm} +}{ + \newpage +} +\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 } +% \if\count{\pagenumber}>1 + % \else + % \newpage + % \fi + }{ + \msg_warning:nn{letgut}{Editorial~file~missing} + \alertbox{ \c__letgut_missing_editorial_tl } + \newpage + } +}{ + % \newpage +} +} +\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 + } + } + } + } +} +\AddToHook{enddocument} +{ +\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 } + } +} +} +} +\setcounter{secnumdepth}{-10} +\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} + {} +\titleclass{\subtitle}{straight}[\title] +\titleformat{\subtitle}{ + \normalfont + \Large + \bfseries + \text_uppercase:n +}{}{1em}{}{} +\etocsetlevel{subtitle}{1} +\def\toclevel@subtitle{1}% +\def\toclevel@subtitle{1} +\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}% +} +\titleformat{\paragraph}{ + \normalfont + \normalsize + \bfseries + }{\theparagraph}{1em}{} + \titleformat{\subparagraph}{ + \normalfont + \normalsize + \bfseries + }{\thesubparagraph}{1em}{} +} +\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} +\NewDocumentCommand \letgutsetup { m } { + \keys_set:nn { letgut/setup } { #1 } +} +\cs_new_protected:Nn \__letgut_ctan_news_item:n { + \package{#1}~: +} +\newlist{ctannews}{description}{1} +\setlist[ctannews]{format=\__letgut_ctan_news_item:n} +\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} +} +\NewDocumentCommand {\francophony} { } { + \raisebox{-1.5pt}{ + \includegraphics[width=\f@size pt]{ + Flag_of_La_Francophonie-crop + } + } +} +\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 } + } +} +\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 {~} +} +\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 } +} +\NewDocumentCommand {\separator} { } { + \par + \skip_vertical:N 1em + \hrule + \skip_vertical:N 1em +} +\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 } +} +\tl_const:Nx \c__letgut_httpsprefix_tl +{https\char_generate:nn{58}{12}//} +\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} +\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} +} +\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} + } +\cs_new_protected:Npn \__letgut_emphasis:n #1 +{ + \emph{#1} +} +\NewDocumentCommand { \foreignloc } { m } { + \__letgut_emphasis:n {#1} +} +\NewDocumentCommand { \latinloc } { m } { + \__letgut_emphasis:n {#1} +} +\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} + } +} +\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 + } + } +\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 } } + } +} +\pdfstringdefDisableCommands + { + \exp_after:wN + \def\cs:w \text_lowercase:n {#2} \cs_end: { #2 } + } +} +} +\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 +} +\DeclareAcroProperty{extra-foreign} +\DeclareAcroProperty{extra-long} +\RenewAcroTemplate {footnote} +{ + \acrowrite {short} + \acroiffirstT + { +\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} + } +\NewDocumentCommand{\letgutacro}{ O{} m m o } +{ + \__letgut_acronym:nnnn {#1} {#2} {#3} {#4} +} +\NewAcroTemplate[heading] {title} + { \title { \acrolistname } } +\NewAcroTemplate[heading] {subtitle} + { \subtitle { \acrolistname } } +\@onlypreamble\letgutacro +\NewCommandCopy{\__letgut_old_citeauthor}{ + \citeauthor +} +\RenewDocumentCommand {\citeauthor} { O{} O{} m } { + \AtNextCite{\DeclareNameAlias{labelname}{given-family}} + \__letgut_old_citeauthor[#1][#2]{#3} +} +\tl_new:N \g__letgut_bookreview_frontcover_tl +\tl_new:N \g__letgut_bookreview_bibkey_tl +\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, +title .value_required:n = true, + frontcover .value_required:n = true, + bibkey .value_required:n = true, + reviewer .value_required:n = true, +} +\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 + } + }{ +\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} +} +\hyphenation{GUT-enberg} +\cs_new_protected:Npn \__letgut_unselectable:n #1 +{ + \BeginAccSupp{ActualText={}}#1\EndAccSupp{} +} +\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} + } +} +\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} +\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}%$ +} +\tcbuselibrary{listings,xparse,breakable,skins} +\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} +} +\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, +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} +}, +title~ addon/.store~ in=\l__letgut_title_addon_tl, +title=\__letgut_title_code_result_box:n {\l__letgut_title_addon_tl}, +reference~ text/.code={ + \tl_set:Nn \l__letgut_reference_text_tl {##1} +}, +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, +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 +\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 +\int_compare:nNnT {\thetcbbreakpart} > {1} {~(suite)} +} +\fi +\fi +}, +}, +} +\AddToHook{begindocument/before}{ +\DeclareTCBListing[ + auto~ counter, + crefname={exemple}{exemples} +]{ltx-code}{ !O{} }{% + __letgut_code, + listing~ only, + #1% +} +\DeclareTCBListing[ + use~ counter~ from=ltx-code, + crefname={exemple}{exemples} +]{ltx-code-result}{ !O{} }{% + __letgut_code_result, + #1% +} +\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% +} +} +\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@ +} +\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 + } +} +\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} +} +\ExecuteBibliographyOptions[bookreview]{skipbib,skiplab} +\endinput diff --git a/Master/texmf-dist/tex/lualatex/letgut/letgut.dbx b/Master/texmf-dist/tex/lualatex/letgut/letgut.dbx new file mode 100644 index 00000000000..980e08a909b --- /dev/null +++ b/Master/texmf-dist/tex/lualatex/letgut/letgut.dbx @@ -0,0 +1,50 @@ +\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}} diff --git a/Master/texmf-dist/tex/lualatex/letgut/letgut.lbx b/Master/texmf-dist/tex/lualatex/letgut/letgut.lbx new file mode 100644 index 00000000000..da57f1770ca --- /dev/null +++ b/Master/texmf-dist/tex/lualatex/letgut/letgut.lbx @@ -0,0 +1,8 @@ +\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}}, +} diff --git a/Master/texmf-dist/tex/lualatex/letgut/logo-gut.pdf b/Master/texmf-dist/tex/lualatex/letgut/logo-gut.pdf new file mode 100644 index 00000000000..8483c6a56f5 Binary files /dev/null and b/Master/texmf-dist/tex/lualatex/letgut/logo-gut.pdf differ diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check index 60d7eabddf7..bea3d85eaec 100755 --- a/Master/tlpkg/bin/tlpkg-ctan-check +++ b/Master/tlpkg/bin/tlpkg-ctan-check @@ -467,7 +467,7 @@ my @TLP_working = qw( lccaps lcd lcg lcyw leading leadsheets leaflet lebhart lecturer lectures lectureslides ledmac leftidx leftindex leipzig lengthconvert - letltxmacro letterspacing letterswitharrows lettre lettrine + letgut letltxmacro letterspacing letterswitharrows lettre lettrine levy lewis lexend lexikon lexref lfb lgreek lh lhcyr lhelp libertine libertinegc libertinus diff --git a/Master/tlpkg/tlpsrc/collection-langfrench.tlpsrc b/Master/tlpkg/tlpsrc/collection-langfrench.tlpsrc index 7f8ddec866e..0ae3dc9319a 100644 --- a/Master/tlpkg/tlpsrc/collection-langfrench.tlpsrc +++ b/Master/tlpkg/tlpsrc/collection-langfrench.tlpsrc @@ -30,6 +30,7 @@ depend impatient-fr depend impnattypo depend l2tabu-french depend latex2e-help-texinfo-fr +depend letgut depend lshort-french depend mafr depend matapli diff --git a/Master/tlpkg/tlpsrc/letgut.tlpsrc b/Master/tlpkg/tlpsrc/letgut.tlpsrc new file mode 100644 index 00000000000..e69de29bb2d -- cgit v1.2.3