Malheureusement
\newcounter{cmpt}
\setcounter{cmpt}{\ref{truc}}
ne convient pas : \ref{truc} est une chaine, et \setcounter attend une
valeur num�rique.
Pour �tre tout � fait exact, �tant donn� que \ref{truc} donne la chaine
"??" � la premi�re complilation, c'est plut�t :
\ifthenelse{\equal{\ref{truc}}{??}}{\setcounter{cmpt}{0}}{\setcounter{cm
pt}{\ref{truc}}}
qui est essay�, et qui �videmment ne fonctionne pas.
Comment donc puis-je obtenir la valeur de la chaine \ref{truc} ?
Avec le package calc et en analysant la chaine caract�re par caract�re,
il m'est sans doute possible de construire le nombre 3 + 10*5 + 100*2 �
partir de la chaine "253", mais j'imagine et esp�re qu'un besoin aussi
"�l�mentaire" dispose d�j� d'une solution toute pr�te.
J'ai essay� avec xstring, mais l� aussi j'arrive � rien.
L'id�e serait de passer par \IfDecimal et d'utiliser le compteur
\integerpart (selon la doc xstring_doc_fr.pdf section 2;1.7; or je ne
comprend pas : un compteur n'a pas de \ devant, selon le latex
Companion, section A.1.4, alors comment on utilise \integerpart ???).
D'autre part, \IfDecimal{\ref{truc}}{vrai}{faux} conduit � :
! Incomplete \iffalse; all text was ignored after line 264.
Pourtant, \IfDecimal{43}{vrai}{faux} fonctionne. La chaine \ref{truc} ne
peut-elle pas �tre employ�e ?
Merci pour toute aide.
\ref{truc} est un appel à une macro qui affiche la référence au label truc.
\ref est une macro (très) compliquée qui, après de multiples choses,
affiche un nombre. Ce n'est pas parce qu'une macro affiche un nombre que
son développement est un nombre. La différence est de taille.
Ici, le développement de \ref{truc} n'est pas un nombre, tu ne peux donc
pas l'assigner directement à un compteur.
> Merci pour toute aide.
>
Le plus simple serait que tu postes un exemple complet minial (ECM).
<couic>
Quelque chose comme �a ?
\documentclass[a4paper,12pt,leqno]{book}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage[francais]{babel}
\usepackage[autolanguage]{numprint}
\usepackage{microtype}
\usepackage{ifthen}
\usepackage{lineno}
\usepackage{lipsum}
\begin{document}
\newcounter{cmpt}
\makeatletter
\ifx\r@truc\@undefined\setcounter{cmpt}{0}%
\else%
\setcounter{cmpt}{\expandafter\@firstoftwo\r@truc}%
\fi%
\makeatother
\linenumbers
\textbf{Valeur de \textsf{cmpt}: \thecmpt.}
\lipsum\linelabel{truc}
\end{document}
Fran�ois
--
<Jean-Marc Bourguet> Et voila Knuth qui se retournerait dans sa tombe,
s'il y etait deja. (Voir dans "The Art Of Computer
Programming" pourquoi il utilise un assembleur et non un autre
langage).
<Joe Cool> Ce monsieur ne m�rite pas que l'on cite son nom sur un
forum informatique.
-+- in fr.comp.lang.general, fr.comp.algorithmes -+-
> Le 01/01/2010 17:07, quark67 a �crit :
> > Bonjour, supposons que \ref{truc} soit une cha�ne
> Supposition fausse d'entr�e. Enfin, d'apr�s ce que je devine �tre ta
> d�finition de "chaine".
>
Bonjour, j'avais lu dans le LaTeX companion, 2�me �dition, page 68
(section 2.4) la chose suivante : "La commande \ref compose une cha�ne
identifiant l'�l�ment donn�". J'avais donc compris la chose suivante :
\ref produit une cha�ne.
> Ce n'est pas parce qu'une macro affiche un nombre que
> son d�veloppement est un nombre
Ok. Je pense commencer � saisir la nuance. Si au lieu d'afficher "4" et
"3" pour indiquer la ligne 43, \ref affichait une �toile , et pla�ait
une �toile suivi d'une fl�che devant la ligne 43, je n'aurais pas
cherch� � "convertir" \ref{truc} vers le nombre 43.
Fran�ois P�tiard m'a r�pondu avec une solution fonctionnelle, donc on
peut dire que la question est r�solue sur un plan pratique.
[HS]
Mais puisque tu es l�, je suis quand-m�me curieux de savoir comment
utiliser \integerpart (qui, s'il est un compteur, a un \ bien troublant
devant... ) propos� par xstring.
As-tu un exemple � donner ?
Si j'execute :
La cha�ne \IfDecimal{43.56}{est}{n'est pas} un nombre.
Comment pourrais-je afficher la partie enti�re le cas �ch�ant dans une
phrase qui suit ?
> Quelque chose comme �a ?
>
> \newcounter{cmpt}
> \makeatletter
> \ifx\r@truc\@undefined\setcounter{cmpt}{0}%
> \else%
> \setcounter{cmpt}{\expandafter\@firstoftwo\r@truc}%
> \fi%
> \makeatother
> Fran�ois
Parfait, merci beaucoup !
Cela fonctionne bien.
Par contre, o� puis-je trouver les bases me permettant de comprendre un
peu ce code ?
Je "devine" que "si la r�f�rence � truc � est ind�finie" (premi�re
compilation, qui donnera "??" pour \ref{truc}), on assigne la valeur 0
au compteur.
Mais o� puis-je trouver des infos d�taill�es sur \r@, sur \@undefined ou
\@firstoftwo ?
C'est � dire, par o� d�buter pour "trouver par moi-m�me" ce genre de
solution ?
Existe-t-il sur le web des documents (si possible francophones) initiant
� cela ?
Oui bien puis-je vous demander quelques explications "simples" ?
\r@truc, c'est la version TeX de \ref{truc} ?
Dans ce cas, comment comprendre \@firstoftwo ? Premier des deux? Mais
premier des deux quoi? \r@truc est vu comme 2 �l�ments ?
Merci ;)
Oui, autant en profiter ;) !
En fait, il faut bien distinguer 2 choses : les compteurs TeX et les
compteurs LaTeX.
Mettons que l'on veuille déclarer un compteur TeX, appelons-le \truc
(car un compteur TeX commence par la caractère d'échappement "\").
On va écrire :
\newcount \truc
Pour lui affecter la valeur 37, on va écrire :
\truc=37
En interne, les compteurs LaTeX sont des compteurs TeX, mais la syntaxe
change.
On écrirait :
\newcounter{truc}
\setcounter{truc}{37}
Ce qu'il se passe en réalité en coulisses, c'est qu'un compteur TeX est
défini qui porte le nom de s'appelle \c@truc
Et écrire
\setcounter{truc}{37}
c'est comme écrire
\c@truc=37
Tu comprends que LaTeX ne fournit qu'un sucre syntaxique pour accéder
aux compteurs de TeX, les seuls qui existent.
> , je suis quand-même curieux de savoir comment
> utiliser \integerpart (qui, s'il est un compteur, a un \ bien troublant
> devant... ) proposé par xstring.
>
\intergerpart est un compteur TeX, pas un compteur LaTeX (ce qui
intrinsèquement, n'existe pas d'ailleurs !).
> As-tu un exemple à donner ?
> Si j'execute :
> La chaîne \IfDecimal{43.56}{est}{n'est pas} un nombre.
> Comment pourrais-je afficher la partie entière le cas échéant dans une
> phrase qui suit ?
>
Tu n'as pas bien lu la doc. La partie entière du nombre qui a été testé
est contenue dans le compteur TeX \interger part tandis que la partie
décimale est contenue dans \decimalpart.
Mettons que j'écrive :
\IfDecimal{123,456coucou}{oui}{non}
alors, le test va afficher "non", à cause du coucou.
Mais tu peux afficher les parties entières et décimales comme ça :
partie entière = \number\integerpart
partie décimale = \number\decimalpart
Tu peux aussi les récupérer dans le compteur LaTeX truc de tout à l'heure :
\setcounter{truc}{\number\integerpart}
En espérant avoir été clair.
\number fait partie de TeX, non ? Je ne le connaissais pas non plus
(juste entre-aper�u dans l'exemple 11 pour \IfEq dans la doc de
xstring).
Merci encore :).
\r@ n'existe pas, c'est \r@truc (voir plus bas).
\@undefined est... undefined !
\@firstoftwo : voir plus bas.
> C'est � dire, par o� d�buter pour "trouver par moi-m�me" ce genre de
> solution ?
> Existe-t-il sur le web des documents (si possible francophones) initiant
> � cela ?
>
> Oui bien puis-je vous demander quelques explications "simples" ?
> \r@truc, c'est la version TeX de \ref{truc} ?
> Dans ce cas, comment comprendre \@firstoftwo ? Premier des deux? Mais
> premier des deux quoi? \r@truc est vu comme 2 �l�ments ?
>
> Merci ;)
On �crit dans le source tex :
\meaning\ref
et, apr�s compilation, on voit :
macro:->\protect \ref
�a veut dire que \ref devient \protect\ref
(attention, \ref suivi d'un espace !)
On �crit alors :
\expandafter\meaning\csname ref \endcsname
et on a :
macro:#1->\@safe@activestrue \org@ref {#1}\@safe@activesfalse
#1 d�signe le nom du label, soit truc
On �crit alors :
\makeatletter
\meaning\org@ref
\makeatother
et on obtient :
macro:#1->\expandafter \@setref \csname r@#1\endcsname
\@firstoftwo {#1}
#1 d�signe toujours truc
On �crit :
\makeatletter
\meaning\@setref
\makeatother
et on obtient :
macro:#1#2#3->\ifx #1\relax \protect \G@refundefinedtrue \nfss@text
{\reset@font \bfseries ??}\@latex@warning {Reference �#3� on page \thepage
\space undefined}\else \expandafter #2#1\null \fi
Ici, #1 d�signe le \csname r@#1 \endcsname pr�c�dent, soit \r@truc,
#2 d�signe \@firstoftwo, #3 d�signe le {#1} pr�c�dent, soit truc
Donc, si \r@truc n'est pas d�fini, latex affiche ?? sinon, il fait :
\expandafter#2#1\null, soit \expandafter\@firstoftwo\r@truc\null
(la commande \r@truc est en fait cr��e par \newlabel, dans le fichier
.aux lu par latex au d�but du document).
On �crit :
\makeatletter
\meaning\r@truc
\makeatother
et on obtient (le r�sultat d�pend de l� o� est plac�e la commande
\linelabel{truc}) :
macro:->{66}{2}
(on a donc, en fait, ligne 66, et page 2).
et, comme son nom l'indique, la commande \@firstoftwo ne garde que le
premier argument, soit 66, qui est ce qu'on veut.
(on peut �crire :
\makeatletter
\meaning\@firstoftwo
\makeatother
et on obtient :
\long macro:#1#2->#1
qui est, me semble-t-il, assez clair).
� partir de l�, on sait ce qu'il faut utiliser pour obtenir le nombre
voulu : \@firstoftwo\r@truc
Le reste est de l'"habillage".
Attention : si vous utilisez hyperref, il faut �crire \@firstoffive au
lieu de \@firstoftwo (hyperref rajoute trois donn�es dans \r@truc).
Remarque : on peut aller plus vite pour voir tout �a :
�crire simplement, dans le fichier .tex :
{\tracingmacros=1\ref{truc}}
et, apr�s, il faut d�cortiquer le fichier .log...
Fran�ois
--
Sinon, pour repr�senter des arbres, j'ai d�j� d�fini et utilis� un
format de fichiers dans lequel le niveau des branches �tait indiqu�
par le nombre d'espaces en d�but de ligne. Mais j'�vite de le raconter
en public.
-+- J�r�my in fr.comp.text.tex -+-
Oui, c'est une primitive. Elle développe (au maximum) ce qui suit et
affiche sous forme décimale le nombre qu'elle trouve.
En LaTeX, la commande équivalente est \arabic{<nom du compteur>}.
> Je ne le connaissais pas non plus
> (juste entre-aperçu dans l'exemple 11 pour \IfEq dans la doc de
> xstring).
>
J'ai mis cet exemple 11 pour montrer qu'on peut se servir de \numexpr :
c'est une primitive de eTeX.
Cette primitive évalue l'enchaînement d'opérations arithmétiques qui
suit et délivre "sous format d'un compteur TeX" le résultat, arrondi
s'il faut à l'entier le plus proche.
Si on écrit
\number\numexpr3*5-2*6
alors eTeX évalue 3*5-2*6, délivre le résultat comme s'il s'agissait
d'un compteur qui contient 3.
En mettant \number devant, on demande à TeX de traduire en nombre la
valeur de ce pseudo-compteur.
> Le 01/01/2010 21:56, quark67 a �crit :
>> \number fait partie de TeX, non ?
>
> Oui, c'est une primitive. Elle d�veloppe (au maximum) ce qui suit et
> affiche sous forme d�cimale le nombre qu'elle trouve.
>
Allez, pour f�ter ton retour sur fctt (parce qu'on te voyait pas
beaucoup ces derniers temps et je le regrettais bien), je vais pinailler
sur un point de d�tail :-) Donc, je dirais m�me plus : elle applique
toutes les r�gles de lecture d'un nombre, y compris le bouffage d'espace
optionnel.
Comparer |123 | et |\number123 | dans le document (les | sont l� juste
pour rep�rer l'espace) pour s'en convaincre.
--
Manuel P�gouri�-Gonnard Institut de math�matiques de Jussieu
http://weblog.elzevir.fr/ http://people.math.jussieu.fr/~mpg/
> Le 01/01/2010 20:38, quark67 a �crit :
>> C'est � dire, par o� d�buter pour "trouver par moi-m�me" ce genre de
>> solution ?
>> Existe-t-il sur le web des documents (si possible francophones) initiant
>> � cela ?
>>
Il y a source2e.pdf, qui est le source comment� de LaTeX. Il est inclus
dans toutes les bonnes distribution, utiliser 'texdoc source2e' pour le
voir. Par contre ce n'est pas en fran�ais, et surtout pas tout � fait
p�dagogique. Mais je ne connais pas d'autre r�f�rence.
> {\tracingmacros=1\ref{truc}}
>
�a aussi c'est tr�s bien pour apprendre. Assez verbeux, il faut un peu
de temps pour s'y habituer, mais �a vaut le coup. Voir aussi les autres
commandes \tracing*, et l'extension trace.
Merci, c'est gentil. Oui, j'ai pris le large suite à quelques
mésaventures un peu moins présentes aujourd'hui... Cependant, quelque
soit ma participation ici, je lis ce forum plusieurs fois par jour
toujours avec grande curiosité, surtout les post de jcc ou toi sur
lesquels je me rue sans attendre ;)
> , je vais pinailler
> sur un point de détail :-) D\numberonc, je dirais même plus : elle applique
> toutes les règles de lecture d'un nombre, y compris le bouffage d'espace
> optionnel.
>
sans oublier le bouffage de 0 inutiles aussi :p
|000123 |
|\number000123 |
>> , je vais pinailler
>> sur un point de d�tail :-) D\numberonc, je dirais m�me plus : elle applique
>> toutes les r�gles de lecture d'un nombre, y compris le bouffage d'espace
>> optionnel.
>>
> sans oublier le bouffage de 0 inutiles aussi :p
> |000123 |
> |\number000123 |
Ne dit-on pas : � pinailleur, pinailleur et demie ? :-) Je me suis plus
souvent fait avoir par des bouffages d'espaces � des moments o� je ne
m'y attendais pas, �a doit �tre pour �a que j'y pense plus
naturellement...
> Bonjour, supposons que \ref{truc} soit une cha�ne repr�sentant un entier
> (dans le cas qui m'int�resse, \ref{truc} sera un num�ro de ligne, via le
> package lineno.)
> J'ai besoin d'employer cet entier, et pour cela, je voudrais assigner
> cet entier � un compteur.
Dans les cas simples (\ref{xy} donne un nombres 1, 2..) tu peux
utiliser le paquet refcount. Pour les cas plus compliques il y a le
paquet zref.
--
Ulrike Fischer
> Dans les cas simples (\ref{xy} donne un nombres 1, 2..) tu peux
> utiliser le paquet refcount. Pour les cas plus compliques il y a le
> paquet zref.
Merci beaucoup, cela fonctionne tr�s bien avec refcount :)
Et hop l���� !
| +--++-+-000012358 |
|\number +--++-+-000012358 |
J'ai m�me r�ussi � bouffer une ligature. C'est pas beau la vie ?
Jean-C�me Charpentier (pinailleur^2)
--
<Jacques> \psgrid est tout de m�me plus pratique...
<Joss> Undefined control sequence!
(zut �a avait l'air pratique ! Est-ce qu'on peut s'en
servir pour faire une cage � lapin, quand m�me ?)
-+- in fr.comp.text.tex -+-
> | +--++-+-000012358 |
> |\number +--++-+-000012358 |
>
> J'ai m�me r�ussi � bouffer une ligature. C'est pas beau la vie ?
>
Si, c'est beau, la vie avec TeX :-)
> Jean-C�me Charpentier (pinailleur^2)
>
Sauf que dans ton exemple tu n'as pas mis d'espace avant les signes la
deuxi�me fois ;-) (Aucun lex�me d'espace ne sera produit, j'entends.)