[risolt]epstopdf in Makefile lanciato se le fig non cambiano

  • Creatore
    Topic
  • #13478
    Up
    0
    Down
    ::


    Ciao a tutti,

    uso pdflatex su linux per scrivere un articolo che contiene figure in eps. Come voi mi insegnate affinchè possano essere inserite nel documento devo convertirle in pdf con epstopdf, cosicchè ho pensato bene di fare un bel Makefile che provvede a far ciò per me.

    Ogni volta che lancio un ‘make’, epstopdf converte tutte le figure indipendentemente dal fatto che queste siano effettivamente cambiate o meno, è possibile evitarlo?? Io vorrei che epstopdf insista solo sulle figure che sono cambiate, non c’è motivo di riconvertire ogni volta tutte le figure..

    Incollo qui la parte del Makefile interessata:
    `
    FIGURES_EPS = $(shell ls Matlab/*.eps 2>/dev/null)
    FIGURES_EPS_PDF = $(subst eps,pdf,$(FIGURES_EPS))

    all: pdf

    # fa le figure eps->pdf
    %.pdf: %.eps
    @echo “eps -> pdf $<" @epstopdf "$<" @mv Matlab/*.pdf $(TEXDIR)pictures/ pdf: $(BASENAME).pdf $(BASENAME).pdf: $(FIGURES_EPS_PDF) @cd $(TEXDIR); make pdf ` Grazie, Matteo

