[LaTeX] Aperçus automatiques

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 : 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 .

Ah, et si un fichier Makefile est présent, alors c’est la commande make qui sera lancée pour la compilation :

#!/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="latex \
            -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="xdvi"                         # Le programme qui affiche le document compilé.
                                      # (xdvi, mupdf, gv...)
#EXTENSION=".pdf"
EXTENSION=".dvi"                      # 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 
            fi
            if [ $? -eq 0 ]; then
                echo "Compilation réussie"
                reload
                if [ $VIEWERPID -eq 0 ]; then
                    echo "Lancement du visionneur"
                    $VIEWER "${FILENAME%.*}$EXTENSION" &
                    VIEWERPID=$!
                fi
            else
                echo "[ERREUR] Compilation échouée"
            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

Après quelques temps que je me dis que je dois répondre il faut bien le faire. J’ai regardé de manière très succincte ton script (rien vu de choquant).

J’ai utilisé à mon avis des solutions plus simple que les tiennes (mais probablement moins flexibles).

Avant j’avais un makefile pour compiler et après chaque compilation il lancait xpdf ainsi :

ce dernier avait déjà était lancé ainsi (mais c’est peut être inutile) :

Maintenant je fais plus simple encore, j’ouvre mes pdf avec evince et il recharge de manière automatique les pdf, donc il suffit que dans vim je lance :

Pour que ça compile le document et mette à jour la visualisation.

Oui, ça s’adapte, tout dépend en fait des logiciels utilisés par chacun, c’est pour ça que j’ai laissé les variables pour ça au début du script.

Tes précisions serviront bien à quelqu’un :slightly_smiling:

(c’est bon de te lire!)