Re: Leggere un file di testo in una macro

#56767
Up
0
Down
::

Salve a tutti.

Avrei bisogno di creare un file latex che abbia come input un file di testo, ed in base al numero di righe del file di testo mi crei con itemize un elenco di tanti elementi quante sono le righe del file.

Come posso fare? Potete darmi delle indicazioni al riguardo?
grazie per il vostro contributo
Stefano

`\documentclass[a4paper]{article}
\makeatletter
\newread\ext@itemize
\def\ext@par{\par}
\newcommand{\makeitemize}[1]{%
\IfFileExists{#1}
{\openin\ext@itemize#1
\begin{itemize}
\ext@read
\end{itemize}}
{\message{^^J*** File #1 not found ***^^J^^J}}}
\newcommand{\ext@read}{%
\ifeof\ext@itemize
\expandafter\closein\expandafter\ext@itemize
\else
\read\ext@itemize to \ext@line
\ifx\ext@line\ext@par\else\item\ext@line\fi
\expandafter\ext@read
\fi}
\makeatother

\begin{document}
\makeitemize{extitem.dat}
\makeitemize{extitem.dot}
\end{document}`
Prova con un file extitem.dat che contenga
`ciao
ecco qui
viva
fine`
Ho messo anche un esempio in più per mostrare che se l’argomento è un file inesistente viene emesso un messaggio e il comando non fa altro.

Il comando \openin attiva la lettura riga per riga da un file; il comando per leggere una riga è “\read to ” che definisce (nel nostro caso \ext@line) come una macro che si espande al contenuto della riga appena letta. Il condizionale \ifeof è vero se non ci sono altre righe e questo termina la ricorsione. Perciò \ext@read viene eseguito fino a che ci sono righe nel file; c’è una piccola complicazione, perché TeX aggiunge sempre una riga vuota in fondo e questo è il motivo per il quale c’è il test \ifx\ext@line\ext@par.

Unico caso in cui non funziona: il file dato come argomento di \makeitemize esiste ma non contiene nulla: in questo caso LaTeX incontra
`\begin{itemize}
\end{itemize}`
che provoca un errore.

Ciao
Enrico

Go to top