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