Fwd: tableau de chaînes?

Christian Tellechea m’a envoyé en perso ceci. Que je retransmet à gut@ens au cas où une réponse à ma question intéresse quelqu’un…
J’ai testé son programme, qui marche bien sûr :wink:

Jacques André

Début du message réexpédié :

De: Christian Tellechea xyz@xyz.tld
Objet: TR : Re: Tableau de chaînes ?
Date: 11 janvier 2020 à 17:36:08 UTC+1
À: xyz@xyz.tld

Impossible de poster sur la liste, je ne sais même pas comment on fait…

Voici le message que j’ai posté 2 fois et qui s’est perdu dieu sait où !

CT

-------- Message transféré --------
Sujet : Re: Tableau de chaînes ?
Date : Sat, 11 Jan 2020 17:27:25 +0100
De : Christian Tellechea xyz@xyz.tld mailto:xyz@xyz.tld
Pour : xyz@xyz.tld mailto:xyz@xyz.tld

Le 11/01/2020 à 09:22, Jacques ANDRÉ a écrit :

Mais je ne vois rien qui permette de traiter des tableaux de chaînes, cad d’écrire, comme dans un langage de programmation, des chosescomme

Mot[i] = “Il pleut”
Une syntaxe de ce type sera très contraignante à programmer en TeX.

Je propose plutôt \mot[i] pour afficher le contenu de la case i et \defstringtab\mot[i] = “chaine” pour l’affectation.

voire

\for i=n,1,p \do {…Mot[i]…} % et non \foreach qui traite toutes les sous-chaînes d’une liste sans donner accès à chacune

Une boucle \for opérant en dehors d’un groupe doit être programmée.

Si quelqu’un a une piste, merci…

Je propose ce code, peut-être fera-t-il l’affaire ? Je l’ai écrit sans trop savoir de quelle manière seront utilisés ces tableaux…

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\newcount\stringtabindex
\def\ifpositiveinteger#1{\afterassignment\ifpositiveintegerI\stringtabindex\numexpr0#1\relax\ifpositiveintegerI}
\def\ifpositiveintegerI#1\ifpositiveintegerI{%
\ifempty{#1}
{\csname @\ifnum\stringtabindex<0 second\else first\fi oftwo\endcsname}
{\csname @secondoftwo\endcsname}%
}
\def\ifempty#1{\csname @\ifcat\relax\detokenize{#1}\relax first\else second\fi oftwo\endcsname}
\def\newstringtab#1{\def#1[##1]{%
\ifcsname\string#1[\the\numexpr##1\relax]\endcsname
\csname\string#1[\the\numexpr##1\relax]\expandafter\endcsname
\else
\errmessage{\detokenize{#1[##1] n’est pas defini}}%
\fi}}
\def\defstringtab#1[#2]#3=#4"#5"{%
\ifdefined#1%
\ifpositiveinteger{#2}
{\expandafter\def\csname\string#1[\the\numexpr#2]\endcsname{#5}}
{\errmessage{\detokenize{#2} est un index illegal}}%
\else
\errmessage{\detokenize{#1} n’est pas un tableau de chaines (l’avez-vous defini ?)}%
\fi
}
\long\def\for#1=#2to#3\do#4{%
\def\forI{%
\unless\ifnum#1>\val@max\relax
#4\edef#1{\number\numexpr#1+1}\expandafter\forI
\fi
}%
\edef#1{\number\numexpr#2\relax}%
\edef\val@max{\number\numexpr#3\relax}%
\forI
}
\begin{document}
\textbf{Essai 1}\par
\newstringtab\mot
\defstringtab\mot[1] = “Bonjour”
\defstringtab\mot[3] = “le monde”
\defstringtab\mot[2]=" tout "
Ma phrase : \mot[1]\mot[2]\mot[3]\par
\defstringtab\mot[2] = “”
Ma phrase : \mot[1]\mot[2]\mot[3]

\textbf{Essai 2}\par
\newstringtab\comptage
% définition:
\for\ii=0 to 10\do{\defstringtab\comptage[\ii]=“\the\numexpr\ii*10”}
% affichage
Je compte de 10 en 10 :\for\ii=0 to 10\do{ \comptage[\ii]}.
\end{document}