Problème de personnalisation d'un index — Les-mathematiques.net The most powerful custom community solution in the world

Problème de personnalisation d'un index

Bonjour à tous,

J'ai cherché sur le net comment personnaliser mon index en utilisant le fichier ist. J'ai trouvé plusieurs solutions et j'ai choisi une solution concernant la class memoir (cette classe m'intéresse pour certaines raisons particulières et personnelles). J'ai mis dans le même répertoire le fichier principal et le fichier ist. Le contenu du fichier ist est come suit
headings_flag 1
heading_prefix "{\\large\\sffamily\\bfseries\\shadowbox{"
heading_suffix "}\\hfil}\\nopagebreak\n"
symhead_negative "symboles"
symhead_positive "Symboles"

delim_0 " \\dotfill \ "
delim_1 " \\dotfill \ "

Un exemple minimal de mon fichier source est comme suit:
\documentclass[twoside]{memoir}
\usepackage{imakeidx}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[french]{babel}
\usepackage{lmodern}
\usepackage[top=1.5cm,bottom=1.5cm,left=2.2cm,right=2.2cm,
marginparwidth=1.1cm,marginparsep=2mm]{geometry}

\makeindex[columns=2, title= Index des mots, options= -s docu.ist]
\begin{document}
\chapter{Chapitre 1}
\section{Section 1}

L'homme est un Etre \index{Etre} \index{sublime}.

\chapter{Chpaitre 2}
\section{Section 2}
On  \index{pense}, donc on \index{existe}

\printindex
\end{document}
Malheureusement, lorsque je compile selon la séquence "pdflatex +makeindex+pdflatex", j'obtient un index formaté selon la version par défaut, c'est-à-dire ne prenant pas en considération le fichier ist. De plus, il n'y a aucune déclaration d'erreur au niveau du terminal.

Je vous remercie tous à l'avance pour toute réponse ou suggestion. De passage je passe un bonjour à Brian qui est très actif sur ce forum.

Bonne fin de semaine à tous.

