[gut] Caractère d'échappement en lua avec luaLaTeX

33 views
Skip to first unread message

Jean-Michel Boucart

unread,
Jan 20, 2021, 12:37:39 PM1/20/21
to g...@ens.fr
Bonjour,

Le caractère \n provoquant une nouvelle ligne dans une chaine sous Lua
ne semble pas reconnu dans un environnement luacode de luaLaTeX. Même
chose pour \r et j'imagine pour les autres caractères d'échappement.

Comment alors peut-on remédier à ça ? (c'est peut-être élémentaire car
je débute en lua et lualatex).

Merci.

Jean-Michel Boucart

ECM :

\documentclass{article}

\usepackage{luacode}

\begin{document}
Exemple
\begin{luacode}
  local chaine = "Début de la chaine".."\n".."fin de la chaine"
  tex.sprint(chaine)
\end{luacode}
et ça marche pas !
\end{document}


Céline Chevalier

unread,
Jan 20, 2021, 1:10:55 PM1/20/21
to g...@ens.fr

Bonjour,


> Le caractère \n provoquant une nouvelle ligne dans une chaine sous Lua ne
> semble pas reconnu dans un environnement luacode de luaLaTeX. Même chose pour
> \r et j'imagine pour les autres caractères d'échappement.
>
> Comment alors peut-on remédier à ça ? (c'est peut-être élémentaire car je
> débute en lua et lualatex).

Je n'y connais rien en lua/lualatex, mais spontanément j'enlèverais les
guillemets autour de \n dans le code ci-dessous, donc \n et non "\n".


Céline

Yvon Henel

unread,
Jan 20, 2021, 2:31:51 PM1/20/21
to g...@ens.fr
Le 20/01/2021 à 18:21, Jean-Michel Boucart a écrit :
> Bonjour,

bonjour

>
> Le caractère \n provoquant une nouvelle ligne dans une chaine sous Lua
> ne semble pas reconnu dans un environnement luacode de luaLaTeX. Même
> chose pour \r et j'imagine pour les autres caractères d'échappement.

pour éviter les insultes dans le code, je dois remplacer {luacode} par
{luacode*}

supprimer les doublequotes autour de \n ne me semble pas la solution ;)

Une tentative avec

local chaine = [[Début de la chaine


fin de la chaine]]

montre que ce n'est pas seulement une question de caractère d'échappement.

Je n'ai rien vu dans le manuel de LuaTeX qui pourrait m'expliquer (m = à
moi, pour les autres, faut voir) ce qui se passe.

>
> Comment alors peut-on remédier à ça ? (c'est peut-être élémentaire car
> je débute en lua et lualatex).

> Merci.
>
> Jean-Michel Boucart
>
> ECM :
>
> \documentclass{article}
>
> \usepackage{luacode}
>
> \begin{document}
> Exemple
> \begin{luacode}
>   local chaine = "Début de la chaine".."\n".."fin de la chaine"
>   tex.sprint(chaine)
> \end{luacode}
> et ça marche pas !
> \end{document}
>
>


--
Yvon Henel

Bastien DUMONT

unread,
Jan 20, 2021, 4:03:28 PM1/20/21
to g...@ens.fr
Bonsoir,

Comme expliqué dans le document fourni par le paquet lualatex-doc p. 5, l'argument de \directlua est interprété par TeX avant d'être passé à l'interpréteur Lua ; ensuite (p. 4), la commande tex.sprint() passe son argument à TeX. C'est le cas aussi dans l'environnement luacode avec quelques modifications, notamment le fait que la séquence \\ et les passages à la ligne sont passés tels quels à Lua et non interprétés par TeX (voir la documentation p. 1-2).

Les liens :
http://mirrors.ctan.org/info/luatex/lualatex-doc/lualatex-doc.pdf
http://mirrors.ctan.org/macros/luatex/latex/luacode/luacode.pdf

Donc, dans l'exemple suivant :

\begin{luacode}
  local chaine = "Début de la chaine".."\n".."fin de la chaine"
  tex.sprint(chaine)
