Newsgroup: it.comp.software.tex
Titolo: Piccola rivoluzione

Tra i tanti pregi del TeX emerge, a mio modo di vedere, un grosso difetto:
i sorgenti delle espressioni matematiche sono poco leggibili. Il motivo e'
nel gran numero di \ presenti, inevitabili anche usando tutte le macro
possibili. Una soluzione potrebbe essere quella di scambiare il
significato di \ con quello di spazio.
Con queste macro
\def\prettymath{\catcode`\ =0 \catcode`\\ =10} 
\everymath={\prettymath\ }
\everydisplay={\prettymath\ }
\def\vet#1{{\bf #1}}
\def\H{\vet{H}}
\def\J{\vet{J}}
\def\D{\vet{D}}
\def\rot{\nabla \times}
\def\pd#1{{\partial \over \partial #1}} 
\def\t{t}
\def\={=}
\def\+{+}
sipotrebbe scrivere
$$ rot H = J + pd t D$$
invece di
\everymath={}
\everydisplay={}
$$\rot \H = \J + \pd t \D$$
Uno dei problemi di questa soluzione e' il gran numero di effetti
collaterali che potrebbe causare.
Un altro problema risiede nel fatto che il sorgente matematico e'
fortemente dipendente dal modo in cui si usano gli spazi, il che
e' inevitabile in una certa misura, tuttavia potrebbe darsi che si possa
trovare il modo di rendere il tutto piu' consistente e intuitivo.
Concludendo mi piacerebbe conoscere il vostro parere, se ritenete che
questa strategia possa portare a buoni risultati e se e' possibile porre
rimedio ai tanti problemi che si possono incontrare.
Come probabilmente vi sarete accorti non sono tanto esperto da mettere le
mani in meccanismi cosi' delicati, per questa ragione mi piacerebbe sapere
se c'e' qualcuno che mi possa aiutare nel mettere a punto una serie di
macro per definire una nuova sintassi che possa rendere il sorgente il
piu' leggibile possibile.
Grazie
Riccardo

 piu' leggibile possibile.
La maniera abituale per rendere i sorgenti molto leggibili consiste in 
genere nello spezzare le formule complesse su più righe, con spazi 
abbondanti ed allineamenti opportuni. Poiché in modalità matematica 
TeX non si cura degli spazi se non per separare gli elementi, si può 
dare ai sorgenti una forma molto libera --a patto di non lasciare 
righe vuote.
Si potrebbe probabilmente costruire una qualche funzione per Emacs e/o 
VIM che dia alle formule un aspetto piacevolmente strutturato --questa 
mi sembra la migliore idea per imbellire le formule in TeX.
E soprattutto, abusare in questa maniera del linguaggio (che è già 
abbastanza problematico da manipolare) solo per imbellire le formule 
(risultato che può essere ottenuto in altro modo --a livetto di editor 
e non intrinsecamente di programma) mi sembra "scorretto".
Ritengo però l'esperimento interessante da un punto di vista 
didattico/operativo: la manipolazione dei codici di categoria dei 
caratteri in TeX è uno degli strumenti più potenti (e difficili da 
usare) resi disponibile dal linguaggio; una applicazione come quella 
proposta, ed uno studio dei suoi effetti collaterali, è certamente 
un'ottima maniera per imparare a fondo lo strumento.
-- 
Giuseppe "Oblomov" Bilotta
Axiom I of the Giuseppe Bilotta
theory of IT:
Anything is better than MS

collaterali che potrebbe causare.
In Lout la scrittura e` perfettamente integrata con il resto del linguaggio
(in realta`, e` quasi il contrario: Eqn (di Kernighan e Cherry) e` uno degli
antecedenti di Lout). In un linguaggio come (La)TeX, probabilmente, gli
effetti collaterali sono inevitabili, ma forse si potrebbero anche
risolvere. Il problema e` che ridefinire tutto l'ambiente matematico e` un
lavoretto mica da poco (altro che "piccola" rivoluzione).
Conviene forse appoggiarsi a qualche convertitore o interfaccia verso
programmi di calcolo.
Ciao.

 non intrinsecamente di programma) mi sembra "scorretto".
