LATEX: un sistem de tehnoredactare pentru matematică

Mihai Budiu -- mihaib+@cs.cmu.edu
http://www.cs.cmu.edu/~mihaib/

septembrie 2000

Subiect:
sistemul de tehnoredactare computerizată LATEX.
Cunoștințe necesare:
cunoștințe elementare despre tehnoredactare
Cuvinte cheie:
tehnoredactare, macro, TEX, LATEX, Knuth, Lamport


Cuprins




Introducere

Acest articol este dedicat unei scule software, care pentru mine este de neînlocuit în activitatea zilnică. Voi descrie în cele ce urmează un limbaj, numit LATEX, și un set de programe folosite pentru tehnoredactarea computerizată. Dintru început simt nevoia însă să avertizez cititorul asupra dezavantajelor acestui sistem, comparat cu alte sisteme similare:

E un limbaj:
LATEX este un limbaj, și nu un program. LATEX seamănă cu limbajul HTML sau cu RTF (Rich Text Format). Pentru a formata un text folosim comenzi inserate între elementele textului pentru a descrie în ce fel trebuie să ``arate'' acest text.

Nu e vizual:
înainte de a folosi LATEX trebuie să ne familiarizăm cu o mulțime de comenzi noi. Pentru HTML există editoare speciale, care ne permit să compunem paginile de web în mod vizual, fără să știm ce fel de comenzi trebuie inserate pentru a obține înfățișarea dorită. În cazul LATEX însă aceste scule sunt mult mai primitive, și în general pentru a obține rezultate satisfăcătoare și pentru a beneficia de întreaga lui putere, limbajul trebuie cunoscut.

E complicat:
din motive istorice, pe care le vom trece pe scurt în revistă, LATEX este un limbaj destul de obscur și greu de folosit. Chiar dacă unele elemente fundamentale sunt relativ ușor de învățat, efortul necesar pentru stăpînirea majorității comenzilor este substanțial.

Specializat:
pentru o mulțime de aplicații LATEX este departe de a fi limbajul ideal. De exemplu, deși există translatoare automate din LATEX în HTML, LATEX nu este limbajul cel mai potrivit pentru a descrie pagini de web.

Scule neprietenoase:
În fine, deși LATEX este implementat pe o mulțime de sisteme, incluzînd Windows, modul preferat de folosire este ``în linie de comandă''. Textul de formatat, conținînd comenzile LATEX de aranjare în pagină, trebuie compus folosind un editor separat. După aceea este invocată o comandă pentru a procesa textul, după care un alt program trebuie folosit pentru a vizualiza rezultatul; adesea alte programe trebuie folosite pentru a genera indexuri, bibliografii, sau pentru a tipări produsul final. (Notă: în ultima vreme au început să apară scule mai prietenoase, care integrează aceste funcționalități sub o singură interfață vizuală).

Nu e ``curat'':
anumite construcții din limbaj, care funcționează bine izolat, atunci cînd sunt folosite împreună dau rezultate surprinzătoare, sau erori. Acestea sunt probleme care rezultă din design-ul inițial al limbajului și sunt extrem de neplăcute, chiar și pentru utilizatori avansați.

Mesaje criptice:
atunci cînd un document conține erori în comenzile de formatare, mesajele de eroare sunt adesea extrem de greu de interpretat, și sursa erorii este foarte greu de găsit. Acesta este un obstacol substanțial pentru novici.

Acest articol e foarte sumar:
în secțiunea de bibliografii recomand cîteva cărți despre LATEX. Descrierea completă a limbajului și a o sumedenie de pachete suplimentare este cuprinsă în nu mai puțin de trei cărți! Ca atare textul de față este o introducere extrem de sumară în capabilitățile LATEX.

Perfect. Dacă ați ajuns pînă aici cu cititul înseamnă că sunteți gata să înfruntați toate aceste obstacole. Iată și unele dintre avantajele LATEX:

Formule:
LATEX rămîne cea mai eficientă metodă pentru a tehnoredacta texte matematice. În primul rînd, rezultatele grafice sunt extrem de plăcute, și nici un alt program existent nu se ridică la înălțimea calității sale. Editorul de ecuații din Microsoft Word este absolut jalnic în comparație cu LATEX. Vedeți și figura 5 pentru niște exemple succinte.

Standard:
LATEX a fost conceput cu grijă pentru a se comporta la fel pe orice sistem. LATEX și TEX sunt lingua-franca pentru schimbul de documente în multe domenii tehnice. De exemplu, majoritatea, dacă nu toate articolele, trimise spre publicare în conferințe și jurnale ale societății americane de matematică, de fizică, sau de astronomie trebuie să fie scrise folosind LATEX. În plus, LATEX este folosit foarte mult în comunitatea informaticienilor; toate articolele mele, inclusiv cel de față, sunt scrise în LATEX1.

Nu e vizual:
faptul că LATEX nu e un sistem vizual de editare (WYSIWYG: What You See is What You Get) este considerat de unii ca un avantaj: în felul acesta autorul se concentrează asupra formei logice a documentului, și nu asupra înfățișării. Mesajul textului este atunci mai bine transmis.

E extensibil:
vom vedea imediat că LATEX este un limbaj în care se pot defini noi construcții. Din cauza asta o sumedenie de adiții au fost făcute de-a lungul timpului, care permit comenzi de formatare deosebit de sofisticate și puternice. Manualul LATEX de bază descrie limbajul în anexa C în 70 de pagini, dar cartea despre module suplimentare are 500 de pagini!