\end{luacode}

\n est interprété avant d'être passé à Lua et lualatex retourne une erreur Undefined control sequence. En effet, la commande \n n'existe pas. Voyez ce que cela donne si vous placez dans le préambule \newcommand{\n}{une expansion}

Si vous tentez d'écrire :

local chaine = [[Début de la chaine


fin de la chaine]]

La chaîne de caractère avec les sauts de ligne est bien passée à Lua puis à Tex (via la commande tex.sprint()), mais TeX convertit les passages à la ligne en espaces.

Il faut donc que l'argument de tex.sprint() contienne la commande qui va opérer le saut de ligne désiré. Si vous souhaitez simplement un passage à la ligne (pas un nouveau paragraphe, donc sans indentation), vous pouvez utiliser le code suivant (qui fonctionnera avec l'environnement luacode mais pas avec directlua, voir ci-dessus) :

\begin{luacode}
  local chaine = [[Début de la chaine\\ fin de la chaine]]
  tex.sprint(chaine)
\end{luacode}

(Les deux crochets évitent que les barres obliques soient interprétées par Lua ; avec des guillemets, il faudrait protégér chaque barre oblique, donc remplacer \\ par \\\\.)

Le code suivant produit le même résultat :

\begin{luacode}
  local chaine = [[Début de la chaine \string\newline fin de la chaine]]
  tex.sprint(chaine)
\end{luacode}

lors de la production du code qui va être transmis à Lua, la commande \string dit à TeX de considérer tout ce qui suit jusqu'à l'espace comme une chaîne de caractères et non une commande. l'interprète Lua recoit donc "local chaine = [[Début de la chaine \newline fin de la chaine]]" et le transmet à TeX via tex.sprint(), qui cette fois-ci interprète la commande \newline.

