Deutsch   English   Français   Italiano  
<tg9r9p$rik1$1@herbert.ortolo.eu>

View for Bookmarking (what is this?)
Look up another Usenet article

X-Received: by 2002:a5d:6985:0:b0:22a:d169:6fce with SMTP id g5-20020a5d6985000000b0022ad1696fcemr10537028wru.717.1663594617764;
        Mon, 19 Sep 2022 06:36:57 -0700 (PDT)
Path: ...!news-out.google.com!nntp.google.com!proxad.net!feeder1-2.proxad.net!fdn.fr!news.ortolo.eu!.POSTED.localhost!not-for-mail
From: Tanguy Ortolo <tanguy@ortolo.eu>
Newsgroups: fr.comp.text.tex
Subject: =?UTF-8?Q?Pr=C3=A9paration?= d'un module pour la projection de
 textes de chants
Date: Mon, 19 Sep 2022 13:36:57 -0000 (UTC)
Sender: tanguy@localhost
Message-ID: <tg9r9p$rik1$1@herbert.ortolo.eu>
Mime-Version: 1.0
Injection-Date: Mon, 19 Sep 2022 13:36:57 -0000 (UTC)
Injection-Info: herbert.ortolo.eu; posting-account="tanguy"; posting-host="localhost:::1";
	logging-data="903809"; mail-complaints-to="usenet@ortolo.eu"
Summary: Module pour =?UTF-8?Q?r=C3=A9aliser?= un diaporama de texte de
 chant =?UTF-8?Q?d=27assembl=C3=A9e?=
 de =?UTF-8?Q?fid=C3=A8les?=
Keywords: module, paquet, package, extension, songproj, chant,
 projection,
 couplet, refrain, vers, strophe, diaporama,
 =?UTF-8?Q?=C3=A9glise=2C=0A_assembl=C3=A9e=2C?= chanson, Beamer, TeX,
 LaTeX, LaTeX3
User-Agent: tin/2.4.5-20201224 ("Glen Albyn") (Linux/5.10.0-17-amd64 (x86_64))
Cancel-Lock: sha1:u6UNCD/N3A72UgN7e9qlfXjy0mw=
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Bytes: 13560
Lines: 371

Bonjour à tous,

Dans mon église locale, nous avons un vidéoprojecteur qui sert à
afficher les textes des chants utilisés. Ça permet de consommer de
l'électricité plutôt que des tonnes de papier (je n'ai pas vérifié si
les bilans financier, énergétique et carbone étaient favorables, mais ce
n'est pas le sujet). Et ça nécessite surtout de préparer, pour chaque
office, un diaporama avec les textes de chants.

Vous me voyez venir, j'imagine : PowerPoint et LibreOffice Impress me
conviennent fort peu, en particulier avec l'absence de notion de
surcouche, qui implique beaucoup de manipulations manuelles pour aligner
les couplets d'une diapo sur la suivante. Après en avoir soupé avec ces
WYSIWYG, je viens donc enfin de réaliser de quoi faire ça avec Beamer.

Pour vous donner un peu de contexte, il s'agit d'afficher le texte de
chants constitués d'un refrain et de couplets en alternance, en
commençant soit par un couplet (C R C R C R), soit directement par le
refrain (R C R C R C R). Certains chants n'ont d'ailleurs que des
couplets. Si les couplets et le refrain ne sont pas trop longs, on peut
afficher sur une même diapo un couplet et le refrain. Sinon, on
n'affiche qu'un couplet, puis, sur la diapo suivante, le refrain, et
ainsi de suite.

L'utilisation visée consiste à écrire le texte des chants dans des
fichiers séparés, avec un balisage de ce genre :

``` latex ave_maria_lourdes.tex
% Vers le plus long, utilisé pour le centrage
\longest{Dans l'eau pure et sainte}

\begin{couplet}
    Ô Vierge Marie \\
    Le peuple chrétien \\
    À Lourdes vous prie \\
    Chez vous il revient. \\
\end{couplet}

\begin{refrain}
    Ave, ave, ave Maria. (bis) \\
\end{refrain}

\begin{couplet}
    Le fond de la roche \\
    S'éclaire à l'instant \\
    La Dame s'approche \\
    Fait signe à l'enfant. \\
\end{couplet}

\begin{couplet}
    « Venez, je vous prie \\
    Ici, quinze fois \\
    Avec vos amies \\
    Entendre ma voix ». \\
\end{couplet}

\begin{couplet}
    Avec insistance \\
    La Dame, trois fois \\
    A dit : « Pénitence ». \\
    Chrétien, c'est pour toi ! \\
\end{couplet}

% Ce chant est plus long, mais c'est sans intérêt pour cet exemple
\end{chant}
```

