Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 18-11-2012 10:28:29

Thuban
Modérateur
Distrib. : OpenBSD
Noyau : current
(G)UI : xfce ou dwm
Inscription : 09-01-2009
Site Web

Aperçus LaTeX pendant l'écriture.

Je viens de finir d'écrire un script permettant d'afficher au fur et à mesure de la composition d'un document LaTeX, son rendu (un peu comme le fait gummi).
Comme d'habitude, je le soumet à vos critiques.

Pour ceux que ça intéresse, je suis tombé sur ça pendant mes recherches : https://bbs.archlinux.org/viewtopic.php?id=107164 (cependant, il laisse moins de liberté à l'utilisateur).

Vous pouvez modifier l'éditeur, ainsi que la commande servant à compiler le .tex, le visionneur et la commande pour le recharger grâce aux variables en début de script. Par défaut, c'est vim+latex+xdvi .


#!/bin/sh
# Auteur : thuban (thuban@singularity.fr)
# licence : GNU General Public Licence
#
# Script permettant d'afficher régulièrement le rendu d'un document LaTeX.
# Utilisation :
# autoTexPrev.sh titre_du_document

# Variables à éditer :
EDITEUR="x-terminal-emulator -e vim"  # Votre éditeur favori pour écrire du LaTeX
                                      # (urxvt -e ed, gvim, ...)
#COMPILPROG="pdflatex -interaction nonstopmode -no-file-line-error"  
COMPILPROG="pdflatex \
            -interaction nonstopmode \
            -no-file-line-error"      # Le compilateur de sources latex.
                                      # (latex, pdflatex...)
                                      # Attention à ne pas mettre de commande bloquante
                                      # Si un fichier Makefile est présent, alors la commande
                                      # make sera utilisée.
#VIEWER="mupdf"
VIEWER="mupdf"                         # Le programme qui affiche le document compilé.
                                      # (xdvi, mupdf, gv...)
#EXTENSION=".pdf"
EXTENSION=".pdf"                      # Extension du document compilé (.dvi, .pdf, .ps, ...)

RELOAD="xdotool search --class mupdf key --window %@ r > /dev/null 2>&1"
#RELOAD="pkill -USR1 xdvi"             # Command à lancer pour recharger le fichier.
                                      # Laisser vide si pas besoin.
                                      # exemple pour mupdf : xdotool search --class mupdf key --window %@ r > /dev/null 2>&1


reload() {
    if [ -n "$RELOAD" ]; then
        echo "On recharge ! "
        eval $RELOAD
    fi
}

verification () {
    FILE="$1"
    if [ -z "$FILE" ]; then
        echo "Nom du document non précisé..."
        exit 1
    fi

    FILENAME=$(basename "$FILE")
    EXT="${FILENAME##*.}"
    if [ "$EXT" != "tex" ]; then
        echo "Extension invalide"
        echo "Le nom du fichier doit se terminer par .tex"
        exit 1
    fi
    DIRNAME=$(dirname "$FILE")
}

preview () {
    PID=$1
    FILENAME=$2
    VIEWERPID=0
    NEWDIFF=0
    PREVDIFF=0
    while [ -n "$(ps --no-headers -o comm= -p $PID)" ]; do
        if [ -f $FILENAME ]; then
            PREVDIFF=$NEWDIFF
            NEWDIFF=$(stat --format=%Y "$FILENAME")
        fi
        if [ $NEWDIFF -ne $PREVDIFF ]; then
            echo "On compile..."
            if [ -f "Makefile" ]; then
                make
            else
                $COMPILPROG $FILENAME >/dev/null 2>&1
            fi
            if [ $? -eq 0 ]; then
                echo "Compilation réussie"
                reload
                if [ $VIEWERPID -eq 0 ]; then
                    echo "Lancement du visionneur"
                    $VIEWER "${FILENAME%.*}$EXTENSION" &
                    VIEWERPID=$!
                fi
            fi
        fi
        sleep 1
    done
    kill $VIEWERPID
}

verification "$1"
cd "$DIRNAME"
$EDITEUR "$FILENAME" &
PID=$!
preview $PID "$FILENAME"
kill $PID
exit 0





 



Pour les utilisateurs de vim :
Vous pouvez automatiquement enregistrer votre fichier toutes les n secondes en ajoutant ces lignes à votre ~/.vimrc


" Pour la sauvegarde automatique
au BufRead,BufNewFile *.tex let b:start_time=localtime()
au CursorHold *.tex call UpdateFile()
au CursorHoldI *.tex call UpdateFile()
au BufWritePre *.tex let b:start_time=localtime()