E configurabil:
Din cauză că este un limbaj bazat pe macro-uri (vom discuta despre asta un pic mai încolo), multe din comenzile de bază se pot redefini sau configura. Din punct de vedere al ingineriei programării acesta nu e un lucru prea înțelept, și unele din erorile criptice de aici provin. Pe de altă parte, capacitatea de a reconfigura foarte multe elemente face schimbarea stilului unei prezentări extrem de simplă. Fișiere de ``stil'' conțin configurații complexe predefinite (asemănător cu Cascaded Style Sheets din HTML); schimbînd un cuvînt într-un fișier LATEX putem schimba radical felul în care este înfățișat textul.

Istoric

Evoluția acestui limbaj de tehnoredactare este extrem de interesantă în ea însăși, și ne va cauza întîlnirea cu niște giganți ai informaticii. Pe lîngă aceste aspecte anecdotice, multe din idiosincraziile limbajului provin din deciziile făcute de designer-ul inițial, Donald Knuth.

Donald E. Knuth

Donald E. Knuth este una dintre figurile cele mai impresionante din istoria informaticii. Deși pagina sa de web este foarte comprehensivă, http://www-cs-faculty.stanford.edu/~knuth/, merită să ne oprim pe scurt asupra personajului. Este genul de individ care are nevoie de o pagină și jumătate pentru a face lista tuturor premiilor, distincțiilor academice și doctoratelor onorifice pe care le-a primit (acestea din urmă deocamdată 21 în număr). Excelența sa academică în informatică este dublată de o cultură enciclopedică, care se reflectă în stilul său literar deosebit de interesant. Chiar dacă, din punct de vedere tehnic, multe din cărțile sale sunt relativ greu de citit, ele sunt întotdeauna o combinație foarte plăcută de știință, literatură, umor și înțelepciune.

Figura: Donald Knuth, creatorul TEX.
\begin{figure}\centerline{\epsfxsize=5cm\epsffile{knuth.eps}}\end{figure}

Domnul Knuth este începînd din 1968 profesor la universitatea Stanford din California. Doctoratul său este însă în matematică, obținut în 1963 la universitatea Caltech. Articolele sale în general sunt la intersecția dintre matematică și calculatoare, dar are foarte multe publicații de matematică pură; Don Knuth (cum este cunoscut printre prieteni și admiratori) este responsabil de altfel pentru multe din metodele matematice de analiză a algoritmilor folosite astăzi în mod curent. Multe din aceste metode au fost expuse în volumele publicate din ampla lucrare ``Arta programării calculatoarelor''. Această serie a fost începută în 1969, și trebuia să conțină șapte volume masive. Primele trei au fost publicate în 1968, 1971 și respectiv 1973, și au fost traduse și în românește, la Editura tehnică, între 1974 și 1976; sunt cu siguranță disponibile la o mulțime de biblioteci și anticari.

Aceste cărți se doreau a fi o incursiune în toate tehnologiile majore din informatică la vremea respectivă, dar conțin și o mulțime de rezultate originale ale lui Don Knuth. Ca urmare, în 1974 i-a fost decernat cel mai prestigios premiu din informatică, ``Nobel''-ul din calculatoare, premiul Turing.

Frustrat de dificultatea de a produce documente tipărite de bună calitate, care să conțină formule matematice, înainte de a începe volumul 4 din serie, Knuth s-a apucat să studieze problemele tipografiei digitale. Astfel a început o excursie de un deceniu în acest domeniu, care a dus la crearea sistemelor TEX și METAFONT, pentru tehnoredactare computerizată și pentru crearea automată de seturi de caractere (font-uri). Pentru a putea împărtăși întregii lumi creațiile sale, Knuth a făcut codul-sursă al lui TEX disponibil în întregime, gratuit dintru început. Pentru a putea apoi explica codul sursă, Knuth a creat un sistem numit WEB (a nu se confunda cu World-Wide-Web), care permite compunerea simultană a unui program și a documentației sale. Sistemul WEB este explicat de Knuth într-un articol celebru numit ``Literate Programming'', despre programarea ca o formă de literatură! Rezultatele acestui proiect în tipografia digitală au fost tipărite în 1986 sub forma a cinci volume numite ``Computers and Typesetting'' (Calculatoarele și tehnoredactarea). Două dintre cărți sunt manualele TEX și respectiv METAFONT, alte două cărți conțin codul sursă al programelor TEX și METAFONT, descrise în sistemul CWEB (care este o implementare a sistemului WEB pentru limbajul C), iar ultimul volum conține descrierile parametrilor și programelor METAFONT utilizate de Knuth pentru a genera setul de caractere Computer Modern.

Creația lui Knuth nu se termină aici; este autorul a peste douăzeci de cărți și a cîteva sute de articole, de la matematică, analiza algoritmilor, tipografie digitală, pînă la analiza unor texte biblice!

Domnul Knuth are o pagină de web foarte comprehensivă, care reflectă propensiunile sale literare, dar a renunțat de mai bine de zece ani să mai folosească poșta electronică, din cauză că primea prea multe scrisori de la nenumărații fani. În urmă cu cîțiva ani a ieșit la pensie, dar asta nu înseamnă că s-a oprit din activitatea didactică în întregime; ține în continuare prelegeri la universitatea Stanford și în alte locuri unde este invitat, și afirmă că vrea să-și dedice majoritatea timpului rămas completării celor șapte volume din ``Arta programării'', a căror serie a fost întreruptă temporar în urmă cu 26 de ani. Afirmă de asemenea că nu mai primește studenți în calitate de îndrumător la doctorat, dar că va semna teza de doctorat a oricui rezolvă în timp scurt (2-3 săptămîni) una din problemele nerezolvate pe care le propune din cînd în cînd în prelegerile sale (aviz amatorilor de un doctorat pe fugă).

