diff --git a/.gitignore b/.gitignore index fd4aa79..01dbb1b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ *.aux +*.bbl +*.blg *.log *.nav *.out diff --git a/intro/88x31.png b/intro/88x31.png new file mode 100644 index 0000000..f0a944e Binary files /dev/null and b/intro/88x31.png differ diff --git a/intro/README b/intro/README new file mode 100644 index 0000000..fc4adfd --- /dev/null +++ b/intro/README @@ -0,0 +1,6 @@ +Pour formatter: + +pdflatex intro +bibtex intro +pdflatex intro +pdflatex intro diff --git a/intro/alex_20130316-crop.jpg b/intro/alex_20130316-crop.jpg new file mode 100644 index 0000000..be55e5c Binary files /dev/null and b/intro/alex_20130316-crop.jpg differ diff --git a/intro/intro.bib b/intro/intro.bib new file mode 100644 index 0000000..36e9de8 --- /dev/null +++ b/intro/intro.bib @@ -0,0 +1,37 @@ +@conference{bortzmeyer2011, +author = {S. Bortzmeyer}, +year = 2011, +title = {« Derrière la scène : comment et grâce à qui l'Internet fonctionne t-il ?}, +booktitle = {Capitole du libre}, +note = {\url {http://www.bortzmeyer.org/derriere-scene.html}} +} + +@misc{amsix2013, +author = {Henk Steenman}, +year = 2013, +title = {The Role of IXP in the internet, AMS-IX in particular}, +note = {\url {https://www.os3.nl/_media/2012-2013/courses/inr/role_of_ixps_en_overview_ams-ix_uva_2013.pdf}} +} + +@misc{spyou2013, +author = {Bruno Spiquel}, +year = 2013, +title = {Fabriquer son Internet}, +note = {\url {http://blog.spyou.org/wordpress-mu/2013/03/20/fabriquer-son-internet/}} +} + +@misc{taziden2013, +author = {Julien Rabier}, +year = 2013, +title = {Une liberté de surfer}, +howpublished = {Conférence TEDx Bordeaux}, +note = {\url {http://www.youtube.com/watch?v=izwFkHbgK-s}} +} + +@techreport{brun2014, +author = {Olivier Brun}, +year = 2014, +institution = {Tetaneutral.net}, +title = {{A}rchitecture et {C}onfiguration du {R}éseau d'{A}ccès à +{I}nternet de {M}auvaisin}, +} diff --git a/intro/intro.tex b/intro/intro.tex new file mode 100644 index 0000000..4d75729 --- /dev/null +++ b/intro/intro.tex @@ -0,0 +1,477 @@ +\documentclass[11pt]{ttnn} +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage{lmodern} +\usepackage[french]{babel} +\usepackage{hyperref} +\usepackage{graphicx} +\usepackage{eurosym} + +\title{Construire son propre fournisseur d'accès internet} +\author{Tetaneutral.net} +\date{Avril 2014} + +\begin{document} +\maketitle + +\begin{abstract} +Ce document présente la démarche administrative et technique qui +permet de créer un fournisseur d'accès associatif, par exemple pour +couvrir une zone blanche ADSL dans les endroits (une bonne proportion +du territoire) délaissés par les opérateurs traditionnels parce que +non rentable pour eux. + +Il s'appuie sur l'expérience de l'association Tetaneutral,net qui +opère un tel réseau à Toulouse, Saint-Gaudens, Mones et Mauvaisin en +Haute-Garonne ainsi que sur des documents de la Fédération French Data +Network\footnote{\url{http://www.ffdn.org/}}, qui regroupe de nombreux +fournisseurs d'accès associatifs français. +\end{abstract} + +\section*{Introduction} +Pour faire son propre fournisseur d'accès internet il faut cinq +ressources principales : +\begin{itemize} +\item des bénévoles pour mettre en place et faire vivre le truc, +\item un statut juridique (association 1901 + déclaration ARCEP), +\item des adresses IP, +\item un moyen pour ces adresses IP d'accéder à l'internet, +\item un moyen de connecter les adhérents à l'accès internet ci-dessus. +\end{itemize} + +Les bénévoles, il y a plein de manières de les trouver et de les +motiver. Dans une zone blanche ou très mal desservie par les +fournisseurs classiques, il suffit de se faire connaître un peu pour +en trouver plein qui seront prêts à aider en échange de la possibilité +d'une meilleure connexion au réseau des réseaux. + +Pour les associations membres de la FFDN, l'aspect bénévole et citoyen +de la démarche est très important. Le réseau internet est une ressource +considérée comme un bien commun de l'humanité, son appropriation par +de grandes multinationales qui tentent de le contrôler et de le +détourner à leur profit, sans compter la surveillance excercée par les +gouvernements sont simplement inacceptables~\cite{taziden2013}. + +En plus de combler un manque (la couverture des zones blanches), la +création de fournisseurs d'accès associatifs est également un moyen de +défendre et de promouvoir un internet plus libre et plus égalitaire et +de s'approprier les technologies utilisées. + +Pour les quatre autres types de ressources, plus techniques, nous +allons décrire sommairement les solutions dans la suite ce ce +document. Un certain nombre de documents plus détaillés sont +disponibles dans la bibliographie pour permettre d'approfondir les +sujets. + +\section{Le statut de fournisseur d'accès} + +Pour être fournisseur d'accès internet, un simple enregistrement +auprès de l'ARCEP suffit. Les démarchent indispensables se limitent +donc à +\begin{itemize} +\item créer une structure légale, une association loi 1901 a + priori. (Mais on peut envisager d'autres statuts pour des cas + particuliers) +\item remplir la déclaration auprès de l'ARCEP. +\end{itemize} + +Ensuite il peut être intéressant de faire d'autres démarches pour se +faciliter la vie : % XXX autres utilités ? +\begin{itemize} +\item ouvrir un compte bancaire au nom de + l'association. Tetaneutral.net utilise les services du Crédit + Coopératif destinés aux associations. Ils permettent de gérer toutes + les cotisations et les abonnements aux services par prélèvement, ce + qui simplifie le travail du trésorier. Il est également possible de + disposer d'une carte bancaire pour régler des achats de matériel en + ligne au nom de l'association. +\item obtenir de numéros INSEE et SIREN, pour simplifier les + relations commerciales avec les fournisseurs professionnels. Pas + utile pour les achats en ligne. +\end{itemize} + +\subsection*{Devoirs du FAI} + +La principale obligation légale d'un fournisseur d'accès internet est +d'être en mesure de fournir sur demande aux autorités de police ou de +justice l'identité d'un abonné au service, à une heure donnée à partir +de son adresse IP. + +Le plus simple est d'être capable d'attribuer une adresse IP publique +fixe à chaque adhérent. On a ainsi une correspondance relativement +stable via le fichier des adhérents, sans être obligés de garder des +traces en temps réel d'un système d'allocation dynamique des +adresses IP ou de traduction d'adresses (plus connu sous le nom de +NAT). + +Le fichier des adhérents doit faire l'objet d'une déclaration +simplifiée à la CNIL\footnote{Commision Nationale Informatique et + Libertés, \url{http://www.cnil.fr/}}, comme pour toute association. + +La loi « informatique et libertés » et le code des +télécommunications, imposent à l'association de protéger les données +concernant la vie privée de ses adhérents en sécurisant ses serveurs +et les procédures liées à la gestion des adhérents et des services qui +leur sont fournis. + +Il est souhaitable de rédiger (ou de copier sur un FAI associatif +existant) une charte d'utilisation des services qui précisera les +droits et les devoirs des uns et des autres. Elle pourra notamment +rappeler que les services sont assurés par des bénévoles, et qu'il ne +peut donc pas y avoir d'engagement quantitatif sur la qualité ou la +disponibilité du service. + +\section{Obtenir des adresses IP} + +Comme on l'a vu ci-dessus, l'adresse IP va être en quelque sorte +l'identifiant des adhérents sur le réseau. Les adresses IP publiques +doivent être uniques au niveau mondial, et il existe donc un mécanisme +pour les allouer aux différents fournisseurs d'accès +internet~\cite{bortzmeyer2011}. + +Pour un nouveau fournisseur d'accès qui se crée, le plus simple pour +commencer c'est de trouver un fournisseur existant qui serait prêt à +louer ou à prêter gratuitement une partie des adresses IP qu'il +n'utilise pas. + +L'autre solution est de contacter directement un LIR (Local Internet +Registrery) pour monter un dossier afin d'obtenir sa propre plage +d'adresses IP. Cette approche est plus complexe parce qu'il faut +argumenter sa demande, en montrant que le besoin est réel, ce qui peut +poser un problème de poule et d'\oe{}uf pour une nouvelle structure qui +démarre. + +Le coût des adresses IP est entre 10 et \EUR{20} par an et par adresse +IP. + +\subsection*{Pénurie d'adresses IPv4} + +Depuis le début, l'Internet utilise principalement la version 4 du +protocole IP\footnote{\emph{Internet Protocol}, tout simplement}, +qui se reconnaît facilement au format des adresses utilisées : +elles sont exprimées sous forme de quatre nombres entre 0 et 256, +séparés par des points. Par exemple 192.9.201.54 est une adresse IP version 4 ou +IPv4. + +Ces quatre nombres entre 0 et 256 (quatre \emph{octets}) permettent de +construire environ quatre milliards d'adresses IPv4. L'internet +mondial ayant beaucoup grossi, l'ensemble des adresses possibles est +presque complètement alloué. Il devient donc difficile pour les +nouveaux fournisseurs d'accès d'obtenir de nouvelles adresses IPv4. + +Mais au moment où ce document est écrit, et en raison des contraintes +légales exprimées ci-dessus, il est préférable de se débrouiller pour +avoir encore une adresse IPv4 publique par adhérent que l'on souhaite +connecter. + +\subsection*{Préparer le futur : IPv6} + +La version 6 du protocole IP (ou IPv6), qui existe depuis près de +vingt ans résout (entre autres) ce problème de pénurie des adresses +IP, grâce à l'utilisation d'un espace beaucoup plus grand (deux +puissance 128 adresses différentes sont possible, ce qui est +monstrueusement gigantesque). Mais ce «\,nouveau\,» protocole tarde à +s'imposer. Pour déployer le réseau pour le grand public, on ne peut +pas se passer d'utiliser encore IPv4. + +Néanmoins, il est souhaitable d'obtenir aussi, au moment de démarrer +un nouveau FAI des adresses IPv6 pour préparer le futur. En raison de +leur abondance, il est beaucoup plus facile d'obtenir des adresses +IPv6 auprès de l'organisme qui aura fourni les IPv4. + +La fédération FFDN peut aider à trouver la meilleure solution +pour trouver une plage d'adresses IP disponibles en fonction du projet +(nombre d'adhérents prévu, localisation,... ) + +\begin{figure}[hb] +%\vspace{1em} +\includegraphics[width=\textwidth]{reseau-wifi-chanteix} +\caption{Exemple de déploiement: Illico en Corrèze} +\end{figure} + +\section{Connexion à l'internet} + +Pour redistribuer des accès au réseau internet, il faut commencer par +en avoir un. Comme on n'a pas une seule adresse IP à connecter, mais +toute une collection, les moyens de connexion à l'internet des +particuliers ne suffisent pas. Il faut avoir les outils pour +\emph{router} la plage d'adresse IP des adhérents vers le reste du +réseau. + +La solution normale consiste à trouver un prestataire de services +(datacenter, opérateur pro, ou structure associative) qui va permettre +d'héberger un routeur (un PC avec le logiciel adapté fait l'affaire) +qui va se charger du travail et fournir (moyennant paiement) la +connexion au réseau. + +La fédération FFDN est à nouveau très utile pour aider les nouveaux à +trouver la meilleure solution. + +\subsection*{Routage} + +La solution normale pour faire arriver le trafic internet sur les +adresses IP de l'association c'est de créer un nouveau \emph{système + autonome}, ou AS (\emph{Autonomous System} en anglais) et de faire +en sorte qu'il soit annoncé aux autres opérateurs sur l'internet via +le protocole de routage BGP (\emph{Border Gateway Protocol}), qui est +le protocole utilisé pour connecter entre eux tous les AS de +l'internet. + +Le routeur du nouveau FAI peut être un simple PC sous Linux et c'est +le logiciel \emph{Bird} qui sera alors utilisé pour faire cette +connexion. + +Ici encore l'aide des autres associations membre de FFDN va être très +utile pour obtenir le numéro d'AS et configurer le logiciel de routage +Bird. + +Il est aussi possible, pour un petit déploiement initial, de trouver un +partenaire disposé à assurer la fonction de routage en +incluant ces adresses IP dans son propre AS et en routant le trafic +statiquement vers votre routeur (et c'est encore plus simple si c'est +le partenaire qui a fourni les adresses). + +\subsection*{Transit et Peering} + +L'échange de trafic avec les autres AS de l'internet peut se faire de +deux manières : soit par du \emph{transit} (payant) assuré par des +prestataires commerciaux, soit par du \emph{peering} (généralement +gratuit) avec d'autres AS sur des \emph{points d'échange} internet. + +Il existe des points d'échange internet dans les grandes villes de +France (FranceIX à Paris, Lyonix à Lyon, TouIX à Toulouse, etc...). Ce +sont des structures associatives qui pourront aussi aider et donner des +conseils pour établir les premiers peerings d'un nouveau réseau. +\cite{bortzmeyer2011} \cite{amsix2013} + +\section{Connexion des adhérents} + +\begin{figure}[h] +\centerline{\includegraphics[width=.6\textwidth]{alex_20130316-crop}} +\caption{Relais radio sur les toits de Toulouse} +\end{figure} + +La dernière étape est le raccordement du routeur qui gérera l'accès du +nouveau fournisseur d'accès à l'internet aux adhérents. + +Les fournisseurs d'accès internet associatifs de FDN utilisent pour +cela principalement deux techniques : +\begin{itemize} +\item une connexion ADSL des adhérents via un réseau de collecte d'un + prestataire commercial (Nerim dans le cas de FDN et de + Tetaneutral.net). Cette solution n'est cependant pas très + intéressante : elle nécessite que l'adhérent se trouve dans une zone + avec une bonne desserte ADSL (donc pas dans une zone blanche), ou il + peut aussi bénéficier des offres ADSL traditionnelles. Les tarifs + que peut proposer un FAI associatif pour couvris ses frais ne sont + pas concurrentiels, et il ne pourra pas offrir pas défaut tous les + services connexes (télévision, téléphone,..) + + Le raccordement en ADSL est donc réservé aux militants de l'internet + neutre et libre qui sont prêts à faire un sacrifice financier pour + soutenir un projet associatif et ne pas dépenser leur argent + directement avec les opérateurs traditionnels. + +\item pour desservir les zones blanches (ou non) on utilise alors une + technologie radio basse puissance, dans la bande de fréquence autour + de 5.5 GHz utilisant une technologie de type Wifi. L'utilisation + d'antennes semi-directionnelles ou de petites paraboles + directionnelles (jusqu'à 40cm de diamètre) permet de couvrir des + distances jusqu'à une quinzaine de kilomètres pour des débits + symétriques entre 10 et 100 Mbits/seconde. + + La principale contrainte de cette technologie est que dans la bande + de fréquences utilisée, le signal ne traverse pas les obstacles + (bâtiments, arbres, collines,...). Il faut donc que les points à + connecter soient en vue directe, ou alors il faut trouver un point + relais intermédiaire. + +\end{itemize} + +Dans ce qui suit, on s'intéressera uniquement au déploiement du réseau +en radio. Un guide pratique pour le déploiement radio qui détaille les +points ci-dessous a été rédigé par les adhérents à Tetaneutral.net de +Mauvaisin~\cite{brun2014}. + +\subsection*{Topologie du réseau} + +Le réseau radio doit connecter tous les adhérents, soit en constituant +un seul réseau en étoile ou en arbre à partir d'un point central de +collecte (le routeur de l'association), soit en via plusieurs arbres, +connectés au point central par des tunnels. + +une paire d'antennes Wifi se comporte comme un câble Ethernet. On +construit donc une topologie similaire à celle d'un réseau Ethernet +classique : il ne faut pas faire de boucle et connecter tout le +monde. On obtient alors une topologie en arbre. + +Les antennes peuvent être soit des points d'accès, soit des +stations. Un point d'accès permet de connecter plusieurs stations +alors qu'une station se connecter à un point d'accès unique. + +Sur les liens à plusieurs relais, on alterne donc des points d'accès +et des stations connectés alternativement en radio et via des +connexions filaires classiques (câble Ethernet simple ou bien +commutateur). + +Les antennes sont configurées en mode pont Ethernet. Un réseau radio +se comporte donc comme un grand commutateur qui connecte tous les +adhérents au routeur. + +\subsection*{Utilisation de tunnels} + +Dans bien des cas, le routeur du fournisseur d'accès ne se trouve pas +dans un endroit pratique pour y connecter directement des adhérents en +radio. + +On va alors rechercher un point intermédiaire, disposant d'une +connexion internet à haut débit (ADSL, VDSL ou fibre optique) que l'on +connectera au routeur via un tunnel au dessus de cette connexion +internet « classique » + + +\subsection*{La box chez l'adhérent} + +Pour terminer chaque adhérent a besoin d'une « box » pour recevoir sa +connexion et la redistribuer dans son logement (soit en Wifi, soit via +un petit commutateur pour distribuer un réseau filaire sur les +ordinateurs de la maison. + +La pratique de tetaneutral.net est de fournir à chaque adhérent un +petit routeur Wifi pré-configuré, avec, du coté du réseau radio +l'adresse IP publique de l'adhérent et qui distribue en interne un +réseau IP privé à l'aide du mécanisme de NAT. + + +\section{Services supplémentaires} + +Une fois l'ensemble du dispositif décrit ci-dessus déployé, le +fournisseur d'accès est opérationnel. Il peut néanmoins être utile de +mettre en place un certain nombre de services supplémentaires pour +pouvoir contrôler le bon fonctionnement du réseau et simplifier +certaines opérations de maintenance. + +\subsection*{Serveur de noms} +Il est très utile de réserver un nom de domaine (par +ex. tetaneutral.net) pour l'association pour associer les adresses IP +à des noms et rendre visible les serveurs de l'association + +Le nom de domaine de l'association sera acheté chez un prestataire +spécialisé (par Gandi), et le serveur DNS peut être géré soit chez le +prestataire, soit sur une machine du réseau de l'association qui +restera allumée en permanence, à l'aide du logiciel \emph{bind}. + +Le serveur de noms peut déléguer aux adhérents qui le souhaitent le +choix du nom utilisé pour la résolution inverse (trouver le nom à +partir de l'adresse) de leur adresse IP. Celui-ci peut correspondre à +leur propre nom de domaine s'ils en ont un (genre dupond.fr). + +Enfin le serveur de nom pourra être utilisé par les PCs des adhérents +via la configuration automatique des paramêtres réseau qui sera +fournie par leur box. + +\subsection*{Serveur web} + +Un serveur web permet de faire connaître l'association et de mettre en +place des outils tels qu'un formulaire de contact, des forums de +discussion ou d'entraide, un blog, etc. + + +Le serveur en question peut être hébergé par l'association elle-même +sur un PC connecté à son réseau (il utilisera alors une adresse IP de +l'association) ou bien être hébergé soit par une association amie de +FFDN, soit par un hébergeur de contenus classique (OVH, Gandi... ) + +\subsection*{Supervision du réseau} + +Normalement tous les opérateurs de réseau ont un logiciel de +supervision qui recueille en permanence des données sur l'ensemble des +équipements (routeur, antennes, commutateurs,...) pour s'assurer de +leur bon fonctionnement et éventuellement collecter des statistiques +sur l'utilisation des différentes ressources. + +Tetaneutral.net utilise les logiciels Nagios +et Check\_MK qui tournent sur un PC Linux qui fonctionne en +permanence. Une interface web permet de consulter l'état du réseau et +d'afficher des graphes de trafic. Nagios peut aussi produire des +alertes et prévenir via SMS ou émail l'équipe des bénévoles en cas de +défaillance ou de problème sur un équipement du réseau. + + +\subsection*{Messagerie ?} + +Les fournisseurs d'accès traditionnels proposent presque tous un +service de messagerie, avec des adresses du type nom@fournisseur.com. +Un fournisseur associatif peut choisir d'offrir également ce +service. Mais ce n'est pas indispensable et avant de décider de +l'offrir, il faut avoir en tête un certain nombre de contraintes, +sachant que ce type de service est plutôt plus difficile à configurer +et à gérer que la partie accès internet. + +\begin{itemize} +\item responsabilité : les services de messagerie sont régis par le +code des télécommunications qui garanti la confidentialité des +messages et rend l'opérateur responsable. C'est donc à l'opérateur de +sécuriser ses serveurs. +\item disponibilité : un service de messagerie doit fonctionner 24h/24 + et les utilisateurs sont peu tolérants face à un service peu fiable. +\end{itemize} + +Pour information, Tetaneutral.net a choisi explicitement de ne pas +fournir de service de messagerie à ses adhérents. + +\section{Coûts} + +Avant de se lancer dans l'aventure, il vaut mieux commencer par +établir un budget prévisionnel, afin de savoir où on va au niveau +financier. + +L'ensemble des prestations payantes (adresses IP, transit, présence +dans un datacenter, nom de domaine,...) représente une somme +récurrente dont une partie est fixe et l'autre dépend du nombre de +foyers connectés et du trafic réseau. + +À cela il faut ajouter un investissement initial (achat d'un routeur +(une configuration de PC basique autour de \EUR{400} peut faire +l'affaire, des équipements radio (entre \EUR{50} et \EUR{100} par +antenne et des routeurs des adhérents (environ \EUR{25}, plus divers +petits matériels pour fixer les antennes,.... qu'il faut amortir avec +les cotisations des adhérents. + +Dans le cas de Tetaneutral.net, un prêt d'un des co-fondateurs de +l'association a rendu possible +l'investissement initial. Ensuite, en raison du succès de +l'association, une redevance mensuelle comprise entre 20 et \EUR{30} +permet à l'association de couvrir les frais récurrent et a permi de +rembourser en deux ans le prêt initial. Le détail du bilan financier +mensuel de Tetaneutral.net est publié sur le site web de +l'association. + +\section*{Conclusion} + +L'environnement juridique qui encadre la fourniture d'accès à Internet +en France est relativement léger et permet facilement de créer son +propre FAI dans les zones délaissées par les opérateurs traditionnels. + +Quelques connaissances en réseau sont nécessaires pour déployer la +partie technique, mais la fédération +FFDN et les membres de tous les FAI associatifs seront en général +heureux de partager leurs connaissances pour aider de nouveaux venus. + +% Bibiliographie +\nocite{*} +\bibliography{intro} + +\section*{Licence} +\includegraphics[width=2cm]{88x31} + +Ce document est sous licence \\ +\emph{Creative Commons Paternité - Partage à l'Identique 3.0 non transposé.} + +Le texte complet de cette licence est disponible à l'adresse~:\\ +\url{http://creativecommons.org/licenses/by-sa/3.0/} + +La figure du réseau Illico a été réalisée par Thomas Guillot. Elle est +également sous licence \emph{Creative Commons Paternité - Partage à l'Identique 3.0 non transposé.} + +\end{document} diff --git a/intro/reseau-wifi-chanteix.pdf b/intro/reseau-wifi-chanteix.pdf new file mode 100644 index 0000000..93abb41 Binary files /dev/null and b/intro/reseau-wifi-chanteix.pdf differ diff --git a/intro/reseau-wifi-chanteix.svg b/intro/reseau-wifi-chanteix.svg new file mode 100644 index 0000000..28495bd --- /dev/null +++ b/intro/reseau-wifi-chanteix.svg @@ -0,0 +1,14344 @@ + + + Schéma de principe réseau Wifi de Chanteix + + + + image/svg+xml + + Schéma de principe réseau Wifi de Chanteix + + + Thomas Guillot + + + + https://vador.fdn.fr/wiki/essaimage:ressources:schema_collecte_routage_fdn + fr-FR + 2013-03-19 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/intro/ttnn.bst b/intro/ttnn.bst new file mode 100644 index 0000000..e41de52 --- /dev/null +++ b/intro/ttnn.bst @@ -0,0 +1,1051 @@ +%% Bib style "jres", Derive de unsrt-fr.bst +%% The current maintainer of this work in Matthieu Herrb +%% +%% Bib. style "unsrt-fr" (version francisee de unsrt.bst) +%% +%% NM, 01-08-2002 +%% markey@lsv.ens-cachan.fr pour tous commentaire, remarque, question... +%% + % This program may be distributed and/or modified under the + % conditions of the LaTeX Project Public License, either version 1.2 + % of this license or (at your option) any later version. + % The latest version of this license is in + % http://www.latex-project.org/lppl.txt + % and version 1.2 or later is part of all distributions of LaTeX + % version 1999/12/01 or later. + % + % This program consists of the files jres.bst + % + + +ENTRY + { address + author + booktitle + chapter + edition + editor + howpublished + institution + journal + key + month + note + number + organization + pages + publisher + school + series + title + type + volume + year + } + {} + { label } + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% +%% C'est ici que je definis les "traductions". Normalement, y a que ca a changer +%% pour franciser le style... +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +FUNCTION{fr.and}{ %% le "et" entre les deux derniers auteurs +" et " +} + +FUNCTION{fr.editeur}{ %% ", {\'e}diteur" au singulier, ou " ({\'e}diteur)"... +", {\'e}diteur" +} + +FUNCTION{fr.editeurs}{ %% ", {\'e}diteurs" au pluriel, ou " ({\'e}diteurs)"... +", {\'e}diteurs" +} + +FUNCTION{fr.et.al}{ %% " et~al." +" et~al." +} + +FUNCTION{fr.in}{ %% "Dans " +"Dans " +} + +FUNCTION{fr.in.spc}{ %% " dans " +" dans " +} + +FUNCTION{fr.of}{ %% " de " +" de " +} + +FUNCTION{fr.number}{ %% "num{\'e}ro " +"num{\'e}ro " +} + +FUNCTION{fr.number.maj}{ %% "Num{\'e}ro " +"Num{\'e}ro " +} + +FUNCTION{fr.volume}{ %% "volume" +"volume" +} + +FUNCTION{fr.volume.maj}{ %% "Volume" +"Volume" +} + +FUNCTION{fr.edition}{ %% " {\'e}dition" +" {\'e}dition" +} + +FUNCTION{fr.pages}{ %% "pages" +"pages" +} + +FUNCTION{fr.page}{ %% "page" +"page" +} + +FUNCTION{fr.chapter}{ %% "chapitre" +"chapitre" +} + +FUNCTION{fr.tech.rep}{ %% "Rapport Technique" +"Rapport technique" +} + +FUNCTION{fr.master}{ %% "M{\'e}moire de D.E.A." +"M{\'e}moire de D.E.A." +} + +FUNCTION{fr.phd}{ %% "Th{\`e}se de doctorat" +"Th{\`e}se de doctorat" +} + +FUNCTION{fr.auteurs.style}{ %% si on veut des small caps sur le LASTNAME de l'auteur +%"\scshape" +"" +} + +MACRO {jan} {"Janvier"} +MACRO {feb} {"F{\'e}vrier"} +MACRO {mar} {"Mars"} +MACRO {apr} {"Avril"} +MACRO {may} {"Mai"} +MACRO {jun} {"Juin"} +MACRO {jul} {"Juillet"} +MACRO {aug} {"Ao{\^u}t"} +MACRO {sep} {"Septembre"} +MACRO {oct} {"Octobre"} +MACRO {nov} {"Novembre"} +MACRO {dec} {"D{\'e}cembre"} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% +%% La suite, normalement, y a rien a changer... +%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + + + +INTEGERS { output.state before.all mid.sentence after.sentence after.block } + +FUNCTION {init.state.consts} +{ #0 'before.all := + #1 'mid.sentence := + #2 'after.sentence := + #3 'after.block := +} + +STRINGS { s t } + +FUNCTION {output.nonnull} +{ 's := + output.state mid.sentence = + { ", " * write$ } + { output.state after.block = + { add.period$ write$ + newline$ + "\newblock " write$ + } + { output.state before.all = + 'write$ + { add.period$ " " * write$ } + if$ + } + if$ + mid.sentence 'output.state := + } + if$ + s +} + +FUNCTION {output} +{ duplicate$ empty$ + 'pop$ + 'output.nonnull + if$ +} + +FUNCTION {output.check} +{ 't := + duplicate$ empty$ + { pop$ "empty " t * fr.in.spc * cite$ * warning$ } + 'output.nonnull + if$ +} + +FUNCTION {output.bibitem} +{ newline$ + "\bibitem{" write$ + cite$ write$ + "}" write$ + newline$ + "" + before.all 'output.state := +} + +FUNCTION {fin.entry} +{ add.period$ + write$ + newline$ +} + +FUNCTION {new.block} +{ output.state before.all = + 'skip$ + { after.block 'output.state := } + if$ +} + +FUNCTION {new.sentence} +{ output.state after.block = + 'skip$ + { output.state before.all = + 'skip$ + { after.sentence 'output.state := } + if$ + } + if$ +} + +FUNCTION {not} +{ { #0 } + { #1 } + if$ +} + +FUNCTION {and} +{ 'skip$ + { pop$ #0 } + if$ +} + +FUNCTION {or} +{ { pop$ #1 } + 'skip$ + if$ +} + +FUNCTION {new.block.checka} +{ empty$ + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.block.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.block + if$ +} + +FUNCTION {new.sentence.checka} +{ empty$ + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {new.sentence.checkb} +{ empty$ + swap$ empty$ + and + 'skip$ + 'new.sentence + if$ +} + +FUNCTION {field.or.null} +{ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ +} + +FUNCTION {emphasize} +{ duplicate$ empty$ + { pop$ "" } + { "{\em " swap$ * "}" * } + if$ +} + +INTEGERS { nameptr namesleft numnames } + +FUNCTION {format.names} +{ 's := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { s nameptr "{ff~}{vv~}\bgroup\fonteauteurs\bgroup {ll}\egroup\egroup{{}}{, jj}" format.name$ 't := + nameptr #1 > + { namesleft #1 > + { ", " * t * } + { numnames #2 > + { "," * } + 'skip$ + if$ + t "\bgroup\fonteauteurs\bgroup others\egroup\egroup{}" = + { fr.et.al * } + { fr.and * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {format.authors} +{ author empty$ + { "" } + { author format.names } + if$ +} + +FUNCTION {format.editors} +{ editor empty$ + { "" } + { editor format.names + editor num.names$ #1 > + { fr.editeurs * } + { fr.editeur * } + if$ + } + if$ +} + +FUNCTION {format.title} +{ title empty$ + { "" } + { title "t" change.case$ } + if$ +} + +FUNCTION {n.dashify} +{ 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ +} + +FUNCTION {format.date} +{ year empty$ + { month empty$ + { "" } + { "there's a month but no year in " cite$ * warning$ + month + } + if$ + } + { month empty$ + 'year + { month " " * year * } + if$ + } + if$ +} + +FUNCTION {format.btitle} +{ title emphasize +} + +FUNCTION {tie.or.space.connect} +{ duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ * * +} + +FUNCTION {either.or.check} +{ empty$ + 'pop$ + { "can't use both " swap$ * " fields in " * cite$ * warning$ } + if$ +} + +FUNCTION {format.bvolume} +{ volume empty$ + { "" } + { fr.volume volume tie.or.space.connect + series empty$ + 'skip$ + { fr.of * series emphasize * } + if$ + "volume and number" number either.or.check + } + if$ +} + +FUNCTION {format.number.series} +{ volume empty$ + { number empty$ + { series field.or.null } + { output.state mid.sentence = + { fr.number } + { fr.number.maj } + if$ + number tie.or.space.connect + series empty$ + { "there's a number but no series in " cite$ * warning$ } + { fr.in.spc * series * } + if$ + } + if$ + } + { "" } + if$ +} + +FUNCTION {format.edition} +{ edition empty$ + { "" } + { output.state mid.sentence = + { edition "l" change.case$ fr.edition * } + { edition "t" change.case$ fr.edition * } + if$ + } + if$ +} + +INTEGERS { multiresult } + +FUNCTION {multi.page.check} +{ 't := + #0 'multiresult := + { multiresult not + t empty$ not + and + } + { t #1 #1 substring$ + duplicate$ "-" = + swap$ duplicate$ "," = + swap$ "+" = + or or + { #1 'multiresult := } + { t #2 global.max$ substring$ 't := } + if$ + } + while$ + multiresult +} + +FUNCTION {format.pages} +{ pages empty$ + { "" } + { pages multi.page.check + { fr.pages pages n.dashify tie.or.space.connect } + { fr.page pages tie.or.space.connect } + if$ + } + if$ +} + +FUNCTION {format.vol.num.pages} +{ volume field.or.null + number empty$ + 'skip$ + { "(" number * ")" * * + volume empty$ + { "there's a number but no volume in " cite$ * warning$ } + 'skip$ + if$ + } + if$ + pages empty$ + 'skip$ + { duplicate$ empty$ + { pop$ format.pages } + { ":" * pages n.dashify * } + if$ + } + if$ +} + +FUNCTION {format.chapter.pages} +{ chapter empty$ + 'format.pages + { type empty$ + { fr.chapter } + { type "l" change.case$ } + if$ + chapter tie.or.space.connect + pages empty$ + 'skip$ + { ", " * format.pages * } + if$ + } + if$ +} + +FUNCTION {format.in.ed.booktitle} +{ booktitle empty$ + { "" } + { editor empty$ + { fr.in booktitle emphasize * } + { fr.in format.editors * ", " * booktitle emphasize * } + if$ + } + if$ +} + +FUNCTION {empty.misc.check} +{ author empty$ title empty$ howpublished empty$ + month empty$ year empty$ note empty$ + and and and and and + { "all relevant fields are empty in " cite$ * warning$ } + 'skip$ + if$ +} + +FUNCTION {format.thesis.type} +{ type empty$ + 'skip$ + { pop$ + type "t" change.case$ + } + if$ +} + +FUNCTION {format.tr.number} +{ type empty$ + { fr.tech.rep } + 'type + if$ + number empty$ + { "t" change.case$ } + { number tie.or.space.connect } + if$ +} + +FUNCTION {format.article.crossref} +{ key empty$ + { journal empty$ + { "need key or journal for " cite$ * " to crossref " * crossref * + warning$ + "" + } + { fr.in "{\em " * journal * "\/}" * } + if$ + } + { fr.in key * } + if$ + " \cite{" * crossref * "}" * +} + +FUNCTION {format.crossref.editor} +{ editor #1 "{vv~}\bgroup\fonteauteurs\bgroup {ll}\egroup\egroup{{}}" format.name$ + editor num.names$ duplicate$ + #2 > + { pop$ fr.et.al * } + { #2 < + 'skip$ + { editor #2 "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { fr.et.al * } + { fr.and * editor #2 "{vv~}\bgroup\fonteauteurs\bgroup {ll}\egroup\egroup{{}}" format.name$ * } + if$ + } + if$ + } + if$ +} + +FUNCTION {format.book.crossref} +{ volume empty$ + { "empty volume in " cite$ * "'s crossref of " * crossref * warning$ + fr.in + } + { fr.volume.maj volume tie.or.space.connect + fr.of * + } + if$ + editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { series empty$ + { "need editor, key, or series for " cite$ * " to crossref " * + crossref * warning$ + "" * + } + { "{\em " * series * "\/}" * } + if$ + } + { key * } + if$ + } + { format.crossref.editor * } + if$ + " \cite{" * crossref * "}" * +} + +FUNCTION {format.incoll.inproc.crossref} +{ editor empty$ + editor field.or.null author field.or.null = + or + { key empty$ + { booktitle empty$ + { "need editor, key, or booktitle for " cite$ * " to crossref " * + crossref * warning$ + "" + } + { fr.in "{\em " * booktitle * "\/}" * } + if$ + } + { fr.in key * } + if$ + } + { fr.in format.crossref.editor * } + if$ + " \cite{" * crossref * "}" * +} + +FUNCTION {article} +{ output.bibitem + format.authors "author" output.check + new.block + format.title "title" output.check + new.block + crossref missing$ + { journal emphasize "journal" output.check + format.vol.num.pages output + format.date "year" output.check + } + { format.article.crossref output.nonnull + format.pages output + } + if$ + new.block + note output + fin.entry +} + +FUNCTION {book} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + new.block + format.btitle "title" output.check + crossref missing$ + { format.bvolume output + new.block + format.number.series output + new.sentence + publisher "publisher" output.check + address output + } + { new.block + format.book.crossref output.nonnull + } + if$ + format.edition output + format.date "year" output.check + new.block + note output + fin.entry +} + +FUNCTION {booklet} +{ output.bibitem + format.authors output + new.block + format.title "title" output.check + howpublished address new.block.checkb + howpublished output + address output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {inbook} +{ output.bibitem + author empty$ + { format.editors "author and editor" output.check } + { format.authors output.nonnull + crossref missing$ + { "author and editor" editor either.or.check } + 'skip$ + if$ + } + if$ + new.block + format.btitle "title" output.check + crossref missing$ + { format.bvolume output + format.chapter.pages "chapter and pages" output.check + new.block + format.number.series output + new.sentence + publisher "publisher" output.check + address output + } + { format.chapter.pages "chapter and pages" output.check + new.block + format.book.crossref output.nonnull + } + if$ + format.edition output + format.date "year" output.check + new.block + note output + fin.entry +} + +FUNCTION {incollection} +{ output.bibitem + format.authors "author" output.check + new.block + format.title "title" output.check + new.block + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + format.bvolume output + format.number.series output + format.chapter.pages output + new.sentence + publisher "publisher" output.check + address output + format.edition output + format.date "year" output.check + } + { format.incoll.inproc.crossref output.nonnull + format.chapter.pages output + } + if$ + new.block + note output + fin.entry +} + +FUNCTION {inproceedings} +{ output.bibitem + format.authors "author" output.check + new.block + format.title "title" output.check + new.block + crossref missing$ + { format.in.ed.booktitle "booktitle" output.check + format.bvolume output + format.number.series output + format.pages output + address empty$ + { organization publisher new.sentence.checkb + organization output + publisher output + format.date "year" output.check + } + { address output.nonnull + format.date "year" output.check + new.sentence + organization output + publisher output + } + if$ + } + { format.incoll.inproc.crossref output.nonnull + format.pages output + } + if$ + new.block + note output + fin.entry +} + +FUNCTION {conference} { inproceedings } + +FUNCTION {manual} +{ output.bibitem + author empty$ + { organization empty$ + 'skip$ + { organization output.nonnull + address output + } + if$ + } + { format.authors output.nonnull } + if$ + new.block + format.btitle "title" output.check + author empty$ + { organization empty$ + { address new.block.checka + address output + } + 'skip$ + if$ + } + { organization address new.block.checkb + organization output + address output + } + if$ + format.edition output + format.date output + new.block + note output + fin.entry +} + +FUNCTION {mastersthesis} +{ output.bibitem + format.authors "author" output.check + new.block + format.title "title" output.check + new.block + fr.master format.thesis.type output.nonnull + school "school" output.check + address output + format.date "year" output.check + new.block + note output + fin.entry +} + +FUNCTION {misc} +{ output.bibitem + format.authors output + title howpublished new.block.checkb + format.title output + howpublished new.block.checka + howpublished output + format.date output + new.block + note output + fin.entry + empty.misc.check +} + +FUNCTION {phdthesis} +{ output.bibitem + format.authors "author" output.check + new.block + format.btitle "title" output.check + new.block + fr.phd format.thesis.type output.nonnull + school "school" output.check + address output + format.date "year" output.check + new.block + note output + fin.entry +} + +FUNCTION {proceedings} +{ output.bibitem + editor empty$ + { organization output } + { format.editors output.nonnull } + if$ + new.block + format.btitle "title" output.check + format.bvolume output + format.number.series output + address empty$ + { editor empty$ + { publisher new.sentence.checka } + { organization publisher new.sentence.checkb + organization output + } + if$ + publisher output + format.date "year" output.check + } + { address output.nonnull + format.date "year" output.check + new.sentence + editor empty$ + 'skip$ + { organization output } + if$ + publisher output + } + if$ + new.block + note output + fin.entry +} + +FUNCTION {techreport} +{ output.bibitem + format.authors "author" output.check + new.block + format.title "title" output.check + new.block + format.tr.number output.nonnull + institution "institution" output.check + address output + format.date "year" output.check + new.block + note output + fin.entry +} + +FUNCTION {unpublished} +{ output.bibitem + format.authors "author" output.check + new.block + format.title "title" output.check + new.block + note "note" output.check + format.date output + fin.entry +} + +FUNCTION {default.type} { misc } + +MACRO {acmcs} {"ACM Computing Surveys"} + +MACRO {acta} {"Acta Informatica"} + +MACRO {cacm} {"Communications of the ACM"} + +MACRO {ibmjrd} {"IBM Journal of Research and Development"} + +MACRO {ibmsj} {"IBM Systems Journal"} + +MACRO {ieeese} {"IEEE Transactions on Software Engineering"} + +MACRO {ieeetc} {"IEEE Transactions on Computers"} + +MACRO {ieeetcad} {"IEEE Transactions on Computer-Aided Design of Integrated Circuits"} + +MACRO {ipl} {"Information Processing Letters"} + +MACRO {jacm} {"Journal of the ACM"} + +MACRO {jcss} {"Journal of Computer and System Sciences"} + +MACRO {scp} {"Science of Computer Programming"} + +MACRO {sicomp} {"SIAM Journal on Computing"} + +MACRO {tocs} {"ACM Transactions on Computer Systems"} + +MACRO {tods} {"ACM Transactions on Database Systems"} + +MACRO {tog} {"ACM Transactions on Graphics"} + +MACRO {toms} {"ACM Transactions on Mathematical Software"} + +MACRO {toois} {"ACM Transactions on Office Information Systems"} + +MACRO {toplas} {"ACM Transactions on Programming Languages and Systems"} + +MACRO {tcs} {"Theoretical Computer Science"} + +READ + +STRINGS { longest.label } + +INTEGERS { number.label longest.label.width } + +FUNCTION {initialize.longest.label} +{ "" 'longest.label := + #1 'number.label := + #0 'longest.label.width := +} + +FUNCTION {longest.label.pass} +{ number.label int.to.str$ 'label := + number.label #1 + 'number.label := + label width$ longest.label.width > + { label 'longest.label := + label width$ 'longest.label.width := + } + 'skip$ + if$ +} + +EXECUTE {initialize.longest.label} + +ITERATE {longest.label.pass} + +FUNCTION {begin.bib} +{ preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ + "\begin{ttnnbibliography}{" longest.label * "}" * write$ newline$ + "\makeatletter" write$ newline$ + "\ifx\fonteauteurs\@undefined" write$ newline$ + "\def\fonteauteurs{" fr.auteurs.style * "}\fi" * write$ newline$ + "\makeatother" write$ newline$ +} + +EXECUTE {begin.bib} + +EXECUTE {init.state.consts} + +ITERATE {call.type$} + +FUNCTION {end.bib} +{ newline$ + "\end{ttnnbibliography}" write$ newline$ +} + +EXECUTE {end.bib} diff --git a/intro/ttnn.cls b/intro/ttnn.cls new file mode 100644 index 0000000..95aad2b --- /dev/null +++ b/intro/ttnn.cls @@ -0,0 +1,262 @@ +%% Copyright 2012 Renater +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% of this license or (at your option) any later version. +% The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% and version 1.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Matthieu Herrb +% +% This work consists of the files jres.cls and article.tex +% +\NeedsTeXFormat{LaTeX2e} +\ProvidesClass{ttnn}[2012/12/10 v1.3 + TTNN document class] +% Derive de la classe article +\DeclareOption {10pt} {\PassOptionsToClass {10pt} {article}} +\DeclareOption {11pt} {\PassOptionsToClass {11pt} {article}} +\DeclareOption {12pt} {\PassOptionsToClass {12pt} {article}} +\DeclareOption {draft} {\PassOptionsToClass {draft} {article}} +\DeclareOption {final} {\PassOptionsToClass {final} {article}} +\DeclareOption* {\OptionNotUsed} % don't forward unknown options + +\ProcessOptions + +\LoadClass{article} +\RequirePackage{hyperref} +% +% Le nom de l'auteur +\def\@jresconf{Tetaneutral.net} +% +% +% Polices... +% XeTeX ou LuaTeX permettent facilement de choisir les polices système +% Donc on essaye de forcer la main à l'utilisateur pour qu'il l'utilise.. +% +% D'abord il faut trouver ifxetex.sty ou l'émuler +\newif\ifm@mifxetex + \m@mifxetexfalse +\IfFileExists{ifxetex.sty}{\RequirePackage{ifxetex}}{% + \ClassWarningNoLine{ttnn}{% + The `ifxetex' package is not installed.\MessageBreak + The package is being emulated}% +\expandafter\newif\csname ifxetex\endcsname +\@ifundefined{XeTeXrevision}{\xetexfalse}{\xetextrue} +\m@mifxetextrue% +} +\newif\ifm@mifluatex + \m@mifluatexfalse +\IfFileExists{ifluatex.sty}{\RequirePackage{ifluatex}}{% + \ClassWarningNoLine{ttnn}{% + The `ifluatex' pagckage is not installed.\MessageBreak + The package is being emulated}% +\expandafter\newif\csname ifluatex\endcsname +\@ifundefined{luatexversion}{\luatexfalse}{\luatextrue} +\m@mifluatextrue% +} +% configuration des fontes proprement dites +\ifxetex + % avec xetex c'est le mieux, le mapping tex-text permet de faire les césures + \RequirePackage{fontspec} + \setmainfont[Mapping=tex-text]{Times New Roman} + \setsansfont[Mapping=tex-text]{Arial} + \setmonofont[Mapping=tex-text]{Courier New} +\else + \ifluatex + \RequirePackage{fontspec} + % luatex ne supporte pas encore le mapping tex-text + \setmainfont{Times New Roman} + \setsansfont{Arial} + \setmonofont{Courier New} + \else + % si c'est pdflatex qui est utilisé, on revient aux paquets PSNFSS existants + \RequirePackage{amsmath} + \RequirePackage[T1]{fontenc} + \RequirePackage{txfonts} + \fi +\fi +% Titres en sans-serif + couleur +\RequirePackage{xcolor} +\definecolor{jresblue}{rgb}{0.,0.2,0.375} % correspond à 0,32,96 du modèle word +\RequirePackage{sectsty} +\allsectionsfont{\sffamily\color{jresblue}} +% +% Interligne +\RequirePackage{setspace} +\setstretch{1.1} +% Règles typographiques Françaises... +\ifxetex + \RequirePackage{polyglossia} + \setdefaultlanguage{french} + \setotherlanguage{english} +\else + \RequirePackage[english,french]{babel} + \frenchbsetup{StandardItemLabels=true, CompactItemize=false, + ReduceListSpacing=true} +\fi +% +% Papier A4 + Marges +\RequirePackage[paper=a4paper,top=3cm,bottom=3cm,left=4cm,right=4cm]{geometry} +% +% liste des auteurs +\RequirePackage{datatool} +\DTLnewdb{auteurs} +\newcommand{\auteur}[1]{% +\DTLnewrow{auteurs}% +\DTLnewdbentry{auteurs}{nom}{#1}% +%\DTLnewdbentry{auteurs}{affiliation}{#2}% +%\DTLnewdbentry{auteurs}{adresse}{#3}% +} +% Présentation du titre +\def\@maketitle{% + \hypersetup{pdftitle=\@title} + \newpage + \begin{center}% + \let \footnote \thanks + {\huge\bfseries\sffamily\color{jresblue} \@title \par}% + {\Large\sffamily\color{jresblue} + \lineskip .5em% + \begin{tabular}[t]{c}% + \@author + \end{tabular}\par}% + \vskip 1em% + {\large\sffamily\color{jresblue} \@date}% + \par + \end{center}% + \vskip 1.5em +} + +% Date vide +\date{} +% +\renewenvironment{abstract}{% + \vskip 10pt + \noindent + \begin{itshape}}% + {\end{itshape}\par} +% +\newcommand{\motscles}[1]{% + \vskip 18pt + \noindent% + {\Large\sffamily\color{jresblue}\textbf{Mots clefs}}% + \par\begin{itshape}#1\end{itshape}} +% +% Format paragraphe +\setlength{\parindent}{0cm} +\setlength{\parskip}{0.7ex plus 0.5ex minus 0.2ex} +% +% Les entêtes et pieds de page +\RequirePackage{fancyhdr} +\RequirePackage{lastpage} +% pour la 1ere page +\fancypagestyle{plain}{ + \fancyhf{} + \renewcommand{\headrulewidth}{0pt} + \renewcommand{\footrulewidth}{0.1pt} + \lfoot{\itshape\color{grey37}\@jresconf} + \cfoot{\itshape\color{grey37}} + \rfoot{\itshape\color{grey37}\thepage/\pageref*{LastPage}} +} +% les autres pages +\fancyhf{} +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0.1pt} +\lfoot{\itshape\color{grey37}\@jresconf} +\cfoot{} +\rfoot{\itshape\color{grey37}\thepage/\pageref*{LastPage}} +\pagestyle{fancy} +% filet gris également +\def\footrule{{\if@fancyplain\let\footrulewidth\plainfootrulewidth\fi + \vskip-\footruleskip\vskip-\footrulewidth + \color{grey37}\hrule\@width\headwidth\@height\footrulewidth\vskip\footruleskip}} +% +% Listes a puces +\def\blackbox{\vrule height .95ex width .7ex depth -.25ex}% +\renewcommand{\labelitemi}{\blackbox\hspace{6pt}} +\renewcommand{\labelitemii}{\blackbox\hspace{4pt}} +% +% Enumerations +\renewcommand{\labelenumii}{\theenumii.} +% +% Configuration de listings +\RequirePackage{listings} +\definecolor{grey37}{gray}{.375} +\definecolor{grey80}{gray}{.8} +\definecolor{grey90}{gray}{.9} +\lstset{backgroundcolor=\color{grey90}} +\lstset{basicstyle=\small\ttfamily} +\lstset{frame=single,framesep=1em,xleftmargin=1em,xrightmargin=1em} +\newenvironment{codesource}% + {\begin{lstlisting}}% + {\end{lstlisting}\vskip 1ex} +% +% style urls +\urlstyle{same} +\hypersetup{colorlinks, + urlcolor=jresblue, + linkcolor=black, + filecolor=black, + citecolor=black} +% +% Figures +\RequirePackage{graphicx} +% Titre en italique... +\long\def\@caption#1[#2]#3{% + \par + \addcontentsline{\csname ext@#1\endcsname}{#1}% + {\protect\numberline{\csname the#1\endcsname}{\ignorespaces #2}}% + \begingroup + \@parboxrestore + \if@minipage + \@setminipage + \fi + \normalsize + \@makecaption{\itshape\csname fnum@#1\endcsname}{\ignorespaces \itshape #3}\par + \endgroup} +% Pas de small caps pour les labels de Figure ou Tableau +\addto\captionsfrench{\def\figurename{Figure}} +\addto\captionsfrench{\def\tablename{Tableau}} +% la commande ci-dessous ne marche pas avec pdflatex +% \addto\captionsfrench{\def\CaptionSeparator{-}} +% donc redefinit \@makecaption pour imposer '-' comme separateur +\long\def\@makecaption#1#2{% + \vskip\abovecaptionskip + \sbox\@tempboxa{#1 - #2}% + \ifdim \wd\@tempboxa >\hsize + #1\space{}- #2\par + \else + \global \@minipagefalse + \hb@xt@\hsize{\hfil\box\@tempboxa\hfil}% + \fi + \vskip\belowcaptionskip} +% +% Bibliographie +% redéfinition de l'environnement pour ajouter un \labelsep de 1.5em pour être +% cohérent avec le modèle de présentation ISO de la biblio de Word. +\newenvironment{ttnnbibliography}[1] + {\section*{\refname}% + \@mkboth{\MakeUppercase\refname}{\MakeUppercase\refname}% + \list{\@biblabel{\@arabic\c@enumiv}}% + {\settowidth\labelwidth{\@biblabel{#1}}% + \labelsep1.5em + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \@openbib@code + \usecounter{enumiv}% + \let\p@enumiv\@empty + \renewcommand\theenumiv{\@arabic\c@enumiv}}% + \sloppy + \clubpenalty4000 + \@clubpenalty \clubpenalty + \widowpenalty4000% + \sfcode`\.\@m} + {\def\@noitemerr + {\@latex@warning{Empty `thebibliography' environment}}% + \endlist} +\addto\captionsfrench{\def\refname{Bibliographie}} +\bibliographystyle{ttnn}