" only write if needed and update the start time after the save
function! UpdateFile()
    if ((localtime() - b:start_time) >= 1 )
    update
    let b:start_time=localtime()
    echo "Only " . (localtime() - b:start_time) . " seconds have elapsed so far."
  endif
endfunction
 

Dernière modification par Thuban (18-11-2012 12:41:04)


YA3HGA-H

Hors ligne

#2 18-11-2012 11:39:22

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Sid/Rc-Buggy
Noyau : Linux (≥ 4.3)
(G)UI : i3-wm (≥ 4.11)
Inscription : 07-07-2008
Site Web

Re : Aperçus LaTeX pendant l'écriture.

Mhh… pas mal.

Par contre, plutôt que de placer les lignes de commandes dans ton .sh, je ferai simplement appel à un Makefile
- make # pour compiler et générer le pdf
- make update # pour actualiser la fenêtre du viewer

Je n'aime pas l'idée de recompiler de manière automatique. En général, un document LaTeX est lourd, et une simple accolade manquante fait planter toute la compilation. Donc la partie utilisateurs de vim, bof.

Pour ma part, j'ai juste un Makefile standard :

PDFLATEX=pdflatex -output-directory .build-latex
BIBTEX=bibtex

%.pdf: %.tex
        @mkdir -p .build-latex
ifndef $(ONEPASS)
        $(PDFLATEX) $(@:%.pdf=%.tex)
endif
        $(BIBTEX) $(@:%.pdf=.build-latex/%) || true
        $(PDFLATEX) $(@:%.pdf=%.tex)
        @ln -f .build-latex/$@ ./

clean-latex:
        @echo -n 'Cleaning latex build files…'
        @rm -fr .build-latex
        @echo ' [done]'

# vim:set ft=make:



Que je range dans ~/.local/share/make/pdflatex.mk

Et lorsque j'ai un nouveau .tex en cours d'édition, je fais le Makefile suivant :

.PHONY: all clean cleanall

TEXSRC=manuscrit.tex
PDFS=$(TEXSRC:%.tex=%.pdf)
#ONEPASS=true

all: $(PDFS)

include ~/.local/share/make/pdflatex.mk

clean: clean-latex

cleanall: clean
        rm -f $(PDFS)
 



Pour la recompilation, j'ai un raccourci dans vim sur la lettre ù :

:map ù <esc>:!make blabla.pdf<cr>



Et pour recharger un pdf, avec xpdf, il suffit d'appuyer sur la touche « r ».

Ce qui donne pour l'utilisation...

  1. escape :w entrée

  2. ù

  3. r



Mais au moins je contrôle les compilations et je n'oublie pas d'erreur à cause du mode non-interactif.


captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#3 18-11-2012 12:40:19

Thuban
Modérateur
Distrib. : OpenBSD
Noyau : current
(G)UI : xfce ou dwm
Inscription : 09-01-2009
Site Web

Re : Aperçus LaTeX pendant l'écriture.

C'est chouette tout ça! Surtout qu'en plus je viens de rajouter 2 lignes, qui font que la compilation utilise juste make lorsqu'un Makefile est présent. (faut que j'édite le post précédent).

Parlant du Makefile justement, ça fait plus d'une heure que j'essaie d'en faire un qui compilerait directement un fichier tex, sans avoir à préciser son nom dans le Makefile (histoire que ça soit plus générique...) . Tes exemples vont peut-être m'être utile smile

Pour la compilation, en cas d'erreur, le script ne recharge pas l'aperçu. Du coup, on se rend vite compte qu'il y a un problème quelque part, puisque plus rien ne change.
Et comme avec dwm, j'ai toujours la console à côté, je peux vite fait jeter un oeil pour voir le résultat de la compilation.

Dernière modification par Thuban (18-11-2012 13:04:20)


YA3HGA-H

Hors ligne

#4 18-11-2012 12:56:15

Thuban
Modérateur
Distrib. : OpenBSD
Noyau : current
(G)UI : xfce ou dwm
Inscription : 09-01-2009
Site Web

Re : Aperçus LaTeX pendant l'écriture.

Merci beaucoup à toi, j'ai enfin un Makefile fonctionnel grâce à toi :


PDFLATEX=pdflatex -output-directory .build-latex
BIBTEX=bibtex

TEXTSRC=$(wildcard *.tex)
PDFS=$(TEXTSRC:%.tex=%.pdf)

all: $(PDFS)
  @echo $(PDFS)

%.pdf: %.tex
  @mkdir -p .build-latex

ifndef $(ONEPASS)
  $(PDFLATEX) $(@:%.pdf=%.tex)
endif
  $(BIBTEX) $(@:%.pdf=.build-latex/%) || true
  $(PDFLATEX) $(@:%.pdf=%.tex)
  @ln -f .build-latex/$@ ./