Aceasta este schița de portret a unuia dintre cele mai pitorești personaje din informatică. Chiar dacă ne-am abătut de la subiectul acestui articol, nu am rezistat să nu vorbesc puțin despre el.

TEX

Vom vedea mai departe că LATEX nu e nimic altceva decît un pachet de definiții (macro-uri) în limbajul TEX creat de Knuth. Ca atare vom arunca întîi o privire rapidă asupra acestui limbaj.

Versiunile succesive de TEX sunt numerotate cu zecimalele numărului $\pi$: la ora actuală s-a ajuns la versiunea 3.14159.

Numele

Primul lucru care trebuie clarificat este pronunția: TEX se citește de fapt ``tech'', și nu ``tex''. Iată explicația lui Don Knuth pentru etimologie, extrasă din primul capitol al cărții de TEX:

English words like `technology' stem from a Greek root beginning with the letters $\tau\epsilon\chi\ldots\,$; and this same Greek word means art as well as technology. Hence the name TEX, which is an uppercase form of $\tau\epsilon\chi$.

Insiders pronounce the $\chi$ of TEX as a Greek chi, not as an `x', so that TEX rhymes with the word blecchhh. It's the `ch' sound in Scottish words like loch or German words like ach; it's a Spanish `j' and a Russian `kh'. When you say it correctly to your computer, the terminal may become slightly moist.

în traducere:

Cuvinte ca ``tehnologie'' sunt formate dintr-o rădăcină grecească care începe cu literele $\tau\epsilon\chi$ (tau, epsilon, chi); acest cuvînt grecesc înseamnă el însuși ``artă'' dar și ``tehnologie''. De aceea numele TEX, care este scrierea cu litere majuscule a cuvîntului $\tau\epsilon\chi$.

Cunoscătorii pronunță litera $\chi$ din TEX ca pe grecescul ``chi'', și nu ca pe un ``x'', astfel încît TEX rimează cu cuvîntul blecchhh. Este ca sunetul ``ch'' din cuvinte scoțiene ca loch sau cuvinte germane ca ach; este ``j''-ul spaniol și ``kh''-ul rusesc. Cînd este pronunțat corect în fața calculatorului, va face ca terminalul să se umezească.

Tehnoredactat corect, litera E din TEX trebuie să apară mai jos decît celelalte (vedeți și figura 4), tocmai pentru a indica faptul că e vorba de un program de tehnoredactare. Cînd se folosește un terminal ASCII cuvîntul se scrie cu T și X mare și E mic: TeX.

Cutiuțe

Conceptele fundamentale cu care TEX operează sunt cutiuțele și lipiciul (boxes and glue). Motorul care tehnoredactează nu știe mare lucru despre fiecare caracter; tot ceea ce îi trebuie este să știe dimensiunile unei cutii care cuprinde caracterul, ca în figura 2. TEX nu știe nimic despre care puncte din cutie vor fi pictate cu cerneală și care nu; aceasta este treaba altor scule.

Figura: Trei litere și cutiile din care fac parte, puse una lîngă alta. TEX operează tot timpul doar cu cutii, și nu știe nimic despre cum arată literele de fapt. Cu linie punctată este indicată cutia obținută din alipirea celor 3 litere.
\begin{figure}\centerline{\epsfxsize=5cm\epsffile{cutii.eps}}\end{figure}

Textul este asamblat din astfel de cutiuțe pusă una lîngă alta. TEX aranjează cutiuțe una după alta pe orizontală formînd rînduri. Cînd un rînd se termină, TEXface din el o cutiuță mai mare și pune cutiuțele-rînduri una peste alta. Fiecare pagină este tot o cutie, asamblată din mai multe rînduri puse unul peste altul.

Utilizatorul poate crea cutii cu dimensiuni negative; în felul acesta se pot obține efecte speciale, micșorînd distanța dintre caractere sau scriind caractere suprapuse. Comenzi speciale pot muta cutiile (de exemplu dacă vrem să facem un exponent putem folosi semnul ^, care va ridica cutia care urmează și va micșora font-ul).

În TEX mai există și un alt tip special de cutie, care se cheamă ``clei''. Ca și cutiuțele, clei-ul are o anumită dimensiune, dar în plus are capacitatea de a se întinde și comprima ca un elastic. Între cuvintele de pe o linie TEX pune automat lipici; asta permite spațiilor dintre cuvinte să se întindă sau să se comprime pentru a ajusta frumos marginea din dreapta a liniei. Cu cît se întinde mai mult lipiciul, cu atît mai ``dureros'' este rezultatul, pentru că așezarea în pagină se depărtează de la cea ideală.

TEX folosește conceptul de lipici pentru a calcula despărțirea în rînduri ``optimă'' a unui text. TEX folosește pentru asta o formulă matematică, care în funcție de cît de întins este lipiciul din fiecare rînd calculează ``frumusețea'' unui paragraf. Cînd programul desparte în rînduri un paragraf, folosește un algoritm deștept inventat de Knuth (folosind programare dinamică) pentru a calcula tăieturile care oferă cel mai plăcut efect estetic, dintre toate cele posibile.

Folosind tipuri speciale de lipici, care se întinde la infinit fără ``dureri'', se pot obține efecte speciale: de exemplu punînd lipici la marginea din dreapta a fiecărui rînd se pot obține pagini la care rîndurile nu sunt egale, ci sunt aliniate la stînga. Punînd lipici la ambele părți se obțin rînduri centrate.

