#!/bin/bash ############################################################################### # # # ShLaTeX # # # ############################################################################### # # # Auteur: Mael Hilléreau # # Mél : mael.hillereau@free.fr # # Web : http://mael.hillereau.free.fr # # Création : 06/03/2003 # # Dernière modif.: 21/08/2003 # # Version: 1.2b-fr # # Description: Script de compilation LaTeX pour Linux # # # ############################################################################### # # # ShLaTeX -- Script de compilation LaTeX pour Linux. # # Copyright (C) 2003 Mael Hilléreau # # # # This program is free software; you can redistribute it and/or # # modify it under the terms of the GNU General Public License # # as published by the Free Software Foundation; either version 2 # # of the License, or (at your option) any later version. # # # # This program is distributed in the hope that it will be useful, # # but WITHOUT ANY WARRANTY; without even the implied warranty of # # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # # GNU General Public License for more details. # # # # You should have received a copy of the GNU General Public License # # along with this program; if not, write to the Free Software # # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # # ############################################################################### nomshell=`expr match "$0" '.*/\([^-\]*\).*'`; version="1.2b-fr"; ## envoi du code de retour approprié function fin() { echo -ne "terminé.\n\n"; if [ $errindex -eq 1 ] then exit 3; else if [ $errbib -eq 1 ] then exit 2; else if [ $errcompil -eq 1 ] then exit 1; else exit 0; fi fi fi } ## suppression des temporaires function suppressionTemp() { if [ $tmp -eq 0 ] then echo "suppression des temporaires latex..."; rm -fr ./"$f".ShLaTeX fi } ## fct de rappel pour CTRL^C function ctrlc() { echo -ne "\n> Annulation !\n"; if [ ! "$f" == "-" ] then repCourant=`pwd`; repCourant=`expr match "$repCourant" '.*/\(.*\)'` if [ "$repCourant" == "$f".ShLaTeX ] then cd ..; fi suppressionTemp; fi fin; } ## déclaration des variables globales # nom du fichier f="-"; # codes d'erreur errindex=0; errcompil=0; errbib=0; # options préférencielles P_dvipdf=-1; P_pdflatex=-1; P_dvips=-1; P_pstopdf=-1; P_dvi=-1; P_idx=-1; P_no_idx=-1; P_idx_file="-"; P_bib=-1; P_no_bib=-1; P_bib_file="-"; P_toc=-1; P_no_toc=-1; P_tmp=-1; P_no_tmp=-1; P_z=-1; P_no_z=-1; P_un=-1; P_deux=-1; P_quatre=-1; P_sep=-1; P_no_sep=-1; P_m=-1; P_no_m=-1; P_view=-1; P_no_view=-1; P_sept=-1; P_huit=-1; P_v_ps="-"; P_v_pdf="-"; P_v_dvi="-"; # options de la ligne de commande L_dvipdf=-1; L_pdflatex=-1; L_dvips=-1; L_pstopdf=-1; L_dvi=-1; L_idx=-1; L_no_idx=-1; L_idx_file="-"; L_bib=-1; L_no_bib=-1; L_bib_file="-"; L_toc=-1; L_no_toc=-1; L_tmp=-1; L_no_tmp=-1; L_z=-1; L_no_z=-1; L_un=-1; L_deux=-1; L_quatre=-1; L_sep=-1; L_no_sep=-1; L_m=-1; L_no_m=-1; L_view=-1; L_no_view=-1; L_sept=-1; L_huit=-1; L_v_ps="-"; L_v_pdf="-"; L_v_dvi="-"; ## options d'éxécution mode="dvi"; idx=0; idx_file="-"; bib=0; bib_file="-"; toc=1; tmp=0; z=0; ppf=1; sep=0; m=0; view=1; ascii=7; v_ps="gv"; v_pdf="gv"; v_dvi="xdvi"; ## capture des CTRL^C trap "ctrlc" SIGINT ## affiche une aide rapide function aideRapide() { echo -ne "> Utilisation :\n"; echo -ne "\n"; echo -ne " $nomshell [options] \n"; echo -ne "\n"; echo -ne " tapez \"man shlatex\" ou \"$nomshell -?\" pour une aide complète.\n"; echo -ne "\n"; } ## affiche une aide complète function aideComplete() { echo ".TH \\fBShLaTeX\\fP 1 \"Août 2003\" \"version 1.2b-fr\" \"Manuel d'utilisation\" .SH NOM \\fBShLaTeX\\fP \\- Script de compilation pour documents écrits en langage LaTeX. .SH SYNOPSIS \\fBShLaTeX\\fP [options] \\fIfichierSource.tex\\fP .SH DESCRIPTION .PP Ce script permet de centraliser les nombreux appels de commandes nécessaires à la compilation complète d'un document LaTeX. Notamment, les appels multiples à la commande \\fBlatex\\fP indispensables pour créer une table des matières, une bibliographie ou un index sont effectués automatiquement. Sont également gérés les appels aux programmes \\fBbibtex\\fP et \\fBmakeindex\\fP ainsi que la visualisation du fichier résultat (au format DVI, PostScript ou PDF) par appel à un programme externe. .PP Il est possible de compiler les documents qui utilisent les commandes \\fB\\\\input\\fP et \\fB\\\\include\\fP pour faire référence à des fichiers externes et cela de façon transparente en ne compilant que le fichier source principal. .PP Une fois la compilation effectuée les fichiers temporaires sont effacés (option \\fB-no-tmp\\fP) ou conservés (option \\fB-tmp\\fP). Les fichiers DVI générés par LaTeX peuvent alors être directement convertis au format PostScript ou PDF. .PP Ce script prend aussi en charge l'accentuation des caractères français par l'intermédiaire d'un programme C externe (nommé \\fBtex8to7\\fP) et fourni avec le script (la gestion des accents est donc transparente). Il gère aussi le \"c\" cédille ainsi que le remplacement des guillemets par les commandes \\fB\\\\og\\fP et \\fB\\\\fg\\fP (cela suppose que les guillemets soient appariés). Les guillemets peuvent être impriqués en utilisant des accolades pour distinguer les différentes paires de guillemets. Par exemple, le texte : .PP Les guillemets \"peuvent être {\"imbriqués\"} à l'aide d'accolades\". .PP est un exemple correct. .PP Les options par défaut (préférences) sont stockées dans le répertoire personnel de l'utilisateur dans le fichier \\fB~/.shlatex\\fP. Voir la section FICHIERS pour connaître la syntaxe de ce fichier. .SH OPTIONS .IP \"\\fB\\-dvipdf\\fP\" Sélectionne un format PDF au lieu du format DVI pour le fichier résultat. Le programme \\fBdvipdf\\fP est alors utilisé pour la conversion. .IP \"\\fB\\-pdflatex\\fP\" Sélectionne un format PDF au lieu du format DVI pour le fichier résultat. Le programme \\fBpdflatex\\fP est alors directement utilisé pour créer le fichier résultat. .IP \"\\fB-dvips\\fP\" Sélectionne un format PostScript au lieu du format DVI pour le fichier résultat. Le programme \\fBdvips\\fP est alors utilisé pour la conversion. .IP \"\\fB-ps2pdf\\fP\" Sélectionne un format PDF au lieu du format PostScript pour le fichier résultat. Utilise l'option \\fB-dvips\\fP. Les programmes \\fBdvips\\fP et \\fBps2pdf\\fP sont successivement utilisés pour la conversion et le fichier PostScript est conservé après la conversion. .IP \"\\fB-dvi\\fP\" Sélectionne un format DVI pour le fichier résultat. .IP \"\\fB-idx\\fP \\fI[style.ist]\\fP ou \\fB--index\\fP \\fI[style.ist]\\fP\" Active la création de l'index (pour une utilisation avec le module \\fImakeidx\\fP). Le fichier optionnel \\fIstyle.ist\\fP est un fichier de style pour \\fBmakeindex\\fP. .IP \"\\fB-no-idx\\fP ou \\fB--no-index\\fP\" Désactive la création de l'index. .IP \"\\fB-bib\\fP \\fI[fichier.bib]\\fP ou \\fB--bibliography\\fP \\fI[fichier.bib]\\fP\" Active la création de la bibliographie avec \\fBbibtex\\fP en se basant sur \\fIfichier.bib\\fP. Si aucun fichier n'est indiqué, le fichier d'extension \".bib\" doit porter le même nom que \\fIfichierSource\\fP.tex. .IP \"\\fB-no-bib\\fP ou \\fB--no-bibliography\\fP\" Désactive la création de la bibliographie. .IP \"\\fB-toc\\fP ou \\fB--table-of-contents\\fP\" Active la compilation supplémentaire pour la construction d'une table des matières, une table des figures, une liste des tableaux et toutes les références LaTeX (commande \\fB\\label{...}\\fP). .IP \"\\fB-no-toc\\fP ou \\fB--no-table-of-contents\\fP\" Désactive la compilation supplémentaire pour la construction d'une table des matières, une table des figures, une liste des tableaux et toutes les références LaTeX (commande \\fB\\label{...}\\fP). .IP \"\\fB-tmp\\fP ou \\fB--temporary\\fP\" Conserve après l'ecécution du script les fichiers temporaires créés par LaTeX. Ces fichiers sont ainsi stockés dans un répertoire nommé \\fIfichierSource.ShLaTeX\\fP. .IP \"\\fB-no-tmp\\fP ou \\fB--no-temporary\\fP\" Supprime après l'ecécution du script les fichiers temporaires créés par LaTeX. .IP \"\\fB-z\\fP ou \\fB--gzip\\fP\" Compresse les fichiers PostScript avec le programme \\fBgzip\\fP. Les fichiers prennent alors l'extension \".ps.gz\". .IP \"\\fB-no-z\\fP ou \\fB--no-gzip\\fP\" Désactive la compression des fichiers PostScript avec le programme \\fBgzip\\fP. .IP \"\\fB-1\\fP ou \\fB--1page\\fP\" Génère des fichiers PostScript ayant 1 page a4 par feuille a4. .IP \"\\fB-2\\fP ou \\fB--2pages\\fP\" Génère des fichiers PostScript ayant 2 pages a5 par feuille a4. .IP \"\\fB-4\\fP ou \\fB--4pages\\fP\" Génère des fichiers PostScript ayant 4 pages a6 par feuille a4. .IP \"\\fB-sep\\fP ou \\fB--separator\\fP\" S'utilise avec l'option \\fB-2\\fP ou \\fB-4\\fP. Permet de tracer une ligne séparatrice entre les différentes pages d'une même feuille. .IP \"\\fB-no-sep\\fP ou \\fB--no-separator\\fP\" S'utilise avec l'option \\fB-2\\fP ou \\fB-4\\fP. Permet de désactiver le tracé de la ligne séparatrice entre les différentes pages d'une même feuille. .IP \"\\fB-m\\fP ou \\fB--messages\\fP\" Affiche systématiquement les messages de LaTeX dans la console (voir aussi la section ERREURS DE COMPILATION). .IP \"\\fB-no-m\\fP ou \\fB--no-messages\\fP\" Si cette option est utilisée, les messages de LaTeX n'apparaissent qu'en cas d'erreur (voir aussi la section ERREURS DE COMPILATION). .IP \"\\fB-view\\fP ou \\fB--viewer\\fP\" Active la visualisation finale. .IP \"\\fB-no-view\\fP ou \\fB--no-viewer\\fP\" Désactive la visualisation finale. .IP \"\\fB-7\\fP ou \\fB--7bits\\fP\" Désactive l'accentuation du fichier source LaTeX. Le fichier source doit être un fichier ascii codé sur 7 bits. .IP \"\\fB-8\\fP ou \\fB--8bits\\fP\" Active l'accentuation du fichier source LaTeX. Le fichier source peut être un fichier ascii codé sur 8 bits. .IP \"\\fB-v-ps\\fP \\fIvisionneur\\fP ou \\fB--view-ps-with\\fP \\fIvisionneur\\fP\" Utilise le programme \\fIvisionneur\\fP pour la visualisation finale des fichiers PostScript. .IP \"\\fB-v-pdf\\fP \\fIvisionneur\\fP ou \\fB--view-pdf-with\\fP \\fIvisionneur\\fP\" Utilise le programme \\fIvisionneur\\fP pour la visualisation finale des fichiers PDF. .IP \"\\fB-v-dvi\\fP \\fIvisionneur\\fP ou \\fB--view-dvi-with\\fP \\fIvisionneur\\fP\" Utilise le programme \\fIvisionneur\\fP pour la visualisation finale des fichiers DVI. .IP \"\\fB-v\\fP ou \\fB--version\\fP\" Affiche la version et quitte. .IP \"\\fB-?\\fP, \\fB-h\\fP ou \\fB--help\\fP\" Affiche l'aide. .IP \"\\fINote\\fP :\" Lors de l'utilisation de l'option \\fB\\-view\\fP, le format de fichier choisi en sortie (DVI, PostScript ou PDF) doit être lisible par le programme \\fIvisionneur\\fP pour que la visualisation fonctionne correctement. Par défaut, les programme utilisés sont \\fBxdvi\\fP pour les fichiers DVI et \\fBgv\\fP pour les fichiers PostScript et PDF. .SH \"ERREURS DE COMPILATION\" .PP Si l'option \\fB-no-m\\fP est utilisée, en cas d'erreur de compilation par LaTeX, le script ne répond plus. On peut l'arrêter en tapant les options de la ligne de commande (\"x\" pour ignorer, \"q\" pour quitter, ...) en aveugle, ou en tapant \"Ctrl^C\". Dans les deux cas, les erreurs seront affichées juste après. Cette imperfection est due au choix de ne pas afficher les messages du programme \\fBlatex\\fP par défaut. Cependant, le problème n'existe que si le mode d'interaction autorise LaTeX à s'arrêter sur les erreurs (ce qui n'est pas le cas, par exemple si la commande \\fB\\\\nonstopmode\\fP est utilisée). .PP Dans tous les cas, il est possible de forcer l'affichage des messages de \\fBlatex\\fP en utilisant l'option \\fB-m\\fP à la place de l'option \\fB-no-m\\fP. .SH \"FICHIERS\" .PP Le fichier \\fB~/.shlatex\\fP contient les préférences de l'utilisateur. Il peut être modifié afin d'utiliser des valeurs par défaut personnalisées pour les options du script, mais la syntaxe du fichier doit être respectée : .PP Chaque ligne du fichier doit contenir une et une seule option. Les options sont toutes permises à l'exeption de \\fB-v\\fP et \\fB-?\\fP qui n'auraient pas leur place dans le fichier de préférences. Pour les options qui admettent des paramètres, comme dans le shell, ils seront placés après leur option respective mais devront en être séparés par un seul caractère d'espacement ('\\ '). L'ordre des options n'importe pas. .PP Dans le cas où des incohérences apparaîtraient lors de l'exécution du script, des avertissements seront affichés. .PP Si lors de la première exécution du script, le fichier \\fB~/.shlatex\\fP n'existe pas, alors il sera créé automatiquement avec le contenu suivant : .RS 5 .IP \"-dvips\" .IP \"-view\" .IP \"-no-idx\" .IP \"-no-bib\" .IP \"-toc\" .IP \"-no-tmp\" .IP \"-no-z\" .IP \"-1\" .IP \"-no-sep\" .IP \"-no-m\" .IP \"-8\" .IP \"-v-ps gv\" .IP \"-v-pdf gv\" .IP \"-v-dvi xdvi\" .SH \"PROBLÈMES CONNUS\" .SS \"BoundingBox\" .PP Lorsque l'on insère une image avec la commande \\fB\\\\includegraphics\\fP, il faut spécifier la \"boundingbox\" en argument de la commande, sinon la compilation ne fonctionne pas. Voici un exemple : .PP \\\\includegraphics[bb=0 0 100 200]{image.eps} .SS \"Fichiers externes\" Pour que l'inclusion de fichiers externes fonctionne correctement, les commandes \\fB\\\\input\\fP et \\fB\\\\include\\fP doivent être placées sur des lignes indépendantes du fichier \\fIfichierSource.tex\\fP. .SH \"VOIR AUSSI\" .BR latex (1), .BR pdflatex (1), .BR dvips (1), .BR ps2pdf (1), .BR dvipdf (1), .BR xdvi (1), .BR gv (1), .BR gzip (1) .SH \"BOGUES\" .PP Merci de signaler les bogues en envoyant un mél à l'adresse de la section AUTEUR. .SH \"LICENCE\" .PP Ce script et l'ensemble des fichiers qui lui sont relatifs (dont ce manuel) sont soumis aux termes de la Licence Publique Générale GNU. La GPL GNU est fournie avec le script (fichier /usr/share/shlatex/GPL.TXT) et est également disponible à l'adresse http://www.gnu.org/licenses/gpl.html. .SH \"AUTEUR\" .PP Copyright (C) 2003 Mael Hilléreau .PP \\fIcontact\\fP : mael.hillereau@free.fr .PP \\fIweb\\fP : http://mael.hillereau.free.fr " > ~/ShLaTeX_"$version".tmp; man ~/ShLaTeX_"$version".tmp rm -f ~/ShLaTeX_"$version".tmp } ## affiche un message d'erreur function erreur() { echo -ne "\n"; echo -ne "> Erreur :\n"; echo -ne " $1\n"; echo -ne "\n"; if [ $# -eq 2 ] then if [ $2 == "-?" ] then aideRapide; fi fi } ## affiche un message d'avertissement function avertissement() { echo -ne "\n"; echo -ne "> Avertissement :\n"; echo -ne " $1\n"; echo -ne "\n"; } ## affiche la version et sort function version() { echo -ne "$nomshell version $version - Script de compilation LaTeX pour Linux.\nCopyright (C) 2003 Mael Hilléreau\n"; exit 0; } ## recherche les fichiers externes (1 seul par ligne dans le source LaTeX !) function fichiersExternes() { fExt=""; lignes=`grep -e "^[ |\t]*\input{" $1`; lignes=`echo $lignes | grep -v -E "^[ |\t]*%.*"` for l in $lignes do fExt="$fExt `expr match $l '.*\input{\(.*\)}'`"; done lignes=`grep -e "^[ |\t]*\include{" $1`; lignes=`echo $lignes | grep -v -E "^[ |\t]*%.*"` for l in $lignes do fExt="$fExt `expr match $l '.*\include{\(.*\)}'`"; done lignes=`grep -e "^[ |\t]*\in\(put\|clude\) " $1`; lignes=`echo $lignes | grep -v -E "^[ |\t]*%.*"` for l in $lignes do if [ ! $l == "\input" -a ! $l == "\include" ] then fExt="$fExt $l"; fi done fTemp=""; for l in $fExt do cTemp=`expr match $l '[ |\t]*\(.*\)\.tex'`; if [[ $cTemp == "" ]] then fTemp="$fTemp $l"; else fTemp="$fTemp $cTemp"; fi done fExt=$fTemp; } ## remplace les fichiers externes nommés $1 par $2 dans le fichier $3 function rplcExtFich() { if [ -f $3 ] then lignes=`cat $3 | grep -n "\input $1" | tr " " "@"`; lignes="`cat $3 | grep -n \input{$1}` $lignes"; for ligne in $lignes do ligne=`echo $ligne | tr "@" " "`; nblignes=`wc -l $3 | tr -s " " ":" | cut -f 2 -d ":"`; nligne=`echo $ligne | cut -f 1 -d ":"`; nligne=`expr $nligne - 1`; fin=`expr $nblignes - $nligne - 1`; head -$nligne "$3" > "$3".tmp echo "\input{$2}" >> "$3.tmp" tail -n $fin "$3" >> "$3".tmp mv -f "$3".tmp "$3" done lignes=`cat $3 | grep -n "\include $1" | tr " " "@"`; lignes="`cat $3 | grep -n \include{$1}` $lignes"; for ligne in $lignes do ligne=`echo $ligne | tr "@" " "`; nblignes=`wc -l $3 | tr -s " " ":" | cut -f 2 -d ":"`; nligne=`echo $ligne | cut -f 1 -d ":"`; nligne=`expr $nligne - 1`; fin=`expr $nblignes - $nligne - 1`; head -$nligne "$3" > "$3".tmp echo "\include{$2}" >> "$3.tmp" tail -n $fin "$3" >> "$3".tmp mv -f "$3".tmp "$3" done fi } ## vérifie que le fichier fourni est accessible et éxécutable function estExec() { for rep in `echo $PATH | tr ":" " "` do if [ -x $rep/$1 ] then return 1; fi done return 0; } ## vérifie qu'au plus un seul des arguments entiers a été initialisé function verifInit() { i=0; for a do if [ $a -ne -1 ] then i=`expr $i + 1`; fi done return $i; } ## charge les préférences à partir du fichier ~/.shlatex (une option par ligne) function preferences() { for ligne in `grep -e "^-.*" ~/.shlatex | tr " " "="` do opt=`expr match $ligne '[:space:]*\(-[-a-z0-9]*\)=*.*'`; paramopt=""; paramopt=`expr match $ligne '[:space:]*-[-a-z0-9]*=\(.*\)'`; case $opt in "-dvipdf" ) P_dvipdf=1;; "-pdflatex" ) P_pdflatex=1;; "-ps2pdf" ) P_pstopdf=1;; "-dvips" ) P_dvips=1;; "-dvi" ) P_dvi=1;; "-idx" | "--index" ) P_idx=1; if [ ! $paramopt == "" ] then P_idx_file=$paramopt; fi ;; "-no-idx" | "--no-index" ) P_no_idx=1; ;; "-bib" | "--bibliography" ) P_bib=1; if [ ! $paramopt == "" ] then P_bib_file=`expr match $paramopt '\(.*\)\.bib'`; fi ;; "-no-bib" | "--no-bibliography" ) P_no_bib=1;; "-toc" | "--table-of-contents" ) P_toc=1;; "-no-toc" | "--no-table-of-contents" ) P_no_toc=1;; "-tmp" | "--temporary" ) P_tmp=1;; "-no-tmp" | "--no-temporary" ) P_no_tmp=1;; "-z" | "--gzip" ) P_z=1;; "-no-z" | "--no-gzip" ) P_no_z=1;; "-1" | "--1page" ) P_un=1;; "-2" | "--2pages" ) P_deux=1;; "-4" | "--4pages" ) P_quatre=1;; "-sep" | "--separator" ) P_sep=1;; "-no-sep" | "--no-separator" ) P_no_sep=1;; "-m" | "--messages" ) P_m=1;; "-no-m" | "--no-messages" ) P_no_m=1;; "-view" | "--viewer" ) P_view=1;; "-no-view" | "--no-viewer" ) P_no_view=1;; "-7" ) P_sept=1;; "-8" ) P_huit=1;; "-v-ps" | "--view-ps-with" ) if [ ! $paramopt == "" ] then P_v_ps=$paramopt; else avertissement "fichier \"$HOME/.shalatex\" -- option \"$opt\" ignorée, paramètre manquant !"; fi ;; "-v-pdf" | "--view-pdf-with" ) if [ ! $paramopt == "" ] then P_v_pdf=$paramopt; else avertissement "fichier \"$HOME/.shalatex\" -- option \"$opt\" ignorée, paramètre manquant !"; fi ;; "-v-dvi" | "--view-dvi-with" ) if [ ! $paramopt == "" ] then P_v_dvi=$paramopt; else avertissement "fichier \"$HOME/.shalatex\" -- option \"$opt\" ignorée, paramètre manquant !"; fi ;; * ) avertissement "fichier \"$HOME/.shlatex\" -- option \"$opt\" ignorée ; cette option n'existe pas ou n'est pas supportée dans le fichier de préférences";; esac done ## vérification des options des préférences # mode verifInit $P_pstopdf $P_dvips $P_dvipdf $P_pdflatex $P_dvi; if [ $? -gt 1 ] then avertissement "fichier \"$HOME/.shlatex\" -- les options -dvipdf, -dvips, -pdflatex, -ps2pdf et -dvi sont mutuellement exclusives !"; fi # index verifInit $P_idx $P_no_idx; if [ $? -gt 1 ] then avertissement "fichier \"$HOME/.shlatex\" -- les options -idx et -no-idx sont mutuellement exclusives !"; fi # bibliography verifInit $P_bib $P_no_bib; if [ $? -gt 1 ] then avertissement "fichier \"$HOME/.shlatex\" -- les options -bib et -no-bib sont mutuellement exclusives !"; fi # table of contents verifInit $P_toc $P_no_toc; if [ $? -gt 1 ] then avertissement "fichier \"$HOME/.shlatex\" -- les options -toc et -no-toc sont mutuellement exclusives !"; fi # temporary verifInit $P_tmp $P_no_tmp; if [ $? -gt 1 ] then avertissement "fichier \"$HOME/.shlatex\" -- les options -tmp et -no-tmp sont mutuellement exclusives !"; fi # gzip verifInit $P_z $P_no_z; if [ $? -gt 1 ] then avertissement "fichier \"$HOME/.shlatex\" -- les options -z et -no-z sont mutuellement exclusives !"; fi # 1, 2, 4 verifInit $P_un $P_deux $P_quatre; if [ $? -gt 1 ] then avertissement "fichier \"$HOME/.shlatex\" -- les options -1, -2 et -4 sont mutuellement exclusives !"; fi # separator verifInit $P_sep $P_no_sep; if [ $? -gt 1 ] then avertissement "fichier \"$HOME/.shlatex\" -- les options -sep et -no-sep sont mutuellement exclusives !"; fi # messages verifInit $P_m $P_no_m; if [ $? -gt 1 ] then avertissement "fichier \"$HOME/.shlatex\" -- les options -m et -no-m sont mutuellement exclusives !"; fi # view verifInit $P_view $P_no_view; if [ $? -gt 1 ] then avertissement "fichier \"$HOME/.shlatex\" -- les options -view et -no-view sont mutuellement exclusives !"; fi # 7, 8 verifInit $P_sept $P_huit; if [ $? -gt 1 ] then avertissement "fichier \"$HOME/.shlatex\" -- les options -7 et -8 sont mutuellement exclusives !"; fi } ## si il n'y a pas de fichier de préférences, on le crée avec des valeurs par défaut if [ ! -f ~/.shlatex ] then echo -ne "-dvips\n-view\n-no-idx\n-no-bib\n-toc\n-no-tmp\n-no-z\n-1\n-no-sep\n-no-m\n-8\n-v-ps gv\n-v-pdf gv\n-v-dvi xdvi\n" > ~/.shlatex fi ## chargement des préférences preferences; ## vérification du nombre d'arguments et récupération des options if [ $# -lt 2 ] then if [ $# -eq 1 ] then if [ $1 == "-?" -o $1 == "-h" -o $1 == "--help" ] then aideComplete; exit 0; elif [ $1 == "-v" -o $1 == "--version" ] then version exit 0; fi else erreur "nombre d'arguments incorrect !" -?; exit 1; fi else noshift=0; while [ $# -gt 1 ] do case $1 in "-dvipdf" ) L_dvipdf=1;; "-pdflatex" ) L_pdflatex=1;; "-ps2pdf" ) L_pstopdf=1;; "-dvips" ) L_dvips=1;; "-dvi" ) L_dvi=1;; "-idx" | "--index" ) L_idx=1; if [ $# -gt 2 ] then shift; if [ ! ${1:0:1} == "-" ] then L_idx_file=$1; else noshift=1; fi fi ;; "-no-idx" | "--no-index" ) L_no_idx=1;; "-bib" | "--bibliography" ) L_bib=1; if [ $# -gt 2 ] then shift; if [ ! ${1:0:1} == "-" ] then if [ -f $1 ] then L_bib_file=`expr match "$1" '\(.*\)\.bib'`; else erreur "le fichier de bibliographie \"$1\" n'existe pas !" -?; exit 1; fi else noshift=1; fi fi ;; "-no-bib" | "--no-bibliography" ) L_no_bib=1;; "-toc" | "--table-of-contents" ) L_toc=1;; "-no-toc" | "--no-table-of-contents" ) L_no_toc=1;; "-tmp" | "--temporary" ) L_tmp=1;; "-no-tmp" | "--no-temporary" ) L_no_tmp=1;; "-z" | "--gzip" ) L_z=1;; "-no-z" | "--no-gzip" ) L_no_z=1;; "-1" | "--1page" ) L_un=1;; "-2" | "--2pages" ) L_deux=1;; "-4" | "--4pages" ) L_quatre=1;; "-sep" | "--separator" ) L_sep=1;; "-no-sep" | "--no-separator" ) L_no_sep=1;; "-m" | "--messages" ) L_m=1;; "-no-m" | "--no-messages" ) L_no_m=1;; "-view" | "--viewer" ) L_view=1;; "-no-view" | "--no-viewer" ) L_no_view=1;; "-7" ) L_sept=1;; "-8" ) L_huit=1;; "-v-ps" | "--view-ps-with" ) if [ $# -gt 2 ] then shift; if [ ! ${1:0:1} == "-" ] then estExec $1; if [ $? -eq 1 ] then L_v_ps=$1; else erreur "le fichier \"$1\" n'est pas accessible ou n'est pas éxécutable depuis la ligne de commande !"; exit 1; fi else noshift=1; fi else erreur "l'argument $1 nécessite un paramètre !" -?; exit 1; fi ;; "-v-pdf" | "--view-pdf-with" ) if [ $# -gt 2 ] then shift; if [ ! ${1:0:1} == "-" ] then estExec $1; if [ $? -eq 1 ] then L_v_pdf=$1; else erreur "le fichier \"$1\" n'est pas accessible ou n'est pas éxécutable depuis la ligne de commande !"; exit 1; fi else noshift=1; fi else erreur "l'argument $1 nécessite un paramètre !" -?; exit 1; fi ;; "-v-dvi" | "--view-dvi-with" ) if [ $# -gt 2 ] then shift; if [ ! ${1:0:1} == "-" ] then estExec $1; if [ $? -eq 1 ] then L_v_dvi=$1; else erreur "le fichier \"$1\" n'est pas accessible ou n'est pas éxécutable depuis la ligne de commande !"; exit 1; fi else noshift=1; fi else erreur "l'argument $1 nécessite un paramètre !" -?; exit 1; fi ;; "-?" | "-h" | "--help" ) aideRapide; exit 0;; "-v" | "--version" ) version;; * ) erreur "l'argument \"$1\" est incorrect !" -?; exit 1;; esac if [ $noshift -eq 0 ] then shift; else noshift=0; fi done fi # vérification de l'existence d'un nom pour le fichier source LaTeX if [ $# -ne 1 ] then erreur "fichier source LaTeX manquant !" -?; exit 1; fi # vérification de l'existence du fichier source LaTeX if [ ! -f $1 ] then erreur "impossible de trouver le fichier \"$1\" !" -?; exit 1; fi # nom du fichier source fich=$1; # nom du fichier source sans son extension ".tex" f=`expr match "$fich" '\(.*\)\.[a-zA-Z]*'`; ## vérification des options de la ligne de commande # mode verifInit $L_pstopdf $L_dvips $L_dvipdf $L_pdflatex $L_dvi; iopt=$?; if [ $iopt -gt 1 ] then erreur "les options -dvipdf, -dvips, -pdflatex, -ps2pdf et -dvi sont mutuellement exclusives !"; exit 1; elif [ $iopt -eq 1 ] then # ligne de commande if [ $L_dvipdf -eq 1 ] then mode="dvipdf"; elif [ $L_dvips -eq 1 ] then mode="dvips"; elif [ $L_pdflatex -eq 1 ] then mode="pdflatex"; elif [ $L_pstopdf -eq 1 ] then mode="ps2pdf"; elif [ $L_dvi -eq 1 ] then mode="dvi"; fi else # préférences if [ $P_dvipdf -eq 1 ] then mode="dvipdf"; elif [ $P_dvips -eq 1 ] then mode="dvips"; elif [ $P_pdflatex -eq 1 ] then mode="pdflatex"; elif [ $P_pstopdf -eq 1 ] then mode="ps2pdf"; elif [ $P_dvi -eq 1 ] then mode="dvi"; fi fi # index verifInit $L_idx $L_no_idx; iopt=$?; if [ $iopt -gt 1 ] then erreur "les options -idx et -no-idx sont mutuellement exclusives !"; exit 1; elif [ $iopt -eq 1 ] then # ligne de commande if [ $L_idx -eq 1 ] then idx=1; else idx=0; fi else # préférences if [ $P_idx -eq 1 ] then idx=1; else idx=0; fi fi if [ ! $L_idx_file == "-" ] then idx_file=$L_idx_file; elif [ ! $P_idx_file == "-" ] then idx_file=$P_idx_file; fi # bibliography verifInit $L_bib $L_no_bib; iopt=$?; if [ $iopt -gt 1 ] then erreur "les options -bib et -no-bib sont mutuellement exclusives !"; exit 1; elif [ $iopt -eq 1 ] then # ligne de commande if [ $L_bib -eq 1 ] then bib=1; else bib=0; fi else # préférences if [ $P_bib -eq 1 ] then bib=1; else bib=0; fi fi if [ ! $L_bib_file == "-" ] then bib_file=$L_bib_file; elif [ ! $P_bib_file == "-" ] then bib_file=$P_bib_file; fi # table of contents verifInit $L_toc $L_no_toc; iopt=$?; if [ $iopt -gt 1 ] then erreur "les options -toc et -no-toc sont mutuellement exclusives !"; exit 1; elif [ $iopt -eq 1 ] then # ligne de commande if [ $L_toc -eq 1 ] then toc=1; else toc=0; fi else # préférences if [ $P_toc -eq 1 ] then toc=1; else toc=0; fi fi # temporary verifInit $L_tmp $L_no_tmp; iopt=$?; if [ $iopt -gt 1 ] then erreur "les options -tmp et -no-tmp sont mutuellement exclusives !"; exit 1; elif [ $iopt -eq 1 ] then # ligne de commande if [ $L_tmp -eq 1 ] then tmp=1; else tmp=0; fi else # préférences if [ $P_tmp -eq 1 ] then tmp=1; else tmp=0; fi fi # gzip verifInit $L_z $L_no_z; iopt=$?; if [ $iopt -gt 1 ] then erreur "les options -z et -no-z sont mutuellement exclusives !"; exit 1; elif [ $mode == "dvips" -o $mode == "ps2pdf" ] then if [ $iopt -eq 1 ] then # ligne de commande if [ $L_z -eq 1 ] then z=1; else z=0; fi else # préférences if [ $P_z -eq 1 ] then z=1; else z=0; fi fi elif [ $iopt -eq 1 ] then avertissement "option -z ignorée -- l'option -z ne concerne que les fichiers PostScript !"; fi # 1, 2, 4 verifInit $L_un $L_deux $L_quatre; iopt=$?; if [ $iopt -gt 1 ] then erreur "les options -1, -2 et -4 sont mutuellement exclusives !"; exit 1; elif [ $mode == "dvips" -o $mode == "ps2pdf" ] then if [ $iopt -eq 1 ] then # ligne de commande if [ $L_un -eq 1 ] then ppf=1; elif [ $L_deux -eq 1 ] then ppf=2; else ppf=4; fi else # préférences if [ $P_un -eq 1 ] then ppf=1; elif [ $P_deux -eq 1 ] then ppf=2; else ppf=4; fi fi elif [ $iopt -eq 1 ] then if [ $L_un -eq 1 ] then avertissement "option -1 ignorée -- les options -1, -2 et -4 n'agissent que sur les fichiers PostScript !"; elif [ $L_deux -eq 1 ] then avertissement "option -2 ignorée -- les options -1, -2 et -4 n'agissent que sur les fichiers PostScript !"; else avertissement "option -4 ignorée -- les options -1, -2 et -4 n'agissent que sur les fichiers PostScript !"; fi fi # separator verifInit $L_sep $L_no_sep; iopt=$?; if [ $iopt -gt 1 ] then erreur "les options -sep et -no-sep sont mutuellement exclusives !"; exit 1; elif [ $ppf -gt 1 ] then if [ $iopt -eq 1 ] then # ligne de commande if [ $L_sep -eq 1 ] then sep=1; else sep=0; fi else # préférences if [ $P_sep -eq 1 ] then sep=1; else sep=0; fi fi elif [ $iopt -eq 1 ] then avertissement "option -sep ignorée -- l'option -sep ne s'utilise qu'avec les options -2 et -4 !"; fi # messages verifInit $L_m $L_no_m; iopt=$?; if [ $iopt -gt 1 ] then erreur "les options -m et -no-m sont mutuellement exclusives !"; exit 1; elif [ $iopt -eq 1 ] then # ligne de commande if [ $L_m -eq 1 ] then m=1; else m=0; fi else # préférences if [ $P_m -eq 1 ] then m=1; else m=0; fi fi # view verifInit $L_view $L_no_view; iopt=$?; if [ $iopt -gt 1 ] then erreur "les options -view et -no-view sont mutuellement exclusives !"; exit 1; elif [ $iopt -eq 1 ] then # ligne de commande if [ $L_view -eq 1 ] then view=1; else view=0; fi else # préférences if [ $P_view -eq 1 ] then view=1; else view=0; fi fi # 7, 8 verifInit $L_sept $L_huit; iopt=$?; if [ $iopt -gt 1 ] then erreur "les options -7 et -8 sont mutuellement exclusives !"; exit 1; elif [ $iopt -eq 1 ] then # ligne de commande if [ $L_sept -eq 1 ] then ascii=7; else ascii=8; fi else # préférences if [ $P_sept -eq 1 ] then ascii=7; else ascii=8; fi fi # v_dvi if [ ! $L_v_dvi == "-" ] then # lige de commande v_dvi=$L_v_dvi; elif [ ! $P_v_dvi == "-" ] then # préférences v_dvi=$P_v_dvi; fi # v_ps if [ ! $L_v_ps == "-" ] then # lige de commande v_ps=$L_v_ps; elif [ ! $P_v_ps == "-" ] then # préférences v_ps=$P_v_ps; fi # v_pdf if [ ! $L_v_pdf == "-" ] then # lige de commande v_pdf=$L_v_pdf; elif [ ! $P_v_pdf == "-" ] then # préférences v_pdf=$P_v_pdf; fi ## test de l'existance du fichier de bibliographie if [ $bib -eq 1 -a $bib_file == "-" ] then if [ ! -f "$f".bib ] then erreur "vous avez utilisé l'option -bib et le fichier \"$f.bib\" n'existe pas !" -?; exit 1; fi fi ## affichage d'un petit message de version echo -ne "\n$nomshell version $version - Script de compilation LaTeX pour Linux.\nCopyright (C) 2003 Mael Hilléreau\n\n"; ## création d'un répertoire de travail if [ ! -d "$f".ShLaTeX ] then mkdir "$f".ShLaTeX fi ## recherche (non récursive) des fichiers externes fichiersExternes $fich ## copie du fichier latex source principal cp "$f".tex "$f".ShLaTeX ## copie des fichiers latex source externes fExtTmp=""; for fe in $fExt do if [ -f "$fe".tex ] then cp "$fe".tex "$f".ShLaTeX # élimination du chemin relatif dans le fichier source sansChemin=`expr match "/$fe" '.*/\(.*\)'`; rplcExtFich "$fe.tex" "$sansChemin.tex" "$f".ShLaTeX/"$f".tex fExtTmp="$sansChemin $fExtTmp"; else avertissement "le fichier externe \"$fe.tex\" référencé dans \"$fich\" est introuvable !"; fi done fExt=$fExtTmp; ## copie du fichier de bibliographie if [ $bib -eq 1 ] then if [ $bib_file == "-" ] then bib_file=$f; fi cp "$bib_file".bib "$f".ShLaTeX fi ## copie du fichier de style d'index if [ ! $idx_file == "-" ] then if [ -f $idx_file ] then cp $idx_file "$f".ShLaTeX fi fi ## on passe dans le répertoire de travail cd "$f".ShLaTeX ## accentuation if [ $ascii -eq 8 ] then ## accentuation du fichier latex source echo "> Accentuation en cours..."; echo -ne "<$fich>" tex8to7 $fich > /dev/null 2>&1 ## écrasement du fichier latex source mv -f "$fich"7 $fich ## accentuation et écrasement des fichier latex source externes for fe in $fExt do if [ -f "$fe".tex ] then echo -ne "<$fe.tex>" tex8to7 "$fe".tex > /dev/null 2>&1 mv -f "$fe".tex7 "$fe".tex fi done echo "" fi ## compilation du fichier latex source accuentué echo "> Lancement de la compilation latex..."; reslatex=0; echo "> Compilation (ShLaTeX)" >latex.log if [ ! $mode == "pdflatex" ] then if [ $m -eq 1 ] then latex $fich else latex $fich >>latex.log 2>&1 fi reslatex=$?; else if [ $m -eq 1 ] then pdflatex $fich else pdflatex $fich >>latex.log 2>&1 fi reslatex=$?; fi if [ $reslatex -ne 0 ] then errcompil=1; else echo "première compilation effectuée avec succès."; fi ## création de la biliographie et deuxième compilation if [ $bib -eq 1 -a $errcompil -ne 1 ] then echo "> Création de la bibliographie..."; bib_file=`expr match "/$bib_file" '.*/\(.*\)'`; if [ $ascii -eq 8 ] then echo "> Accentuation du fichier \""$bib_file".bib\"..."; tex8to7 "$bib_file".bib > /dev/null 2>&1 echo "<$bib_file.bib>" mv -f "$bib_file".bib7 "$bib_file".bib fi bibtex "$f" > bibtex.log 2>&1 if [ $? -eq 0 ] then if [ ! $mode == "pdflatex" ] then echo "> Compilation (ShLaTeX)" >>latex.log latex $fich >>latex.log 2>&1 reslatex=$?; else echo "> Compilation (ShLaTeX)" >>latex.log pdflatex $fich >>latex.log 2>&1 reslatex=$?; fi if [ $reslatex -ne 0 ] then errcompil=1; else echo "deuxième compilation effectuée avec succès."; fi else echo -ne "\n"; cat bibtex.log erreur "problème lors de la création de la bibliographie !"; errbib=1; fi fi ## création d'un index if [ $idx -eq 1 -a $errcompil -ne 1 -a $errbib -ne 1 ] then echo "> Création de l'index..."; if [ $idx_file == "-" ] then makeindex "$f".idx > makeindex.log 2>&1 else makeindex -s $idx_file "$f".idx > makeindex.log 2>&1 fi if [ $? -ne 0 ] then echo -ne "\n"; cat makeindex.log cat "$f".ilg 2>/dev/null erreur "problème lors de la création de l'index !"; errindex=1; else errindex=0; echo "index créé avec succès."; fi fi ## deuxième ou troisième compilation pour l'index et la table des matières if [ $toc -eq 1 -a $errbib -ne 1 -a $errindex -ne 1 -a $errcompil -ne 1 ] then if [ ! $mode == "pdflatex" ] then echo "> Compilation (ShLaTeX)" >>latex.log latex $fich >>latex.log 2>&1 reslatex=$?; else echo "> Compilation (ShLaTeX)" >>latex.log pdflatex $fich >>latex.log 2>&1 reslatex=$?; fi if [ $reslatex -ne 0 ] then errcompil=1; else if [ $bib -eq 1 ] then echo "troisième compilation effectuée avec succès."; else echo "deuxième compilation effectuée avec succès."; fi fi fi ## déplacement du fichier dvi ou pdf if [ $mode == "pdflatex" ] then mv "$f".pdf .. else mv "$f".dvi .. fi ## on sort du répertoire de travail cd .. ## conversion du fichier dvi errconvert=0; if [ $errbib -ne 1 -a $errindex -ne 1 -a $errcompil -ne 1 -a ! $mode == "pdflatex" -a ! $mode == "dvi" ] then echo "> Conversion en cours..."; if [ $mode == "dvipdf" ] then dvipdf "$f".dvi "$f".pdf > ./"$f".ShLaTeX/dvipdf.log 2>&1 if [ $? -ne 0 ] then echo -ne "\n"; cat ./"$f".ShLaTeX/dvipdf.log erreur "problème de conversion PDF !"; errconvert=1; fi elif [ $mode == "dvips" -o $mode == "ps2pdf" ] then dvips -Ppdf "$f".dvi -o "$f".ps > ./"$f".ShLaTeX/dvips.log 2>&1 if [ $? -ne 0 ] then echo -ne "\n"; cat ./"$f".ShLaTeX/dvips.log erreur "problème de conversion PostScript !"; errconvert=1; fi if [ $errconvert -ne 1 ] then optpstops=""; if [ $sep -eq 1 ] then optpstops="-d"; fi if [ $ppf -eq 2 ] then pstops $optpstops "2:0L@.7(21cm,0cm)+1L@.7(21cm,14.85cm)" "$f".ps "$f".2ppf.ps >/dev/null 2>&1 mv "$f".2ppf.ps "$f".ps elif [ $ppf -eq 4 ] then pstops $optpstops "4:0@.5(0cm,14.85cm)+1@.5(10.5cm,14.85cm)+2@.5(0cm,0cm)+3@.5(10.5cm,0cm)" "$f".ps "$f".4ppf.ps >/dev/null 2>&1 mv "$f".4ppf.ps "$f".ps fi if [ $mode == "ps2pdf" ] then ps2pdf "$f".ps "$f".pdf > ./"$f".ShLaTeX/ps2pdf.log 2>&1 if [ $? -ne 0 ] then echo -ne "\n"; cat ./"$f".ShLaTeX/ps2pdf.log erreur "problème de conversion PDF !"; errconvert=1; fi fi if [ $z -eq 1 ] then rm -f "$f".ps.gz gzip "$f".ps > /dev/null 2>&1 fi fi fi rm -f "$f".dvi fi ## visualisation du fichier dvi, ps ou pdf if [ $errconvert -ne 1 -a $errbib -ne 1 -a $errindex -ne 1 -a $errcompil -ne 1 -a $view -eq 1 ] then echo "> Lancement de la visualisation du résultat."; case $mode in "dvi" ) $v_dvi "$f".dvi >/dev/null 2>&1 & ;; "dvips" ) if [ $z -eq 1 ] then $v_ps "$f".ps.gz >/dev/null 2>&1 & else $v_ps "$f".ps >/dev/null 2>&1 & fi ;; "ps2pdf" | "dvipdf" | "pdflatex" ) $v_pdf "$f".pdf >/dev/null 2>&1 & ;; esac fi ## affichage des messages d'erreur de compilation if [ $errcompil -eq 1 ] then if [ $m -eq 0 ] then echo -ne "\n"; cat ./"$f".ShLaTeX/latex.log fi erreur "problème de compilation !"; fi ## suppression des temporaires et sortie suppressionTemp; fin;