- Questo topic ha 8 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 5 anni, 4 mesi fa da .
-
Topic
-
Ciao a tutti.
Tempo fa scrissi un paio di macro con lo scopo di raccogliere linea per linea l’input dell’utente.
Le varie linee sono memorizzate all’interno di un array Lua e processate in seguito.
All’epoca studiai il TeX by Topic per creare un ambiente verbatim come quello descritto, ma non riuscii a creare il vero ambiente LaTeX ma solamente le macro di apertura \lines e di chiusura \endlines.
Ora mi sono accorto che il codice ha un bug perché raccoglie una prima linea vuota che non dovrebbe esserci.
Veniamo al codice:
`% !TeX program = LuaLaTeX
\documentclass{article}
\def\mkchar#1{\catcode`#1=12 }
\def\lines{%
\directlua{
lines = {}
contatore = 0
}\begingroup
\let\do=\mkchar \dospecials
\endlinechar`\^^M \catcode`\^^M=12 \xlines}{\catcode`\^^M=12 \endlinechar=-1 %
\gdef\xlines#1^^M{%
\def\test{#1}
\ifx\test\endlines
\let\next\endgroup
\else
\directlua{
if contatore == 0 then contatore = 1 else
;lines[contatore] = [==[#1]==];
contatore = contatore + 1; end
}%
\let\next\xlines \fi \next}
}{\escapechar=-1
\xdef\endlines{\string\\endlines}
}\begin{document}
\lines
uno
due
tre
\endlines
\directlua{tex.print(“|”..table.concat(lines, “, “)..”|”)}
\end{document}
`Come potete constatare il codice funziona perché ho inserito l’artificio di eliminare la prima riga.
Il codice Lua di acquisizione linee “naturale” dovrebbe essere infatti il più semplice:
`…
\else
\directlua{
contatore = contatore + 1;
lines[contatore] = [==[#1]==];
}%
\let\next\xlines \fi \next}
…`Si potrebbe fare a meno della variabile contatore ma dovrei inserire l’operatore di lunghezza che è il carattere #. Evitiamo altri guai.
Se sostituisco il codice “naturale” nel sorgente ottengo una virgola in più, e questo è il bug.
Il mio codice raccoglie quindi una riga iniziale vuota.Le domande:
1) è possibile risolvere il bug senza applicare l’artificio?
2) come creare l’ambiente \begin{lines} \end{lines} al posto delle macro \lines e \endlines?
3) in LaTeX3 esiste un modo per risolvere brillantemente il quesito 2?Grazie mille.
R.
- Devi essere connesso per rispondere a questo topic.