[Resolu] Définir puis réutiliser un texte

Tout ce qui concerne l'utilisation ou l'installation de LaTeX.

Modérateur: gdm_tex

Règles du forum
Merci d'éviter le style SMS dans vos messages et de penser à utiliser la fonction Recherche avant de poster un message. Pour joindre des fichiers à vos messages, consulter ce sujet.
> Penser à utiliser les balises Code pour poster du code.

[Resolu] Définir puis réutiliser un texte

Messagepar rebouxo » Mercredi 05 Avril 2017, 08:16

Bonjour à tous.
Je voudrais faire un couple de macro :
  • une macro de définition, dans laquelle je stocke un texte. Mettons \toto{un texte}
  • une macro d'utilisation (\totouse), que je mets là où je veux.
Ce qui ressemble le plus à ce que je veux faire est la macro \author, dont je pense qu'elle stocke le contenu pour le réutiliser plus loin.
C'est aussi les méthodes setToto et getToto en POO.
J'ai deux méthodes qui fonctionnent, je voudrais savoir si il y en a d'autres :
  • Une méthode à base de boite (\savebox, \usebox), qui a un inconvénient qu'il faut gérer tout ce qui concerne les fontes.
  • Une méthode à base de registre de token, cela donne :
    Code: Tout sélectionner
     \newtoks\tokcontenus%
     \newcommand{\contenus}[1]
     {%
       \tokcontenus= {#1}%
     }%
     \newcommand{\contenususe}{\the\tokcontenus}
La 2e me semble bien plus souple que la première. Mais peut-on faire autrement ? Dans la 2e, quels sont les risques ?

Merci de vos lumières
Olivier
A line is a point that went for a walk. Paul Klee
Par solidarité, pas de MP
rebouxo
Modérateur
 
Messages: 6729
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Publicité

Re: Définir puis réutiliser un texte

Messagepar raphkebab » Mercredi 05 Avril 2017, 09:18

Ce n'est pas très claire.
Pour quoi ne peut tu pas faire simplement ?

Code: Tout sélectionner
 \newcommand{\totouse}{un texte}


Sinon j'ai un code plus bourrin :

Code: Tout sélectionner
\def\contenus#1#2{%
\expandafter\def\csname #1\endcsname{#2\xspace}%
}


Il crée des \#1 avec un contenue #2.

Je m'en sers pour mes abréviations, pour être plus rapide.
Code: Tout sélectionner
\def\abrev#1#2#3{%
\newacronym{#1}{#2}{#3}
\expandafter\def\csname #1\endcsname{\gls{#1}\xspace}%
}
raphkebab
Kilo-utilisateur
 
Messages: 223
Inscription: Mardi 31 Décembre 2013, 12:37
Localisation: Caen
Statut actuel: Post-bac | Doctorat

Re: Définir puis réutiliser un texte

Messagepar rebouxo » Mercredi 05 Avril 2017, 15:52

Parce que cela ne fait pas ce que je veux.
La macro \author{} n'affiche pas l'auteur, elle stocke le contenu pour que celui-ci soit réutilisé ailleurs (dans la macro \maketitle).
Et j'ai chercher cette macro, et ben je ne l'ai pas trouvée...

Où alors je me complique la vie (ce qui n'est pas forcément faux). Non après vérification, cela ne fonctionne pas. Comme la commande \author, mes commandes sont appelées avant le \begin{document}.

Ta 2e macro me permettrais de factoriser mon code. Parce que là c'est pas optimisé... Mais déjà, cela fonctionne bien avec les registres de token. et ce que je fais semble prédictible, donc je dois comprendre un peu ce que je fais.

Gagner du temps c'est bien, encore faut-il que le code soit compréhensible. Je ne suis pas un fan (mais comme c'est tes sources tu fais ce que tu veux). Je préfère faire ce genre de trucs avec un snippet. Mais il y a des avantages et des inconvénients dans les deux méthodes. Ta méthode permet de modifier facilement la source en cas d'évolution, la mienne ne le permet pas.

Olivier
A line is a point that went for a walk. Paul Klee
Par solidarité, pas de MP
rebouxo
Modérateur
 
Messages: 6729
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Re: Définir puis réutiliser un texte

Messagepar gigiair » Mercredi 05 Avril 2017, 21:09

Je ne suis pas sûr d'avoir tout compris le problème.
Personnellement si j'avais à réutiliser du texte plusieurs fois dans un document, je le sauvegarderais dans un fichier que je restituerais là ou je veux par un Input.
Un peu comme ça :
Code: Tout sélectionner
\documentclass[frenchb]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{moreverb}
\usepackage{babel}

\begin{document}

\begin{verbatimwrite}{\jobname-decoté.txt}
  {\Large Ceci est du texte mis de côté}
 
  {\tiny pouvant être réutilisé}
  \begin{itemize}
  \item à la demande
  \end{itemize}
\end{verbatimwrite}
\input{\jobname-decoté.txt}

Des choses et d'autres

\input{\jobname-decoté.txt}

\end{document}

Bien sûr, pour économiser les frappes, on peut créer un environnement qui sauve le texte et le restitue aussitôt. Mais j'ai la flemme de le faire.
JJR.
LaTeXien migrateur.
gigiair
Exa-utilisateur
 
