Vorrei definire un ambiente che legge le righe in formato csv in esso contenute, e le elabori nella maniera voluta, per esempio creando un database con il pacchetto datatool o semplicemente salvando il testo in una serie di macro per usi successivi.
Per capirci, il seguente esempio potrebbe comportare la creazione del database (datatool) di nome mydata:
`\begin{dbtable}{mydata}
Sara, 45 , 60
Antonio, 78 , 89
Giuseppe, 45 , 12
\end{dbtable}
`
Il pacchetto datatool non permette questa efficace sintassi perché prevede che i dati csv debbano essere posizionati solo in un file esterno (ne sono abbastanza sicuro), altrimenti è necessario utilizzare un numero elevato di comandi (un comando per ciascun campo di ciascuna riga, intervallati dai comandi di nuova riga).Nel caso delle macro, l’ambiente dbtable dovrebbe invece memorizzare i campi in macro (globali) per esempio per inserirne i valori in una tabella:
Per esempio, dopo l’ambiente precedente, la macro \data@mydata@row1@field1 dovrebbe espandersi in “Sara”.Ho pensato che \scantokens di e-tex potrebbe essere la soluzione perché lavora aprendo un file virtuale, ma non saprei proprio come impostare l’implementazione.
Purtroppo non puoi farlo con \scantokens; infatti datatool usa \openin e \read per leggere il file .csv, mentre con \scantokens{…} leggi la lista di token argomento di \scantokens come se fosse un file soggetto a \input.
Un modo per definire i comandi che vorresti è
`\newcount\row
\newcount\col
\newenvironment{dbtable}[1]
{\setbox0=\vbox\bgroup\setupdbtable{#1}%
\halign\bgroup&\relax\processentry{##}\crcr}
{\crcr\egroup\egroup}
\def\processentry#1{%
\global\advance\col by 1
\expandafter\gdef\csname data@\tablename@row\number\row@field\number\col\endcsname{#1}}
\def\setupdbtable#1{\def\tablename{#1}%
\catcode`,=4 \catcode`\ =9
\row=0 \col=0 \everycr{\noalign{\global\advance\row 1 \global\col 0 }}}
\begin{dbtable}{mydata}
Sara, 45 , 60 \cr
Antonio, 78 , 89 \cr
Giuseppe, 45 , 12 \cr
\end{dbtable}`
Puoi controllare che la cosa funzioni dando
`\def\x#1#2{%
\expandafter\show\csname data@mydata@row#1@field#2\endcsname}
\x{1}{1}
\x{1}{2}
\x{1}{3}
\x{2}{1}
\x{2}{2}
\x{2}{3}
\x{3}{1}
\x{3}{2}
\x{3}{3}`
Ci sono vari difetti che forse possono essere corretti: gli spazi sono ignorati, quindi non puoi usarli all’interno di un argomento; occorre una terminazione delle righe. Ho provato rendendo attivo \endlinechar, ma non ci sono riuscito. Puoi evitare di dover ignorare gli spazi mettendo la virgola subito dopo il contenuto della cella:
`\begin{dbtable}{mydata}
Sara, 45, 60\cr
Antonio, 78, 89\cr
Giuseppe, 45, 12\cr
\end{dbtable}`
L’uso di \halign è solo per avere a disposizione i vari argomenti uno alla volta.
Ciao
Enrico