Archivi Categorie: La Pagina della Sfinge

TeX e LaTeX a confronto

La mia domanda “TeX e LaTeX sono compatibili?” [qui] √® mooolto mal posta, anzi priva di senso, vado a lavarmi i diti e la testiera con il sapone, ecco ūüėź

Per fortuna c’√®¬† Google¬† DuckDuckGo ūü§©

What is the difference between TeX and LaTeX? [qui]

TeX is both a program (which does the typesetting, tex-core) and format (a set of macros that the engine uses, plain-tex). Looked at in either way, TeX gives you the basics only. If you read the source for The TeXBook, you’ll see that Knuth wrote more macros to be able to typeset the book, and made a format for that.

LaTeX is a generalised set of macros to let you do many things. Most people don’t want to have to program TeX, especially to set up things like sections, title pages, bibliographies and so on. LaTeX provides all of that: these are the ‘macros’ that it is made up of.

Quindi, sintetizzando per me: il testo TeX è (almeno per quanto concerne Maxima e me) conforme a quanto si aspetta LaTeX. Ecco perché tutti (OK, quasi tutti) quelli che conosco usano LaTeX.

Proseguendo con i documenti trovati ecco The difference between TeX and LaTeX [qui]. √ą roba macista ma who cares? E dice:

[… W]hen you type LaTeX you are running TeX, but before it loads your LaTeX source it first loads the latex.ltx file, which defines all the familiar \section, \documentclass, \begin, \end, \ref, \label, … commands familiar to LaTeX users.

Ricorda poi che ci sono altre varianti ancora, per me adesso: who cares ūüėź

Una¬† googlata¬† ddg-ata per questo tipo di query non √® completa se manca Quora && Stack Overflow, quindi…

What’s the difference between TeX and LaTeX? [qui].

LaTeX is a user-friendly extension of TeX. Sort of. Let me explain. C’√® di l√†, non riporto anche se breve (ma con tanti link invoglianti). Anche perch√©, per chi volesse My book “TeX by Topic”, published in 1991, is a free download, and back in print.

Si diceva della famiglia TeX, eccola qui.

E Stack Overflow che ho promesso? C’√® qui, topic chiuso per OT ma con una rimarchevole dritta: “Learn TeX only if you would like to become a typesetter“. E anche qui una marea di links.

Conclusione per la mia domanda malposta: s√¨, per quanto riguarda Maxima e me TeX e LaTeX accettano gli stessi files. (OK, risposta che a rigore non √® corretta, TeX non √® quello (a rigore), sono pressapochista) ūüėź Ma s√¨.
‚≠ē

Subroutine, ovvero divagazioni tra Fortran e C

Tutto è partito da qui:

click

Allora provo a rimediare.

Il Fortran √® stato il primo linguaggio di programmazione “umano”. Prima c’era solo l’assembler –si dovrebbe dire assembly.

Come linguaggio non era malaccio –buona la prima, si direbbe nel cinema– e si √® espanso e imposto tanto che quando ho cominciato io sui computer normali c’era solo quel compilatore. O volete prendere in considerazione i gestionali che usavano il Cobol? dai siamo seri 8)

Uno dei vantaggi del Fortran √® che il programma pu√≤ essere suddiviso in parti e queste ultime possono essere scritte e compilate separatamente. E si mettono insieme solo al momento del linkaggio, per produrre l’eseguibile.

Quindi c’√® un main (non ricordo se allora si chiamasse cos√¨) e tante altre procedure, pezzi. Si chiamano subroutine. A dire il vero c’√® anche un altro tipo di procedura, la funzione, ma per ragioni che non ho mai capito i Veri Programmatori Fortran preferivano la subroutine.

Io che sono un cerchiobottista (in questo campo) vedrò di illustrarle entrambe. E proporrò una versione in C, per illustrare una grossa differenza tra i due approcci.

Non è una guida o un corso, mi limito a rispondere a un quesito, intesi nèh 8)

c1234567
       program demo

       i = 1
       j = 10
       r = 3.14
       write(*,*) "main - prima", i, j, r
       call duplica(i, j, r)
       write(*,*) "main - dopo ", i, j, r

       end

**********************************************

       subroutine duplica(ip, jp, rp)
       write(*,*) 'duplica - prima', ip, jp, rp
       ip = ip * 2
       jp = jp * 2
       rp = rp * 2
       write(*,*) 'duplica - dopo ', ip, jp, rp

       end

