Re: Inserimento dinamico del percorso del file *.tex nel header

#41851
Up
0
Down
::

Non si potrebbe usare kpathsea?

Sì e no: mettendo
`\immediate\write18{kpsewhich #1 > temp.ttt}`
la chiamata \filepath{pippo.tex} scriverebbe, nel file temp.ttt, “./pippo.tex”, se pippo.tex è un file nella directory di lavoro. Invece \filepath{article.cls} scriverebbe “/usr/local/texlive/2009/texmf-dist/tex/latex/base/article.cls”

Si potrebbe migliorare la macro in modo che scriva anche la directory di lavoro e poi guardi il primo carattere della stringa ottenuta leggendo il file e legga anche la seconda riga se quel primo carattere è “.”
`\catcode`@=11

\def\@car#1#2\@nil{#1}
\def\@gobble#1{}

\newread\@filepathstream
\def\filepath#1{%
\immediate\write18{kpsewhich #1 > \jobname.ttt}%
\immediate\write18{pwd >> \jobname.ttt}%
\immediate\openin\@filepathstream=\jobname.ttt
\read\@filepathstream to\@tempa
\read\@filepathstream to\@tempb
\immediate\closein\@filepathstream
\@computefilepathname}
\def\@gobblefinalspace#1 \@nil{#1}
\edef\@PAR@{\string\par}
\def\@computefilepathname{%
\edef\@tempa{\detokenize\expandafter{\@tempa}}%
\edef\@tempa{\expandafter\@gobblefinalspace\@tempa\@nil}%
\edef\@tempb{\detokenize\expandafter{\@tempb}}%
\edef\@tempb{\expandafter\@gobblefinalspace\@tempb\@nil}%
\edef\@tempc{\expandafter\@car\@tempa\@nil}%
\if\@tempc.%
\edef\filepathname{\@tempb\expandafter\@gobble\@tempa}%
\else
\ifx\@tempb\@PAR@
\def\filepathname{FILE NOT FOUND}%
\else
\let\filepathname\@tempa
\fi
\fi}
\catcode`@=12

\filepath{moddate.tex}
[\filepathname]

\filepath{article.cls}
[\filepathname]

\filepath{xun.nin}
[\filepathname]

\bye
`
In una versione LaTeX si usi \makeatletter e \makeatother, evitando la definizione di \@gobble e di \@car. Le ridefinizioni di \@tempa e di \@tempb servono per buttar via lo spazio che risulta dalla lettura del file: se la prima riga è “./pippo.tex”, per esempio, l’espansione di \filepathnametemp è “./pippo.tex ” (con lo spazio in fondo).

Adopero \detokenize per neutralizzare eventuali caratteri “pericolosi”; tanto ci serve solo la stringa. L’ultimo condizionale funziona perché, se il file dato come argomento non esiste, ll file temporaneo avrà una sola riga e \@tempb, inizialmente, ha come espansione “\par”.

Ciao
Enrico

Go to top