Sur un autre forum, la question suivante a été posée :

« À la manière de la commande \addcontentsline, j'aimerai ajouter une ligne dans un tableau. Voici un exemple d'utilisation:

Ouvrir dans l'éditeur
\addline{matable}{valeur1 & valeur2}

Je ne sais pas du tout si c'est faisable mais après une recherche sur Internet, je n'ai rien trouvé.

Est-ce faisable ? Avez-vous une idée d'où commencer mes recherches ? (J'aimerais éviter si possible de regarder tout le code de \addcontentsline.) »

Posée 22 Oct '15, 20:14

Nikopol's gravatar image

Nikopol
1.0k614
Taux d'acceptation : 42%

Modifiée 23 Oct '15, 08:32

denis's gravatar image

denis ♦♦
7.0k1510


Voilà un truc bricolé vite fait. Dans la vraie vie, il faudrait évidemment rajouter les gardes-fous d'usage à coup de \ifcsname...\endcsname pour voir si la table est déjà définie lorsqu'on l'affiche et lorsqu'on y ajoute un truc.

Edit : le \begin{footnotesize}...\end{footnotesize}, comme tout environnement de changement de taille de fonte, n'est pas recommandé dans la vraie vie. En fait, cet environnement sert juste à s'assurer que la macro \check@tabname ne se trompe pas de \end : elle ajoute bien le contenu supplémentaire avant le \end{<x>} (ou <x> est l'environnement de tableau spécifié après le premier \begin dans \newtable) et non pas avant le premier end qu'elle rencontre.

Ouvrir dans l'éditeur
\documentclass{article}
\makeatletter
\def\gob@tonil#1\@nil{}
\def\newtable#1#2{%
    \expandafter\def\csname tab@@#1\endcsname{#2}%
    \def\find@tabname##1\begin{%
        \afterassignment\gob@tonil
        \expandafter\def\csname tabname@@#1\endcsname
    }%
    \find@tabname#2\@nil
}
\def\showtable#1{\csname tab@@#1\endcsname}
\def\addtototable#1#2{%
    \let\collect@tab\empty
    \def\check@tabname##1\end##2##3\@nil{%
        \def\close@envname{##2}%
        \csname @\expandafter\ifx\csname tabname@@#1\endcsname\close@envname first\else second\fi oftwo\endcsname
            {\g@addto@macro\collect@tab{##1#2\end{##2}##3}%
            \expandafter\let\csname tab@@#1\endcsname\collect@tab
            }
            {\g@addto@macro\collect@tab{##1\end{##2}}%
            \check@tabname##3\@nil
            }%
    }%
    \expandafter\expandafter\expandafter\check@tabname\csname tab@@#1\endcsname\@nil
}
\makeatother

\begin{document}
\newtable{matable}{% définit une table
    \begin{tabular}{|c|c|c|}\hline
        1 & 2 & 3\\\hline
        foo\begin{footnotesize}minus\end{footnotesize} & bar & baz\\\hline
    \end{tabular}}

Voici "matable" : \showtable{matable}% l'affiche
\bigbreak

\addtototable{matable}{valeur 1 & valeur 2 & valeur 3\\\hline}% ajoute une ligne
Voici ma table : \showtable{matable}

\addtototable{matable}{\multicolumn{2}{|c|}{truc 1} & truc 2\\\hline}% ajoute une autre ligne
Voici ma table : \showtable{matable}
\end{document}
Lien permanent

Publiée 22 Oct '15, 21:08

unbonpetit's gravatar image

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

Modifiée 22 Oct '15, 23:49

@unbonpetit Comme d'habitude, réponse très savante et bourrée de \expandafter ! ;) Juste une remarque : pour changer la taille des caractères, le recours à un environnement est déconseillé car rarement utilisé (comme ici) sur une seule ligne, d'où des espaces superfétatoires et c'est plutôt la bascule correspondante qui est préconisée : ici, j'aurais donc mis truc 1{\footnotesize minus} plutôt que truc 1\begin{footnotesize}minus\end{footnotesize}.

(22 Oct '15, 23:37) denis ♦♦ denis's gravatar image

Les \expandafter sont nécessaires, ils ne sont pas là pour faire joli ! Ensuite, pour l'environnement, je sais très bien que pour changer de taille de police, ils sont à éviter : je voulais justement mettre en évidence que un \end{<autre chose que tabular>} était bien géré par mes macros. Mais je me suis complètement planté car j'aurais dû mettre cet environnement dans la table initiale. J'avais faim et pas le temps de tout vérifier ! Je te rassure : mes macros acceptent des \end dans le tableau que l'on veut rallonger. J'édite ma réponse.

(22 Oct '15, 23:42) unbonpetit ♦♦ unbonpetit's gravatar image
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.