A mio avviso e' invece molto sottoutilizzata la capacita' del TeX di
interpretare il testo digitato. L'impostazione del LaTeX, tanto per fare
un esempio, utilizza solo il concetto di funzione e gruppo, mentre le
capacita' del def e if sono enormemente maggiori.
Sono convinto che un buon sorgente, per chi produce matematica, e'
importante in quanto e' piu' facile da ritoccare. Una sintassi piu'
leggera, sebbene piu' rigida, potrebbe rendere il terminale pratico
quasi come lavorare su di un pezzo di carta.
Riccardo

Un secondo effetto collaterale e' che se scrivo
\def\prettymath{\catcode92=10\catcode32=0}
\everydisplay={\everydisplay\prettymath}
nel tentativo di conservare le impostazioni del LaTeX ottengo errori la
cui origine non riesco proprio a spiegare.
Avete qualche idea?
Grazie
Riccardo

Un primo effetto collaterale se scrivo:
\def\prettymath{\catcode92=10\catcode32=0}
\everymath={\prettymath}
\everydisplay={\prettymath}
$$ int$$
Ottengo
\everydisplay->\prettymath-
\prettymath ->\catcode 92=10\catcode 32=0
{display math mode: \catcode}
{\catcode}
{the letter i}
{the letter n}
{the letter t}
Invece di ottenere:
\prettymath ->\catcode 92=10\catcode 32=0
{display math mode: \int}
\int ->\intop \nolimits-
Cioe' il primo spazio non lo legge come \, come dovrebbe avendo modificato il
catcode. Al contrario se inserisco due spazi, cioe' $  int$, il primo spazio
se lo mangia, mentre il secondo lo legge come \, come dovrebbe.
Avete idea del motivo?
Riccardo

 rivoluzione)