Visualizzazione 7 filoni di risposte
  • Autore
    Risposte
    • #13479
      Up
      0
      Down
      ::


      Non ho avuto tempo di provare il tuo Makefile, però credo che la tua domanda sia più del genere “come fare un Makefile”. Dovrebbe essere possibile configurare i target dei makefile in modo tale che epstopdf venga chiamato solo se un generico “file.eps” risulta più giovane del corrispondente “file.pdf”. Forse è il tuo makefile che va rivisto.

      O mi sbaglio?

      Ciao e scusa per non averti dato una risposta definitiva

      Daniele

    • #13480
      Up
      0
      Down
      ::


      Hum ok.. forse il problema è proprio il fatto che io sposto i file .pdf dalla directory ./Matlab a ./tex/pictures, di conseguenza make non trova nessun file .pdf e ogni volta lo rifa.

      Non ho nessun motivo per usare la dir ./tex/pictures, se non estetico, visto che vorrei tenere sotto la dir ./tex tutto ciò che riguarda il documento pdf senza “quello che ci sta dietro” come codice matlab, etc

    • #13481
      Up
      0
      Down
      ::


      Ok, ho cambiato il Makefile così
      `PDFFIGURES = $(patsubst %.eps,%.pdf,$(wildcard ./Matlab/*.eps))

      all: pdf

      %.pdf: %.eps
      epstopdf $*.eps > $*.pdf
      @cp Matlab/*.pdf $(TEXDIR)pictures/

      pdf: $(BASENAME).pdf

      $(BASENAME).pdf: $(PDFFIGURES)
      @cd $(TEXDIR); make pdf`

      i file .pdf delle figure sono doppi ma è un buon compromesso (potrei anche solo linkarli), il risultato è ok visto che

      `matteo@burnt:~/documenti/ricerca/quaderno$ make
      epstopdf Matlab/3copule2.eps > Matlab/3copule2.pdf
      epstopdf Matlab/dhistonorm1.eps > Matlab/dhistonorm1.pdf
      epstopdf Matlab/dhistonorm2.eps > Matlab/dhistonorm2.pdf
      epstopdf Matlab/dscatter1.eps > Matlab/dscatter1.pdf
      epstopdf Matlab/dscatter2.eps > Matlab/dscatter2.pdf
      epstopdf Matlab/mhistonorm1.eps > Matlab/mhistonorm1.pdf
      epstopdf Matlab/mhistonorm2.eps > Matlab/mhistonorm2.pdf
      epstopdf Matlab/mprezzi.eps > Matlab/mprezzi.pdf
      epstopdf Matlab/mscatter1.eps > Matlab/mscatter1.pdf
      epstopdf Matlab/mscatter2.eps > Matlab/mscatter2.pdf
      epstopdf Matlab/qqplot2.eps > Matlab/qqplot2.pdf
      epstopdf Matlab/qqplot3.eps > Matlab/qqplot3.pdf
      epstopdf Matlab/rend.eps > Matlab/rend.pdf
      make[1]: Entering directory `/home/matteo/documenti/ricerca/quaderno/tex'
      pdflatex 1
      pdflatex 2
      pdflatex 3
      thumbpdf
      pdflatex 4
      make[1]: Leaving directory `/home/matteo/documenti/ricerca/quaderno/tex'`

      cambio qualcosa nel file .tex
      `
      matteo@burnt:~/documenti/ricerca/quaderno$ make
      make: Nothing to be done for `all'.
      matteo@burnt:~/documenti/ricerca/quaderno$ cd tex/
      matteo@burnt:~/documenti/ricerca/quaderno/tex$ make clean
      rm -f aux/*.aux aux/*.log aux/*.blg aux/*.bbl aux/*.toc aux/*.out aux/*.tpt *.pdf aux/quaderno.pdf *~
      matteo@burnt:~/documenti/ricerca/quaderno/tex$ cd ..
      matteo@burnt:~/documenti/ricerca/quaderno$ make
      make[1]: Entering directory `/home/matteo/documenti/ricerca/quaderno/tex'
      pdflatex 1
      pdflatex 2
      pdflatex 3
      thumbpdf
      pdflatex 4
      make[1]: Leaving directory `/home/matteo/documenti/ricerca/quaderno/tex'
      `

      Ora non mi lancia epstopdf se non ho cambiato i file .eps, però forse c’è qualcosa che non va nel ‘make pdf’, com’è possibile che se cambio il file ./tex/quaderno.tex e lancio ‘make’ mi dice che non c’è da far nulla?? I due Makefile sono “indentati” male?

      Sono alle prime armi con i Makefile ma lo strumento è troppo potente perchè non ci metta le mani sopra

    • #13482
      Up
      0
      Down
      ::


      Sto cercando di scrivere un makefile apposito.

    • #13483
      Up
      0
      Down
      ::


      Io ho ottenuto questo:`TEXDIR := texdir
      # Attenzione! assicurarsi che workfile sia solo uno
      WORKFILE := prova.tex
      OUTPUTFILE := $(patsubst %.tex,%.pdf,$(WORKFILE))
      PDFFIG=$(patsubst %.eps,%.pdf,$(wildcard Matlab/*.eps))

      $(TEXDIR)/$(OUTPUTFILE): $(TEXDIR)/$(WORKFILE) $(PDFFIG)
      @cp Matlab/*.pdf $(TEXDIR)/pictures
      @cd $(TEXDIR); \
      pdflatex $(WORKFILE); \
      pdflatex $(WORKFILE); \
      thumbpdf $(WORKFILE); \
      pdflatex $(WORKFILE)

      %.pdf : %.eps
      epstopdf $< clean: @rm -f Matlab/*.pdf @rm -f $(TEXDIR)/pictures/*.pdf $(TEXDIR)/*.log $(TEXDIR)/*.aux $(TEXDIR)/*.pdf .PHONY: clean`In questa maniera, se non cambia il file .tex o le immagini, non ricompilerà. In compenso, però, puoi indicare solamente un file di input, semmai overridarlo sulla linea di comando:`make WORKFILE=pippo.tex` Ciao.

    • #13484
      Up
      0
      Down
      ::


      e.vavassori mi ha bruciato sul tempo 😳

      Il mio makefile risultava essere

      `EPS_FILES = file_1.eps \
      file_2.eps

      PDF_FILES = ${EPS_FILES:.eps=.pdf}

      all: ${PDF_FILES}

      %.pdf: %.eps
      epstopdf $< clean: rm ${PDF_FILES} ` che è sostanzialmente la seconda parte del suo makefile. Stavo appunto cercando di trovare un modo per sosituire la lista EPS_FILES con qualcosa tipo "ls *.eps". Ciao Daniele

    • #13485
      Up
      0
      Down
      ::


      Trovato di più:`TEXDIR := texdir
      # Attenzione! assicurarsi che workfile sia solo uno
      WORKFILES = $(wildcard $(TEXDIR)/*.tex)
      OUTPUTFILES = $(patsubst %.tex,%.pdf,$(WORKFILES))
      PDFFIG=$(patsubst %.eps,%.pdf,$(wildcard Matlab/*.eps))

      default: $(PDFFIG) $(OUTPUTFILES)

      $(TEXDIR)/%.pdf: $(TEXDIR)/%.tex
      @cp Matlab/*.pdf $(TEXDIR)/pictures
      @cd $(TEXDIR); \
      pdflatex $(notdir $<); \ pdflatex $(notdir $<); \ thumbpdf $(basename $(notdir $<)); \ pdflatex $(notdir $<) %.pdf : %.eps epstopdf $< clean: @rm -f Matlab/*.pdf @rm -f $(TEXDIR)/pictures/*.pdf $(TEXDIR)/*.log $(TEXDIR)/*.aux $(TEXDIR)/*.pdf .PHONY: default clean`In questa maniera, tutti i files .tex nella dir $(TEXDIR) sono processati con la sequenza di comandi riportata. Non sono proprio sicuro del funzionamento di thumbpdf, ma non lo uso spesso quindi... Inoltre, i files pdf vengono copiati in $(TEXDIR)/pictures tante volte quanti sono i files .tex... Ciao.

    • #13486
      Up
      0
      Down
      ::


      Grazie a entrambi, prendendo un po’ di qua e un po’ di la, dati i miei vincoli, la soluzione che mi piace di più è:


      PDFFIGURES = $(patsubst %.eps,%.pdf,$(wildcard ./Matlab/*.eps))

      %.pdf: %.eps
      epstopdf $*.eps > $*.pdf
      @cp Matlab/*.pdf $(TEXDIR)pictures/

      all: pdf

      pdf: $(BASENAME).pdf

      $(BASENAME).pdf: $(PDFFIGURES) $(TEXDIR)/$(BASENAME).tex
      @$(MAKE) -C $(TEXDIR)

      questo mi permette di preservare in $(TEXDIR) tutti i sorgenti utili a compilare il documento finale in pdf (.tex, figure in .pdf e Makefile), cosicchè con una ulteriore regolina nel Makefile principale posso anche ottenere uno zip snello distribuibile (senza la dir di Matlab, etc).

      Le figure .eps sono convertite in .pdf solo quando serve, inoltre il Makefile principale si accorge di cambiamenti in $(TEXDIR)/$(BASENAME).tex e quindi dalla root del progetto posso rifare il pdf ad ogni cambiamento del sorgente .tex. Il fatto che il file .tex debba essere uno solo non è una limitazione per me in quando i vari capitoli sono inseriti nel .tex principale tramite \input.

      Grazie ancora a tutti!

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

Go to top