Chiaro vero? OK! In Fortran non è che si può scrivere come ti pare e piace (n.b.: adesso sì, si chiama free format ma è una cosa nuova, del 1995) ci sono un paio di regole:

  • un C o un * in colonna 1 indica che la riga √® un commento;
  • nelle colonne 1-5 puoi mettere una label numerica (numeri da 1 a 99999); i numeri, arbitrari, servono per i cicli, i goto (e altri salti) e altro ancora;
  • il codice √® tra le colonne 7 e 72, comprese, il resto viene ignorato;
  • la colonna 6 √® riservata alla continuazione di un’istruzione troppo lunga; per dire che la riga √® una continuazione della precedente bisogna mettere qualsiasi carattere tranne il blank e lo zero.

write(*,*) seguito da variabili significa scrivi sullo standard output (primo *) nel formato di default (secondo *).

La chiamata alla subroutine si fa con call <nome della subroutine> seguita dai parametri che si vogliono passare.
La subroutine stessa √® esattamente come il main ad eccezione dell’intestazione: subroutine <nome della subroutine>.

Nelle versioni dal 77 in poi le stringhe possono essere delimitate sia da apici semplici che doppi. Prima non c’erano. Ma ogni variabile poteva essere vista come caratteri e quindi era come se ci fossero, discorso lungo…

In genere non si definisce il tipo delle variabili, se si usa la regola predefinita: sono tutte float (in gergo real*4) tranne quelle il cui nome inizia con una lettera compresa tra I e N (come INteger).

Proviamo a compilare e eseguire

Chiaro no? Sì, capita una cosa strana, difforme dal C 8)
Per chi ancora non l’ha vista ecco il codice C equivalente

#include <stdio.h>

void duplica(int ip, int jp, float rp);

void main() {
    int i = 1, j = 10;
    float r = 3.14;
    printf("main - prima %d %d %f\n", i, j, r);
    duplica(i, j, r);
    printf("main - dopo  %d %d %f\n\n", i, j, r);
}

void duplica(int ip, int jp, float rp) {
    printf("duplica - prima %d %d %f\n", ip, jp, rp);
    ip *= 2;
    jp *= 2;
    rp *= 2;
    printf("duplica - dopo  %d %d %f\n", ip, jp, rp);
}

compilando ed eseguendo si ha

Trovato? Troppo facile, vero? In Fortran tutti i dati vengono passati per riferimento, nel C (e credo dappertutto) per valore. OK! discorso lungo, non è questa la sede, dai! 8)

Si era parlato anche di funzioni, ecco un esempio

c1234567
       program demo
       common /mieidati/ ivar, fvar

       ivar = 100
       fvar = 2.7818
       write(*,*) "main - prima ", ivar, fvar, k
       k = myfunc(8)
       write(*,*) "main - dopo  ", ivar, fvar, k

       end

**********************************************

       function myfunc(n)
       common /mieidati/ i, f
       write(*,*) 'in myfunc - prima', n, i, f
       i = i + n
       f = f + n
       write(*,*) 'in myfunc - dopo ', n, i, f
       myfunc = n * n

       end

La chiamata alla funzione è quella usuale, la definizione è: function <nome della funzione>. Notare la sintassi per il valore ritornato, diversa da quella cui siamo abituati. In fortran esiste return ma non è lo stesso del C: abbandona immediatamente la procedura corrente.

Nell’esempio c’√® ancora una cosa da notare: il common. Il common, croce e delizia del Fortran, permette di gestire le variabili che conservano il loro valore attraverso le varie procedure. Perch√© la cosa sia flessibile (ricordare che possiamo compilare separatamente i vari file componenti il programma) non conta il nome della variabile ma la sua posizione. Nel caso in oggetto nel main i primi 4 byte del common sono occupati dalla variabile ivar nel main e i nella funzione. Chiaro? Fate attenzione che parecchi casini verranno da questo punto, avvisati, n√®h!

Compiliamo ed eseguiamo

Notare che non avendo assegnato alcun valore alla variabile k abbia un valore casuale nella prima write.

In C abbiamo

#include <stdio.h>

int myfunc(int n);
float f;

void main() {
    int k;
    f = 2.7818;
    printf("main prima %d %f\n", k, f);
    k = myfunc(8);
    printf("main dopo  %d %f\n", k, f);
}

int myfunc(int n) {
    printf("in myfunc %d %f\n", n, f);
    f = f + n;
    return n * n;
}

che ci da

In questo caso l’equivalente del common √® di definire le variabili globalmente. S√¨, lo so, lo so! questo √® solo un approccio elementare.

A questo punto entrerebbero in scena puntatori, indirizzi e quant’altro. Ma no, mi fermo qui: credo di aver risposto alla domanda di Alessio e Francesco –sempre che qualcuno mi abbia seguito fin qui 8)

Questo post fa parte di una nuova categoria “La Pagina della Sfinge“, mica si riesce sempre a scrivere cose sensate ma superseriose ūüėČ e notare che ho l’approvazione del dr.prof., qui 8)