hilpers


  hilpers > comp.* > comp.text.tex

 #1  
20/04/2017, 11h21
François Patte
Bonjour,

J'utilise le paquet "version" pour mettre supprimer certaines partie
d'un fichier suivant la version que je veux obtenir. D'abord une
question à son propos: si on met \excludeversion{toto} dans le cours du
texte, l'environnement "toto" disparaît dans tout le texte et pas
seulement à partir de l'endroit où on a mis \excludeversion. Cela
m'étonne un peu car je croyais que TeX ne revenait jamais en arrière et
donc ce qui précède la commande ne devrait pas être affecté, ie.:
l'environnement "toto" ne devrait disparaître qu'après l'usage de cette
commande.

Ce que je cherche c'est, au fil d'un texte, faire apparaître ou
disparaître certains morceaux suivant la version que je voudrais.

Dans le même esprit, existe-t-il un paquet qui permette d'activer ou
désactiver des commandes suivant que je veux telle ou telle version de
mon texte?

 #2  
20/04/2017, 17h43
Jean-Côme Charpentier
Le 20/04/2017 à 11:21, François Patte a écrit :
> Bonjour,


Bonjour,

> J'utilise le paquet "version" pour mettre supprimer certaines partie
> d'un fichier suivant la version que je veux obtenir. D'abord une
> question à son propos: si on met \excludeversion{toto} dans le cours
> du texte, l'environnement "toto" disparaît dans tout le texte et pas
> seulement à partir de l'endroit où on a mis \excludeversion. Cela
> m'étonne un peu car je croyais que TeX ne revenait jamais en arrière
> et donc ce qui précède la commande ne devrait pas être affecté, ie.:
> l'environnement "toto" ne devrait disparaître qu'après l'usage de
> cette commande.


Je confirme que TeX ne revient jamais en arrière et je demande à voir
ce comportement sur un ECM. Ma croyance dans le fait que TeX ne revient
jamais en arrière est plus forte qu'une assertion sans preuve...
d'autant plus que mon ECM invalide (évidemment) cette thèse :-)

> Ce que je cherche c'est, au fil d'un texte, faire apparaître ou
> disparaître certains morceaux suivant la version que je voudrais.


J'ai appelé cela flipflop. Donc on peut toujours appeler
\excludeversion{flipflop} à n'importe quel moment et cela fera bien
disparaître les environnements flipflop qui suivent. Le problème serait
plutôt de les faire réapparaître. Normalement un simple
\includeversion{flipflop} aurait dû faire l'affaire mais, bizarrement,
il faut au préalable tuer totalement l'environnement flipflop (avec un
\let\flipflop\relax.
Je n'ai pas essayé sur des cas compliqué mais en tous cas, le
fonctionnement de base à l'air correct :

----%<---------%<---------%<---------%<---------%<-----
\documentclass{article}
\usepackage{version}
\begin{document}
\includeversion{flipflop}

\begin{flipflop}
Ceci est un texte qui doit se voir.
\end{flipflop}

\excludeversion{flipflop}

\begin{flipflop}
Ceci est un texte qui ne doit pas se voir.
\end{flipflop}

\let\flipflop\relax
\includeversion{flipflop}

\begin{flipflop}
Ceci est un texte qui doit se voir de nouveau.
\end{flipflop}
\end{document}
----%<---------%<---------%<---------%<---------%<-----

> Dans le même esprit, existe-t-il un paquet qui permette d'activer ou
> désactiver des commandes suivant que je veux telle ou telle version
> de mon texte?


