Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Exploiter une variable d'environnement dans un fichier latex, ou passer un paramètre de commande

91 views
Skip to first unread message

Dominique MICOLLET

unread,
Mar 11, 2011, 7:02:48 AM3/11/11
to
Bonjour,

Existe-t'il un moyen de récupérer la valeur d'une variable d'environnement
au sein d'un fichier Latex, ou de récupérer cette valeur en tant que
paramètre de la commande latex.

L'idée serait par exemple de configurer la dimension de la page de la
manière suivante, sous unix :
__$ export PAGE=a4

ou sous la forme
__$ latex --define PAGE=a4 fichier.tex

et d'avoir en entête de latex quelque chose comme :
\documentclass[${PAGE}]{memoir}

On peut évidemment s'en sortir avec sed ou awk, mais j'aurais préféré
quelque chose de plus "direct" :-).

La seule chose que j'ai trouvé s'approchant serait l'emploi de \typein.

Pour info, j'ai deux usages potentiels en tête :
- gestion d'un numéro de version svn ;
- génération de plusieurs qcm diversement désordonnés à partir d'une source
unique.

Mes recherches google n'ont rien donné de probant, peut-être faute des bons
mots clefs.

Cordialement.

--
Dominique MICOLLET
Adresse email : enlever deux francs

Alain Ketterlin

unread,
Mar 11, 2011, 8:12:06 AM3/11/11
to
Dominique MICOLLET <Dominique...@u-bourgogne.fr.fr.fr> writes:

> Existe-t'il un moyen de récupérer la valeur d'une variable d'environnement
> au sein d'un fichier Latex, ou de récupérer cette valeur en tant que
> paramètre de la commande latex.

Pas que je sache, mais on peut faire :

pdflatex "\def\name{$PAGE}\input fichier"

et utiliser \name dans le fichier.

> Pour info, j'ai deux usages potentiels en tête :
> - gestion d'un numéro de version svn ;

Jette un oeil à svninfo.sty, ou svn-multi.sty

> - génération de plusieurs qcm diversement désordonnés à partir d'une source
> unique.

Sais pas.

-- Alain.

Manuel Pégourié-Gonnard

unread,
Mar 11, 2011, 9:16:13 AM3/11/11
to
Bonjour,

Dominique MICOLLET scripsit :

> Existe-t'il un moyen de récupérer la valeur d'une variable d'environnement
> au sein d'un fichier Latex, ou de récupérer cette valeur en tant que
> paramètre de la commande latex.
>

Pas sous pdfTeX ou XeTeX. Sous LuaTeX par contre, c'est trivial :

\directlua{tex.sprint(os.getenv('PAGE') or 'a4')}

donne (pour être précis : se développe en) la valeur de la variable
d'environnement PAGE, ou 'a4' si elle n'est pas définie.

> On peut évidemment s'en sortir avec sed ou awk, mais j'aurais préféré
> quelque chose de plus "direct" :-).
>

Le plus direct est la méthode

> La seule chose que j'ai trouvé s'approchant serait l'emploi de \typein.
>
> Pour info, j'ai deux usages potentiels en tête :
> - gestion d'un numéro de version svn ;
> - génération de plusieurs qcm diversement désordonnés à partir d'une source
> unique.
>
> Mes recherches google n'ont rien donné de probant, peut-être faute des bons
> mots clefs.
>
> Cordialement.
>

--
Manuel Pégourié-Gonnard Institut de mathématiques de Jussieu
http://weblog.elzevir.fr/ http://people.math.jussieu.fr/~mpg/


Manuel Pégourié-Gonnard

unread,
Mar 11, 2011, 9:55:13 AM3/11/11
to
Bonjour,

Dominique MICOLLET scripsit :

> Existe-t'il un moyen de récupérer la valeur d'une variable d'environnement
> au sein d'un fichier Latex, ou de récupérer cette valeur en tant que
> paramètre de la commande latex.
>

Pas sous pdfTeX ou XeTeX. Sous LuaTeX par contre, c'est trivial :

\directlua{tex.sprint(os.getenv('PAGE') or 'a4')}

donne (pour être précis : se développe en) la valeur de la variable
d'environnement PAGE, ou 'a4' si elle n'est pas définie.

> __$ latex --define PAGE=a4 fichier.tex
>
Ce qui s'en rapproche le plus est en effet la solution proposée par
Alain : latex '\def\page{'$PAGE'} \input fichier.tex'. Ceci dit, je
recommenderais aussi de changer le nom du fichier de sortie :

latex --jobname=fichier-$PAGE '\def\page{'$PAGE'} \input fichier.tex'

histoire que les compilations avec différentes valeurs de $PAGE
n'écrasent pas mutuellement les résultats des autres.

Dans l'hypothèse où les valeurs possibles de $PAGE sont prises dans un
ensemble fini et assez petit, on peut aussi prévoir un wrapper pour
chaque variante :

% fichier-a4.tex
\PassOptionsToCLass{a4paper}{article}
\input main
% fin de fichier-a4.tex

% fichier-a5.tex
\PassOptionsToCLass{a5paper}{article}
\input main
% fin de fichier-a5.tex

