- Questo topic ha 9 risposte, 4 partecipanti ed è stato aggiornato l'ultima volta 15 anni, 8 mesi fa da
robitex.
-
CreatoreTopic
-
10 Febbraio 2010 alle 11:37 #41847::
Buongiorno,
sto cercando di inserire in maniera dinamica e automatica il percorso del file *.tex nell’header del documento, senza doverlo ridigitare nel momento in cui il percorso cambia. Vorrei fosse il sistema durante la compilazione a mettere il percorso corrente.
Per il momento la porzione di codice inserita è la seguente:\pagestyle{fancy}
\lhead{\url{HOME}}dove al posto di HOME vorrei venisse messo un comando tipo \jobname che inserisca autonomamente il percorso del file e non solo il nome.
Qualcuno ha qualche idea?
GrazieGiorgio
-
CreatoreTopic
-
AutoreRisposte
-
-
10 Febbraio 2010 alle 12:13 #41848
-
10 Febbraio 2010 alle 13:09 #41849::
Buongiorno,
sto cercando di inserire in maniera dinamica e automatica il percorso del file *.tex nell’header del documento, senza doverlo ridigitare nel momento in cui il percorso cambia. Vorrei fosse il sistema durante la compilazione a mettere il percorso corrente.
Per il momento la porzione di codice inserita è la seguente:\pagestyle{fancy}
\lhead{\url{HOME}}dove al posto di HOME vorrei venisse messo un comando tipo \jobname che inserisca autonomamente il percorso del file e non solo il nome.
Qualcuno ha qualche idea?
GrazieGiorgio
`\documentclass[a4paper]{article}
\newread\filepathstream
\def\filepath#1{%
\immediate\write18{echo `pwd`/#1.tex > temp.ttt}%
\immediate\openin\filepathstream=temp.ttt%
\immediate\read\filepathstream to\filepathname
\immediate\closein\filepathstream}\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\fancyhead[R]{\ttfamily\filepathname}\begin{document}
\filepath{\jobname.tex}
abc\end{document}`
Va compilato con l’opzione -shell-escape attiva.Ciao
Enrico
-
11 Febbraio 2010 alle 8:12 #41850::
Buongiorno,
sto cercando di inserire in maniera dinamica e automatica il percorso del file *.tex nell’header del documento, senza doverlo ridigitare nel momento in cui il percorso cambia. Vorrei fosse il sistema durante la compilazione a mettere il percorso corrente.
Per il momento la porzione di codice inserita è la seguente:\pagestyle{fancy}
\lhead{\url{HOME}}dove al posto di HOME vorrei venisse messo un comando tipo \jobname che inserisca autonomamente il percorso del file e non solo il nome.
Qualcuno ha qualche idea?
GrazieGiorgio
`\documentclass[a4paper]{article}
\newread\filepathstream
\def\filepath#1{%
\immediate\write18{echo `pwd`/#1.tex > temp.ttt}%
\immediate\openin\filepathstream=temp.ttt%
\immediate\read\filepathstream to\filepathname
\immediate\closein\filepathstream}\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\fancyhead[R]{\ttfamily\filepathname}\begin{document}
\filepath{\jobname.tex}
abc\end{document}`
Va compilato con l’opzione -shell-escape attiva.Ciao
EnricoNon si potrebbe usare kpathsea?
Grazie
-
11 Febbraio 2010 alle 9:26 #41851::
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
-
12 Febbraio 2010 alle 7:46 #41852
-
5 Agosto 2010 alle 6:32 #41853::
Buongiorno,
sto cercando di inserire in maniera dinamica e automatica il percorso del file *.tex nell’header del documento, senza doverlo ridigitare nel momento in cui il percorso cambia. Vorrei fosse il sistema durante la compilazione a mettere il percorso corrente.
Per il momento la porzione di codice inserita è la seguente:\pagestyle{fancy}
\lhead{\url{HOME}}dove al posto di HOME vorrei venisse messo un comando tipo \jobname che inserisca autonomamente il percorso del file e non solo il nome.
Qualcuno ha qualche idea?
GrazieGiorgio
`\documentclass[a4paper]{article}
\newread\filepathstream
\def\filepath#1{%
\immediate\write18{echo `pwd`/#1.tex > temp.ttt}%
\immediate\openin\filepathstream=temp.ttt%
\immediate\read\filepathstream to\filepathname
\immediate\closein\filepathstream}\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\fancyhead[R]{\ttfamily\filepathname}\begin{document}
\filepath{\jobname.tex}
abc\end{document}`
Va compilato con l’opzione -shell-escape attiva.Ciao
EnricoMi si è ripresentata la necessità di compilare il codice che mi hai inviato su una macchina dove anzichè linux è installato Windows XP, WinEdt 5.5 e MikTex 2.7.
Come và cambiato il codice affinchè nell’header compaia il percorso corrente e il nome del file che sto compilando?Grazie per l’aiuto.
Giorgio
-
20 Dicembre 2010 alle 12:24 #41854::
Ciao,
ho installato la libreria lua file system con la quale si può ottenere in lualatex il percorso della directory corrente.Il tutto è molto semplice: basta chiamare all’interno della nuova macro \directlua di LuaTeX, il codice Lua con il quale si ottiene il percorso, ma vediamo le cose una alla volta:
Il codice Lua per stampare il path corrente è (da inserire in uno script):
`– codice Lua:
— caricamento libreria LuaFileSystem
require “lfs”— memorizzo la stringa contenente il path
— della directory corrente
local cd = lfs.currentdir()
print(“Current dir: ” .. cd”)`Ok. Se vogliamo utilizzarlo in un documento (Lua)LaTeX dovremo scrivere semplicemente:
`\documentclass{minimal}\newcommand{\curdir}{
\directlua{% ecco quì il codice Lua
require “lfs”
local cd = lfs.currentdir()
tex.print(cd)
}
}\begin{document}
\curdir
\end{document}`Tuttavia questa semplicità è in realtà un poco più complicata per i sistemi Windows perché l’espansione della macro \curdir contenendo il carattere backslash produce un errore:
Per esempio il percorso “C:\documenti\tesi” darebbe luogo all’espansione delle macro \Documenti e \tesi. Ciò si può evitare per esempio sostituendo i caratteri di escape con la macro \textbackslash.
Il codice del comando diventerebbe questo:`\newcommand{\curdir}{
\directlua{
require “lfs”
local cd = string.gsub(lfs.currentdir(),
“\\”,
“\\textbackslash “)
tex.print(cd)
}
}`Abbiamo messo i doppi \\ perché in Lua in una stringa letterale definita dagli apici (doppi o semplici) il carattere \ funziona come carattere di escape ed un doppio \\ significa quindi il carattere \ stesso.
Allora avremo potuto anche scrivere:
`\newcommand{\curdir}{
\directlua{
require “lfs”
local cd = string.gsub(lfs.currentdir(),
[[\]],
[[\textbackslash ]])
tex.print(cd)
}
}`
dove si è usata la notazione tra doppie parentesi quadre per specificare le stringhe, notazione che non interpreta i caratteri di escape in Lua.
Entrambe i codici non funzionano perché in LuaTeX il codice all’interno di \directlua VIENE espanso TeXnicamente e quindi viene espanso per esempio \textbackslash dove non dovrebbe affatto essere.Questo serpente che si morde la coda può essere risolto inserendo la primitiva \string nel codice Lua per evitare che i token vengano espansi.
Un codice per stampare il percorso della directory corrente in lualatex può essere questo:`% installare la libreria lfs e compilare con lualatex
\documentclass{minimal}\newcommand{\curdir}{
\directlua{
require “lfs”
local cd = string.gsub(lfs.currentdir(),
“\string\\”,
“\string\\textbackslash “)
tex.print(cd)
}
}\begin{document}
\curdir
\end{document}
`
Ciao
-
20 Dicembre 2010 alle 20:31 #41855::
Solo per confermare che invece sotto sistemi Linux, e quindi credo anche per il Mac, non ci sono problemi dovuti al carattere backslash perché in questi sistemi operativi il carattere di separazione nel path è la slash /.
Quindi la soluzione con lualatex è assai semplice: per ottenere un comando che produce la directory corrente è sufficiente il seguente codice (deve essere installata la libreria Lua file System):
`\documentclass{minimal}\newcommand{\curdir}{%
\directlua{tex.sprint(lfs.currentdir())}}\begin{document}
\curdir
\end{document}`Saluti.
-
22 Dicembre 2010 alle 8:33 #41856::
Scusate,
ancora qui per aggiungere un miglioramento: inversione del punto di vista. In questo modo il codice Lua anziché essere richiamato ogni volta che compare la macro \curdir, esso definisce una volta per tutte la macro \curdir che espande al path.L’utente si ritrova quindi con una macro tradizionale, efficiente ed espandibile.
`\documentclass{minimal}
\directlua{
do
require “lfs”
local bs = “\string\\”
local cd = string.gsub(lfs.currentdir(),
bs,
bs..”textbackslash “)tex.sprint(bs..”def”..bs..”curdir{“..cd..”}”)
end
}\begin{document}
\texttt{\curdir}
\emph{\curdir}
\curdir
\curdir
\curdir
\end{document}`
Saluti
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.