Inserimento dinamico del percorso del file *.tex nel header

  • Creatore
    Topic
  • #41847
    Up
    0
    Down
    ::


    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?
    Grazie

    Giorgio

Visualizzazione 8 filoni di risposte
  • Autore
    Risposte
    • #41848
      Up
      0
      Down
      ::

      Qualcuno ha qualche idea?

      Ammesso che non esistano primitive dedicate a questo compito, su GNU/Linux si potrebbe realizzare uno script che richiama basedir o analogo e modifica una stringa nel sorgente TeX tramite espressione regolare.

      A presto.

    • #41849
      Up
      0
      Down
      ::

      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?
      Grazie

      Giorgio

      `\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

    • #41850
      robitex
      Amministratore del forum
        Up
        0
        Down
        ::

        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?
        Grazie

        Giorgio

        `\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

        Non si potrebbe usare kpathsea?
        Grazie

      • #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

      • #41852
        Up
        0
        Down
        ::


        Grazie Ragaz, ora provo a metterlo nel codice.

      • #41853
        Up
        0
        Down
        ::

        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?
        Grazie

        Giorgio

        `\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

        Mi 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

      • #41854
        robitex
        Amministratore del forum
          Up
          0
          Down
          ::


          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

        • #41855
          robitex
          Amministratore del forum
            Up
            0
            Down
            ::


            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.

          • #41856
            robitex
            Amministratore del forum
              Up
              0
              Down
              ::


              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

          Visualizzazione 8 filoni di risposte
          • Devi essere connesso per rispondere a questo topic.

          Go to top