2003-03-18 01:15:44 +01:00
|
|
|
|
<?xml version="1.0" encoding="ISO-8859-1"?>
|
|
|
|
|
<!DOCTYPE html
|
|
|
|
|
PUBLIC "-//ENS/Tuteurs//DTD TML 1//EN"
|
|
|
|
|
"tuteurs://DTD/tml.dtd">
|
|
|
|
|
<html>
|
|
|
|
|
<head>
|
|
|
|
|
<title>Son package</title>
|
|
|
|
|
</head>
|
|
|
|
|
<body>
|
|
|
|
|
|
|
|
|
|
<h1><3E>crire son propre package</h1>
|
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<h2>Pourquoi<6F>?</h2>
|
2003-03-18 01:15:44 +01:00
|
|
|
|
|
|
|
|
|
<p>
|
2007-07-17 12:01:59 +02:00
|
|
|
|
D<EFBFBD>finir son propre package permet<65>:</p>
|
2003-03-18 01:15:44 +01:00
|
|
|
|
|
|
|
|
|
<ul>
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li>de ne pas avoir <20> toujours ins<6E>rer toujours les m<>mes lignes<65>:
|
2003-03-18 01:15:44 +01:00
|
|
|
|
<pre>
|
|
|
|
|
\usepackage[francais]{babel}
|
|
|
|
|
\usepackage[latin1]{inputenc}
|
|
|
|
|
\usepackage[T1]{fontenc}
|
|
|
|
|
\usepackage[dvips]{graphicx}
|
|
|
|
|
\usepackage{amsmath}
|
|
|
|
|
\usepackage{amssymb}
|
|
|
|
|
</pre>
|
|
|
|
|
</li>
|
|
|
|
|
<li>de ne pas avoir <20> red<65>finir toutes ses macros et aussi de gagner
|
2007-07-17 12:01:59 +02:00
|
|
|
|
du temps <20> force de s'habituer <20> ses commandes persos<6F>;</li>
|
2003-03-18 01:15:44 +01:00
|
|
|
|
<li>d'avoir des documents coh<6F>rents entre eux.</li>
|
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
<h2>Principe</h2>
|
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<p>Nous allons cr<63>er un fichier <20><><code>mon_package.sty</code><3E><> (ou
|
2003-03-18 01:15:44 +01:00
|
|
|
|
tout autre nom qui ne cr<63>e de doublon) qui comportera les instructions
|
2007-07-17 12:01:59 +02:00
|
|
|
|
qui permettront<6E>:</p>
|
2003-03-18 01:15:44 +01:00
|
|
|
|
|
|
|
|
|
<ul>
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li>de charger nos extensions pr<70>f<EFBFBD>r<EFBFBD>es<65>;</li>
|
|
|
|
|
<li>de d<>finir nos commandes pr<70>f<EFBFBD>r<EFBFBD>es<65>;</li>
|
2003-03-18 01:15:44 +01:00
|
|
|
|
<li>de passer des options lors du chargement du package qui lui
|
|
|
|
|
donneront un comportement particulier.</li>
|
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
<h2>Organisation</h2>
|
|
|
|
|
|
|
|
|
|
<h3>Listing</h3>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
<b>%% Informations g<>n<EFBFBD>rales</b>
|
|
|
|
|
\NeedsTeXFormat{LaTeX2e}[1999/01/01]
|
|
|
|
|
\ProvidesPackage{mon_package}[2003/01/01]
|
|
|
|
|
|
|
|
|
|
<b>%% Chargement des extensions</b>
|
|
|
|
|
\RequirePackage[dvips]{graphicx}
|
|
|
|
|
|
|
|
|
|
<b>%% D<>claration des options</b>
|
|
|
|
|
\DeclareOption{option}{...}
|
|
|
|
|
\DeclareOption*{...}
|
|
|
|
|
\ProcessOptions
|
|
|
|
|
|
|
|
|
|
<b>%% D<>finition des commandes</b>
|
|
|
|
|
\newcommand{\blabla}{Super commande}
|
|
|
|
|
|
|
|
|
|
<b>%% Fin du package</b>
|
|
|
|
|
\endinput
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<h3>Explications</h3>
|
|
|
|
|
|
|
|
|
|
<ul>
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li><code><b>\NeedsTeXFormat{<formar>}[<version>]</b></code><3E>:
|
2003-03-18 01:15:44 +01:00
|
|
|
|
informe TeX du format (LaTeX2e, donc refus de LaTeX2.09, plain TeX,
|
|
|
|
|
eplain TeX, AMS-TeX, etc.) n<>cessaire pour l'utilisation du
|
|
|
|
|
package, on peut sp<73>cifier un argument optionnel (entre crochets)
|
2007-07-17 12:01:59 +02:00
|
|
|
|
permettant d'utiliser des versions r<>centes dudit format<61>;</li>
|
|
|
|
|
<li><code><b>\ProvidesPackage{<package>}[<version>]</b></code><3E>:
|
2003-03-18 01:15:44 +01:00
|
|
|
|
le package s'identifie (l<> encore on peut donner en argument
|
2007-07-17 12:01:59 +02:00
|
|
|
|
optionnel une date de version)<29>;</li>
|
|
|
|
|
<li><code><b>\RequirePackage[<options>]{<package>}</b></code><3E>:
|
2003-03-18 01:15:44 +01:00
|
|
|
|
<20>quivalent de <code>\usepackage</code> pour l'<27>criture d'un package
|
|
|
|
|
ou d'une classe, on peut passer des options au package comme
|
2007-07-17 12:01:59 +02:00
|
|
|
|
habituellement<6E>;</li>
|
|
|
|
|
<li><code><b>\DeclareOption{<option>}{<action>}</b></code><3E>:
|
2003-03-18 01:15:44 +01:00
|
|
|
|
d<>clare une option qui peut <20>tre pass<73>e lors de l'appel du
|
|
|
|
|
package, lorsque l'option <code><option></code> est pass<73>e
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<code><action></code> est ex<65>cut<75>e<EFBFBD>;</li>
|
|
|
|
|
<li><code><b>\DeclareOption*{<action>}</b></code><3E>:
|
2003-03-18 01:15:44 +01:00
|
|
|
|
comportement adopt<70> par le package quand il est confront<6E> <20> une
|
2007-07-17 12:01:59 +02:00
|
|
|
|
option pass<73>e qui n'est pas d<>clar<61>e<EFBFBD>;</li>
|
|
|
|
|
<li><code><b>\ProcessOptions</b></code><3E>: ex<65>cute le code des options
|
2003-03-18 01:15:44 +01:00
|
|
|
|
pass<73>es, si cette commande n'existe pas dans le package les options
|
|
|
|
|
seront sans effet (bien prendre conscience que les declarations
|
2007-07-17 12:01:59 +02:00
|
|
|
|
n'ex<65>cutent pas de code!)<29>;</li>
|
|
|
|
|
<li><code><b>\newcommand{\commande}{<code>}</b></code><3E>:
|
2003-03-18 01:15:44 +01:00
|
|
|
|
d<>finition d'une nouvelle commande (voir la page sur les
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<a href="&url.tuteurs;logiciels/latex/macros.html">macros</a>)<29>;</li>
|
|
|
|
|
<li><code><b>\endinput</b></code><3E>: fin du package.</li> </ul>
|
2003-03-18 01:15:44 +01:00
|
|
|
|
|
|
|
|
|
<h2>Exemple simple</h2>
|
|
|
|
|
|
|
|
|
|
<p>Supposons qu'il m'arrive d'<27>crire des documents sans algorithmes et
|
|
|
|
|
d'autres avec. Lorsque j'en ai besoin je charge les packages
|
|
|
|
|
<code>algorithm</code> et <code>algorithmic</code> qui permettent de
|
2007-07-17 12:01:59 +02:00
|
|
|
|
mettre en forme des algorithmes, d'en faire une <20><>liste des
|
|
|
|
|
algorithmes<EFBFBD><EFBFBD> et de les rendre flottants (voir la page...). Je peux
|
2003-03-18 01:15:44 +01:00
|
|
|
|
encore utiliser mon propre package pour g<>rer ces cas, il suffit
|
2007-07-17 12:01:59 +02:00
|
|
|
|
d'introduire une option <20><>algo<67><6F> quand on a besoin des fonctionnalit<69>s
|
|
|
|
|
idoines. Voil<69> comment<6E>:</p>
|
2003-03-18 01:15:44 +01:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
<b>%% (...) \NeedsTeXFormat et \ProvidesPackage</b>
|
|
|
|
|
\newif\if@algo \@algofalse
|
|
|
|
|
\DeclareOption{algo}{\@algotrue}
|
|
|
|
|
\DeclareOption*{}<b>%% Ne rien faire quand une option est inconnue</b>
|
|
|
|
|
\ProcessOptions
|
|
|
|
|
|
|
|
|
|
\if@algo
|
|
|
|
|
\RequirePackage{algorithm}
|
|
|
|
|
\RequirePackage{algorithmic}
|
|
|
|
|
\RequirePackage{mes-commandes-algo}
|
|
|
|
|
\newcommand{\algorithme}{Blabla}
|
|
|
|
|
\fi
|
|
|
|
|
<b>%% (...) \newcommand's et \endinput</b>
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
La commande <code>\newif\if<i>quelquechose</i></code> cr<63>e trois
|
2007-07-17 12:01:59 +02:00
|
|
|
|
commandes<EFBFBD>:</p>
|
2003-03-18 01:15:44 +01:00
|
|
|
|
|
|
|
|
|
<ul>
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li><code><b>\if<i>quelquechose</i></b></code><3E> <20> utiliser ainsi (la
|
|
|
|
|
partie <20><>else<73><65> est facultative)
|
2003-03-18 01:15:44 +01:00
|
|
|
|
<pre>
|
|
|
|
|
\if<i>quelquechose</i>
|
|
|
|
|
<i>Code si oui</i>
|
|
|
|
|
\else
|
|
|
|
|
<i>Code si non</i>
|
|
|
|
|
\fi
|
|
|
|
|
</pre></li>
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li><code><b>\<i>quelquechose</i>true</b></code><3E>
|
|
|
|
|
<code>\if<i>quelquechose</i></code><3E> devient
|
|
|
|
|
<20>quivalent <20> <b>if true</b><3E>;</li>
|
|
|
|
|
<li><code><b>\<i>quelquechose</i>false</b></code><3E>
|
|
|
|
|
<code>\if<i>quelquechose</i></code><3E> devient
|
2003-03-18 01:15:44 +01:00
|
|
|
|
<20>quivalent <20> <b>if false</b>.</li>
|
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
<p>Dans notre exemple on cr<63>e une instruction conditionnelle
|
|
|
|
|
<code>\if@algo</code> qui est <20>quivalente <20> <b>if false</b> (<28> cause
|
2007-07-17 12:01:59 +02:00
|
|
|
|
de <code>\@algofalse</code>). Cependant, si l'option <20><>algo<67><6F> est
|
2003-03-18 01:15:44 +01:00
|
|
|
|
pass<EFBFBD>e au package, on ex<65>cute <code>\@algotrue</code> qui a pour effet
|
|
|
|
|
de rendre <code>\if@algo</code> <20>quivalent <20> <b>if true</b>. Les
|
|
|
|
|
packages relatifs <20> l'algo (et les commandes d<>finies dans le bloc)
|
2007-07-17 12:01:59 +02:00
|
|
|
|
seront charg<72>s si et seulement si l'option <20><>algo<67><6F> aura <20>t<EFBFBD> pass<73>e dans
|
|
|
|
|
le fichier <code>.tex</code><3E>:</p>
|
2003-03-18 01:15:44 +01:00
|
|
|
|
|
|
|
|
|
<ul>
|
|
|
|
|
<li>soit au niveau du <code>\usepackage</code>
|
|
|
|
|
<pre>
|
|
|
|
|
\documentclass[a4paper, dvips]{article}
|
|
|
|
|
\usepackage[<b>algo</b>]{mon_package}
|
|
|
|
|
\begin{document}
|
|
|
|
|
.
|
|
|
|
|
.
|
|
|
|
|
.
|
|
|
|
|
\end{document}
|
|
|
|
|
</pre></li>
|
|
|
|
|
<li>soit au niveau du <code>\documentclass</code>
|
|
|
|
|
<pre>
|
|
|
|
|
\documentclass[a4paper, dvips, <b>algo</b>]{article}
|
|
|
|
|
\usepackage{mon_package}
|
|
|
|
|
\begin{document}
|
|
|
|
|
.
|
|
|
|
|
.
|
|
|
|
|
.
|
|
|
|
|
\end{document}
|
|
|
|
|
</pre></li></ul>
|
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<p><b>Remarque<75>:</b> notons que dans les packages <20><>@<40><> est une lettre
|
|
|
|
|
(contrairement aux document <code>.tex</code> o<> <20><>@<40><> est un symbole)
|
|
|
|
|
et que donc on peut <20>crire des noms de commandes avec <20><>@<40><>. D'o<> les
|
2003-03-18 01:15:44 +01:00
|
|
|
|
noms <code>\makeatletter</code> et <code>\makeatother</code> utilis<69>es
|
|
|
|
|
dans des cas un peu exceptionnels. Dans un fichier <code>.tex</code>,
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<EFBFBD><EFBFBD><code>\if@algo</code><3E><> aurait <20>t<EFBFBD> interpr<70>t<EFBFBD>e comme la commande
|
|
|
|
|
<code>\if</code> suivie de <20><>@algo<67><6F>.</p>
|
2003-03-18 01:15:44 +01:00
|
|
|
|
|
|
|
|
|
<h2>Exemple moins simple, plus r<>aliste</h2>
|
|
|
|
|
|
|
|
|
|
<h3>Listing</h3>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
\NeedsTeXFormat{LaTeX2e}[1999/01/01]
|
|
|
|
|
\ProvidesPackage{mon_package}[2003/01/01]
|
|
|
|
|
|
|
|
|
|
\newif\if@algo \@algofalse
|
|
|
|
|
\newif\if@listings \@listingsfalse
|
|
|
|
|
|
|
|
|
|
\DeclareOption{listings}{\@listingstrue}
|
|
|
|
|
\DeclareOption{algo}{\@algotrue}
|
|
|
|
|
\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{babel}}
|
|
|
|
|
\ProcessOptions
|
|
|
|
|
|
|
|
|
|
\RequirePackage{babel}
|
|
|
|
|
|
|
|
|
|
\if@algo
|
|
|
|
|
\RequirePackage{algorithm}
|
|
|
|
|
\RequirePackage{algorithmic}
|
|
|
|
|
\RequirePackage{mes-commandes-algo}
|
|
|
|
|
\fi
|
|
|
|
|
|
|
|
|
|
\if@listings
|
|
|
|
|
\RequirePackage{listings}
|
|
|
|
|
\RequirePackage{verbatim}
|
|
|
|
|
\RequirePackage{moreverb}
|
|
|
|
|
\RequirePackage{mes-commandes-listings}
|
|
|
|
|
\fi
|
|
|
|
|
|
|
|
|
|
\endinput
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<h3>Explications</h3>
|
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<p>On d<>clare comme pr<70>c<EFBFBD>demment deux options <20><>normales<65><73><EFBFBD>:
|
2003-03-18 01:15:44 +01:00
|
|
|
|
<code>algo</code> et <code>listings</code> mais quand on est face <20>
|
2007-07-17 12:01:59 +02:00
|
|
|
|
une option inconnue on la passe <20> babel, ainsi<73>:</p>
|
2003-03-18 01:15:44 +01:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
\documentclass[a4paper]{article}
|
|
|
|
|
\usepackage[algo, listings, english, greek, francais]{mon_package}
|
|
|
|
|
\begin{document}
|
|
|
|
|
.
|
|
|
|
|
.
|
|
|
|
|
.
|
|
|
|
|
\end{document}
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
sera <20>quivalent <20> charger les modules d'algorithmiques, les modules de
|
|
|
|
|
d'<27>criture de programmes, et babel avec les options
|
|
|
|
|
<code>english</code>, <code>greek</code> et <code>francais</code>
|
|
|
|
|
(dans cet ordre). La commande <code>\PassOptionsToPackage<!--
|
|
|
|
|
-->{<options>}{<package>}</code> ne charge pas le package
|
|
|
|
|
<code><package></code>, elle rajoute les
|
|
|
|
|
<code><options></code> <20> la liste d'options qui seront pass<73>es
|
|
|
|
|
au package <code><package></code> lors de l'appel
|
|
|
|
|
<code>\RequirePackage{<package>}</code>.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<p>
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<b>Remarque<75>:</b> les options d<>clar<61>es avec
|
2003-03-18 01:15:44 +01:00
|
|
|
|
<code>\DeclareOption{...}{...}</code> peuvent <20>tre pass<73>es comme
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<em>options globales</em> du document comme dans<6E>:
|
2003-03-18 01:15:44 +01:00
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
\documentclass[a4paper, algo, listings]{article}
|
|
|
|
|
\usepackage[english, greek, francais]{mon_package}
|
|
|
|
|
\begin{document}
|
|
|
|
|
.
|
|
|
|
|
.
|
|
|
|
|
.
|
|
|
|
|
\end{document}
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
En revanche les langages doivent <20>tre pass<73>s au package lui-m<>me
|
2007-07-17 12:01:59 +02:00
|
|
|
|
(notamment babel n'a pas tent<6E> de trouver un langage nomm<6D> <20><>a4paper<65><72>
|
2003-03-18 01:15:44 +01:00
|
|
|
|
ce qui aurait abouti <20> une erreur).
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<h3>Limitations</h3>
|
|
|
|
|
|
|
|
|
|
<p>D'une part on ne peut pas utiliser ce m<>canisme pour plusieurs
|
|
|
|
|
packages auquel on passerait les options non d<>clar<61>es avec
|
|
|
|
|
<code>\DeclareOption{...}{...}</code> et d'autre part on ne peut pas
|
|
|
|
|
s'abstenir de passer au moins une option de langage au package.</p>
|
|
|
|
|
|
|
|
|
|
<h2>Exemple (tr<74>s) compliqu<71></h2>
|
|
|
|
|
|
|
|
|
|
<h3>Pr<50>requis</h3>
|
|
|
|
|
|
|
|
|
|
<ul>
|
|
|
|
|
|
|
|
|
|
<li>Avoir lu la doc du package <code>keyval</code> de David Carliste (ou
|
2007-07-17 12:01:59 +02:00
|
|
|
|
peut-<2D>tre prochainement une page tuteurs <20> ce sujet)<29>;</li>
|
2003-03-18 01:15:44 +01:00
|
|
|
|
|
|
|
|
|
<li> <code><b>\@ifundefined{commande}<!--
|
2007-07-17 12:01:59 +02:00
|
|
|
|
-->{<then>}{<else>}</b></code><3E>: si
|
2003-03-18 01:15:44 +01:00
|
|
|
|
<code>\commande</code> (avec le backslash contrairement <20> l'argument
|
|
|
|
|
de <code>\@ifundefined</code>) n'est pas d<>finie alors ex<65>cute
|
|
|
|
|
<code><then></code> sinon ex<65>cute
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<code><else></code> (LaTeX interne)<29>;</li>
|
2003-03-18 01:15:44 +01:00
|
|
|
|
|
|
|
|
|
<li> <code><b>\PackageWarning{<package>}<!--
|
2007-07-17 12:01:59 +02:00
|
|
|
|
-->{<texte>}</b></code><3E>: produit un warning lors de la
|
|
|
|
|
compilation (par opposition <20> <code>\PackageError{...}{...}</code>)<29>;</li>
|
2003-03-18 01:15:44 +01:00
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<li> <code><b>\CurrentOption</b></code><3E>: l'option en cours de
|
|
|
|
|
traitement<6E>;</li>
|
2003-03-18 01:15:44 +01:00
|
|
|
|
|
|
|
|
|
<li>le reste c'est du TeX, donc il ne vaut mieux pas s'attarder
|
|
|
|
|
dessus.</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
<h3>Listing g<>n<EFBFBD>ral</h3>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
\NeedsTeXFormat{LaTeX2e}[1999/01/01]
|
|
|
|
|
\ProvidesPackage{mon_package}[2003/01/01]
|
|
|
|
|
\RequirePackage{keyval}
|
|
|
|
|
|
|
|
|
|
<b>%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
|
|
|
% Pour g<>rer les deux types d'options : %
|
|
|
|
|
% 1. les options normales (\DeclareOption{...}{...}) %
|
|
|
|
|
% 2. les options type key-val option=value (\define@key{...}{...}{...}) %
|
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%</b>
|
|
|
|
|
\@ifundefined{my@unusedlist}{<b>%</b>
|
|
|
|
|
\let\my@unusedlist\@empty}{}
|
|
|
|
|
\@ifundefined{my@extractkey}{<b>%</b>
|
|
|
|
|
\def\my@extractkey#1=#2\my@extractkey{#1}}{}
|
|
|
|
|
\newcommand{\ProcessUnusedOptions}[1]{<b>%</b>
|
|
|
|
|
\let\my@tempa\@empty
|
|
|
|
|
\let\my@tempb\@empty
|
|
|
|
|
\@for\CurrentOption:=\my@unusedlist\do{<b>%</b>
|
|
|
|
|
\expandafter\expandafter\expandafter\def
|
|
|
|
|
\expandafter\expandafter\expandafter\my@key
|
|
|
|
|
\expandafter\expandafter\expandafter{<b>%</b>
|
|
|
|
|
\expandafter\my@extractkey\CurrentOption=\my@extractkey}<b>%</b>
|
|
|
|
|
\@ifundefined{KV@#1@\my@key}{<b>%</b>
|
|
|
|
|
\edef\my@tempa{\my@tempa,\CurrentOption,}}{<b>%</b>
|
|
|
|
|
\edef\my@tempb{\my@tempb,\CurrentOption,}}}<b>%</b>
|
|
|
|
|
\@for\CurrentOption:=\my@tempa\do{<b>%</b>
|
|
|
|
|
\ifx\CurrentOption\@empty\else
|
|
|
|
|
\PackageWarning{mypack}{`\CurrentOption' not defined.}\fi}<b>%</b>
|
|
|
|
|
\edef\my@tempb{<b>%</b>
|
|
|
|
|
\noexpand\setkeys{#1}{\my@tempb}}<b>%</b>
|
|
|
|
|
\my@tempb
|
|
|
|
|
\AtEndOfPackage{\let\@unprocessedoptions\relax}}
|
|
|
|
|
|
|
|
|
|
\DeclareOption*{<b>%</b>
|
|
|
|
|
\expandafter\expandafter\expandafter\def
|
|
|
|
|
\expandafter\expandafter\expandafter\my@unusedlist
|
|
|
|
|
\expandafter\expandafter\expandafter{<b>%</b>
|
|
|
|
|
\expandafter\my@unusedlist\expandafter,<b>%</b>
|
|
|
|
|
\CurrentOption}}
|
|
|
|
|
<b>%%%%%%%%%%%%%%%
|
|
|
|
|
% Fin du bloc %
|
|
|
|
|
%%%%%%%%%%%%%%%</b>
|
|
|
|
|
|
|
|
|
|
<b>%% Options <20>normales<65></b>
|
|
|
|
|
\DeclareOption{foo}{<action foo>}
|
|
|
|
|
\DeclareOption{bar}{<action bar>}
|
|
|
|
|
|
|
|
|
|
<b>%% Options pass<73>es sous forme key=val</b>
|
|
|
|
|
\define@key{mypack}{<key1>}{<action 1> d<>pendant de #1}
|
|
|
|
|
\define@key{mypack}{<key2>}[<default>]<!--
|
|
|
|
|
-->{<action 2> d<>pendant de #1}
|
|
|
|
|
|
|
|
|
|
\ProcessOptions
|
|
|
|
|
\ProcessUnusedOptions{mypack}
|
|
|
|
|
|
|
|
|
|
\endinput
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<h3>Explications</h3>
|
|
|
|
|
|
|
|
|
|
<p>Dans l'exemple suivant</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
\documentclass[foo]{article}
|
|
|
|
|
\usepackage[foo, key1=value1, key2=value2]{mypack}
|
|
|
|
|
\begin{document}
|
|
|
|
|
.
|
|
|
|
|
.
|
|
|
|
|
.
|
|
|
|
|
\end{document}
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p>l'option <code>foo</code> va agir comme dans les exemples simples,
|
|
|
|
|
<code>key1=value1</code> va ex<65>cuter le code <code><action 1></code>
|
|
|
|
|
en utilisant <code>value1</code> en lieu et place de <code>#1</code>. Idem
|
|
|
|
|
pour <code>key2=value2</code> sauf que on peut omettre la partie
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<EFBFBD><EFBFBD><code>=value2</code><3E><> auquel cas <code><action 2></code> est ex<65>cut<75>
|
2003-03-18 01:15:44 +01:00
|
|
|
|
en utilisant <code><default></code> <20> la place de <code>#1</code>.
|
2007-07-17 12:01:59 +02:00
|
|
|
|
Par exemple si <code>mon_package.sty</code> contient<6E>:</p>
|
2003-03-18 01:15:44 +01:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
<b>%% (...) </b>
|
|
|
|
|
\newcounter{nombre}
|
|
|
|
|
\define@key{mypack}{number}[14]{%
|
|
|
|
|
\setcounter{nombre}{#1}}
|
|
|
|
|
<b>%% (...) </b>
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p>on pourra l'appeler ainsi</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
\documentclass[foo]{article}
|
|
|
|
|
\usepackage[number=10]{mypack}
|
|
|
|
|
\begin{document}
|
|
|
|
|
.
|
|
|
|
|
\thenombre\ affiche 10.
|
|
|
|
|
.
|
|
|
|
|
.
|
|
|
|
|
\end{document}
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p>ou encore comme cela</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
\documentclass[foo]{article}
|
|
|
|
|
\usepackage[number]{mypack}
|
|
|
|
|
\begin{document}
|
|
|
|
|
.
|
|
|
|
|
\thenombre\ affiche 14.
|
|
|
|
|
.
|
|
|
|
|
.
|
|
|
|
|
\end{document}
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p>ou bien s<>r sans option du tout (auquel cas le code
|
|
|
|
|
<code>\setcounter</code> ne sera pas ex<65>cut<75> et donc le compteur
|
|
|
|
|
<code>nombre</code> vaudra z<>ro).</p>
|
|
|
|
|
|
|
|
|
|
<h3>Exemple d'application</h3>
|
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<p>Si <code>mon_package</code> contient<6E>:</p>
|
2003-03-18 01:15:44 +01:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
\newcommand{\pack@languages}{francais}
|
|
|
|
|
\define@key{mypack}{language}{%
|
|
|
|
|
\renewcommand{\pack@languages}{#1}}
|
|
|
|
|
\RequirePackage[\pack@languages]{babel}
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p>alors on peut l'appeler ainsi</p>
|
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
\documentclass[a4paper]{article}
|
|
|
|
|
\usepackage[<b>language={english, francais}</b>]{mon_package}
|
|
|
|
|
\newcommand{\option}{\texttt}
|
|
|
|
|
\begin{document}
|
|
|
|
|
.
|
|
|
|
|
\paragraph{Remarque}
|
|
|
|
|
Noter les accolades pour que l'option \option{francais} ne soit pas
|
|
|
|
|
pass<EFBFBD>e comme une option <20> part.
|
|
|
|
|
.
|
|
|
|
|
.
|
|
|
|
|
\end{document}
|
|
|
|
|
</pre>
|
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<p>ou encore ainsi<73>:</p>
|
2003-03-18 01:15:44 +01:00
|
|
|
|
|
|
|
|
|
<pre>
|
|
|
|
|
\documentclass[a4paper]{article}
|
|
|
|
|
\usepackage{mon_package}
|
|
|
|
|
\newcommand{\option}{\texttt}
|
|
|
|
|
\begin{document}
|
|
|
|
|
.
|
|
|
|
|
Babel charg<72> avec l'option \option{francais}.
|
|
|
|
|
.
|
|
|
|
|
.
|
|
|
|
|
\end{document}
|
|
|
|
|
</pre>
|
|
|
|
|
|
|
|
|
|
<p>
|
|
|
|
|
L<EFBFBD> encore les options de langages ne pourront pas <20>tre sp<73>cifi<66>es
|
|
|
|
|
globalement avec la commande <code>\documentclass</code>. (La raison en est
|
|
|
|
|
que les options globales qui ne correspondent pas <20> des options d<>clar<61>es
|
|
|
|
|
avec <code>\DeclareOption</code> ne sont pas transmises <20>
|
|
|
|
|
<code>\DeclareOption*</code>.)
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<h2>Utiliser son package</h2>
|
|
|
|
|
|
|
|
|
|
<p>Le package <code>mon_package</code> doit pouvoir <20>tre trouv<75> par LaTeX,
|
2007-07-17 12:01:59 +02:00
|
|
|
|
pour cela on peut<75>:</p>
|
2003-03-18 01:15:44 +01:00
|
|
|
|
|
|
|
|
|
<ul>
|
|
|
|
|
<li>mettre le fichier <code>mon_package</code> dans le m<>me r<>pertoire que
|
2007-07-17 12:01:59 +02:00
|
|
|
|
les fichier <code>.tex</code> qui l'utilisent<6E>;</li>
|
2003-03-18 01:15:44 +01:00
|
|
|
|
<li>mettre le fichier dans un r<>pertoire de son compte (par exemple
|
|
|
|
|
<code>~/texmf/tex/latex/perso/</code> et cr<63>er la variable d'environnement
|
|
|
|
|
<code>export TEXINPUTS=$HOME/texmf//:</code> (certaines distributions
|
|
|
|
|
permettent de cr<63>er un fichier ls-R gr<67>ce <20> la commande
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<code>texhash</code>)<29>;</li>
|
2003-03-18 01:15:44 +01:00
|
|
|
|
<li>si l'on est root sur sa machine on peut le mettre dans l'arborescence
|
|
|
|
|
texmf classique (mais <20>a ne facilite pas des upgrades des distributions
|
|
|
|
|
LaTeX) et ex<65>cuter la commande <code>mktexlsr</code>.</li>
|
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
<h2>Documentation et aide</h2>
|
|
|
|
|
|
|
|
|
|
<p>Pour une documentation concernant l'<27>criture de classe et de
|
2007-07-17 12:01:59 +02:00
|
|
|
|
packages<EFBFBD>: <code>clsguide</code> (<28> noter <20>galement les documentations
|
|
|
|
|
<code>fntguide</code>, <code>usrguide</code>)<29> pour une documentation
|
|
|
|
|
g<EFBFBD>n<EFBFBD>rale sur LaTeX<65>: <code>source2e</code> ou plus soft <em>The not so
|
|
|
|
|
short introduction to LaTeX</em> (disponible en fran<61>ais<69>!).</p>
|
2003-03-18 01:15:44 +01:00
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<p>Sur internet<65>: <a href="http://www.ctan.org/">CTAN</a>, les
|
2003-03-18 01:15:44 +01:00
|
|
|
|
newsgroup <code>fr.comp.text.tex</code> et <code>comp.text.tex</code> sur
|
|
|
|
|
lesquels on peut faire une recherche <em>via</em> Google. Par
|
2007-07-17 12:01:59 +02:00
|
|
|
|
exemple<EFBFBD> comment r<>aliser le symbole <20><>1<EFBFBD><31> avec une double
|
|
|
|
|
barre pour d<>signer une fonction indicatrice<63>? La r<>ponse se trouve
|
|
|
|
|
sur Google, groupes et taper <20><><code>group:fr.comp.text.tex 1 barre
|
|
|
|
|
indicatrice</code><3E><>. C'est une source d'informations in<69>puisable.
|
2003-03-18 01:15:44 +01:00
|
|
|
|
Sinon les tuteurs ou forum <code>ens.forum.informatique.tex</code>.</p>
|
|
|
|
|
|
2007-07-17 12:01:59 +02:00
|
|
|
|
<div class="metainformation"> Auteur<75>: Josselin Noirel. Derni<6E>re
|
|
|
|
|
modification le <date value="$Date: 2007-07-17 10:02:52 $"/>.
|
|
|
|
|
</div>
|
2003-03-18 01:15:44 +01:00
|
|
|
|
|
|
|
|
|
</body>
|
|
|
|
|
</html>
|