Per me non e' tantissimo, basta trovare il modo di trattare con un numero
arbitrario di spazi (si potrebbe ottenere ridefinendo le strighe \\ \\\
\\\\ ecc., con \do e poi con una macro), definire le macro \? come ? e
poi il gioco e' fatto. Sempre che si riescano a risolvere i problemi,
infatti vedi messaggi successivi...
Riccardo

 rappresentazione di formule matematiche. E` leggibilissimo.
Perfetto e' proprio quello che intendevo.

Sempre che si riescano a risolvere i problemi, infatti vedi messaggi successivi...
Io credo che una via potrebbe essere quella che hanno seguito altri per
integrare ambienti con sintassi diverse, tipo i tool per scrivere musica.
Ciao.

 quasi come lavorare su di un pezzo di carta.
Una sintassi più rigida? Ma allora si ricade nel problema del LaTeX. 
Una delle maggiori potenze del TeX sta proprio nella NON rigidezza 
della sintassi.


 musica.
Sai darmi qualche riferimento piu' preciso, cosi' provo a dare
un'occhiata, anche se la soluzione solo TeX, se mai esista, e' forse
preferibile sebbene piu' difficile da raggiungere.
Grazie
Ciao


Prova ad aggiungere un \relax dopo \catcode32=0: \catcode deve finire 
di leggere il numero, e non sa che finisce fin quando non arriva a 
qualcosa che NON è un numero; nel frattempo i catcode sono quelli 
originali.
Più in dettaglio TeX esegue:
Prossimo token: [catcode]. (non ha catcode perché è una sequenza)
Leggi un numero seguente:
	[9,12] fa parte di un numero
	[2,12] fa parte di un numero
	[=,12] non fa parte di un numero
Il numero cercato è 92.
Token seguente (già letto prima): [=,12]
	Accettato (richiesto dalla sintassi di \catcode).
Leggi un numero seguente:
	[1,12] fa parte di un numero
	[0,12] fa parte di un numero
	[catcode] non fa parte di un numero
Il numero cercato è 10.
Esegui assegnazione di \char92 alla categoria 10.
<<<Da ora in poi la barra retroversa funzionerà da spazio>>>
Token seguente (già letto prima): [catcode].
Leggi un numero seguente:
	[3,12] fa parte di un numero
	[2,12] fa parte di un numero
	[=,12] non fa parte di un numero
Il numero cercato è 32.
Token seguente (già letto prima): [=,12]
	Accettato (richiesto dalla sintassi di \catcode).
Leggi un numero seguente:
	[0,12] fa parte di un numero
<<<A questo punto \every<math,display> è terminato, quindi TeX 
comincia a leggere quello inserito dall'utente>>>
	[ ,12] non fa parte di un numero
Il numero cercato è 0.
Esegui assegnazione di \char32 alla categoria 0.
<<<Da ora in poi lo spazio funzionerà da escape char>>>
Token seguente (già letto prima): [ ,12]
!!!Ecco il problema: lo spazio è già stato letto nella precedente 
richiesta di numero, e quindi la sua categoria è stata fissata prima 
che il catcode di \char32 venisse modificato!!!
Mettendo un \relax alla fine di \prettymath la ricerca del numero 
viene terminata da \relax e non dallo spazio, risolvendo il problema.



Dove ne posso trovare un esempio?


 terminata da \relax e non dallo spazio, risolvendo il problema.
Sembra che non funzioni o io non ho capito.
\def\prettymath{\catcode92=10\catcode32=0\relax}
\everymath={\prettymath}
$ int$
Lo spazio e' visto come tale come prima. Forse il mathmode legge comunque
il primo carattere e poi applica \everymath.
Riccardo

 sintassi.
Intendevo dire che volevo dare un significato agli spazi che di solito
vengono lasciati liberi da quasi tutti i linguaggi di programmazione.
Sempre con la stessa filosofia sarebbe pratico poter chiudere un gruppo
tra doppi spazi per esempio.
Il problema della sintassi matematica del TeX e' che, nella pratica, una
espressione, a differenza di un testo, e' una sequenza di macro piu' o
meno complesse, logicamente separate, mentre e' piu' raro l'uso di
semplici lettere o parole. Se il TeX considerasse subito tutte le stringhe
come simboli si farebbe meno fatica e sarebbe tutto piu' leggibile.
Riccardo

Dove ne posso trovare un esempio?
Prova qui:
http://snark.ptc.spbu.ru/~uwe/lout/lout.html
in particolare l'introduzione:
http://snark.ptc.spbu.ru/~uwe/lout/slides.pdf
http://snark.ptc.spbu.ru/~uwe/lout/slides.ps.gz
Mi pare pero' di aver capito che dalla versione corrente il supporto
per pdf sia stato abbandonato.
\bye

 riuscire meglio nell'intento.
Direi che e-TeX sarebbe la scelta migliore. Credo che il manuale che 
spiega le differenze/aggiunte di e-TeX in extended mode sia parte 
integrante di qualsiasi distribuzione TeX.
La cosa più importante che e-TeX fornisce al programmatore che gioca 
con i catcodes è \scantokens (che rilegge una sequenza di tokens 
cambiando i catcodes).



Ah già, qui entriamo in un ulteriore dettaglio: poiché $ 
inizia/termina la matemacia in-line e $$ inizia/termina la matematica 
displayed, quando TeX incontra un token con catcode mathshift ne cerca 
uno nuovo subito dopo, per sapere che tipo di matematica usare. 
(Verifica: non dovrebbe succedere se usi un display).
Una soluzione potrebbe consistere nel far diventare $ attivo, 
assegnandogli come compito di cambiare i catcodes.


 
Vedo. Ricorda un po' la sintassi del vecchio editor equazioni di 
WordPerfect.
Credo sia possibile implementare qualcosa del genere in TeX. Si 
potrebbero rendere attivi i caratteri a-z A-Z e fare in modo che 
costituiscano automaticamente un appropriato comando se sono presenti 
piů di due.


più di due.
Ma l'anno nuovo vi ha messo veramente voglia di rivoluzione? O avete
esagerato con lo zampone e le lenticchie?
Scherzi a parte, a me la sintassi [La]TeX sembra molto leggibile,
tant'e' che ne faccio ampio uso come "memorandum universitario" in
abbinamento alla calcolatrice... Naturalmente bisogna farci la mano e
l'occhio, ma e' quello che accade in tutti i linguaggi di
programmazione e con le notazioni in genere: basta prendere, ad
esempio, la teoria delle distribuzioni o quella degli spazi per
incontrare parecchie difficolta' di leggibilita'.
Se invece poi la vogliamo vedere come un esercizio accademico, in
"Digital Typography" Knuth presenta una serie di macro scritte per la
moglie (ci sono mariti che regalano fiori ed altri che regalano linee
di codice...) dove si puo' trovare un piccolo esempio di modifica
della notazione.
\bye

 incontrare parecchie difficolta' di leggibilita'.
Sono d'accordo.



Gia' :-)
\bye

 più di due.
Credo che all'uopo si possa usare il pacchetto mathlig
(CTAN:macros/generic/mathlig.tex)
Cosi'
\input mathlig
\mathlig{int}{\int}
\mathlig{infty}{\infty}
\mathlig{dx}{{\rm d}x}
$$int_0^{infty} x dx$$
\bye
Certo non e' che sia molto meglio...
Oscar Lazzarino

Be', questo non dipende dalla rappresentazione nel sorgente.
Ci sono alcune scelte stilistiche che possono piacere o non piacere; almeno
per quanto riguarda i caratteri, pero`, si possono avere anche quelli TeX.
Il vantaggio di Lout, poi, e` che mettere le mani sulle funzioni di
formattazione e` molto, ma molto piu` semplice che modificare un formato
TeX[1].
Ciao.
[1] Dovreste trovare, se non l'hanno nel frattempo eliminata per scarso
interesse, una non documentata zroot (dove lo 'z' iniziale sta per Zezza)
che ho proposto perche' non mi piaceva il comportamento della root con
indici lunghi.

 Certo non e' che sia molto meglio...
Cosě non si avrebbe un gran miglioramento. Ma si potrebbe fare in modo 
che a-z A-Z attivi costruiscano automaticamente una stringa fino al 
prossimo non-carattere per poi: chiamare il comando relativo se 
esistente, oppure scrivere automaticamente \mathop{\rm stringa 
ottenuta} se il comando non č definito, dopo un opportuno avviso.


 se il comando non Ãš definito, dopo un opportuno avviso.
In pratica come si riesce a fare quello che dici?

 assegnandogli come compito di cambiare i catcodes.
\def\prettymath{\catcode92=10\catcode32=0\relax}
\def\mathdollar{$}
\catcode`\$=\active
\newif\ifdm
\dmfalse
\def${\ifdm\catcode`\$=3\mathdollar\dmfalse\catcode`\$=\active%
\else\dmtrue\catcode`\$=3\mathdollar\prettymath\catcode`\$=\active\fi}
Funziona, ora rimane il problema di $$. E' possibile rendere attivo $$ e
fargli fare lo stesso lavoro?
Il problema e' che anche se \everydisplay funziona in TeX, per motivi che
non ancora comprendo, in LaTeX non funzionano piu' gli ambienti
matematici. Infatti se scrivo
\def\prettymath{\catcode92=10\catcode32=0\relax}
\everydisplay{\prettymath}
\begin{equation}
 int