% début main.tex
\documentclass[11pt]{article}

Comme ça on fait juste 'latex fichier-a4' et pas besoin de -jobname ou
autre.

Deux autres approches possibles :

1. Avoir un fichier de configuration fichier.cfg contenant des trucs du
genre :

\PassOptionsToClass{a4paper}{article}
\def\option{valeur}

et faire \input fichier.cfg au début du fichier principal, et jouer avec
-jobname. C'est essentiellement l'approche utilisée par les scripts
ConTeXt pour produire plusieurs variantes d'un même document.

2. S'il y peu d'options différentes, les encoder dans le \jobname et
analyser son contenu pour récupérer les options (demande de hacker un
peu de TeX, encore que ça doit pas être très dur avec xstring ou autre,
et carrément super simple si on utilise LuaTeX).

latex -jobname fichier-a4-oneside fichier.tex

et fichier.tex contient le code magique qui parse \jobname.

Dominique MICOLLET

unread,
Mar 12, 2011, 3:16:10 AM3/12/11
to
Alain Ketterlin wrote:

> pdflatex "\def\name{$PAGE}\input fichier"
> et utiliser \name dans le fichier.

Si je comprends bien, cela me fabrique à la volée un nouveau fichier tex qui
qui contient en début de ligne, après expansion par bash :
\def\name\a4
\documentclass[\name]{memoir}

> Jette un oeil à svninfo.sty, ou svn-multi.sty

Voilà qui devrait parfaitement me convenir.

Merci pour ces informations.

azubi

unread,
Mar 12, 2011, 3:22:29 AM3/12/11
to
On 03/11/2011 03:55 PM, Manuel Pégourié-Gonnard wrote:
[ plein de choses ]


Une solution peut-être moins élégante que celles proposées est
d'utiliser gpp ("generic preprocessor" ou "general purpose
preprocessor"). Cet outil, similaire au préprocesseur de C est aussi
partiellement adapté à LaTeX (je suis un fan de la compilation
conditionnelle).

Tu peux trouver un début de doc à l'adresse:

http://files.nothingisreal.com/software/gpp/gpp.html


Bonne journée

Alain Ketterlin

unread,
Mar 12, 2011, 3:24:07 AM3/12/11
to
Dominique MICOLLET <Dominique...@u-bourgogne.fr.fr.fr> writes:

>> pdflatex "\def\name{$PAGE}\input fichier"
>> et utiliser \name dans le fichier.
>
> Si je comprends bien, cela me fabrique à la volée un nouveau fichier
> tex qui qui contient en début de ligne, après expansion par bash :
> \def\name\a4
> \documentclass[\name]{memoir}

Ce n'est pas tout à fait aussi élaboré, et bash ne fait rien de spécial.
On profite juste de la capacité de TeX d'accepter, à la place d'un nom
de fichier, un ensemble de commandes, qu'il exécute.

-- Alain.

Dominique MICOLLET

unread,
Mar 12, 2011, 3:31:25 AM3/12/11
to
Bonjour,

Manuel Pégourié-Gonnard wrote:

> Sous LuaTeX par contre, c'est trivial :

Ah... oui, il faudrait que j'envisage de basculer vers des outils plus
modernes. Mais j'ai un comportement dinosaurien en la matière, vu que je ne
domine absolument pas ces outils.

> latex --jobname=fichier-$PAGE '\def\page{'$PAGE'} \input fichier.tex'

Effectivement. J'envisageais de m'en sortir à coup de mv (ai-je dis que je
suis dinosaurien :-).

> Dans l'hypothèse où les valeurs possibles de $PAGE sont prises dans un
> ensemble fini et assez petit,

C'est le cas (a4, a5) et deux ou trois valeurs numériques différentes pour
générer "aléatoirement" le désordre des réponses du QCM.


> on peut aussi prévoir un wrapper pour
> chaque variante :

==8<------


> Comme ça on fait juste 'latex fichier-a4' et pas besoin de -jobname ou
> autre.

Je viens d'apprendre deux choses qui me seront très utiles :
- on peut écrire des choses avant \documentclass, en l'occurence, ici
\PassOptionsToCLass
- on peut inclure le vrai fichier par \input


> 1. Avoir un fichier de configuration fichier.cfg contenant des trucs du
> genre :
>
> \PassOptionsToClass{a4paper}{article}
> \def\option{valeur}

Celle là me plaît bien, parce que je peux le créer à la volée dans un
shell-script.


> 2. S'il y peu d'options différentes, les encoder dans le \jobname et
> analyser son contenu pour récupérer les options (demande de hacker un
> peu de TeX, encore que ça doit pas être très dur avec xstring ou autre,
> et carrément super simple si on utilise LuaTeX).
>
> latex -jobname fichier-a4-oneside fichier.tex
>
> et fichier.tex contient le code magique qui parse \jobname.
>


Là, j'ai décroché.


Merci pour toutes ces pistes. Je vais essayer de trouver ce qui me convient
le mieux.

Dominique MICOLLET

unread,
Mar 12, 2011, 5:06:13 AM3/12/11
to
Bonjour,