clean:
  @echo -n 'Cleaning latex build files...'
  @rm -fr .build-latex
  @echo ' [done]'

.PHONY: all clean cleanall


cleanall: clean
  rm -f $(PDFS)

 


YA3HGA-H

Hors ligne

#5 18-11-2012 13:05:51

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Sid/Rc-Buggy
Noyau : Linux (≥ 4.3)
(G)UI : i3-wm (≥ 4.11)
Inscription : 07-07-2008
Site Web

Re : Aperçus LaTeX pendant l'écriture.

yep, le wildcard et le "( :% =% )". Je ne l'utilise pas par défaut parce que parfois, mon .tex fait des « \input » d'autres .tex (ie. je découpe un .tex en plusieurs morceaux) Et dans ce cas, je ne veux pas que tous les .tex soient compilés, mais juste le fichier principal.

captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#6 18-11-2012 15:34:41

Thuban
Modérateur
Distrib. : OpenBSD
Noyau : current
(G)UI : xfce ou dwm
Inscription : 09-01-2009
Site Web

Re : Aperçus LaTeX pendant l'écriture.

Ah oui je comprend. Mais comme j'ai l'habitude de mettre les "sous-documents" dans un dossier à part, je n'ai pas ce souci là.

Dernière modification par Thuban (18-11-2012 15:34:50)


YA3HGA-H

Hors ligne

#7 19-11-2012 20:30:30

Thuban
Modérateur
Distrib. : OpenBSD
Noyau : current
(G)UI : xfce ou dwm
Inscription : 09-01-2009
Site Web

Re : Aperçus LaTeX pendant l'écriture.

J'ai modifié le makefile pour ne pas utiliser pdflatex, qui ne passe pas toujours très bien apparement.



#PDFLATEX=pdflatex -interaction nonstopmode -no-file-line-error
#PDFLATEX=rubber -f --pdf -s
LATEX=latex --interaction=nonstopmode
DVIPS=dvips -Ppdf
PSPDF=ps2pdf
BIBTEX=bibtex

TEXTSRC=$(wildcard *.tex)
PDFS=$(TEXTSRC:%.tex=%.pdf)
DVIS=$(TEXTSRC:%.tex=%.dvi)
PSS=$(TEXTSRC:%.tex=%.ps)

all: $(PDFS)
  @echo $(PDFS)

%.pdf: %.tex $(DEPENDS)
  $(LATEX) $(TEXTSRC)
  $(DVIPS) $(DVIS)
  $(PSPDF) $(PSS)

# $(PDFLATEX) $(@:%.pdf=%.tex)
# rubber -f --pdf -s $<
# rubber-info --check $<

clean:
  @echo -n 'Cleaning latex build files...'
  rm -f *.aux *.log *.toc *.out *.nav
  @echo ' [done]'

.PHONY: all clean cleanall


cleanall: clean
  rm -f $(PDFS) $(DVIS) $(PSS)
  rm -rf *.aux *.bbl *.blg *.log *.pdf *.toc *.snm *.out *.nav
 

Dernière modification par Thuban (19-11-2012 20:34:29)


YA3HGA-H

Hors ligne

#8 19-11-2012 20:54:56

captnfab
Admin-Girafe
Lieu : /dev/random
Distrib. : Debian Stretch/Sid/Rc-Buggy
Noyau : Linux (≥ 4.3)
(G)UI : i3-wm (≥ 4.11)
Inscription : 07-07-2008
Site Web

Re : Aperçus LaTeX pendant l'écriture.

Mhh, en règle général, pdflatex est préférable à latex + dvi2ps + ps2pdf

La contrainte est de ne pas include de fichier postscript mais plutôt des .png et des .pdf

Je te conseille fortement d'utiliser l'option « -output-directory dossier-temporaire » qui permet de séparer les fichiers .tex des fichiers construits pendant le build. Ça fait plus propre quoi…

captnfab,
Association Debian-Facile, bépo.
TheDoctor: Your wish is my command… But be careful what you wish for.

Hors ligne

#9 19-11-2012 21:16:25

Thuban
Modérateur
Distrib. : OpenBSD
Noyau : current
(G)UI : xfce ou dwm
Inscription : 09-01-2009
Site Web

Re : Aperçus LaTeX pendant l'écriture.

Ben en fait, ça dépend de ce que je lis. Certains préconisent latex + dvips +ps2pdf et d'autres comme toi pdflatex. Et je manque d'expérience pour être très sûr de moi.

Merci pour tes conseils, comme je le disais à l'instant, je manque d'expérience, le LaTeX est nouveau pour moi.

YA3HGA-H

Hors ligne

Pied de page des forums