Asta e tot! Folosind cutiuțe și lipici împreună cu algoritmi inteligenți de aranjare în pagină, TEX obține tipografie de calitate extraordinară.

Trebuie menționate aici formulele matematice: modul în care TEX formatează matematica este încă neîntrecut, deși sistemul este vechi de peste douăzeci de ani. Cînd are de tehnoredactat o formulă, TEX folosește un algoritm sofisticat care re-calculează dimensiunile și plasamentele tuturor cutiuțelor în funcție de tipurile de simboluri care apar: fiecare simbol este catalogat ca fiind într-una din 13 categorii: operator binar, operator relațional, accent, un semn de punctuație, un tip de paranteză închisă sau deschisă, semn de fracție, radical, etc. Fiecare din aceste categorii de simbol se comportă într-un anume fel în raport cu vecinii săi; unele simboluri cresc cît este necesar pentru a se adapta la cutiile cu care sunt vecine (de exemplu linia de fracție sau parantezele).

Macro-uri

TEX este un limbaj foarte original. Principalul concept din acest limbaj este macro-instrucțiunea, numită familiar și macro. Cei care programează în C sunt familiarizați cu macro-urile, care sunt acolo definite cu comanda #define. Un macro este practic o instrucțiune care arată cum un anumit text este substituit cu un altul.

Limbajul TEX este în întregime bazat pe macro-uri. Fiecare variabilă este de fapt un macro care este substituit în text cu valoarea sa. Limbajul are un set restrîns de operații primitive (cea mai primitivă operație fiind cea de a ``desena'' un caracter), și toate celelalte operații sunt definite din acestea folosind macro-uri. Unele macro-uri se pot expanda la rîndul lor într-un text care conține macro-uri, care trebuie expandate la rîndul lor, etc. În felul acesta, folosind macro-uri recursive, limbajul folosește un concept rudimentar de buclă.

Limbajele bazate pe macro-uri sunt extrem de puternice; de fapt sunt la fel de puternice ca orice alt limbaj; pentru demonstrație Andrew Marc Greene de la universitatea MIT a scris în 1992, în 470 de linii de TEX (inclusiv comentarii) un interpretor complet de BASIC! (Un alt limbaj bazat pe macro-uri foarte folosit este m4.) Dar anumite complicații cu macro-urile fac de fapt folosirea lor extrem de dificilă. Cele mai multe probleme apar din ordinea de evaluare: cînd avem un macro aplicat altui macro, care dintre ele trebuie expandat întîi? În funcție de ordine putem avea rezultate diferite.

În TEX problemele sunt exacerbate din cauză că nu există cuvinte rezervate, ca în toate limbajele cu care suntem obișnuiți. Fiecare cuvînt sau chiar fiecare caracter poate fi transformat într-un macro, care se expandează în altceva! Expansiunea unui macro poate genera o definiție care schimba semnificația macroului însuși!

TEX: un limbaj imposibil

Cu tot respectul pentru dl. Knuth, care a jucat un rol foarte important în 1968 în construirea primului compilator de Algol, și care a contribuit la crearea unor importante concepte în teoria compilatoarelor, limbajul TEX este o varză completă. Utilizatorul trebuie să consume un efort de imaginație substanțial pentru a face programele să funcționeze, fiind foarte atent la ordinea de evaluare și la efectele laterale ale fiecărui macro.

Pentru că unele macro-uri le redefinesc pe altele, avem o neplăcută problemă de dependență: efectul unui ``program'' TEX depinde de mediul în care este invocat. Pentru că efectele prin variabile globale și definiții de macro-uri nu sunt întotdeauna controlate clar, programele TEX sunt foarte greu de scris și de depanat. Mai mult, unele concepte care funcționează foarte frumos în izolare, au mari probleme cînd sunt folosite laolaltă (de exemplu, în LATEX e foarte complicat să faci note de subsol în tabele).

Utilizatori sofisticați pot folosi TEX pentru a tehnoredacta texte relativ simple, dar doar o mînă de oameni poate exploata TEX cu ușurință. Eu cred că design-ul mizerabil al limbajului este unul dintre motivele fundamentale pentru care TEX nu este folosit pe scară mai largă. De fapt TEX ar fi trebuit de mult să fie scos din circulație de produse mai ușor de folosit; singura explicație pentru longevitatea sa este faptul că piața pentru un program de tehnoredactare de matematică este extrem de îngustă, iar dificultatea implementării unui program de tehnoredactare atît de sofisticat (cu toată publicarea algoritmilor și a codului sursă) este enormă (Knuth este un programator colosal, cu o atenție nemărginită pentru detaliu).

METAFONT

Simultan cu TEX, Knuth a construit un alt program foarte interesant, numit METAFONT, care poate genera familii întregi de font-uri dintr-o singură specificație. Astfel, programatorul descrie forma generală a fiecărui caracter; fișiere de configurație pot apoi genera toate familiile de font-uri dintr-o singură descriere: caracterele oblice, grase, egale, CAPITALIZATE, italice și variatele dimensiuni și mărimi, cu și fără serife sunt toate generate apoi automat din aceeași descriere.

METAFONT este tot un limbaj de programare care permite desenarea a felurite primitive geometrice, declarații de variabile, definirea de macro-uri și bucle, folosirea a diferite creioane cu vîrfuri eliptice pentru a desena curbe spline cubice2, sisteme de ecuații lineare pentru definirea de variabile (rezolvate automat de interpretor).

Leslie Lamport

Înainte de a afla mai multe detalii despre LATEX, ne întîlnim din nou cu o figură colosală a informaticii, Leslie Lamport.

