4
1

J'ai rédigé un lexique trilingue de vocabulaire technique.

Il s'agit d'un tableau de trois colonnes, chacune correspondant à une langue.

Ouvrir dans l'éditeur
\documentclass{minimal}
\usepackage{longtable}
\usepackage{multirow}
\usepackage{marvosym}
\usepackage{hyperref}
\begin{document}
\begin{longtable}{lll}
\textsc{Română} & \textsc{English} & \textsc{Français}\\
\hline\\[10pt]
\endhead
Macară & Crane & Grue\\
\hline
\multirow{2}{*}{Director de film} & \multirow{3}{*}{Unit production manager} & Directrice de production \Female\\
& & Directeur de production \Male\\
\multirow{-2}{*}{Director de produtie} & & \emph{Dir' prod'}\\
Husă & & Voile\\
\hline
Maestru de lumini & \multirow{2}{*}{Gaffer} & Chef-électricien\\
Electrician șef & & \emph{Chef-électro}
\end{longtable}
\end{document}

J'aimerais y adjoindre un index reprenant tous les mots du lexique, quelle qu'en soit la langue.

Mon tableau étant très long, comment faire pour le créer automatiquement ?

Posée 31 Oct '15, 10:22

Pathe's gravatar image

Pathe ♦♦
7.5k42203251
Taux d'acceptation : 55%

Modifiée 08 Nov '15, 23:29

1

La classe minimal n'est pas recommandée : on le voit dans ce cas où le tableau n'est qu'une pâle copie de ce qu'il est avec la classe article, par exemple. Ensuite, créer l'index automatiquement ne serait pas très difficile s'il n'y avait que des mots seuls dans les cellules. En mettant dans certaines des macros telles que \emph ou \multirow, cela est augmente énormément le niveau de difficulté car il faut analyser le contenu des cellules pour trouver l'argument qu'il faut mettre dans l'index.