Cela veut dire quoi désactiver une commande ? La rendre équivalente à
\relax (mais il n faut pas qu'il y ait de paramètre) la redéfinir en une
truc du type \renewcommand\bidule[1]{} ?

Jean-Côme Charpentier
 #3  
21/04/2017, 12h33
François Patte
Le 20/04/2017 à 17:43, Jean-Côme Charpentier a écrit :
> Le 20/04/2017 à 11:21, François Patte a écrit :
> Bonjour,
> ce comportement sur un ECM. Ma croyance dans le fait que TeX ne revient
> jamais en arrière est plus forte qu'une assertion sans preuve...
> d'autant plus que mon ECM invalide (évidemment) cette thèse :-)
> \excludeversion{flipflop} à n'importe quel moment et cela fera bien
> disparaître les environnements flipflop qui suivent. Le problème serait
> plutôt de les faire réapparaître. Normalement un simple
> \includeversion{flipflop} aurait dû faire l'affaire mais, bizarrement,
> il faut au préalable tuer totalement l'environnement flipflop (avec un
> \let\flipflop\relax.


Ah! Merci, ce que j'avais pris pour "TeX ne revient jamais en arrière"
en défaut, est l'usage de version dans l'ordre: \excludeversion ...
\includeversion qui fait disparaître tous les environnements concernés
par l'usage de version.

si on ajoute \let\flipflop\relax, ça marche effectivement mais à moitié:
une partie de l'environnement est "mangé"

----%<---------%<---------%<---------%<---------%<-----
\documentclass[11pt]{article}

\usepackage[frenchb]{babel}
\usepackage{amsmath,amsfonts,amssymb}

\usepackage{version}

\newenvironment{vdemo}{%
\begin{center}\textbf{Solution}%
\end{center}}%
{\par\nopagebreak\centerline{\rule{5cm}{1.5pt}}}

\begin{document}

{\bfseries Exercice~1} Soit $G$ un groupe et $H$ un sous-groupe de $G$.

\excludeversion{vdemo}

\begin{vdemo}
\begin{enumerate}
\item Si $x,\, y \in N_H$,
\end{enumerate}
\end{vdemo}

\let\vdemo\relax

\includeversion{vdemo}

{\bfseries Exercice~2} Soit $G$ un groupe et $x$ et $y$ deux éléments
de $G$.

\begin{vdemo}
\begin{enumerate}
\item Pour tout automorphisme $\varphi$ de $G$ et tout $x$ et $y$,
\end{enumerate}
\end{vdemo}

\end{document}
----%<---------%<---------%<---------%<---------%<-----

L'entête de l'environnement "vdemo" (Solution en gras au centre) disparaît.

> Cela veut dire quoi désactiver une commande ? La rendre équivalente à
> \relax (mais il n faut pas qu'il y ait de paramètre) la redéfinir en une
> truc du type \renewcommand\bidule[1]{} ?


La rendre "invisible" à la compilation. Par exemple, je définis une
commande

\newcommand[1]{\maref}{\marginpar{\tiny #1}

En mode travail, on voit apparaître le contenu dans la marge, en mode
public on ne voit rien. Jusqu'à présent, j'utilise
\renewcommand\bidule[1]{} mais je me demande s'il n'y a pas un paquet
permettant de mettre une liste de commandes à activer ou désactiver au
fil du fichier. Genre: dans le préambule on met:

\commande-a-desactiver{\toto,\tata,\titi,....}

Dans le fichier, là où on veut désactiver une commande:

\commandekaput{\toto,\titi}

là où on veut réactiver

\commandenokaput{\titi}

Mais c'est peut-être impossible ou trop de travail pour un maigre profit.

Cela dit, comment réactiver une commande après avoir utilisé
\renewcommand\bidule[1]{}? Il faut la redéfinir avec un renewcommand
aussi, ou y a-t-il un autre moyen?

Merci.
 #4  
22/04/2017, 00h54
Jean-Côme Charpentier
Le 21/04/2017 à 12:33, François Patte a écrit :
> si on ajoute \let\flipflop\relax, ça marche effectivement mais à moitié:
> une partie de l'environnement est "mangé"


Ah oui pardon ! Je n'avais pas compris que l'extension package
pouvait désactiver un véritable environnement. Je pensais juste que
c'était un truc pour commenter une partie d'un document. Du coup c'est
normal que je tue l'environnement avec mon \let\machin\relax. Il faut la
jouer plus fine :-)

[..]
> Dans le fichier, là où on veut désactiver une commande:
> \commandekaput{\toto,\titi}
> là où on veut réactiver
> \commandenokaput{\titi}
> Mais c'est peut-être impossible ou trop de travail pour un maigre profit.


Impossible n'est pas LaTeX. Cela dit, le faire de façon totalement
générale et automatique est un poil embêtant. Lorsqu'on a une macro
simple, par exemple :

\newcommand\poli{Veuillez recevoir l'expression des sentiments de ma
très haute considération distinguée}

pour « effacer » la commande tout en la sauvegardant, on peut se faire un :

\let\poliORI\poli
\renewcommand\poli{}

et du coup c'est simple à faire. L'embêtant c'est qu'une commande peut
avoir des paramètres. Par exemple :

\newcommand\polisex[1]{Veuillez recevoir, #1, mes plus sincères
condoléances}

pour la sauvegarde, pas de problème : un \let\polisexORI\polisex fera
très bien l'affaire. En revanche, pour que cela ne couine pas à la
compilation, il faut redéfinir une coquille vide avec le bon nombre de
paramètres. Ici :

\renewcommand\polisex[1]{}

voire mieux (petite astuce) :

\renewcommand\polisex[1]{\ignorespaces}

La difficulté est de retrouver, uniquement à partir du nom le nombre de
paramètres de la macro. Pour cela, il faut faire joujou avec \meaning,
faire de la découpe, faire gaffe aux code de catégorie des caractères
qui viennent et qui vont. Bref, il y a un moment un peu TeXnique mais
cela se fait.
En revanche, je n'ai pas analyser très en profondeur ce que raconte
\meaning et le cas des macros à argument optionnel n'a pas été géré...
si quelqu'un de courageux se sent de le faire :-) Sinon, on peut créer
une deuxième série de macro pour désactiver et réactiver les commandes à
paramètre : c'est plus simple puisque d'un point de vue TeXien, les
commandes à paramètre optionnel n'ont pas de paramètre du tout !

> Cela dit, comment réactiver une commande après avoir utilisé
> \renewcommand\bidule[1]{}? Il faut la redéfinir avec un renewcommand
> aussi, ou y a-t-il un autre moyen?


Fondamentalement c'est ça (modulo le \ignorespaces pour que la macro
n'ait réellement aucun effet). Le problème est d'automatiser la chose.

Alors. Pour le \excludeversion, dès que l'environnement est créé, il
faut le sauvegarder avec la macro \saveenv{nom-environnement}. Ensuite,
pour réactiver l'environnement, il faut juste mettre un
reactiveenv{nom-environnement}.
Pour les macros, c'est plus simple, j'ai repris la syntaxe proposée
(liste de macros séparées par des virgules). Il faut les désactiver avec
\desactivecmd{liste-macros} et les réactiver éventuellement après avec
\reactivecmd{liste-macros}. Attention : on ne peut pas réactiver une
macro qui n'a pas été préalablement désactiver. Attention bis : il ne
faut pas désactiver deux fois de suite la même macro sinon on la perd
définitivement. Attention ter : les désactivations et réactivations sont
sensibles aux groupes. Si on désactive dans un groupe, en sortie de
groupe, les macro se réactivent toutes seules comme des grandes (idem
pour un réactivation).

Voici le code avec ECM qui commence à être de moins en moins M :-)

-----%<----------%<----------%<----------%<----------%<-----
\documentclass[11pt]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[frenchb]{babel}
\usepackage{amsmath,amsfonts,amssymb}

\usepackage{version}

%%%%%%%%%%%%%%%%%%
%%% Le camboui %%%

\newcommand\saveenv[1]{%
\expandafter\let\expandafter\tmp\csname #1\endcsname
\expandafter\let\csname #1ORI\endcsname \tmp
}
\newcommand\reactiveenv[1]{%
\expandafter\let\expandafter\tmp\csname #1ORI\endcsname
\expandafter\let\csname #1\endcsname\tmp
}

\newcommand\desactivecmd[1]{%
\desactiveonecmd#1,\nil,%
}
\def\NIL{\nil}
\def\desactiveonecmd#1,{%
\def\arg{#1}%
\unless\ifx\arg\NIL
\message{^^JTraitement de \string#1}
\edef\meaningcmd{\meaning#1}%
\expandafter\parseargument\meaningcmd\nil
\extractname{#1}%
\expandafter\let\csname\name ORI\endcsname#1
\let#1\tmp
\expandafter\desactiveonecmd
\fi
}
\def\parseargument#1:#2->#3\nil{%
\scantokens{\long\def\tmp#2{\ignorespaces}}%
}
\def\extractname#1{%
\edef\name{\string#1}%
\expandafter\extractnameaux\name\nil
}
\def\extractnameaux#1#2\nil{\def\name{#2}}

\newcommand\reactivecmd[1]{%
\reactiveonecmd#1,\nil,%
}
\def\reactiveonecmd#1,{%
\def\arg{#1}
\unless\ifx\arg\NIL
\extractname{#1}%
\expandafter\let\expandafter\tmp\csname\name ORI\endcsname
\let#1\tmp
\expandafter\reactiveonecmd
\fi
}

%%% fin du camboui %%%
%%%%%%%%%%%%%%%%%%%%%%

%%% Définition environnement

\newenvironment{vdemo}{%
\begin{center}\textbf{Solution}%
\end{center}}%
{\par\nopagebreak\centerline{\rule{5cm}{1.5pt}}}
\saveenv{vdemo} % avec sa sauvegarde (important)

%%% Définitions commandes

\newcommand{\maref}[1]{\marginpar{\tiny #1}}
\newcommand{\macmd}[2]{(en #1 cela donne #2)}
\newcommand{\montab}[3]{%
\begin{tabular}{|*{3}{c|}}
\hline
#1 & #2 & #3
\\\hline
\end{tabular}%
}

\begin{document}
%%% Tests de commmandes

\desactivecmd{\maref,\macmd,\montab}

Utilisation de maref\maref{un}, de macmd \macmd{français}{un}
et de montab \montab{un}{deux}{trois}

\reactivecmd{\maref,\montab}

Utilisation de \textbf{maref}\maref{one}, de macmd \macmd{anglais}{one}
et de \textbf{montab} \montab{one}{two}{three}

\desactivecmd{\maref}
\reactivecmd{\macmd}

Utilisation de maref\maref{ein}, de \textbf{macmd} \macmd{allemand}{ein}
et de \textbf{montab} \montab{ein}{zwei}{drei}

%%% Tests d'environnement

{\bfseries Exercice~1} Soit $G$ un groupe et $H$ un sous-groupe de $G$.

\excludeversion{vdemo}

\begin{vdemo}
\begin{enumerate}
\item Si $x,\, y \in N_H$,
\end{enumerate}
\end{vdemo}

\reactiveenv{vdemo}

{\bfseries Exercice~2} Soit $G$ un groupe et $x$ et $y$ deux éléments
de $G$.

\begin{vdemo}
\begin{enumerate}
\item Pour tout automorphisme $\varphi$ de $G$ et tout $x$ et $y$,
\end{enumerate}
\end{vdemo}

\end{document}
-----%<----------%<----------%<----------%<----------%<-----

Jean-Côme Charpentier

Discussions similaires
Où trouver la version précédente d'un paquet ?

Récupérer un paquet d'une version antérieure

Création paquet : remplacement fichiers d'autres paquets

version(s) d'un paquet Debian source ?


Fuseau horaire GMT +2. Il est actuellement 03h51. | Privacy Policy