Figura 3: Leslie Lamport, creatorul LATEX.
\begin{figure}\centerline{\epsfxsize=5cm\epsffile{lamport.eps}}\end{figure}

Deși mai puțin faimos decît Donald Knuth, Leslie Lamport este unul dintre cercetătorii cei mai renumiți din domeniul calculatoarelor. Domeniul său de specialitate este teoria sistemelor distribuite și verificarea formală. După ce a obținut un doctorat în matematică în 1972 de la universitatea Brandeis, a lucrat pentru o vreme la compania Stanford Research Institute (inițial formată prin colaborare cu universitatea Stanford; SRI este unul din cele mai mari centre de cercetare din întreaga lume, care lucrează pe bază contracte). În timp ce lucra aici Lamport a creat sistemul LATEX, care este pretextul acestui articol. După un scurt timp s-a mutat la centrul de cercetări Systems Research Center (SRC) al companiei Digital (care a fost între timp cumpărată de Compaq). Lamport lucrează în continuare la Compaq SRC, unde puteți găsi și pagina sa de web: research.compaq.com/SRC/personal/lamport/home.html.

Înainte de a discuta despre cea mai cunoscută creație a lui Lamport, LATEX, se cuvine să menționăm unele dintre contribuțiile lui fundamentale în teoria sistemelor concurente și distribuite:

LATEX

În 1983 Lamport învățase TEX de relativ puțină vreme, și își construise un set de macro-uri foarte utile, care mutau operațiile pe un nivel ceva mai înalt, în care descriai nu cum vrei să arate un document, ci care este structura lui logică.

Sistemul acesta de macro-uri a căpătat numele Lamport TEX, sau LATEX. Editura Addison-Wesley dorea să tipărească un manual despre un sistem de tehnoredactare pentru matematicieni și ingineri, așa că un redactor l-a contactat pe Lamport. Ca urmare, Lamport a scris ``cartea de LATEX'' (vedeți și secțiunea despre alte surse de informație), care a devenit un best-seller (s-au vîndut cîteva sute de mii de exemplare și a fost retipărită de cel puțin șapte ori). Cartea a propulsat setul de macro-uri al lui Lamport în celebritate; ca și TEX, acestea sunt disponibile în cod sursă pe Internet.

Ceea ce LATEX încearcă să facă este să ascundă întreaga mașinărie încîlcită a TEX-ului sub o fațadă netedă: redefinirea comenzilor este în mod implicit interzisă (dar poate fi făcută, dacă utilizatorul chiar dorește), un set de comenzi esențiale este oferit, care organizează documentul într-o formă logică, și sunt introduse fișierele de stil, care grupează declarații care influențează arhitectura întregului document; schimbarea stilului se poate face separat de cea a conținutului. LATEX introduce de asemenea suport pentru referințe încrucișate (genul ``vezi figura X'', unde X este numerotat automat de sistem), etichete, cuprins, index, bibliografie, unele cu ajutorul unor programe suplimentare care procesează texte.

LATEX2e și LATEX3

LATEX face o treabă destul de bună; este un limbaj destul de rezonabil, în care se pot produce relativ repede rezultate atractive; matematica este tehnoredactată la întreaga putere a TEX-ului. Dar implementarea LATEX era greu de menținut și dezvoltat, așa că începînd din 1993 o serie de voluntari și programatori din întreaga lume au pornit un nou proiect numit LATEX3 (versiunea de LATEX la acea dată era 2.09). LATEX3 este un proiect în evoluție, dar a fost deja lansată o versiune preliminară, numită LATEX2e.

LATEX a fost în întregime re-implementat într-o manieră asemănătoare cu programarea orientată pe obiecte, într-o serie de module separate. Unele module se pot înlocui unele pe altele, și felul în care utilizatorii pot contribui cu noi module este standardizat. Asta a dat naștere la o cantitate remarcabilă de facilități noi aduse limbajului și sistemul de folosire a font-urilor a fost extins și perfecționat, permițînd LATEX să folosească font-uri dezvoltate de terți (și nu numai Computer Modern).

LATEX2e este compatibil cu 2.09, dar nu și invers. Instrucțiunile pe care le prezentăm în continuarea acestui articol funcționează în ambele versiuni. Limbajul de bază 2.09 este complet inclus în 2e.

O introducere rapidă în LATEX

În cele ce urmează voi prezenta pe scurt unele din cele mai importante construcții ale limbajului. Mi-e teamă că stăpînirea limbajului este imposibilă fără posesiunea cel puțin a cărții de bază. Pe Internet există cîteva cărți de introducere, și cel puțin una a fost publicată și în română. De asemenea, există o pleiadă de fișiere de ``help'' care descriu sumar comenzile. Dar nici una nu poate înlocui în acoperire manualul lui Lamport.

Un exemplu de document foarte simplu

Figura 4 arată un simplu document complet LATEXși rezultatul tehnoredactării sale. Orice document începe cu o declarație de stil (\documentstyle) și este cuprins între \begin{document} și \end{document}. În celelalte figuri voi omite aceste trei linii.

Înainte de a discuta unele dintre comenzile importante, va trebui să vă spun cum am obținut fiecare din imaginile din acest text.

Figura 4: Un exemplu de document LATEX împreună cu cuprinsul și cîteva secțiuni.
\begin{figure}\centerline{\epsfxsize=10cm\epsffile{exemplu.eps}}\end{figure}

Folosirea LATEX

