Caractère d'échappement en lua avec lualatex

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}

Bonjour,

Le caractre \n provoquant une nouvelle ligne dans une chaine sous Lua ne
semble pas reconnu dans un environnement luacode de luaLaTeX. Mme chose pour
\r et j’imagine pour les autres caractres d’chappement.

Comment alors peut-on remdier a ? (c’est peut-tre lmentaire car je
dbute en lua et lualatex).

Je n’y connais rien en lua/lualatex, mais spontanment j’enlverais les
guillemets autour de \n dans le code ci-dessous, donc \n et non « \n ».

Cline

Merci.

Jean-Michel Boucart

ECM :

\documentclass{article}

\usepackage{luacode}

\begin{document}
Exemple
\begin{luacode}
local chaine = « Dbut de la chaine »..« \n »..« fin de la chaine »
tex.sprint(chaine)
\end{luacode}
et a marche pas !
\end{document}

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 :wink:

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

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

Le Wednesday 20 January 2021 à 08:31:42PM, Yvon Henel a écrit :

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 :wink:

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

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

Le 20/01/2021 à 22:00, Bastien DUMONT a écrit :

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

Le Wednesday 20 January 2021 à 08:31:42PM, Yvon Henel a écrit :

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 :wink:

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

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

Le Thursday 21 January 2021 à 09:58:11AM, Jean-Michel Boucart a écrit :

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

Le 20/01/2021 à 22:00, Bastien DUMONT a écrit :

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

Le Wednesday 20 January 2021 à 08:31:42PM, Yvon Henel a écrit :

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 :wink:

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

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 :

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

Bonjour Bastien, Jean-Michel et les autres,

Le Thu, 21 Jan 2021 11:46:40 +0100,
Bastien DUMONT xyz@xyz.tld 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 expriment que moi me relise, car pour tre
honnte j’ai profit de votre question pour exprimenter Lua dans
LaTeX pour la premire fois hier soir.

En tous cas, cette petite explication tait trs claire, et la FAQ
est l’endroit idal pour mettre ce genre de chose, car elle permet que
d’autres personnes relisent et amliorent le contenu, comme
sur Wikipedia:
https://faq.gutenberg.eu.org/
(tout le monde peut librement se crer 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 trs 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 bientt sur la FAQ!
Jrmy.


Jrmy JUST