Réponses

  • Bonjour,

    L'exemple fourni a l'air pas mal, mais... impossible qu'il n'y ait pas d'erreur avec ça. Pour commencer, il manque le \end{document} (enfin, il est mal placé) mais surtout, le fichier .ist fait appel à une macro \shadowbox qui est non définie avec ton code (et je ne sais pas d'où elle vient).

    En corrigeant ces deux points, j'ai une autre erreur qui me fait comprendre qu'il faut faire quelque chose comme ça pour le .ist :
    headings_flag 1
    heading_prefix "{\\large\\sffamily\\bfseries\n"
    heading_suffix "\\hfil}\\nopagebreak\n"
    symhead_negative "symboles"
    symhead_positive "Symboles"
    
    delim_0 " \\dotfill \ "
    delim_1 " \\dotfill \ "
    
    Là, ça fonctionne, et ce, en compilant uniquement avec pdflatex.

    Petite explication : j'utilise TeX Live et dans TeX Live, il y a quelques programmes dont makeindex qui sont considérés comme sûrs et peuvent donc être appelés directement depuis du code TeX sans avoir à compiler avec -shell-escape aka --enable-write18 (option dont le nom dépend de la distribution TeX). C'est ce qui permet à imakeidx, utilisé dans ton .tex, de lancer automatiquement makeindex.

    Mais si ta distribution n'a pas ce mécanisme de liste blanche incluant makeindex, il faut soit passer l'option -shell-escape aka --enable-write18 au moteur TeX utilisé (ce qui a des conséquences en matière de sécurité), soit le lancer à la main :
    pdflatex docu.tex
    makeindex -s docu.ist docu.idx
    pdflatex docu.tex
    
    Dernière chose : makeindex est « un peu » obsolète : il ne va trier correctement que les caractères ASCII, donc exit le bon tri avec caractères accentués. Il y a deux alternatives qui gèrent Unicode :
    • xindy (texindy) qui est bien rôdé mais n'est plus maintenu ;
    • xindex tout jeune, activement maintenu (installer au moins la version 0.30 — qui se présente hélas comme 0.3 — sinon il faut s'attendre à des problèmes avec le français).
    Mon expérience récente est avec xindex. Pas de liste blanche pour lui dans TeX Live, mais on peut le lancer soi-même et ça marche bien — y compris avec imakeidx et des index multiples.
  • Pour essayer d'être plus clair, dans ton cas, le fichier docu.ist n'est sans doute pas lu car :
    • vraisemblablement, tu ne lances pas 'makeindex -s docu.ist docu.idx ;
    • tu crois que 'options= -s docu.ist' passé à la macro \makeindex va le faire, mais imakeidx.sty ne peut lancer makeindex que si celui-ci est sur une liste blanche de programmes sûrs (vrai par défaut avec TeX Live, peut-être faux avec MiKTeX) ou si l'on a passé -shell-escape ou --enable-write18 au moteur TeX utilisé.
    Je pense qu'aucune de ces conditions n'a été remplie dans tes essais (enfin, la seconde pourrait éventuellement avoir été remplie mais le fichier .ind ensuite écrasé par ton lancement manuel de makeindex sans l'option -s...), ce qui pourrait expliquer que tu as eu le formatage par défaut de l'index et que tu n'as pas vu qu'il manquait des choses dans ton docu.tex pour que \shadowbox soit définie.

    La section If something goes wrong de la documentation d'imakeidx est assez instructive. Si makeindex a été lancé automatiquement par imakeidx lors de la compilation du fichier .tex, ça doit se voir dans les messages affichés par la commande pdflatex (ou lualatex, etc.), par exemple :
    Scanning style file ./docu.ist.......done (7 attributes redefined, 0 ignored).
    Scanning input file docu.idx....done (4 entries accepted, 0 rejected).
    Sorting entries....done (9 comparisons).
    Generating output file docu.ind....done (20 lines written, 0 warnings).
    Output written in docu.ind.
    Transcript written in docu.ilg.
    
    Comme le montre cet extrait, il doit aussi y avoir un fichier .ilg contenant quelque chose comme ceci :
    This is makeindex, version 2.15 [TeX Live 2020] (kpathsea + Thai support).
    Scanning style file ./docu.ist.......done (7 attributes redefined, 0 ignored).
    Scanning input file docu.idx....done (4 entries accepted, 0 rejected).
    Sorting entries....done (9 comparisons).
    Generating output file docu.ind....done (20 lines written, 0 warnings).
    Output written in docu.ind.
    Transcript written in docu.ilg.
    
    Le fichier .ind généré par makeindex (ou texindy ou xindex) contient le code LaTeX que \printindex va exécuter, celui qui produit l'index trié.

    Résumons : les commandes \index dans le .tex permettent de constituer le fichier .idx, ni trié ni formaté. L'outil de tri et formatage (makeindex, texindy ou xindex) lit ce .idx, trie les entrées, arrange le formatage et écrit le résultat dans un fichier .ind. Enfin, la commande \printindex exécute le code LaTeX contenu dans le .ind (regarde-le !), ce qui a pour effet d'insérer un index formaté et trié dans le document.
  • Par ailleurs, pour mettre une entrée d'index sur « mot », je conseille ceci :
    \index{mot}mot
    
    Je mets la commande \index avant pour le cas où le mot (enfin, un mot plus long) serait coupé entre deux pages : il me semble préférable qu'une entrée d'index pour « anticonstitutionnellement » pointe sur une page se terminant par « anticons- » plutôt que sur une commençant « titutionnellement ».

    N.B. : pas d'espace entre « \index{mot} » et « mot » !
  • Bonjour Brian et merci encore et encore pour tes réponses. Je vais essayer de bien lire et comprendre tes suggestions et de regarder si ceci résoudra mon problème.

    Bon début de semaine.
  • J'ai réécrit le début de ce message, car un truc que tu as dit m'est revenu entre temps, d'où une explication un peu différente. Bonne chance et fin de week-end !
  • Bonjour Brian. Je viens de lire tes commentaires et ils m'ont appris des choses que je ne connaissais pas. Cependant, étant un néophyte en Latex, je ne comprends pas certains de tes commentaires.

    En premier lieu, je ne sais pas où est l'erreur lorsque j'ai mis end{document} à la fin de mon fichier (je pensais que c'est l'endroit habituel).

    Deuxièmement, je ne saisis pas "lancer à la main" les trois instructions. Je compile directement et il n'y a pas de séquence
    makeindex -s docu.ist docu.idx
    
    dans mon compilateur. Sauf si l'expression "lancer à la main" veut dire utiliser une ligne de commande. Dans ce cas, je ne l'ai jamais utilisée et je ne sais même pas comment y accéder.

    Pour information, j'utilise MikTex-portable version 2.15 sur windows.

    En ce qui concerne \shadowbox je voulais mettre la première lettre dans chaque groupe de mots commençant par cette lettre dans une boite ombrée.
    Merci beaucoup Brian et bonne journée.
    zenon.
  • Le \end{document} va bien à la fin du document mais il n'était pas où il faut dans ton premier message (AD l'a corrigé).

    Oui, « lancer à la main » dans un de mes messages ci-dessus veut dire « utiliser une (des) ligne(s) de commande ». Ce n'est pas sorcier mais c'est très utile. Je suggère de te renseigner sur « invite de commandes » dans Windows, sur cmd.exe, éventuellement sur Powershell — mais je ne pourrai pas t'aider avec ce dernier. Il doit y avoir des centaines de tutoriels en ligne là-dessus, sur YouTube ou sur des pages web « statiques ».

    Sinon, débrouille-toi avec ton éditeur de texte pour qu'il passe l'option -s comme j'ai indiqué. Enfin, ça, c'est si tu veux rester avec makeindex...

    Lorsque tu as écrit « je compile selon la séquence "pdflatex +makeindex+pdflatex" », j'ai cru que tu savais lancer ces commandes dans un terminal (l'« invite de commandes » selon la terminologie Windows). J'ai mal cru mais tu as de la chance : c'est un problème qui se soigne très facilement.

    Désolé, mais je ne peux détailler plus. Il faut que tu apprennes à lancer une commande soit dans un terminal, soit avec ton éditeur de texte que je n'utilise pas (je fais ce genre de trucs avec des Makefile's ou des scripts shell, sauf pour expérimenter ou tester, auquel cas je lance justement les commandes en question dans un terminal).
  • Merci beaucoup Brian pour le temps que tu as pris pour me répondre. Je comprends bien que ce n'est pas évident d'expliquer quelque chose qui est simple. Je vais chercher selon tes recommandations comment ouvrir un terminal. Juste une chose, lorsque j'ai écrit que je compilais selon la séquence PdfLatx+makeindex+pdfLatex c'était directement sur mon éditeur (TexStudio). Il suffisait juste de choisir le mode de compilation voulu dans une liste prédéfinie.

    Encore une fois merci beaucoup et bonne fin de soirée.
    zenon.
  • Oui, c'est ce que j'avais compris a posteriori. Pour la commande, tu vas voir qu'il n'y a pas grand-chose à savoir au final :
    - lancer cmd.exe d'une manière plus ou moins explicite ;
    - utiliser la commande 'cd' pour aller dans le dossier contenant ton document .tex principal (celui à compiler) ;
    - utiliser des "double quotes" si certains chemins comportent des espaces ;
    - entrer la commande à lancer et appuyer sur Enter...
  • Bonjour Brian. Tu avais entièrement raison, puisque la version Miktex que j'ai sur mon laptop est une version portable. Lorsque j'ai utilisé mon propre PC où la version est complète, ça marche très bien. Merci beaucoup pour ton aide très très précieuse.

    Bonne fin de soirée.
    zenon.
Connectez-vous ou Inscrivez-vous pour répondre.
Success message!