SPIP-Contrib

SPIP-Contrib

عربي | Deutsch | English | Español | français | italiano | Nederlands

286 Plugins, 197 contribs sur SPIP-Zone, 259 visiteurs en ce moment

Accueil > Contribs dédiées > Livre avec SPIP > Archives livre > Tutoriel : produire sa propre structure de livre

Tutoriel : produire sa propre structure de livre

20 janvier 2012 – par Maïeul

2 votes

Ceci est une archive périmée mais qui reste intéressante, parfois autant pour l’article que les commentaires associés.

La structure proposée ne vous convient pas ? Il est possible de produire les fichiers .tex correspondant à vos besoins.

Pour ce faire, c’est entièrement des boucles SPIP, avec une API spéciale.

Ceci est donc une documentation dévellopeur. Pour être comprise, elle nécessite des compétences :
-  En SPIP
-  En LaTeX

Les différent élèments de l’API

-  Le plugin latexwheel propose des règles de transformation des raccourcis SPIP en code LaTeX. Il se base sur TextWheel.
-  Le plugin ZipTeX, qui se base sur le plugin Zippeur.

Cet article se veut un tutoriel visant à montrer comment se servir de ces deux plugins pour créer sa propre structure de liste avec SPIP.

Deux articles plus détaillés donnent les détails de l’API.

Exemple de la structure prise

La structure sera simple : il s’agira dans un livre de regrouper tout les articles d’une rubrique. Par exemple, la rubrique éditoriale, en les classant par ordre chronologique, en mettant à chaque fois le titre, suivi de la date, du chapo, du corps du texte, puis de la signature des auteurs.

Organisation finale de notre Zip

Il est possible en LaTeX de diviser un projet en plusieurs fichiers .tex, un peu comme on ferait en SPIP avec des squelettes inclus, via <INCLURE> ou #INCLURE.

Dans cette logique, le but est que SPIP produise un fichier livre.tex, qui appelle lui-même des des fichiers inclure/articlexxx.html correspondant à chaque article. L’ensemble de ces fichiers étant regroupés dans un fichier .zip.

Pour les besoins de l’exercice, nous nous servirons de la base de donnée sqlite jointe [1]. L’identifiant pour se connecter est auteur et le mot de passe est demodemo.

Zip - 81 ko
Base de donnée exemple

Nous supposerons qu’il n’y a ni images dans nos articles, ni code informatique, ni liens. L’article détaillé sur l’API fournit les outils pour les intégrer le cas échéant.

Pour éviter tout ennui de cache, désactivez le en mettant la ligne suivante dans le fichier mes_options.php :

  1. define('_NO_CACHE',-1);

Étape 1 : le fichier parent