Ce genre de fichier sera ensuite à importer dans un diaporama, comme
ceci :

``` latex ecm.tex
\documentclass[12pt]{beamer}
\usepackage[french]{babel}
\usepackage{songproj}

\begin{document}
    \begin{frame}
        \begin{song}{2}[1,2,3]
            % Deux strophes sur l'écran (couplet et refrain)
            % Utiliser les couplets 1, 2 et 3
            \input{ave_maria_lourdes}
        \end{song}
    \end{frame}
\end{document}
```

Le code de mon extension détermine s'il y a un refrain au début ou après
un premier couplet, pour construire un transparent de ce genre :

```latex
\begin{frame}
    \settowidth{\versewidth}{Dans l'eau pure et sainte}
    \vfill \vfill
    \begin{overprint}
        \onslide<+>
        \begin{verse}[\versewidth]
            Ô Vierge Marie \\
            Le peuple chrétien \\
            À Lourdes vous prie \\
            Chez vous il revient. \\
        \end{verse}
        \onslide<+>
        \begin{verse}[\versewidth]
            Le fond de la roche \\
            S'éclaire à l'instant \\
            La Dame s'approche \\
            Fait signe à l'enfant. \\
        \end{verse}
        % Et ainsi de suite pour les autres couplets
    \end{overprint}
    \vfill
    \begin{verse}[\versewidth]
        Ave, ave, ave Maria. (bis) \\
    \end{verse}
    \vfill \vfill
\end{frame}
```

J'en viens au code de mon extension (c'est un peu long, vous vous en
doutez). Comme vous pourrez le voir, j'utilise largement des concepts de
LaTeX3, que j'ai trouvés très utiles. Pour info, j'ai conservé les
termes de « refrain » et « couplet » en français, parce qu'ils sont déjà
utilisés en anglais, et que les termes anglo-anglais correspondants,
soit “chorus” et “verse”, sont extrêmement ambigus (en particulier
“verse”, qui peut également signifier « vers » ou « strophe »).

Que pensez-vous de mon code ci-dessous ? Je m'interroge en particulier
sur les points suivants :
- Le nom : j'ai appelé ça “songproj” mais on devrait sans doute pouvoir
  trouver mieux.
- L'utilisation de variables globales : c'est simple et acceptable parce
  qu'il serait à mon avis tout à fait absurde de vouloir définir un
  chant dans un chant. Mais s'il s'avère plus propre ou plus pertinent
  d'utiliser des affectations locales, je suis preneur de suggestions
  sur la façon de faire cela.
- J'aimerais bien prendre en charge des listes de numéros de couplets
  comme « 1-2, 6-7 », voire « -2, 6- » mais j'ai peur que ce soit un peu
  trop compliqué à faire pour une utilité assez faible (on chante
  généralement entre deux et cinq couplets, donc rien d'horrible à
  énumérer.
- À plusieurs endroits, je cherche à propager un argument optionnel d'une
  fonction à une autre. Dans l'environnement `refrain` par exemple, je
  passe l'argument optionnel `#1` à l'environnement `simple_refrain`.
  J'utilise pour cela `\IfNoValueTF{#1}` pour rappeler, selon le cas,
  `\begin{simple_refrain}` ou `\begin{simple_refrain}[#1]`. J'aimerais
  bien simplifier cela.
- Ça ne permet pas d'afficher un chant sans refrain avec deux couplets
  par écran, ce qui devra faire l'objet d'une amélioration future.
- Il me reste à déterminer comment documenter et de publier cela, parce
  que c'est la première fois que j'écris une extension qui peut
  intéresser plusieurs personnes sur la planète. :-)

Ah, et évidemment, vous pouvez l'essayer avec `ecm.tex` et
`ave_maria_lourdes.tex` précités.

```latex songproj.sty
\NeedsTeXFormat{LaTeX2e}[2021/02/02]
\ProvidesPackage{songproj}[2021/09/19 Song projection]
\RequirePackage{expl3}
\RequirePackage{xparse}
\RequirePackage{verse}

\ExplSyntaxOn

\bool_new:N\g_my_song_bool            % are we in a song?
\bool_new:N\g_my_song_start_bool      % are we at the start of a song?
\bool_new:N\g_my_refrain_first_bool   % does the song start with the refrain?
\int_new:N\g_my_stanzas_per_slide_int % number of stanzas to show on each slide (1 or 2)
\dim_new:N\g_my_linewidth_dim         % length of the longest song line
\seq_new:N\g_my_couplet_indexes_seq   % indexes of song couplets to include
\seq_new:N\g_my_couplets_seq          % list of the song's couplets
========== REMAINDER OF ARTICLE TRUNCATED ==========