Newsgroup: it.comp.software.tex
Titolo: ancora algoritmi

Nel thread "algoritmi [876896]" si è parlato dell'implementazione di un 
ambiente "freecode".
L'attuale implementazione è questa:
------------>
\newcommand{\IF} {\textbf{if}\hspace{0.7em}}
\newcommand{\ELSE} {\textbf{else}\hspace{0.7em}}
\newcommand{\WHILE} {\textbf{while}\hspace{0.7em}}
\newcommand{\RETURN} {\textbf{return}\hspace{0.7em}}
\newcommand{\setcounterPageref}[2] {
\setbox0=\hbox{\count255=\number0\pageref{#2}}
\ifdim\wd0=0pt
	\setcounter{#1}{\pageref{#2}}		% it's a number
\else
	\setcounter{#1}{-1}					% it's not a number
\fi
}
\newcounter{labelno}
\newcounter{prevlabelno}
\def\mylabel{\label{mylabel_\thelabelno}\setcounter{prevlabelno}{\value{labelno}}\stepcounter{labelno}}
\def\mypageref{\pageref{mylabel_\theprevlabelno}}
\newcounter{firstTab}
\setcounter{firstTab}{1}
\newcounter{toPrint}
\setcounter{toPrint}{1}
\newcommand{\printTab}{
	\ifnum \thefirstTab=1
		\setcounter{firstTab}{0}
		\mylabel
		\ifnum \value{lastpage}=\mypageref
			\setcounter{toPrint}{0}
		\else
			\setcounter{toPrint}{1}
		\fi
	\fi
	\ifnum \thetoPrint=1
		\tiny $\to$
	\fi
}
\newcounter{lastpage}
\begingroup
\catcode`\^^I=\active
\def\x{\endgroup\def^^I{\makebox[2em]{\printTab}}}\x
\begingroup
\catcode`\^^M=\active
\def\x{\endgroup%
     \def\myobeylines{\catcode`\^^M=\active 
%\def^^M{\setcounter{lastpage}{\mypageref}\setcounter{firstTab}{1}\par}}}\x
\def^^M{\setcounterPageref{lastpage}{mylabel_\theprevlabelno}\setcounter{firstTab}{1}\par}}}\x
\newenvironment{freecode}
     {\par\medskip\myobeylines\catcode`\^^I=\active
         \setlength{\parindent}{0pt}}
     {\par\medskip}
<------------
Il problema sorge se aggiungo la seguente riga al preambolo del documento:
\usepackage[english]{babel}
Che ci sia una collisione di identificatori?
Kiuhnm

 Che ci sia una collisione di identificatori?
Il pacchetto babel ridefinisce \pageref per ottimi motivi. Se scrivi
\let\latexpageref\pageref
\usepackage[english]{babel}
e sostituisci \pageref nelle tue macro con \latexpageref dovresti
risolvere.
Ciao
Enrico

 risolvere.
Sě, il problema era proprio quello, ma non capisco perché \pageref non 
venga modificato con un po' piů di accortezza. La modifica dovrebbe 
essere trasparente, in teoria, no?
Kiuhnm

 essere trasparente, in teoria, no?
Dov'è il problema? È il tuo codice che usa \pageref in modo non
standard.
Ciao
Enrico

 standard.
Dove si può reperire questo standard?
Kiuhnm

 essere trasparente, in teoria, no?
Il comando \pageref è modificato da babel in modo /molto/ accorto e del
tutto trasparente per gli utenti. Purtroppo gli sviluppatori non 
possono tener conto di tutti i Kiuhnm di questo mondo che desiderano 
usare un comando per scopi non previsti. Il codice di babel per
\pageref funziona benissimo per fare ciò per cui è stato pensato.
Il comando originale rimane disponibile come \org@pageref. Puoi
usare questa macro (circondando il codice con \makeatletter e
\makeatother invece di definire \latexpageref), ma alla fine il
metodo è equivalente.
Ciao
Enrico

 \pageref funziona benissimo per fare ciò per cui è stato pensato.
Non posso non notare che stai un po' rigirando la frittata.
Babel funziona, però "rompe" altro codice. Se non so quello che si può e 
non si può fare come faccio a produrre codice standard? La mia domanda 
iniziale non è arrogante, ma anzi legittima.
Kiuhnm

non si può fare come faccio a produrre codice standard?
LaTeX è un linguaggio macro: in un linguaggio macro, superata una certa
soglia di complessità del codice, nessuno sa a priori che cosa può o non
può essere fatto.
Ciao.

 può essere fatto.
Certe cose non si possono leggere... (e neanche dimostrare, essendo false).
Kiuhnm