# 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}.