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