Créons un squelette livre.tex.html, en y mettant le contenu suivant :

  1. #HTTP_HEADER{content-type:application/x-latex}
  2. \documentclass[a4paper,12pt]{book}
  3. \begin{document}
  4. <BOUCLE_articles(ARTICLES){id_rubrique}{!par date}>
  5. \input{inclus/article#ID_ARTICLE}
  6. </BOUCLE_articles>
  7. \end{document}

Télécharger

Analysons le code :

  • ligne 1, la balise #HTTP_HEADER permet, dans notre cas, deux choses :
    1. de dire au navigateur qu’on produit du latex et pas du html.
    2. d’empêcher SPIP d’insérer les boutons d’administrations.
  • ligne 2, nous déclarons la classe de notre fichier .tex. Pour rappel, un fichier latex doit toujours commencer par une déclaration de classe. Ici nous disons que nous produisons un livre, sur du papier A4, avec une police de base de 12 pt.
  • ligne 3, nous commençons le corps du document.
  • ligne 4, une Boucle classique de SPIP : on demande les articles de la rubrique passée en argument lors de l’appel au squelette, classés par ordre antéchronologique.
  • ligne 5, pour chaque article, nous insérons le code \input{inclus/articlexxx} qui permettra à LaTeX d’appeler le fichier inclus/articlexxx.tex.
  • ligne 6, fin de la boucle.
  • ligne 7, fin du corps du document LaTeX.
  • Maintenant, rendons-nous sur http://votresite.dev/?page=livre.tex&id_rubrique=1. Notre navigateur va nous télécharger un fichier contenant les lignes suivantes :
  1. \documentclass[a4paper,12pt]{book}
  2. \begin{document}
  3.  
  4. \input{inclus/article1}
  5.  
  6. \input{inclus/article2}
  7.  
  8. \end{document}

Télécharger

C’est bien, mais il serait bon d’avoir un préambule appelant les packages nécéssaires. Ces packages peuvent varier en fonction du contenu des articles, si par exemple on a des images, du code, des tableaux. Mais tout cela est sera détaillé dans l’article sur l’API LaTeXWheels.

Pour le moment, contentons nous des packages minimums.

Il nous faut :
-  fontspec et xunicode pour gérer correctement l’UTF-8.
-  polyglossia, pour gérer les langues.

Insérons donc entre le \documentclass[a4paper,12pt]{book} et le \begin{document} l’appel à ces packages :

  1. \usepackage{fontspec}
  2. \usepackage{xunicode}
  3. \usepackage{polyglossia}

Télécharger

Et puis, précisons quand même la langue, avec le code suivant :

\setmainlanguage{[(#LANG|ziptex_polyglossia)]}

Alors là, on a un mélange de LaTeX, la commande \setmainlanguage qui permet de dire à polyglossia qu’elle est la langue principale, et donc de gérer correctement les césures et la ponctuation, et le code [(#ENV{lang}|ziptex_polyglossia)], qui prend le code de la langue courante, en l’occurence fr et le transforme en code compréhensible par polyglossia, à savoir french, par le biais du filtre |ziptex_polyglossia.

Tout ceci donne donc :

  1. #HTTP_HEADER{content-type:application/x-latex}
  2. \documentclass[a4paper,12pt]{book}
  3. \usepackage{fontspec}
  4. \usepackage{xunicode}
  5. \usepackage{polyglossia}
  6. \setmainlanguage{[(#LANG|ziptex_polyglossia)]}
  7. \begin{document}
  8. <BOUCLE_articles(ARTICLES){id_rubrique}{!par date}>
  9. \input{inclus/article#ID_ARTICLE}
  10. </BOUCLE_articles>
  11. \end{document}

Télécharger

Ce qui une fois interprété par SPIP, produit :

  1. \documentclass[a4paper,12pt]{book}
  2. \usepackage{fontspec}
  3. \usepackage{xunicode}
  4. \usepackage{polyglossia}
  5. \setmainlanguage{french}
  6. \begin{document}
  7.  
  8. \input{inclus/article2}
  9.  
  10. \input{inclus/article1}
  11.  
  12. \end{document}

Télécharger

Et puis soyions fous, ajoutons une table des matières, à la fin, avec la commande \tableofcontents :

  1. #HTTP_HEADER{content-type:application/x-latex}
  2. \documentclass[a4paper,12pt]{book}
  3. \usepackage{fontspec}
  4. \usepackage{xunicode}
  5. \usepackage{polyglossia}
  6. \setmainlanguage{[(#LANG|ziptex_polyglossia)]}
  7. \begin{document}
  8.  
  9. <BOUCLE_articles(ARTICLES){id_rubrique}{!par date}>
  10. \input{inclus/article#ID_ARTICLE}
  11. </BOUCLE_articles>
  12.  
  13. \tableofcontents
  14. \end{document}

Télécharger

Étape 2, les fichiers fils

Préparons le squelette qui va engendrer les fichiers inclus/articlexxx.tex. Appelons ce squelette article.tex.

  1. #HTTP_HEADER{content-type:application/x-latex}
  2. <BOUCLE_article(ARTICLES){id_article}>
  3. \chapter{[(#TITRE*|propre_latex)]}
  4.  
  5. [(#DATE|affdate|propre_latex)]
  6.  
  7. [(#CHAPO*|propre_latex)]
  8.  
  9. [(#TEXTE*|propre_latex)]
  10.  
  11. <B_auteurs><BOUCLE_auteurs(AUTEURS){id_article}{","}>[(#NOM*|propre_latex)</BOUCLE_auteurs></B_auteurs>
  12. </BOUCLE_article>

Télécharger

Analysons :

  • Ligne 1, le même #HTTP_HEADER que précédemment, vu que je veux à nouveau produire un fichier .tex
  • Ligne 2 et 12, boucle ARTICLES classique.
  • Ligne 3, mettre le titre dans la commande LaTeX \chapter{}.
  • Ligne 5, mettre la date.
  • Ligne 7, mettre le chapeau.
  • Ligne 9, mettre le texte.
  • Ligne 11, mettre les auteurs.

On remarque les lignes vides : rappelons qu’en LaTeX, les lignes vides produisent des changements de paragraphes.

Toutes les balises SPIP qui retournent du texte sont présentés de la manière suivante :
[(#BALISE*|propre_latex)]

Rappelons une règle de fonctionnement de SPIP : le contenu de chaque champ de type texte est filtré automatiquement par le filtre |propre, qui transforme les raccourcis SPIP en code HTML.

En revanche, si on écrit #BALISE*, |propre n’est pas appelé : on obtient alors le contenu du champ, de manière brute [2].

C’est ce contenu brut qui est passé dans le filtre |propre_latex du plugin latexwheel. Ce filtre transforme les raccourcis SPIP en code LaTeX.

Au final, si je me rend sur la page http://site/?page=article.tex&id_article=1, j’obtiens :

  1. \chapter{De l'influence de LaTeX sur la sexualité humaine}
  2.  
  3. 28 décembre 2011
  4.  
  5. Si selon le mot, peut-être apocryphe, de Freud, « tout est sexe », alors LaTeX a une influence sur la sexualité humaine. Qu'en est-il ?
  6.  
  7.  
  8.  
  9.  
  10. On pourrait montrer trois influences de LaTeX en matière de sexualité humaine :
  11.  
  12. \begin{enumerate}
  13. \item En tant que le LaTeX est généralement le principal composant des préservatifs.
  14. \item Dans certaines pratiques sexuelles avec certains vêtements.
  15. \item Dans la constitution de groupes d'utilisateurs de LaTeX, pouvant constituer des lieux de rencontres.
  16. \end{enumerate}
  17.  
  18.  
  19.  
  20. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
  21.  
  22. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
  23.  
  24. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
  25.  
  26. Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
  27.  
  28. auteur

Télécharger

Étape 3 : générer automatiquement les fichiers .tex fils

L’étape suivante consiste à dire au squelette livre.tex.html de générer automatiquement, lorsqu’il est appelé, les fichiers .tex fils, comme article1.tex et article2.tex.

Pour ce faire, on utilise le filtre |ziptex_creer_tex du plugin ziptex.

Ce filtre s’applique sur le nom du squelette à interpréter, sans le .html final. Il reçoit comme premier argument le chemin du fichier à produire, à l’intérieur du dossier local/ziptex, et comme second argument un tableau d’arguments à passer lors de l’appel au squelette.

Dans notre cas, nous souhaitons interpréter le squelette article.tex.html, pour produire un fichier inclus/articlexxx.tex, en passant à chaque fois au squelette l’id_article nous intéressant.

Nous allons donc insérer dans le fichier livre.tex.html, après \input{inclus/article#ID_ARTICLE} la ligne suivante :

  1. [(#VAL{article.tex}||ziptex_creer_tex{inclus/article#ID_ARTICLE.tex,#ARRAY{id_article,#ID_ARTICLE}})]

Par ailleurs, comme nous souhaitons créer un sous-dossier (inclus), il nous faut dire de générer le sous-dossier le cas échéant. Pour ce faire, on utilise la ligne suivante :

  1. [(#ARRAY{0,inclus}|ziptex_dir)]

qu’on met dans le squelette livre.tex.html, en dehors de la boucle.

Au final, on obtient :

  1. #HTTP_HEADER{content-type:application/x-latex}
  2. [(#ARRAY{0,inclus}|ziptex_dir)]
  3. \documentclass[a4paper,12pt]{book}
  4. \usepackage{fontspec}
  5. \usepackage{xunicode}
  6. \usepackage{polyglossia}
  7. \setmainlanguage{[(#LANG|ziptex_polyglossia)]}
  8. \begin{document}
  9. <BOUCLE_articles(ARTICLES){id_rubrique}{!par date}>
  10. \input{inclus/article#ID_ARTICLE}
  11. [(#VAL{article.tex}|ziptex_creer_tex{inclus/article#ID_ARTICLE.tex,#ARRAY{id_article,#ID_ARTICLE}})]
  12. </BOUCLE_articles>
  13. \tableofcontents
  14. \end{document}

Télécharger

Désormais, en allant sur http://site.com/?page=livre&id_rubrique=1, non seulement SPIP nous retourne un fichier LaTeX, mais en plus il produit les fichiers inclus/article1.tex et inclus/article2.tex dans le dossier local/ziptex.

Étape 4 Fabriquer un zip contenant tout les fichiers .tex

Il va maintenant falloir produire un zip contenant tout les .tex nécéssaires à la production du livre.

Pour ce faire, nous allons créer un squelette livre.html, qui nous retournera l’adresse du Zip.

Pour que ce zip soit généré, on va appeler le filtre |ziptex_zipper.

Ce filtre zipper le dossier local/ziptex et retourne l’url du Zip.

Mais avant de zipper, le filtre peut ajouter du contenu dans le dossier local/ziptex.

Pour ce faire, il reçoit un tableau (au sens PHP) dont la structure est la suivante :

  • 0. Un tableau contenant les .tex direct, c’est à dire sans code SPIP dedans, avec à chaque fois :
    • 0. Chemin du fichier .tex dans l’arborescence SPIP
    • 1. Chemin du fichier .tex dans le future ZIP
  • 1. Un tableau contenant les squelettes qui généreront du latex avec à chaque fois :
    • 0. Chemin du squelette, sans le .html
    • 1. Chemin du .tex correspondant, avec le .tex
    • 2. Option du squelette

Dans notre cas, l’entrée 0 doit être vide. En revanche l’entrée 1 contiendra elle même une seule entrée, correspondant à la transformation du squelette livre.tex.html en fichier livre.tex. On passera la rubrique courante comme argument.

Nous allons mettre ce tableau dans un #GET, à l’aide la balise #ARRAY. Puis nous allons appeler sur ce tableau le filtre ziptex_zipper.

Ce qui donne :

  1. #SET{tableau,#ARRAY{
  2. 0,#ARRAY{},
  3. 1,#ARRAY{
  4. 0,#ARRAY{
  5. 0,livre.tex,
  6. 1,livre.tex,
  7. 2,#ARRAY{id_rubrique,#ID_RUBRIQUE}
  8. }
  9. }
  10. }
  11. }
  12. <a href="[(#GET{tableau}|ziptex_zipper)]">Le zip</a>

Télécharger

Si je me rend sur http://site.com/?page=livre&id_rubrique=1, j’obtiens un liens vers le zip contenant les fichiers .tex.

Si on compile deux fois ce fichier, avec XeLaTeX, on obient alors le PDF joint.

Zip - 2.7 ko
Ensemble des fichiers .tex
PDF - 23.2 ko
Fichier PDF final

Conclusion

Zip - 1.6 ko
Squelette complet

Cet article vous présente les base pour transformer du SPIP en LaTeX. Vous pouvez trouver ci joint le squelette complet de ce tutoriel.

Il faut ensuite évidemment connaître LaTeX pour gérer la présentation. En outre, si nos textes sont plus complexes (liens, code, etc.) il faut appeler d’autres packages, ajouter des codes.

On se reportera aux deux articles de références :

Notes

[1Le niveau intellectuel qui est y présent n’engage pas son auteur, qui avait besoin de textes mais n’avait pas envie de se creuser la tête …

[2À l’exception des sécurités vis-à-vis des codes javascripts et PHP.

Dernière modification de cette page le 1er avril 2012

Retour en haut de la page

Répondre à cet article

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici Les choses à faire avant de poser une question (Prolégomènes aux rapports de bugs. )
Ajouter un document

Retour en haut de la page

Ça discute par ici

  • Brownie

    6 juillet 2012 – 43 commentaires

    Brownie est une adaptation pour Zpip du thème du même nom initialement développé par Egrappler.com. Présentation Brownie est un thème Responsive à deux colonnes. La démonstration ci-dessous utilise la version 2.0.0 de Brownie, la dist de SPIP3 (...)

  • Métas +

    3 décembre – 13 commentaires

    Améliorez l’indexation de vos articles dans les moteurs et leur affichage sur les réseaux sociaux grâce aux métadonnées Dublin Core, Open Graph et Twitter Card. Installation Activer le plugin dans le menu dédié. Dans le panel de configuration, (...)

  • Acces Restreint 3.0

    11 décembre 2008 – 785 commentaires

    Le plugin accès restreint permet de définir et de gérer des zones de l’espace public en accès restreint. Cette version du plugin a été redévelopée et optimisée tout spécialement pour SPIP 2.0. Il en découle une amélioration des performances sur les gros (...)

  • Compositions 2 et 3

    25 mars 2011 – 176 commentaires

    Ce plugin vous permet de définir plusieurs variantes de squelettes (nommées compositions) pour un même type d’objet SPIP. Dans l’espace privé, il est alors possible de choisir, dans un menu déroulant, la composition qu’on veut attribuer à chaque (...)

  • Configurer Sparkpost

    25 avril – 18 commentaires

    N’hésitez pas à relire le préambule de cette rubrique avant de créer un compte sur une plateforme tierce . Présentation Sparkpost est une société d’envoi de mailing https://www.sparkpost.com/ Sur les petits volumes ( <100.000 emails / mois), (...)

Ça spipe par là