Alain Ketterlin wrote:

> bash ne fait rien de spécial.

Je ne comprends pas cette remarque : n'est ce pas bash qui transforme
${PAGE} en "a4" ?

Cordialement.

Dominique MICOLLET

unread,
Mar 12, 2011, 5:10:03 AM3/12/11
to
Dominique MICOLLET wrote:

> Existe-t'il un moyen de récupérer la valeur d'une variable d'environnement
> au sein d'un fichier Latex,

Merci à toutes les contributions.

J'ai finalement retenu la solution d'un fichier xxxx.cfg inclus en début de
fichier tex parce que :
- je le construis à la volée dans un shell-script bash sous forme de
document en ligne ;
- il subsiste après l'exécution du shell-script dans le répertoire de
travail, ce qui permet de continuer à travailler sans encombre avec kile
pour la mise au point du document final.

Cordialement

Alain Ketterlin

unread,
Mar 12, 2011, 6:44:52 AM3/12/11
to
Dominique MICOLLET <Dominique...@u-bourgogne.fr.fr.fr> writes:

> Alain Ketterlin wrote:
>
>> bash ne fait rien de spécial.
> Je ne comprends pas cette remarque : n'est ce pas bash qui transforme
> ${PAGE} en "a4" ?

Si si, tu as coupé la partie pertinente. Dans ton message initial tu
disais :

> Si je comprends bien, cela me fabrique à la volée un nouveau fichier
> tex qui qui contient en début de ligne, après expansion par bash :

En disant que bash ne fait rien de spécial, je voulais dire en
particulier que bash ne "fabrique" pas un nouveau fichier.

-- Alain.

Manuel Pégourié-Gonnard

unread,
Mar 12, 2011, 9:01:20 AM3/12/11
to
Dominique MICOLLET scripsit :

> Manuel Pégourié-Gonnard wrote:
>
>> Sous LuaTeX par contre, c'est trivial :
>
> Ah... oui, il faudrait que j'envisage de basculer vers des outils plus
> modernes. Mais j'ai un comportement dinosaurien en la matière, vu que je ne
> domine absolument pas ces outils.
>

Bah, en fait on ne peut pas encore dire qu'on est un dinosaure jsute
parce qu'on utilise pas luatex. Je ne conteste pas ton statut de dino si
tu le dis, je dis juste que pour l'instant luatex c'est encore un peu
nouveau.

>> latex --jobname=fichier-$PAGE '\def\page{'$PAGE'} \input fichier.tex'
>
> Effectivement. J'envisageais de m'en sortir à coup de mv (ai-je dis que je
> suis dinosaurien :-).
>

Le problème du mv final, c'est que les fichiers auxiliaires gardent
l'ancien nom. En particulier, on va devoir recompiler plus souvent
chaque version si on compile un coup l'une un coup l'autre et que les
références croisées tombent pas aux mêmes endroits (probable si on
change le format de la page).

> Je viens d'apprendre deux choses qui me seront très utiles :
> - on peut écrire des choses avant \documentclass, en l'occurence, ici
> \PassOptionsToCLass

En fait, on peut écrire à peu près ce qu'on veut avant \documentclass,
les exceptions les plus notables étant \usepackage (par contre
\RequirePackage fait la même chose et marche) et \begin{document} bien
sûr :-) Ou des trucs qui ne sont définis que par la classe, aussi.

> Celle là me plaît bien, parce que je peux le créer à la volée dans un
> shell-script.
>

Voilà. Faut voir que la plupart des solutions discutées seront plus
confortables via un Makefile ou autre script qu'en tapant les longues
lignes de commandes à la main, mais comme vous le remarquez ailleurs,
celle-ci a l'avantage qu'on est pas obligés d'utiliser le script à
chaque fois, ce qui peut être appréciable.

>> 2. S'il y peu d'options différentes, les encoder dans le \jobname et
>> analyser son contenu pour récupérer les options (demande de hacker un
>> peu de TeX, encore que ça doit pas être très dur avec xstring ou autre,
>> et carrément super simple si on utilise LuaTeX).
>>
>> latex -jobname fichier-a4-oneside fichier.tex
>>
>> et fichier.tex contient le code magique qui parse \jobname.
>>
>
>
> Là, j'ai décroché.
>

Alors un exemple, ça sera peut-être plus clair.

% docu.tex
\makeatletter
\def\getpaper{%
\expandafter\get@paper\jobname--\@nil}
\def\get@paper#1-#2-#3\@nil{%
\ifx\empty#2\empty a4\else #2\fi paper}
\makeatother

\documentclass[\getpaper]{article}
\usepackage[ascii]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{geometry}
\usepackage{lipsum}
\usepackage[latin]{babel}

\begin{document}
\lipsum
\end{document}

Si on compile avec pdflatex docu.tex, ça sort en a4. Si on fait

pdflatex --jobname=docu-a5 docu.tex

ça sort en a5 (en avec le nom docu-a5.pdf, évidemment).

J'admets volontiers que c'est un peu hackeux. En particulier, il ne faut
pas que le nom du fichier à la base contienne déjà un tiret.

0 new messages