\end{equation}
genera un gran numero di errori
In latex tuttavia si potrebbe risolvere definendo gli ambienti in modo da
includere esplicitamente \prettymath e un \unprettymath che riporta i
catcode originali.

 In pratica come si riesce a fare quello che dici?
Assegna ad ogni carattere mathcode "8000 (attivo in ambiente 
matematico), e come definizione:
(1) aggiungi il carattere stesso alla catena
(2) leggi il token successivo
(3a) se il token successivo è a-zA-Z, torna ad (1)
(3b) altrimenti, se esiste un comando come da catena, eseguilo.
(3c) altrimenti, \mathop{\rm \catena}
I dettagli lasciati come esercizio allo studente ;-)


 catcode originali.
Infatti.


 I dettagli lasciati come esercizio allo studente ;-)
Lo studente e' un po' somaro, temo che avra' bisogno di altri suggerimenti
:-)
Prima di tutto volevo chiederti se in questo modo i comandi con argomenti
generati da \newcommand funzionano ugualmente, inoltre se funzionano 
quelli tipo 
\def\frac#1/#2  {{#1 \over \#2}}
\def\from#1 to #2  {\sb{#1}\sp{#2}}
Cominciamo con le domande
0) Se scrivo \mathcode`\a="8000 \defa{prova} ottengo un errore,
altrimenti come posso assegnare ad a e tutte le lettere una macro
3a) Devo fare il test con \ifcat ?
3b) Suppongo debba usare \ifx, ma come?
Grazie mille
Riccardo

 altrimenti come posso assegnare ad a e tutte le lettere una macro
Il problema del far diventare le lettere attive č che non puoi usarle 
per costruire i nomi. Inoltre, per poter assegnare ad 'a' attivo una 
macro devi renderla attiva.
Assegna la funzione di creazione della lista ad una macro che aggiunga 
un token predefinito (tipo \!!!, da espandere) alla lista per poi 
verificare che il caratter successivo sia ancora da considerare. Poi 
fai sě che venga letto il token successivo e controllato 
(\futurelet\next= \controllanext}\def\controllanext etc)
Suppongo si possa usare come base il package mathlig. (Ora me lo 
procuro e lo studio un po'.)


 \controllanext}\def\controllanext etc)
Purtroppo mi risulta ancora oscuro, non riesco a capire come poter
leggere il token successivo e creare un loop
Riccardo

Dai un occhio al mio post circa la ``rivoluzione'' matematica.


 
Fatto, altrimenti non avrei saputo dare la risposta precedente. Tuttavia
rimango nella difficolta' a capire come funzionano mathlig, nath e il tuo
suggerimento, mi mettero' a studiare un po' meglio il TeXbook.
Grazie
Riccardo


Perché non usi semplicemente nath? La manipolazione dei catcode delle 
lettere è mostruosa (richiede utilizzi sofisticati di riassegnazione 
temporanea, lowercase ed uppercase ...)


 Perche' non usi semplicemente nath?
Nath e mathlig non rispondono alla necessita' di poter assegnare ad una
stringa di una o piu' lettere(categorie 11 12) una macro qualsiasi, 
in particolare mathlig non permette l'assegnazione di una sola lettera 
Al momento riesco ad assegnare ad una lettera una macro qualsiasi, tuttavia
non riesco a creare quella macro che legge i caratteri successivi e a
seconda che il nome sia una macro o no espanda la macro o riscriva cio'
che ha letto.
Ora come ora sto' cercando il modo di usare \futurelet per leggere il
carattere successivo e accodarlo ad un registro se la sua categoria e'
11 o 12. Tuttavia non ci riesco.
Riccardo

 
\newtoks\catena
\def\assegnaacatena{%
\ifcat a\next
\catena\expandafter\expandafter\expandafter{\expandafter\catena\next}%
\expandafter
\else
\usacatena\next
\fi
}
\def\usacatena{%
\expandafter\expandafter\expandafter%
\if\expandafter\csname\catena\endcsname\relax
\mathop{\rm\catena}
\else
\expandafter\expandafter\csname\catena\endcsname
\fi
}
e poi definisci le lettere con qualcosa come
\def z{\afterassignment\assegnaacatena\let\next= }


 }
Dovrebbe essere piuttosto:
\def\assegnaacatena{%
\ifcat a\next
\catena\expandafter\expandafter\expandafter{\expandafter\catena\next}%
\else
\expandafter\usacatena\expandafter\next\fi
