Newsgroup: it.comp.software.tex
Titolo: rimuovere l'estensione da una stringa

Purtroppo gli anni in cui conoscevo abbastanza il TeX sono lontani
diversi lustri...
Avrei bisogno di un sistema per cui,
passando ad una macro un nome come "nome.tex",
posso avere a disposizione "nome" senza il .tex
Il motivo di questo e' che ho un testo con circa 180
figure fatte con pgf e al momento avevo strutturato
la cosa con una macro \miaFigura
\begin{figure}
\miaFigura{pippo.tex}
\caption{...}
\end{figure}
in modo da avere due versioni, una "veloce"
in cui \miaFigura veniva definita come uno spazio bianco
e una "lenta" in cui veniva definita come \input{#1} del file tex in
pgf che creava l'immagine.
Siccome ormai a generare l'output ci metto abbastanza
(e in certi casi esaurisco la memoria...) ho pensato di
creare delle versioni gia' in PDF di alcune delle figure piu'
pesanti e quindi usare una macro tipo:
\newcommand{\miaFigura}[1]{%
\IfFileExists{#1.pdf}
{\includegraphics{#1.pdf}}
{\input{#1.tex}}}
passandogli \miaFigura{pippo} dovrebbe prima provare a vedere
se c'e' gia' pippo.pdf e se non c'e' usare pippo.tex.
per fare questo pero', devo passare a \miaFigura il nome senza
estensione,
ma purtroppo ho circa 180 punti in cui uso \miaFigura{pippo.tex}, con
l'estensione ".tex".
Chiaramente potrei usare una qualche sostituzione testuale sotto linux
per
trovare tutte le righe di quel tipo e togliere l'estensione, ma ero
curioso di
come poter fare direttamente con un comando TeX o LaTeX.
Scusate la lunghezza del messaggio...
ciao,
g.

 scrive:

Dunque vuoi che siano legali sia la chiamata \miaFigura{pippo} sia
\miaFigura{pippo.tex}; ecco qui:
\makeatletter
\def\miaFigura#1{\@miaFigura #1.tex\@nil}
\def\@miaFigura #1.tex#2\@nil{%
  \IfFileExists{#1.pdf}{\includegraphics{#1}}{\input{#1}}}
\makeatother
Esempi (scrivo le espansioni una dopo l'altra e
indico gli argomenti dopo il %):
\miaFigura{pippo} % #1=pippo
\@miaFigura pippo.tex\@nil % #1=pippo #2=
\IfFileExists{pippo.pdf}{\includegraphics{pippo}}{\input{pippo}}
\miaFigura{pippo.tex} % #1=pippo.tex
\@miaFigura pippo.tex.tex\@nil % #1=pippo #2=.tex
\IfFileExists{pippo.pdf}{\includegraphics{pippo}}{\input{pippo}}
In \includegraphics e \input non occorre aggiungere l'estensione.
Ciao
Enrico

Grazie,
adesso me li studio, cosi' ripasso un po' la sintassi del Tex...
(ottimo anche il tuo manuale che ho scoperto da poco).
ciao,
g.

 (ottimo anche il tuo manuale che ho scoperto da poco).
Adopero gli "argomenti delimitati". Vediamo il codice una riga
alla volta.
1. \makeatletter
2. \def\miaFigura#1{\@miaFigura #1.tex\@nil}
3. \def\@miaFigura #1.tex#2\@nil{%
4.   \IfFileExists{#1.pdf}{\includegraphics{#1}}{\input{#1}}}
5. \makeatother
1. Rendiamo @ una lettera per usare nomi di comandi "privati".
2. Passo l'argomento di \miaFigura a un'altra macro togliendo
le graffe e aggiungendo in fondo i token ".tex\@nil".
3. Definisco la macro \@miaFigura con due argomenti delimitati:
#1 è tutto ciò che segue \@miaFigura fino a che si trovano i
quattro token ".tex"; il secondo è da lì in poi fino al token \@nil
che è un tradizionale delimitatore finale in LaTeX, si potrebbe
usare qualsiasi altro token
4. Agiamo usando l'argomento #1 (perché #2 è vuoto oppure è .tex)
5. Torniamo alla normalità riguardo @. È per tradizione, non sarebbe 
necessario usare comandi con @.
Adesso vediamo le due possibilità:
A. \miaFigura{pippo.tex} si trasforma in
  \@miaFigura pippo.tex.tex\@nil
Qui #1 è "pippo", #2 è ".tex"
B. \miaFigura{pippo} si trasforma in
  \@miaFigura pippo.tex\@nil
Qui #1 è "pippo", #2 è vuoto.
In entrambi i casi si ottiene ciò che si desidera. Chiaro però che
se chiami \miaFigura{pippo.ltx} la faccenda non funziona più, ma
è facilmente gestibile modificando la definizione di \@miaFigura.
Più complicato sarebbe eliminare l'estensione nel caso di nomi
contenenti il punto (roba come pippo.ieri.tex).
La macro non funziona se hai nomi di file con _; per quello occorre
qualche trucco extra. Esercizio. ;-)
Ciao
Enrico