Notez que si vous voulez vraiment que Lua ait une chaîne de caractère qui contient un saut de ligne (par exemple si vous en avez besoin de la traiter dans votre bloc de code avec d'autres fonctions Lua), il faut écrire :
local chaine = "Début de la chaine \string\n fin de la chaine
Lua recevra alors :
local chaine = "Début de la chaine \string\n fin de la chaine"
Si vous utilisez print(chaine), vous verrez apparaître au milieu des informations imprimées par lualatex sur votre terminal votre chaîne de caractères avec le saut de ligne. Mais si vous passez ce saut de ligne à TeX via tex.sprint(chaine), il sera traité comme dit précédemment.

J'espère ne pas avoir été trop long.

Bonne nuit, et bien à vous,

Bastien

Jean-Michel Boucart

unread,
Jan 21, 2021, 3:59:26 AM1/21/21
to g...@ens.fr
Bonjour,

Les documents cités expliquent effectivement le mécanisme
d'interprétation du source pour la commande \directlua et donnent pour
exemple le problème qui peut être créé par un commentaire. Je l'avais
bien vu mais même avec ces considérations j'ai été incapable de voir
comment obtenir un passage à la la ligne dans une chaine en utilisant
l'environnement luacode. Alors non, les explications fournies ne sont
pas trop longues ! Elles sont claires et détaillées et je vous en
remercie vivement.  Merci aussi à C. Chevalier et Y. Henel pour avoir
tenté, comme moi, des solutions inefficaces.

Il serait dommage que vos explications soient perdues. N'y a-t-il pas un
moyen de les rendre accessibles facilement : la documentation en
français sur lualatex est bien trop rare.

Merci encore,

Jean-Michel

Bastien DUMONT

unread,
Jan 21, 2021, 5:51:52 AM1/21/21
to g...@ens.fr
Bonjour,

À votre service ! Il est vrai que le problème actuellement est qu'il faut combiner trois documentations différentes pour arriver à comprendre comment luacode fonctionne. Il existe plusieurs tutoriels en anglais (notamment sur Overleaf), mais ils traitent généralement en détails \directlua avant de signaler que luacode existe et qu'on ferait bien de l'utiliser. Peut-être qu'un court tutoriel qui explique de zéro les principes de luacode pourrait être utile, avec un renvoi vers des ressources plus complètes (par exemple celle-ci, qui donne un aperçu pratique de la syntaxe et des principales commandes Lua dans des environnements luacode : https://lataix-sebastien.developpez.com/tutoriels/latex/LaTeX-evolue-vers-LuaLaTeX).

Je veux bien retravailler mon mail si ça peut être publié quelque part (sur la FAQ du site de Gutenberg?), mais il faudrait que quelqu'un de plus expérimenté que moi me relise, car pour être honnête j'ai profité de votre question pour expérimenter Lua dans LaTeX pour la première fois hier soir.

Bonne journée,

Bastien

Jérémy Just

unread,
Jan 21, 2021, 6:48:50 AM1/21/21
to g...@ens.fr

Bonjour Bastien, Jean-Michel et les autres,


Le Thu, 21 Jan 2021 11:46:40 +0100,
Bastien DUMONT <bastien...@etu.univ-paris1.fr> a écrit :

> Je veux bien retravailler mon mail si ça peut être publié quelque
> part (sur la FAQ du site de Gutenberg?), mais il faudrait que
> quelqu'un de plus expérimenté que moi me relise, car pour être
> honnête j'ai profité de votre question pour expérimenter Lua dans
> LaTeX pour la première fois hier soir.

En tous cas, cette petite explication était très claire, et la FAQ
est l'endroit idéal pour mettre ce genre de chose, car elle permet que
d'autres personnes relisent et améliorent le contenu, comme
sur Wikipedia:
https://faq.gutenberg.eu.org/
(tout le monde peut librement se créer un compte)


Il n'y a encore quasiment rien sur LuaLaTeX dans la FAQ, *mais* on
utilise lualatex pour compiler les exemples sur le serveur depuis deux
ans maintenant, donc il est très probable que vos exemples fonctionnent
du premier coup (et sinon, il faut nous le dire pour les évolutions
futures).


Merci pour l'explication de luacode, et à bientôt sur la FAQ!
Jérémy.

--
Jérémy JUST

Denis Bitouzé

unread,
Jan 21, 2021, 4:13:42 PM1/21/21
to g...@ens.fr
Le 21/01/21 à 09h58, Jean-Michel Boucart a écrit :

> Bonjour,

Bonsoir,

> [...]
>
> Il serait dommage que vos explications soient perdues. N'y a-t-il pas
> un moyen de les rendre accessibles facilement : la documentation en
> français sur lualatex est bien trop rare.

J'abonde dans le sens de Jérémy pour la FAQ (sur le fonctionnement de
laquelle l'association GUTenberg est actuellement en phase de
réflexion).

Mais un autre moyen que des solutions pertinentes ne soient pas perdues
dans des fils de discussions est que les questions correspondantes
soient posées sur un site de questions et réponses (« Q & A site » en
anglais) tel que :

- le francophone (non commercial, sans publicité, propulsé par
l'association GUTenberg) :
┌────
https://texnique.fr/osqa/
└────
- l'anglophone :
┌────
https://tex.stackexchange.com/
└────

Sur ce genre de sites, les réponses sont :

- clairement présentées (leur code notamment) ;
- remontées en haut de la pile en fonction :
- des votes positifs ou négatifs qu'elles reçoivent (et qui reflètent,
imparfaitement certes, la confiance que leur accorde la
communauté) ;
- de l'acceptation d'une réponse comme étant « la » (meilleure)
réponse par celui qui a posé la question ;
- clairement émaillées de commentaires qui permettent de les éclaircir,
les amender, etc.
- taguées (via les tags des questions auxquelles elles répondent) pour
être mieux indexées par les moteurs de recherche ;
- etc.

Cela n'empêche en rien que les questions les plus fréquentes/pertinentes
et leurs réponses de ce site puissent ensuite être ajoutées (au
demeurant assez aisément) à la FAQ.
--
Denis

Reply all
Reply to author
Forward
0 new messages