|
#1
![]() |
|
|
|
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
![]() |
|
|
|
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
![]() |
|
|
|
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
![]() |
|
|
|
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
|
Fuseau horaire GMT +2. Il est actuellement 16h11. | Privacy Policy
|