(31 Oct '15, 10:59) unbonpetit ♦♦ unbonpetit's gravatar image

J'ai utilisé la classe minimal car il est demandé de poster des ECM... minimaux !

C'est à dessein que j'ai mis ces commandes : \emph, utilisé pour les mots familiers ou les diminutifs, est destiné à rester dans l'index. Quant aux \multirow, je pourrai les enlever à la main : je préfère enlever quelques multirow plutôt que d'écrire à la main des centaines d'entrées d'index.

Il s'agit donc de créer des entrées d'index à partir des chaînes de caractère se trouvant :

  • entre le début de ligne et le signe &,
  • entre deux &,
  • ou entre & et la fin de ligne.
(31 Oct '15, 11:10) Pathe ♦♦ Pathe's gravatar image

@Pathe Il est vrai que les ECM se doivent d'être minimaux mais, en effet, la classe minimal est déconseillée pour les ECM car elle est tellement minimale qu'elle fonctionne mal avec la plupart des packages et restitue trop peu leur utilisation réelle. Il vaut mieux recourir à la classe article en général, sauf pour les questions qui traitent de ce qui est spécifique aux autres classes (par exemple les titres courants pour la classe book).

(31 Oct '15, 12:14) denis ♦♦ denis's gravatar image

Je propose une autre solution, qui fait appel aux même méthodes que celles de Denis (qui fonctionne très bien, l'index est bien créé), mais qui permet aussi d'indexer le texte dans un \multirow et fournit la macro \noindex pour ne pas indexer le contenu de la cellule dans laquelle elle est écrite.

Édition : les cellules de fin de ligne vides sont permises sans provoquer de bug.

Ouvrir dans l'éditeur
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8x]{inputenc}
\usepackage[xindy]{imakeidx}
\usepackage{multirow,longtable,array,collcell,hyperref}
\makeindex
\makeatletter
\newif\if@index \unless\ifdefined\noindex\protected\def\noindex{\@indexfalse}\fi
\let\multirow@saved\multirow \def\multirow{\noexpand\multirow@saved}
\def\cell@index#1{%
    \@indextrue#1\if@index\test@multirow#1\multirow@saved\@nil{#1}%
    \unless\ifx\index@text\empty\index\index@text\fi\fi
}
\def\test@multirow#1\multirow@saved#2\@nil#3{\ifx\@empty#2\@empty\def\index@text{#3}\else\capture@multirowtext#3\@nil\fi}
\def\capture@multirowtext#1\multirow@saved#2\@nil{\capture@multirowtexti#2\@nil}
\def\capture@multirowtexti#1{\@testopt\capture@multirowtextii{}}
\def\capture@multirowtextii#1]#2{\@testopt\capture@multirowtextiii{}}
\def\capture@multirowtextiii#1]#2#3\@nil{\def\index@text{#2}}%
\newcolumntype i{>{\collectcell\cell@index}l<\endcollectcell}
\protected\def\LT@tabularcr{%
    \relax\iffalse{\fi\ifnum0=`}\fi
    \@ifstar
        {\def\crcr{\LT@crcr\noalign{\nobreak}}\let\cr\crcr
        \LT@t@bularcr}%
        {\LT@t@bularcr}}
\makeatother

\begin{document}

\begin{longtable}{*3i}
    \noindex\textsc{Română} & \noindex\textsc{English} & \noindex\textsc{Français}\\
    \hline
    \hline
    \endhead
    Prăjină & Boom & Perche\\
    \hline
    Macară & Crane & Grue\\
    \hline
    Husă & & Voile\\
    \hline
    Maestru de lumini & \multirow{2}{*}{Gaffer} & Chef-électricien\\
    Electrician șef & & \emph{Chef-électro}\\
    Abacab& \multirow{2}{*}{Foo} & \multirow{3}{*}{Bar} \\
    Absoudre & & \\
    Acabi& \multirow{-2}{*}{BAZ}&
\end{longtable}
\printindex
\end{document}
Lien permanent

Publiée 08 Nov '15, 09:38

unbonpetit's gravatar image

unbonpetit ♦♦
1.8k18
Taux d'acceptation : 68%

Modifiée 08 Nov '15, 22:01

@unbonpetit @denis le nouveau code fonctionne, mais dès lors que j'y incorpore mes données, je rencontre des erreurs de compilation. Je constate que vos deux exemples font intervenir le paramètre « i » (\begin{longtable}{III} & \begin{longtable}{*3i}). Si je remplace celui-ci par « l », je rencontre moins d'erreurs.

Que sont donc ces « i » ? Permettent-ils la génération automatique de l'index ?

(08 Nov '15, 12:41) Pathe ♦♦ Pathe's gravatar image

@Pathe Ce sont de nouveaux types de colonnes, créés grâce à la commande \newcolumntype fournie par le package array et figurant dans nos codes respectifs.

(08 Nov '15, 12:46) denis ♦♦ denis's gravatar image

@unbonpetit J'ai des données avec trois items dans la première colonne, deux dans la suivante et un seul dans la dernière, ce qui crée un code du type :

Ouvrir dans l'éditeur
A& \multirow{2}{*}{B} & \multirow{3}{*}{C} \\
A & & \\
A& \multirow{-2}{*}{B}&\\

Cela génère des erreurs de compilation du type ! Missing \endgroup inserted. : j'ai eu du mal à faire la relation avec cette utilisation spécifique de multirow. Votre code est-il prévu pour ce cas particulier ?

(08 Nov '15, 14:00) Pathe ♦♦ Pathe's gravatar image

@Pathe Ce commentaire devrait être plutôt adressé @unbonpetit car c'est lui qui a proposé une solution prenant en charge la présence de commandes \multirow.

(08 Nov '15, 15:58) denis ♦♦ denis's gravatar image

Apparemment, il s'agit d'un bug de collcell qui perd un peu les pédales sur les cellules vides en fin de ligne. On le voit clairement dans cet ECM où collcell plante si au lieu de C, la dernière cellule est mise à vide :

Ouvrir dans l'éditeur
\documentclass{article}
\usepackage{longtable,collcell}
\def\showcell#1{\showtokens{contenu = "#1"}}
\begin{document}
\begin{longtable}{*3{>{\collectcell\showcell}l<\endcollectcell}}
A & B & C \\
\end{longtable}
\end{document}
(08 Nov '15, 19:49) unbonpetit ♦♦ unbonpetit's gravatar image

Le "bug" avec longtable vient du fait que \\ n'est pas définie \protected et donc est développée par le \halign sous-jacent. On peut y remédier en définissant \LT@tabularcr à l'aide de \protected.

(08 Nov '15, 21:59) unbonpetit ♦♦ unbonpetit's gravatar image

Là, tu me parles un langage que je n'entends point. Redéfinir une commande comprenant un @ (!) à l'aide de \protected ?

(08 Nov '15, 23:17) Pathe ♦♦ Pathe's gravatar image
Affichage de 5 parmi 7 Afficher 2 commentaire(s) en plus

Une solution consiste à recourir au package array qui permet de faire figurer automatiquement du code au début et/ou à la fin de chaque cellule d'une colonne, et aussi de définir de nouveaux types de colonnes qui notamment mettent en œuvre cette fonctionnalité. Le problème est que cette dernière ne fonctionne pas avec les macros à argument telle \index mais il suffit de recourir au package collcell (prévu à cet effet) pour s'en sortir :

Ouvrir dans l'éditeur
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8x]{inputenc}
\usepackage{longtable}
\usepackage{array}
\usepackage{collcell}
\usepackage{ifmtarg}
\usepackage[xindy]{imakeidx}
\usepackage{hyperref}
\makeindex
\makeatletter
\newcommand*{\myindex}[1]{%
  \@ifnotmtarg{#1}{#1\index{#1}}%
}
\makeatother
\newcolumntype{I}{>{\collectcell\myindex}l<{\endcollectcell}}
\begin{document}
\begin{longtable}{III}
  \multicolumn{1}{l}{\textsc{Român}} & \multicolumn{1}{l}{\textsc{English}} & \multicolumn{1}{l}{\textsc{Français}}\\
  \hline
  \hline
  \endhead
  Prăjină & Boom & Perche\\
  \hline
  Macară & Crane & Grue\\
  \hline
  Husă & & Voile\\
  \hline
  Maestru de lumini & Gaffer & Chef-électricien\\
  Electrician șef & Gaffer & \emph{Chef-électro}
\end{longtable}
\printindex
\end{document}

Il est à noter que ce fichier est à compiler avec pdflatex, puis texindy, puis à nouveau pdflatex (éventuellement plusieurs fois du fait du recours à longtable). Or la compilation texindy est normalement lancée avec une indication de langue, par exemple : texindy -L french toto.idx, pour spécifier les règles de classement alphabétique qui devront s'appliquer. Dans le cas présent, il y a trois langues en jeu...

Lien permanent

Publiée 31 Oct '15, 12:26

denis's gravatar image

denis ♦♦
7.3k1510
Taux d'acceptation : 53%

Modifiée 01 Nov '15, 22:26

Pathe's gravatar image

Pathe ♦♦
7.5k42203251

Ça me crée bien une page d'index... mais elle reste vide.

(31 Oct '15, 21:49) Pathe ♦♦ Pathe's gravatar image

@Pathe As-tu bien lancé la compilation texindy ?

(31 Oct '15, 21:53) denis ♦♦ denis's gravatar image

Mais oui : je suis scrupuleusement les recommandations postées ici !

(31 Oct '15, 22:49) Pathe ♦♦ Pathe's gravatar image

@Pathe Et il n'y a pas de warnings lors de la compilation texindy ?

(31 Oct '15, 23:04) denis ♦♦ denis's gravatar image

@Pathe Pourtant, sur overleaf, l'ECM que j'ai fourni donne le résultat escompté, index compris (modulo la suppression du caractère ș qui pose un problème à la version du package inputenc qui y est utilisée -- sur une TeX Live 2015 à jour, ce caractère ne pose pas de problème).

(31 Oct '15, 23:09) denis ♦♦ denis's gravatar image

Chez moi le fichier .idx est bien vide.

J'ai placé la totalité de mon fichier sur overleaf. L'index est toujours aussi vide, et le site me répond : « Class scrartcl Warning: Usage of package 'fancyhdr' together with a KOMA-Script class is not recommended. I'd suggest to use package 'scrpage2' or 'scrlayer-scrpage'. Nevertheless, using requested (scrartcl) package 'fancyhdr' on input line 19. »

En effet, j'utilise fancyhdr pour générer un pied de page.

Mais je ne fais pas le lien avec la vacuité de l'index.

(01 Nov '15, 22:15) Pathe ♦♦ Pathe's gravatar image

@Denis Aucun avertissement lors de la compilation texindy. Un seul truc étrange pour moi : il affiche Loading module "/tmp/ZlN9r5RgSp"... Mais c'est peut-être normal.

(01 Nov '15, 22:31) Pathe ♦♦ Pathe's gravatar image

@Pathe Le code que j'ai proposé ne fonctionne a priori pas avec \multirow. Que ce soit sur ma machine ou sur Overleaf, l'ECM que j'ai fourni (sans de telles commandes, donc) donne le résultat escompté, y compris en remplaçant la classe article par la classe scrartcl. Les messages du type Loading module "/tmp/ZlN9r5RgSp"... sont normaux. Quant au package fancyhdr, il est en effet à éviter avec les classes KOMA-Script : cf. par exemple leurs commandes \ofoot, \cfoot, \ifoot (mais ça devrait faire l'objet d'une question à part entière).

(02 Nov '15, 10:49) denis ♦♦ denis's gravatar image

Je suis loin d'être un expert en index. Si j'ai bien compris, pour que le fichier compile correctement, il me faudrait enlever toutes les mentions multirow et générer l'index.

Par la suite, pour obtenir la présentation initiale, il me faudrait remettre les multirow dans le document et modifier le fichier .idx en fonction desdites modifications, c'est cela ?

(03 Nov '15, 10:25) Pathe ♦♦ Pathe's gravatar image

J'ai enlevé de mon fichier :

  • tous les \multirow,
  • \fancyhdr et les commandes y afférant,
  • tous les caractères particuliers au roumain.

Cela ne change rien : mon fichier .idx reste vide. Je ne comprends pas pourquoi.

(07 Nov '15, 15:40) Pathe ♦♦ Pathe's gravatar image

@Pathe As-tu essayé le code que j'ai fourni ?

(07 Nov '15, 20:17) denis ♦♦ denis's gravatar image
Affichage de 5 parmi 11 Afficher 6 commentaire(s) en plus
Votre réponse
(dés)activer l'aperçu

Suivre cette question

Par courriel :

Une fois que vous serez enregistré, vous pourrez souscrire à n'importe quelle mise à jour ici

Par flux RSS :

Réponses

Réponses et commentaires

Bases de Markdown

  • *italique* ou _italique_
  • **gras** ou __gras__
  • Lien ::[texte](http://url.com/ "Titre ")
  • Image : ?![alt texte](/path/img.jpg "Titre ")
  • Liste numérotée : 1. Foo 2. Bar
  • Pour ajouter un passage à la ligne, ajoutez deux espaces à l'endroit où vous souhaitez que la ligne commence.
  • Les balises HTML de base sont également prises en charge.