Pentru a scrie textul din partea de jos din figurii 4 am folosit un editor de texte obișnuit, în cazul meu emacs, care are un mod major care ajută editarea de documente TEX și LATEX (vedeți și articolul meu despre emacs din PC Report din mai 1997).

Am salvat fișierul sub numele exemplu.tex. Sufixul .tex este folosit atît pentru fișiere TEX cît și pentru fișiere LATEX.

Pentru a tehnoredacta fișierul am folosit apoi comanda: latex exemplu.tex. Această comandă pornește interpretorul TEX, care la rîndul lui încarcă un set de macro-uri fundamentale, numite plain.tex, și care apoi încarcă setul de macro-uri numit latex.tex. Apoi interpretorul citește fișierul exemplu.tex și îl execută. Comenzile (în general indicate de cuvinte care încep cu semnul \, backslash), sunt macro-uri, care sunt expandate. Literele și semnele speciale sunt tehoredactate, așa cum am explicat mai sus în secțiunea despre cutiuțe.

(De fapt LATEX trebuie executat de două, pentru că prima oară strînge informații despre unde se află fiecare secțiune pe care a la a doua rulare le folosește pentru a construi cuprinsul.)

Această execuție produce mai multe fișiere, din care cel mai important este exemplu.dvi. Sufixul .dvi înseamnă DeVice Independent, adică ``independent de dispozitivul de afișare''. Fișierele dvi conțin o descriere a documentului tehnoredactat, în sensul că spun unde pe pagină trebuie plasată fiecare cutiuță și ce simbol se află în interiorul ei. Un fișier dvi nu conține însă nici un fel de informații despre cum arată caracterele, sau eventualele imagini incluse.

Programul dvips transformă un fișierul exemplu.dvi într-un fișier Postscript exemplu.ps folosind comanda dvips -o exemplu.ps exemplu.dvi. Acest fișier extrage informații despre font-uri din locuri dinainte stabilite, adaugă imaginile incluse în text și generează un program în Postscript. Acesta este un program de sine-stătător, care conține toată informația despre cum arată rezultatul final; acest ``program'' poate fi fie vizualizat pe ecranul calculatorului folosind programul ghostview, fie tipărit la orice imprimantă care înțelege limbajul Postscript.

Toate aceste programe, tex, latex, dvips, ghostview sunt disponibile gratuit de pe Internet, laolaltă cu o sumedenie de fișiere de configurare, macro-uri și font-uri, pentru o mulțime de sisteme de operare incluzînd Windows, Unix și MacOS.

Cuvinte cheie și caractere speciale

Programele LATEX pot fi scrise folosind doar setul de caractere ASCII. Pentru a genera semne care nu sunt pe tastatură se folosesc macro-uri speciale care folosesc font-uri speciale. Acesta este un avantaj mare asupra programelor WYSIWYG: privind fișierul putem spune exact ce se va întîmpla; toate comenzile și caracterele sunt descrise printr-un text clar (de exemplu în Microsoft Word trecerea de la text normal la text gras nu este vizibilă decît prin efectele sale).

Iată cum interpretează LATEX diferitele construcții:

Toate literele și cifrele
sunt caractere obișnuite, care apar în rezultatul final.

Semne speciale:
Pentru a scrie macro-uri și comenzi speciale, zece dintre caracterele ASCII au semnificații speciale; acestea sunt:

Caracter Nume Semnificație
# Diez Număr de argumente într-un macro definit de utilizator
$ Dolar Delimitează formule matematice
% Procent Începe un comentariu
& Ampersand Separă coloanele în tabele
~ Tilda Spațiu unde nu se poate despărți rîndul
_ Subliniat Pentru a scrie indici
^ Căciulă Pentru a scrie exponenți
\ Backslash Urmează un nume de macro
{} Acolade Grupează mai multe caractere la un loc

Alte semne:
De asemenea, caracterele | < > pot fi folosite numai în formule matematice (folosite în text dau naștere unor efecte ciudate).

Un macro:
este indicat de un cuvînt format numai din litere în față căruia apare semnul \. Literele mari și mici sunt distincte, deci \LaTeX e diferit de \LaTeX.

Semnul procent:
% este folosit pentru a introduce comentarii în text: tot ce urmează pînă la sfîrșitul liniei este ignorat de către interpretorul LATEX.

Acoladele
sunt extrem de importante în LATEX; ele au o dublă funcțiune:

Spațiile
multiple sunt nesemnificative (includem aici caracterele blank, tab (\t în C) și linie-nouă (\n sau \r); nu puteți schimba deci alinierea textului tastînd mai multe spații. Excepții la această regulă sunt însă următoarele:

Formule matematice

După cum spuneam, TEX și LATEX sunt excepționale în tehnoredactarea formulelor matematice. O sumedenie de macro-uri sunt predefinite pentru toate soiurile de operatori matematici, care de care mai ciudați.

Formulele sunt delimitate de semne dolar $. Există două feluri de formule: care apar în text, care sunt delimitate de un singur semn $, și formule care apar de sine-stătător, care sunt separate cu cîte două semne: $$.

Figura 5: Exemple de formule complexe în mod matematic și programele LATEX care le generează.
\begin{figure}\centerline{\epsfxsize=12cm\epsffile{math.eps}}\end{figure}

Figura 5 arată unele simboluri folosite în formule matematice.

Enumerări și liste

În LATEX există două tipuri de macro-uri: macro-uri simple, care pot avea argumente, sau macro-uri de tip ``bloc'' (environment). Macro-urile de tip bloc apar întotdeauna în perechi begin-end; între begin și end este activ macro-ul.

Trei macro-uri de tip bloc pot fi folosite pentru a obține mai multe feluri de enumerări; acestea sunt itemize, enumerate și description. itemize va pune biluțe (sau alte semne) în fața fiecărui element, enumerate va pune cifre iar description va pune ceea ce indică utilizatorul. Vedeți și figura 6 pentru un exemplu.

Figura 6: Exemple de liste și enumerări în LATEX și codul care le-a generat.
\begin{figure}\centerline{\epsfxsize=12cm\epsffile{liste.eps}}\end{figure}

Tabele și matrici

Figura 7 arată unele dintre lucrurile care se pot face folosind tabele.

Figura 7: O tabelă și codul LATEX care a generat-o.
\begin{figure}\centerline{\epsfxsize=11cm\epsffile{tabela.eps}}\end{figure}

Mediul ``tabular'' este urmat de o listă de poziții ale coloanelor:

Literă Engleză Semnificație
l left aliniat la stînga
c center centrat
r right aliniat la dreapta
| bar bară verticală
p{marime} paragraph coloană de lățime fixă

Coloanele sunt separate cu semnul ampersand &, și liniile sunt terminate cu semnul \\. Texte pe mai multe coloane se pot face folosind macro-ul \multicolumn, care are trei argumente. Linii orizontale se pot face folosind \hline; linii orizontale parțiale cu \cline.

Font-uri

Rămînînd în interiorul aceleiași familii de font-uri se pot schimba font-urile cu diferite comenzi. Figura 8 arată cîteva exemple de comenzi și fonturile obținute.

Figura: Exemple de comenzi de schimbare a font-ului în LATEX; unele comenzi se pot combina, de exemplu \sl\tt.
\begin{figure}\centerline{\epsfxsize=14cm\epsffile{fonturi.eps}}\end{figure}

Accente

TEX și LATEX oferă o serie bogată de accente, care se pot folosi pentru a scrie în majoritatea limbilor cu alfabete latine, ilustrate în figura 9.

Figura 9: Accente LATEX și codul care a generat tabelul; pentru accente în mod matematic trebuie folosite alte comenzi.
\begin{figure}\centerline{\epsfxsize=6cm\epsffile{accente.eps}}\end{figure}

Index-uri, referințe încrucișate, bibliografii

LATEX generează automat numere pentru pagini, capitole, secțiuni, paragrafe, ecuații, figuri, tabele, etc. Folosind macro-ul \label se generează automat nume pentru etichete. De exemplu, \label{sec} plasată în text va da variabilei sec numărul secțiunii curente. Plasînd \label{fig} în interiorul textului asociat unei figuri (vedeți mai jos un exemplu), va da variabilei fig numărul figurii curente.

Folosind macro-ul \ref putem referi aceste variabile astfel: vezi capitolul \ref{sec}.

Figuri

Figurile sunt tot dreptunghiuri în LATEX, dar sunt speciale pentru că plasamentul lor în text nu este fixat de la început, ci este aranjat în funcție de restul textului. Figurile se numesc de aceea ``corpuri flotante'', pentru că ``plutesc'' prin textul înconjurător pentru a ajunge mereu unde a indicat utilizatorul. Există două tipuri de figuri, care funcționează asemănător, dar sunt numerotate independent: figuri și tabele. Iată un exemplu de fragment cod LATEX care generează un tabel:

\begin{table}[ht]
\begin{tabular}{lll}
....

\end{tabular}
\caption{\label{culori}Culorile fundamentale.}
\end{table}

Acest tabel conține chiar o tabelă (al cărei corp l-am omis), dar care asociază un text (capțiune) cu tabelul și o etichetă, numită culori, care poate fi referită în text cu \ref{culori}.

Algoritmul de paginare va încerca să plaseze tabela după indicațiile dintre parantezele pătrate ([ht] în exemplul de mai sus), după posibilități, în ordine în locul în care apare în text (h = here), la partea de sus a unei pagini (t = top) sau la partea de jos a unei pagini (b = bottom).

Macro-uri și definiții

După cum am văzut pînă acum în exemple, există mai multe feluri de macro-uri. Dar toate sunt construite din același obiect fundamental: un macro cu zero sau mai multe argumente. Utilizatorii pot defini și ei macro-urile lor, și sunt chiar încurajați să facă asta. Comanda \newcommand chiar asta face.

Pentru a defini un macro fără argumente folosim ceva de genul:

\newcommand{\pcr}{PC Report}

Iată și un exemplu de macro cu două argumente, folosit pentru semnul ``combinări de x luate cîte y'':

\newcommand{\comb}[2]{C^{#1}_{#2}}

După cum puteți ghici, semnul #1 înseamnă ``primul argument''. Pentru a folosi acest macro putem scrie ceva de genul:

\comb{5}{x}

LATEX permite de asemenea definirea unor macro-uri bloc; asta se face cu ajutorul comenzii \newenvironment. Figura 10 arată exemple de macrodefiniții.

Figura 10: Definirea și folosirea unor noi macro-uri; rezultatul obținut și codul care îl generează.
\begin{figure}\centerline{\epsfxsize=11cm\epsffile{macro.eps}}\end{figure}

Cînd expansiunea unui macro generează un alt macro, acesta este expandat la rîndul lui; acest proces se încheie cînd se generează caractere sau macro-uri fundamentale (de exemplu nume de simboluri speciale). Unele dintre macro-urile predefinite pot avea argumente opționale, care sunt transmise între paranteze pătrate.

Stiluri și documente

Prima linie din document este \documentstyle; acest macro are un argument care indică tipul de document care urmează. Schimbînd argumentul puteți schimba radical tipul de document. Tipurile standard de document sunt article, report, book, sau letter. Acest macro este înlocuit în versiunea LATEX2e de macro-ul \documentclass.

\documentstyle poate avea tot felul de argumente opționale, care pot influența dramatic stilul. Font-ul standard e de 10 puncte, dar putem mări caracterele cu

\documentstyle[12pt]{article}

Dacă vrem să scriem pe două coloane, ajunge să facem:

\documentstyle[twocolumn]{article}

și așa mai departe, avem la dispoziție o mulțime de opțiuni.

Pachete suplimentare

În varianta LATEX2e a fost introdusă o nouă metodă (care nu funcționează în LATEX2.09) de a încărca pachete de macro-uri, folosind comanda \usepackage. Există efectiv mii de pachete de macro-uri, de la modificări și extensii ale comenzilor standard pînă la pachete ultra-specializate pentru diferite domenii (chimie, fizică, matematică, algoritmi, etc.), marea majoritate fiind disponibile pe Internet, din arhivele CTAN (vedeți mai jos secțiunea despre alte surse de informație).

Alte scule legate de LATEX

O grămadă de alte scule pot opera cu fișiere LATEX; iată aici unele dintre cele mai importante:

latex2html
convertește din LATEX în HTML; face o treabă destul de bună, mai ales dacă documentele sunt scrise în LATEX standard, fără cod TEX.

makeindex
este un program care generează automat un index dintr-un document. Cuvintele care trebuie să apară în index sunt marcate de editor cu comanda \index în text, dar restul procesării este automat.

bibtex
este un utilitar care extrage, crează și formatează bibliografii în mod automat din documente LATEX și fișiere speciale care conțin descrieri bibliografice, cu extensia .bib.

xdvi
este un program care permite vizualizarea fișierelor dvi direct pe un sistem de ferestre X Windows (standard sub Unix)

ghostview
este un utilitar care poate afișa sau converti fișiere Postscript.

amstex
este un pachet de macro-uri scris de American Mathematical Society, pe care autorii de manuscrise matematice trebuie să-l folosească cînd vor să publice în revistele editate de societate.

pdftex
este un program care generează din TEX direct fișiere în limbajul pdf, Portable Document Format.

AUC-TeX
este un mod major pentru emacs care permite editarea și procesarea fișierelor TEX și LATEX.

dvips
este un utilitar care convertește din format dvi în format Postscript.

LyX
este un editor vizual, în curs de dezvoltare, care generează cod LATEX.

MathType
pentru Microsoft Word este un editor WYSIWYG de ecuații care generează TEX.

Convertoare
între LATEX și alte procesoare de text sunt listate la
http://www.kfa-juelich.de/isr/1/texconv/texcnv.html.

texinfo
un limbaj în care proiectul GNU (vedeți și articolul meu din PC Report din iunie 1998) construiește documentația programelor; din texinfo se pot genera automat fișiere TEX pentru documentație tipărită și fișiere info pentru manuale interactive hipertext.

Încheiere

LATEX este un program foarte complicat, dar cu care se pot obține cu ușurință rezultate spectaculoase, mai ales în tehnoredactarea de formule matematice. Rămîne să decideți dacă vă este sau nu util. Învățarea este cîteodată anevoioasă, și limbajul este plin de idiosincrazii. Dar, fie ca ne place, fie că nu, LATEX va rămîne pentru viitorul apropiat singura alternativă decentă pentru tehnoredactarea computerizată de mare calitate a textelor matematice.

Alte surse de informație

Cele trei cărți de LATEX:

  1. ``LaTeX: A document Preparation System, User's guide and Reference manual'', de Leslie Lamport; Addison-Wesley, ediția a doua, 1994, ISBN 0-201-52983-1.

  2. ``The LaTeX Companion'', de Michel Goossens, Frank Mittelbach, Alexander Samarin; Addison-Wesley, 1994, ISBN 0-201-54199-8.

  3. ``The LaTeX Graphics Companion; Illustrating Documents with TeX and PostScript'', de Michel Goossens, Sebastian Rahtz, Frank Mittelbach; Addison-Wesley, 1994, ISBN 0-201-85469-4.

Cartea de TEX: ``The TeX book de Donald E. Knuth; Addison-Wesley, 1986, ISBN 0-201-13447-0 / 0-201-13448-9.

Tot software-ul și documentația free despre TEX se află la arhiva numită Comprehensive Tex Archive Network și oglinzile sale: http://www.ctan.org/.

Site-ul de web al proiectului LATEX: http://www.latex-project.org/

Legături despre METAFONT: http://www-cgrl.cs.mcgill.ca/~luc/metafont.html

Un articol despre formatarea logică și vizuală scris de Leslie Lamport ``Document Production: Visual or Logical?'',
http://www.research.digital.com/SRC/personal/lamport/pubs/document-production.ps.

Un articol despre impactul LATEXde Leslie Lamport ``How (La)TeX changed the face of Mathematics'',
http://www.research.digital.com/SRC/personal/lamport/pubs/lamport-latex-interview.ps.



Note

...LATEX1
PC Report folosește însă ca program de tehnoredactare QuarkXpress, care nu suportă LATEX; ca atare, în textul pe care îl aveți în fața ochilor în revistă, numai unele dintre figuri au fost generate cu LATEX și apoi transformate în Postscript. Articolele prezente în pagina mea de web sunt însă tehnoredactate în întregime cu LATEX.
... cubice2
Splinele cubice sunt curbe compuse din bucăți care se ``unesc'' în mod ``continuu'', și pentru care fiecare fiecare bucată este descrisă de un polinom de gradul 3.