Convertiseur Fig -> LaTeX -> EPS
Posted by mazet on 14 Nov 2009 in Programmation, Bash
Script convertissant un fichier au format EPS à partir d'un fichier FIG (xfig). On appelle LaTeX pour convertir les chaines de caractères qui contiennent des commandes LaTeX.
Shell
#!/bin/sh | |
# genfig (C) Marc de Courville 20 aout 1994 | |
# Laurent Mazet 26 janvier 1999 | |
# Cyril Humbert 14 stemptre 1999 | |
# Laurent Mazet 5 octobre 1999 | |
# Marc de Courville and Laurent Mazet 16 octobre 2000 | |
# Laurent Mazet 22 novembre 2001 | |
| |
# Fabrique un fichier au format eps a partir d'un fichier xfig (FIG). | |
# On appelle LaTeX pour convertir les chaines de caracteres qui | |
# contiennent des commandes LaTeX. | |
| |
# 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, 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. */ | |
| |
# Changelog: | |
# - 1.10.0 | |
# * work also on cygwin | |
# ... | |
| |
| |
# Lecture des parametres | |
| |
VERSION="1.10.0" | |
| |
help=no | |
list=""; | |
level=1000; | |
resource="" | |
showversion=no | |
incstdres=yes | |
| |
while [ $# -gt 0 ]; do | |
case $1 in | |
-h) | |
help="yes" | |
;; | |
-m) | |
shift | |
level="$1" | |
;; | |
-m*) | |
level=$(echo $1 | sed -e 's/^-m//') | |
;; | |
-r) | |
shift | |
resource="$resource $1" | |
;; | |
-r*) | |
resource="$resource $(echo $1 | sed -e 's/^-r//')" | |
;; | |
-v) | |
echo "$(basename "$0") version $VERSION" >&2; exit 1; | |
;; | |
-x) | |
incstdres=no | |
;; | |
*) | |
list="$list $1" | |
esac | |
shift | |
done | |
| |
# Verification des parametres | |
| |
level=$(echo $level | sed -e 's/[^0-9]*\([0-9]*\).*/0\1/') | |
[ $level -eq 0 ] && | |
{ echo "$level is an incorrect magnification level." >&2; exit 1; } | |
| |
checked_res="" | |
[ -n "$resource" ] && | |
for file_res in $resource; do | |
[ ! -f $file_res ] && | |
{ echo "Resource file $file_res not found." >&2; exit 1; } | |
[ -z "$(echo $file_res | grep '^[~/]')" ] && | |
file_res="$(pwd)/$file_res" | |
checked_res="$file_res $checked_res" | |
done | |
resource=$checked_res | |
| |
[ \( "$incstdres" = "yes" \) -a \( -f $HOME/.$(basename "$0")rc \) ] && | |
resource="$HOME/.$(basename "$0")rc $resource" | |
| |
[ \( -z "$list" \) -o \( "$help" = yes \) ] && | |
{ echo " | |
Usage: $(basename "$0") [-h] [-m level] [-r resource] <file[.fig]>... | |
| |
-h display help (this page) | |
-m level set magnification level. A value of 1000 corresponds to | |
100% and the scale is linear. Default value is [1000]. | |
-r resource specifies the name of a resource file which contains TeX macros. | |
TeX macro must be one line to allow multiple resource files. | |
By deault, it tries to open ~/.$(basename "$0")rc | |
-v show version. | |
-x exclude standard resource file. | |
| |
| |
<file1> <ile2>... figure's name | |
| |
generate the postcript file <filename>.eps to be included as | |
a figure in the latex file with graphics.cls | |
| |
This script allows to generate a postscript figure created by xfig containing | |
text to be processed by latex. Fonts are scaled properly. | |
The fonts to be used in xfig are the latex fonts. | |
It is convinient to use the alias lafig for calling xfig: | |
alias lafig 'xfig -specialtext -latexfonts -startlatexFont default' | |
" >&2; exit 1; } | |
| |
# Le repertoire ou on ecrit les fichiers temporaires. | |
# On recherche un nom de repertoire dans la variable d'environnement TMP, | |
# si elle n'est pas definie, on regarde dans TEMP, si cette derniere | |
# n'existe pas non plus, on utilise /tmp . | |
TMP=${TMP:=$TEMP} | |
TMP=${TMP:=/tmp} | |
[ \( -d $TMP \) -a \( -w $TMP \) ] || | |
{ echo "$TMP must be a writable directory" >&2; exit 1; } | |
| |
# Les fichiers temporaires (chemin d'acces relatif a $TMP). | |
prefixe=$(basename "$0")-$$ | |
dvi_file=$prefixe.dvi | |
eps_file=$prefixe.eps | |
latex_file=$prefixe.tex | |
pstex_file=$prefixe.pstex | |
pstex_t_file=$prefixe.pstex_t | |
trap "rm -f $TMP/$prefixe*; cd $OLDPWD; exit 1;" 0 1 2 15 | |
| |
# Version de dvips | |
if [ $(dvips -v | cut -d" " -f4 | tr '.[:alpha:]' ' ' | sed -e "s, ,,g") -gt 570 ]; then | |
dvi_v="cool" | |
else | |
dvi_v="ugly" | |
fi | |
| |
# Pour chaque fichier passe en argument... | |
for fig_file in $list; do | |
| |
name=$(basename "$fig_file" .fig) # sans extension ni chemin d'acc | |
dir=$(dirname "$fig_file") | |
fig_file=$name.fig | |
| |
# Si le fichier n'existe pas ou s'il n'est pas au format FIG, | |
# on passe au suivant. | |
[ ! -f $dir/$fig_file ] && | |
{ echo "Skipping \"$fig_file\" (file not found)..." >&2; continue; } | |
| |
head -1 "$dir/$fig_file" | grep -q "#FIG" || | |
{ echo "Skipping \"$fig_file\" (not a FIG file)..." >&2; continue; } | |
| |
# Fabrique les fichiers pstex et pstex_t a l'aide de fig2dev | |
echo -n "Processing \"$fig_file\": " | |
| |
if [ "$dvi_v" = "cool" ]; then | |
fig2dev -L pstex -n "$name" "$dir/$fig_file" $TMP/$pstex_file && | |
fig2dev -L pstex_t -p $pstex_file "$dir/$fig_file" $TMP/$pstex_t_file || | |
{ echo "Error while creating pstex and/or pstex_t files" >&2; continue; } | |
else | |
fig2dev -L pstex -n "$name" "$dir/$fig_file" $TMP/$pstex_file && | |
fig2dev -L pstex_t "$dir/$fig_file" $TMP/$pstex_t_file || | |
{ echo "Error while creating pstex and/or pstex_t files" >&2; continue; } | |
fi | |
| |
cd $TMP | |
| |
# Cree un petit fichier LaTeX qui inclue l'image | |
cat >$latex_file <<EOF | |
\documentclass{article} | |
| |
\usepackage{pslatex} | |
\usepackage{times} | |
\usepackage[T1]{fontenc} | |
\usepackage{amsmath} | |
\usepackage{amstext} | |
\usepackage{amsfonts} | |
\usepackage{amssymb} | |
\usepackage[mathscr]{eucal} | |
\usepackage{bbm} | |
\usepackage[dvips]{color} | |
\usepackage[dvips]{epsfig} | |
EOF | |
| |
# Ajout de macro standards | |
| |
[ -n "$resource" ] && | |
{ ( for fil_res in $resource; do | |
cat $fil_res; | |
done ) | sort | uniq >>$latex_file; } | |
| |
# Fin du fichier LaTeX | |
| |
if [ "$dvi_v" = "cool" ]; then | |
cat >>$latex_file <<EOF | |
\setlength{\textheight}{100cm} | |
\setlength{\textwidth}{100cm} | |
\setlength{\oddsidemargin}{-0pt} | |
\setlength{\evensidemargin}{-0pt} | |
\setlength{\topmargin}{-0pt} | |
\setlength{\parindent}{0pt} | |
\pagestyle{empty} | |
| |
\begin{document} | |
\begin{center} | |
\input{$pstex_t_file} | |
\end{center} | |
\end{document} | |
EOF | |
else | |
cat >>$latex_file >>EOF | |
\setlength{\textheight}{100cm} | |
\setlength{\textwidth}{100cm} | |
\setlength{\oddsidemargin}{-0pt} | |
\setlength{\evensidemargin}{-0pt} | |
\setlength{\topmargin}{-0pt} | |
\setlength{\parindent}{0pt} | |
| |
\pagestyle{empty} | |
| |
\begin{document} | |
\makebox[0pt][l]{\color[rgb]{1,1,1}.}\par | |
\mbox{\begin{picture}(0,0) | |
\epsfig{file=$pstex_file} | |
\end{picture} | |
\input{$pstex_t_file} | |
\hspace{-10pt}\makebox[0pt][l]{\color[rgb]{1,1,1}.} | |
\end{document} | |
EOF | |
fi | |
# | |
### Ne rien changer dans la ligne `EOF' (indentation, espaces...) | |
| |
echo -n "LaTeX, " | |
latex 2>&1 "\nonstopmode\input{$latex_file}" 1>/dev/null 2>&1 || | |
{ cat $prefixe.log >&2; continue; } | |
| |
echo -n "dvips " | |
dvips -Pwww -q -x $level -E $dvi_file -o $eps_file 1>/dev/null 2>&1 | |
| |
# retaille l'image eps et recale l'image au bord de la page | |
| |
bbox=$(grep '^%%BoundingBox:' $eps_file | head -1 | | |
awk '{printf "0 0 %d %d", $4-$2, $5-$3;}') | |
epsffit $bbox $eps_file $eps_file.tmp | |
mv $eps_file.tmp $eps_file | |
| |
# recopie le fichier eps dans le repertoire courant | |
# apres avoir change le titre de la figure (%%Title). | |
if [ -s $eps_file ]; then | |
cd $OLDPWD | |
cat $TMP/$eps_file | | |
sed 's/^\(%%Title: \).*/\1'"$name"'/1' > "$name".eps | |
| |
# $name ne doit pas contenir le caractere `/' ! | |
| |
echo "-> \"$name.eps\"" | |
fi | |
| |
# un peu de menage avant de passer au fichier suivant | |
rm -f $TMP/$prefixe* 2>/dev/null | |
| |
done | |
| |
# Fin de genfig |