Messages: 2267
Inscription: Samedi 08 Juillet 2006, 19:56
Localisation: Saint Bonnet Elvert
Statut actuel: Actif et salarié

Re: Définir puis réutiliser un texte

Messagepar marco56 » Mercredi 05 Avril 2017, 22:00

Par curiosité, pourquoi un fichier .txt et pas un fichier .tex ?
J'avoue ne pas comprendre le problème posé, je n'y réponds donc pas...
marco56
Giga-utilisateur
 
Messages: 663
Inscription: Jeudi 25 Novembre 2010, 22:10
Statut actuel: Actif et salarié | Enseignant

Re: Définir puis réutiliser un texte

Messagepar raphkebab » Jeudi 06 Avril 2017, 08:52

Si tu veux vraiment faire la même chose qu'avec \author sont code est le suivant :

Code: Tout sélectionner
\makeatletter
\newcommand{\author}[1]{\def\@author{#1}}
\makeatother


mais \@author ne peut être utilisé que entre \makeatletter et \makeatother.

Sinon tu peux faire sauter cette restriction comme ça :

Code: Tout sélectionner
\newcommand{\contenus}[1]{\def\contenususe{#1}}


Mais du coups je ne vois pas l'intérêt comparé à :

Code: Tout sélectionner
\newcommand{\contenususe}{mon texte}


Ce que je ne comprend pas c'est pourquoi veux-tu une fonction intermédiaire ? (Ce que je veux dire c'est la macro \newcommand n'affiche pas le texte elle le stocke dans \contenususe)
Qu'es qui t'oblige à ne pas utiliser un \newcommand simple ? (Est-ce pour l’esthétique ?)
raphkebab
Kilo-utilisateur
 
Messages: 223
Inscription: Mardi 31 Décembre 2013, 12:37
Localisation: Caen
Statut actuel: Post-bac | Doctorat

Re: Définir puis réutiliser un texte

Messagepar rebouxo » Jeudi 06 Avril 2017, 13:54

raphkebab a écrit:Si tu veux vraiment faire la même chose qu'avec \author sont code est le suivant :

Code: Tout sélectionner
\makeatletter
\newcommand{\author}[1]{\def\@author{#1}}
\makeatother


Déjà tu as trouvé la définition de \author que je n'ai pas trouvé et qui est très clairement plus simple que ce que j'ai fait.
J'avoue ne pas penser à cette TeXniquerie de redéfinir les macros à chaque fois. Mais c'est très clairement plus simple que ce que j'ai fait.
Cela dit la liste de tokens fonctionne très bien.
raphkebab a écrit:mais \@author ne peut être utilisé que entre \makeatletter et \makeatother.

Sinon tu peux faire sauter cette restriction comme ça :

Code: Tout sélectionner
\newcommand{\contenus}[1]{\def\contenususe{#1}}


C'est juste pour la privatiser, mais ce n'est pas un problème car j'utiliserais la macro dans une macro définit dans un .sty où @ est réutilisée.
raphkebab a écrit:Mais du coups je ne vois pas l'intérêt comparé à :

Code: Tout sélectionner
\newcommand{\contenususe}{mon texte}


Je ne veux pas faire une nouvelle commande, je veux faire une commande qui stocke mon texte. Dans le source je veux pouvoir écrire \contenu{du texte}. De la même manière que \author n'est pas précédée d'un \newcommand.
raphkebab a écrit:
Ce que je ne comprend pas c'est pourquoi veux-tu une fonction intermédiaire ? (Ce que je veux dire c'est la macro \newcommand n'affiche pas le texte elle le stocke dans \contenususe)
Qu'es qui t'oblige à ne pas utiliser un \newcommand simple ? (Est-ce pour l’esthétique ?)

Oui, en partie. En fait l'idée est de faire un package pour un entête commun, mais dépendant d'établissement, de section...

Merci de vos réponses
Olivier
A line is a point that went for a walk. Paul Klee
Par solidarité, pas de MP
rebouxo
Modérateur
 
Messages: 6729
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant

Re: Définir puis réutiliser un texte

Messagepar evariste_G » Jeudi 06 Avril 2017, 14:07

Ceci répond-il à ta demande ?

Code: Tout sélectionner
\documentclass[11pt]{article}

\usepackage[utf8]{inputenc}

\newcommand{\toto}[1]{\def\totouse{#1}}

\begin{document}

\toto{Un texte}

Ceci est \totouse.
\end{document}
evariste_G
Téra-utilisateur
 
Messages: 1332
Inscription: Vendredi 19 Décembre 2008, 19:13
Localisation: Bordeaux
Statut actuel: Post-bac

Re: Définir puis réutiliser un texte

Messagepar rebouxo » Jeudi 06 Avril 2017, 17:23

Oui parfaitement, c'est d'ailleurs la même réponse que raphketab.

Merci
Olivier
A line is a point that went for a walk. Paul Klee
Par solidarité, pas de MP
rebouxo
Modérateur
 
Messages: 6729
Inscription: Mercredi 15 Février 2006, 13:18
Localisation: le havre
Statut actuel: Actif et salarié | Enseignant


Retourner vers LaTeX

 


  • Articles en relation
    Réponses
    Vus
    Dernier message

Qui est en ligne

Utilisateurs parcourant ce forum: Google [Bot] et 4 invités