``Corect'' -- un ``spell-check''-er pentru limba română

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

16 mai 1997

Subiect:
un corector de texte pentru limba română
Cunoștințe necesare:
familiaritate cu sisteme de prelucrare a textelor
Cuvinte cheie:
spell-check, emacs, ispell, standard, inernaționalizare


Contents



Folosind programul ispell am construit un pachet de utilitare care ușurează scrierea și corectarea textelor în limba română. Pachetul este, sper, relativ ușor de instalat și folosit pe platforme Unix, și este disponibil oricui fără restricții.

Poate fi obținut prin web de la http://www.cs.cmu.edu/~mihaib/ftp/rom-spell.taz. În acest articol discut în oarece detaliu despre una dintre sculele pe care pachetul se bazează (excelentul program ispell) și justific unele dintre deciziile pe care le-am luat cînd am construit pachetul. Pe alocuri divaghez despre importanța unui design clar separat, și despre funcția standardelor în ziua de azi.

Programul ispell

ispell este software ``free'', deci accesibil oricui. Rolul lui este destul de simplu: analizează texte și indică cuvintele a căror grafie nu o cunoaște, permițînd în felul acesta corectarea unora dintre erorile de dactilografie. ispell vine de la ``fabricanți'' cu o întreagă suită de programe care permit construirea, manipularea și întreținerea de dicționare.

ispell este prin natura lui un program nu prea inteligent: are la îndemînă un dicționar cu toate cuvintele corecte, iar ceea ce face este să caute fiecare cuvînt din textul de corectat în dicționar. Dacă găsește cuvîntul îl socotește bun, dacă nu, se uită în dicționar după cuvinte care sunt ``apropiate'' ca scriere de cel absent, pe care apoi le propune spre înlocuire, presupunînd ca acel cuvînt a fost greșit scris.

Ce înseamnă că ``două cuvinte sunt aproape'' pentru ispell? Un cuvînt este aproape de altul dacă se poate obține printr-una din următoarele operații:

De asemenea, ispell poate identifica lipsa unui spațiu dintre două cuvinte.

Deși un astfel de program nu poate oferi nici o garanție în producerea de texte corecte, este extrem de eficace în a elimina o mare parte dintre erorile tipografice.

Chiar faptul că ispell nu are nici o cunoștință despre limbă îl face foarte util, pentru că permite folosirea lui cu texte scrise în orice limbă, cu condiția posedării unui dicționar potrivit.

Un principiu de Design

Programe de genul ispell există de multă vreme în lumea Unix (de ex. programul spell; to spell = a scrie literă cu literă). Ceea ce face ispell atrăgător este universalitatea lui. ispell este un exemplu tipic de program care încarnează un foarte important principiu de proiectare în calculatoare. Acest principiu se manifestă în separarea dintre mecanism și politică (policy/mechanism). Principiul indică faptul că un aparat trebuie să fie cît mai universal, ca să nu oblige pe cel care îl folosește la anumite feluri de manipulare, care să îi reducă utilitatea.

Tehnica este extrem de importantă în proiectarea sistemelor de operare, și în general a programelor care servesc drept unelte1(de exemplu bibliotecile). Un sistem de operare trebuie de exemplu să-ți ofere toate metodele prin care să poți controla cînd se vor executa programele tale, dar să nu impună o anumită ordine de execuție a lor. Sistemul de operare este cel care execută programele, dar utilizatorul este cel care indică ordinea și prioritățile.

Un alt exemplu interesant este în rețelele de calculatoare: protocoalele de transmisiune a datelor știu să mute biți de la un calculator la altul, chiar foarte îndepărtat. În acest caz mecanismul este cel care transportă datele. Politica de alegere a traseului pe care le urmează datele este însă complet separată de mecanismul de transport; ea este decisă de un set complet separat de protocoale, numite protocoale de rutare. Această flexibilitate permite construirea de protocoale de rutare noi și înlocuirea celor vechi ``din mers'', fără a întrerupe funcționarea rețelei în vreun fel.

Pe scurt: dacă faci un aparat complicat, nu restrînge modul în care poate fi folosit, ci construiește-i suficiente mînere cît să poată fi controlat în cît mai multe feluri.

Pachetul pentru limba română

Unde trebuie puse mînerele nu este întotdeauna evident. Proiectantul variantei internaționale a lui ispell, Geoff Kuenning, a studiat cu atenție locurile în care politica era îngropată în interiorul programului, și a încercat să o extragă în afară. Acest lucru este vizibil utilizatorului prin faptul că pentru a folosi ispell trebuie să scrii o grămadă de fișiere auxiliare, care controlează modul în care lucrează. Ceea ce am și făcut, pentru a putea face ispell utilizat cu texte românești.

În cele ce urmează voi descrie pe scurt conținutul pachetului; această descriere îmi va prilejui identificarea porțiunilor din ispell care sunt supuse controlului utilizatorului.

Fișierele de prefixe/sufixe

Principala piesă din configurarea ispell este fișierul de afixe. Numele nu este foarte fericit ales, pentru că funcțiunea acestuia este, pe lîngă de a indica metode de derivare cu prefixe și sufixe (care pot fi folosite pentru a comprima dicționarele), și descrierea parametrilor funcționării lui ispell.

O primă alegere cu care m-am confruntat a fost dacă dicționarele vor conține semne diacritice sau nu. Pentru că nu m-am putut hotărî, pînă la urmă am construit două configurații și două dicționare, pentru ambele cazuri.

Pentru cazul semnelor diacritice a trebuit să fac față următoarelor două decizii:

Problema internaționalizării

Calculatoarele depind într-o sumedenie de moduri subtile de faptul că au fost concepute de oameni care foloseau mai ales limba engleză (orice istorie a calculatoarelor va recunoaște rolul americanilor și, ceva mai puțin, al englezilor). Modul în care sunt prelucrate textele, în care sunt afișate și citite este adesea strîns legat de caracteristicile speciale ale limbii engleze. De acest lucru și-au dat seama cei care au încercat să universalizeze folosirea calculatoarelor, pentru a le adapta și altor nații.

Fără a avea pretenția de a trata exhaustiv această problemă, să aruncăm o privire asupra influenței limbii asupra programelor.

Traseul informației

Pentru a prelucra texte avem trei categorii mari de operații:

Pentru fiecare din aceste activități este responsabil un program distinct. De citirea tastaturii se ocupă ``driver''-ul de terminal. Acesta are de obicei mai multe funcțiuni:

În funcție de sistemul de operare, utilizatorul are mai multe opțiuni la-ndemînă pentru a influența driverul: poate să citească direct codurile, să influențeze modul în care se face traducerea, să evite editarea automată textului.

Dacă lucrezi pe un calculator la distanță, de exemplu conectat prin telnet prin rețea, lucrurile se complică, pentru că între driver-ul care citește tastatura (aflat pe calculatorul local) și aplicația ta (aflată la distanță) se mai interpun încă două programe care codifică fiecare tastă apăsată:

Afișarea textelor este iarăși de obicei sarcina unui ``driver''. Dacă avem de-a face cu un terminal alfa-numeric (sau o fereastră care emulează un astfel de terminal prin software), atunci de obicei driver-ului i se dau secvențe de caractere ASCII, pe care știe el cum să le afișeze; din cînd în cînd i se dau și coduri numite ``caractere de control'', care de obicei nu lasă urme pe ecran, ci îi spun terminalului cum să manipuleze caracterele ce urmează. De exemplu putem indica, folosind caractere de control, în ce loc pe ecran să se scrie următorul caracter ASCII. Care este secvența de caractere de control care spune acest lucru depinde de terminal; fiecare fabricant a inventat propriile convenții.

De cînd firma Xerox a inventat ecranul grafic (``bitmapped screen''), a deveni un lucru comun ca interfața dintre aplicație și utilizator să nu fie un simplu șir de caractere pe care terminalul le afișează, ci o matrice mare de punctulețe care pot fi controlate individual. Aplicațiilor li se pune la îndemînă posibilitatea de a desena orice formă doresc; foarte frecvent însă sistemul de operare pune la dispoziție funcții de bilbiotecă pentru a desena caractere cu felurite forme (``fonturi'').

În fine, ultimul aspect al prelucrării de texte este procesarea lor cu feluriți algoritmi: căutări, sortări, tehnoredactare, corectură, editare, transmitere de poștă electronică, etc. Vom reveni pe scurt asupra fazei de prelucrare după ce discutăm despre standardizare.

Standardizarea

Un element cheie în interacțiunea între aceste părți (drivere, aplicații, biblioteci, sistemul de operare) este faptul că toate folosesc aceeași metodă de codificare. Cînd apăsați tasta ``A'', driverul de tastatură întoarce 97, iar aplicația știe că a primit un ``A'', pe care îl poate da bibliotecii de afișare, care știe că trebuie să deseneze o astfel de literă.

Oricine a lucrat pe o tastatură prost configurată, sau a încercat să acceseze de la distanța o aplicație care decodifică ciudat tastatura, sau a manipulat tabele de translatare ale codurilor, sau a primit mail cu caractere internaționale va înțelege importanța acestei convenții. Literei ``A'' i se asociază codul 97 de către codul ASCII (American Standard Code for Information Interchange), care este standardizat de ANSI (American National Standard Institute); e un fel de STAS local. Din fericire, datorită dominației SUA în arena calculatoarelor, ASCII este practic implementat de toată lumea. Și organizația mondială a standardelor ISO (International Standards Organization) a acceptat ASCII sub numele ISO 646. Codificarea ASCII însă recomandă numai 128 de simboluri (din care 32 nici măcar nu sunt vizibile, ci sunt ``caractere de control''). De îndată ce ieșim din perimetrul acestora, domnește haosul.

Pentru caractere pe 8 biți există standardul ISO-8859, care oferă o duzină de interpretări pentru caracterele cu coduri peste 128. Pentru limba română cea mai interesantă interpretare este cea dată de ISO-8859-2, numită și Latin-2, care conține toate semnele speciale cu diacritice românești. Problema acum este însă: înainte de a cădea de acord ce semn este cel cu codul 200, trebuie să cădem de acord ce cod folosim din duzina de variante ISO sau alte variante. Plus că fiecare aplicație trebuie să fie capabilă să interpreteze toate variantele, etc.

Tentative de standardizare și mai îndrăznețe s-au făcut: un consorțiu gigant, din care fac parte Microsoft, IBM, Xerox, Sun și alte (zeci) de firme din lumea calculatoarelor, a fost înființat, pe nume Unicode. Acesta, cu ajutorul a zeci de experți lingviști a propus o standardizare uniformă a tuturor caracterelor, din toate limbile lumii, folosind pentru aceasta 16 biți pe caracter. Fiecare caracter ar avea astfel o reprezentare unică și ne-ambiguă. Dificultățile de înfrînt sunt enorme; de exemplu trebuie cumva luate în considerare standardele naționale (cum ar fi cel elaborat de Japonezi) și reconciliate.

Din păcate concordia nu este încă realizată, pentru că ISO a propus în același scop propriul ei standard, diferit de Unicode, pe 32 de biți, numit ISO DIS 10646.

Dificultatea la ora asta este deci nu că nu există standarde, ci că există prea multe. O aplicație poate folosi propriile ei convenții interne pentru citirea tastaturii/modificare/afișare, dar de îndată ce se pune problema schimbului de informații, absența unui standard unic (sau a unui număr mic de standarde) face problema intratabilă.

În general, viața noastră de toate zilele depinde enorm de standarde, într-un fel pe care nici nu-l realizăm. Dacă nu am avea standarde trenurile nu ar pute circula pentru că ecartamentul ar fi diferit în țări diferite (de altfel, la ruși chiar este mai mare), aparatele electrice nu ar funcționa decît unde au fost proiectate (și așa americanii merg la 110V), mașinile ar trebui să care benzina de acasă ca să se potrivească cifra octanică, am vedea la televizor numai ce ar transmite bunica, cu care folosim aceeași codificare, etc, etc.

Prelucrările pe texte

Înainte de a ne îndepărta de zona standardelor internaționale, să mai aruncăm o privire asupra unor întrebări care sunt legate de reprezentarea caracterelor, și al căror răspuns influențează modul în care algoritmii vor procesa textele:

Oricare din aceste probleme poate fi rezolvată, dar pînă cînd nu toată lumea le va rezolva pe toate în același fel (prin intermediul unui standard), programele riscă să manipuleze obiecte pe care nu le mai înțelege nimeni în afară de autori.

Probabil că învingător în lupta standardelor va ieși pînă la urmă Unicode, datorită suportului unor firme extrem de mari, și datorită calităților sale tehnice. Standardul este descris în 8 cm2 de hîrtie la ora actuală, și mai crește.

Sistemul de operare Windows NT de la Microsoft este construit integral cu Unicode în interior; totul, de la nume de fișiere la mesaje de eroare este construit pe 16 biți. Biblioteci speciale transformă datele manipulate de programele ``vechi'' (care lucrează cu caractere pe 8 biți) în Unicode înainte de a ruga driverele din nucleu să le afișeze. Chiar faptul ca Windows NT domină piața sistemelor de operare la ora actuală este un motiv major pentru ca Unicode să învingă.

Reprezentarea diacriticelor

Închei aici digresiunea mea despre standarde și reprezentarea caracterelor internaționale, și revin la pachetul meu mult mai modest, care încearcă să rezolve unele dintre problemele limbii române.

Hotărîrea mea finală a fost să reprezint absolut tot textul folosind semne ASCII, lucru care o să mă scutească de o sumedenie de probleme de portabilitate, pentru că virtual toate terminalele din lume recunosc setul de caractere ASCII. În schimb mi-am propus să folosesc o convenție care să aibă următoarele proprietăți:

Pînă la urmă alegerea s-a oprit asupra semnului apostrof: ' . De aceea voi scrie acum literele astfel: 'a 'i 's 't pentru ă, î, ș, ț.

Probabil că alegerea pentru â a fost mai puțin fericită: am ales "a.

Dar să revenim la fișierele de configurare pentru ispell3.

Odată ce am hotărît ce litere voi folosi, am purces la a scrie un fișier de configurare pentru ispell. Formatul fișierului este documentat în paginile de manual ale programului ispell. Acesta este conținutul fișierului rom.signs.aff: fișierul de afixe pentru limba română cu semne diacritice (cel pentru configurația fără diacritice este mai simplu).

nroffchars    ().\\*
texchars      ()\[]{}<\>\\$*.%
stringchar    "'a" "'A"
stringchar    "'i" "'I"
stringchar    "'s" "'S"
stringchar    "'t" "'T"
stringchar    "\"a" "\"A"
wordchars     [a-z] [A-Z]

Folosind un limbaj foarte simplu îi descriu lui ispell care caractere au semne speciale în fișierele scrise pentru nroff și TEX (acestea sunt două programe foarte răspîndite în lumea Unix pentru tehnoredactarea de texte, care au folosesc niște limbaje speciale pentru a descrie aranjarea în pagină a textului. Practic eu trebuie să îi spun lui ispell că atunci cînd manipulez un text scris pentru nroff, respectiv TEX, trebuie să ignore cuvintele care descriu aranjarea în pagină, și să corecteze numai restul textului.)

Apoi îi indic lui ispell că voi interpreta perechile de semne apostrof-a, apostrof-A, etc. drept o singură literă în textele mele. Asta este foarte important pentru că îi spune lui ispell că ``fîș'' este obținut din ``fșî'' prin schimbarea a două litere (deci este ``aproape''), și nu prin permutarea unui șir de 4 caractere (cuvintele se vor scrie cu convenția mea astfel: f'i's f's'i).

În fine, indic faptul că semnele ASCII obișnuite pentru litere sunt componente ale cuvintelor. ispell permite reguli și mai rafinate, pentru a indica de pildă că anumite caractere sunt considerate litere numai dacă apar în interiorul unui cuvînt (cum ar fi de pildă liniuța de unire -), sau pentru a indica faptul că nroff sau TEX denotă altfel un același caracter.

Observați cît de flexibil este ispell: comportarea programului este influențată de o grămadă de parametri dinafară, din fișierul de configurare. Aceasta este separarea de politică și mecanism de care vorbeam, care îi permite lui ispell să fie simultan folosit în condiții atît de diferite.

Dicționarele

A doua problemă spinoasă era: de unde dicționare? La această întrebare am răspuns imediat.

Achiziția de date

ispell este un program interactiv, care este suficient de înțelept să fie de acord că nu știe totul. De fiecare dată cînd ispell găsește un cuvînt necunoscut, pe lîngă faptul că îmi oferă o listă de posibile corecturi, îmi oferă posibilitatea de a introduce cuvîntul în dicționar. Exact pe asta m-am bazat și eu: voi construi dicționarul incremental, rulînd ispell pe texte (cît se poate de) corecte. După o fază plictisitoare în care mă va întreba mai toate cuvintele, va învăța vocabularul meu de bază și va deveni eficace.

Construcția dicționarelor este în plină desfășurare, deși ambele (cel cu diacritice și cel fără) au cîte 40 de mii de cuvinte la ora actuală. Principala mea sursă de vocabular este ediția pe Internet a ziarelor ``România Literară'' și ``Dilema'', plus, mai puțin, textele pe care le scriu eu însumi.

Analiza statistică

După ce am strîns cîteva mii de cuvinte, am folosit celelalte programe din pachetul cu care vine ispell pentru a face o analiză statistică a dicționarelor. Analiza este utilă pentru că în fișierele de configurare îi pot descrie lui ispell simple reguli de derivare cu prefixe și sufixe, pe care apoi el le folosește pentru a reduce mărimea dicționarelor, memorînd o singură dată rădăcinile comune. Pachetul care conține programul ispell oferă pentru acest scop programele findaffix, care analizează exhaustiv un dicționar, generînd informații despre potențialele derivări, și tryaffix, care evaluează economia care se poate obține folosind un anumit affix.

Compresia prin prefixe și sufixe

Cum se folosesc afixele pentru a reduce mărimea dicționarului? Pentru fiecare afix se definește (manual) cîte o prescurtare de o literă. De exemplu, pentru prefixul ``re-'' am alocat litera E. Atunci, în loc ca în dicționar să apară cuvintele ``educare'' și ``reeducare, va apărea doar o înregistrare de forma ``educare/E''. Practic am înlocuit un cuvînt întreg cu două litere (/ și E).

Pachetul ispell vine împreună cu un alt program numit munchlist, care, dîndu-i-se un dicționar și o listă de afixe, comprimă dicționarul la o reprezentare minimă. Rezultatul este foarte eficace; chiar cu fișierele relativ primitive de afixe pe care le-am făcut am reușit să reduc mărimea dicționarelor la aproximativ 50-55%.

Restul fișierelor de configurare a afixelor este ocupat cu regulile prin care afixele se atașează cuvintelor. ispell știe să opereze mici modificări asupra rădăcinilor; asta crește enorm utilitatea afixelor. Iată un fragment tipic dintr-o descriere a unui ``flag'' din rom.signs.aff:

suffixes

flag *I:
    U           >       LUI             # bou  > boului
    [^UA]       >       ULUI            # porc > porcului
    [GC] A      >       -A,II           # vaca > vacii
    [^CG] A     >       -A,EI           # baba > babei

Traducere: indicatorul I va funcționa în 4 feluri, depinzînd de forma rădăcinii cuvîntului la care se aplică:

  1. Dacă rădăcina se termină în ``U'', atunci indicatorul I va cauza concatenarea șirului ``lui''. De exemplu, în dicționar cuvîntul ``bou/I'' va genera simultan ``bou'' și ``boului'';

  2. Dacă rădăcina nu (negația este indicată de semnul ^) se termină în ``U'' sau ``A'', atunci adaug șirul ``ului'';

  3. Dacă rădăcina se termină în ``ga'' sau ``ca'', atunci regula va șterge ``A''-ul de la coadă și va concatena un ``ii'';

  4. În fine, dacă rădăcina se termină în ``a'', dar nu în ``ca'' sau ``ga'', atunci șterg ``A''-ul și adaug ``ei''.

Observați că aceste reguli nu sunt folosite pentru a genera noi cuvinte din cele existente, ci doar pentru a comprima un set de cuvinte dat, deci nu pot greși dacă avem de-a face cu o excepție (de exemplu cuvîntul ``poarta'', care după regulile de mai sus ar deveni ``poartei''). Singura consecință este că ambele cuvinte vor apărea în dicționar, pentru că nu se poate aplica compresia (voi avea și ``poarta'' și ``porții'' în dicționar).

Interfața cu emacs

ispell este prin construcție un program interactiv: analizează textul, și la prima eroare scrie pe ecran porțiunea de text suspicioasă, indicînd posibile corecturi, și așteptînd ca utilizatorul să ia măsuri.

Dl. Kuenning însă a fost suficient de înțelept pentru a înzestra ispell cu un mod de funcționare ``batch'': ne-interactiv. Dacă ispell este pornit cu modificatorul -a atunci nu mai scrie nimic pe ecran și nu mai citește tastatura, ci scrie și citește de la intrarea și ieșirea sa standard. Practic de la intrare ispell citește un cuvînt, iar la ieșire trimite șiruri de caractere care descriu părerea lui despre acel cuvînt (dacă e corect, dacă nu ce variante sunt, etc). De exemplu, (de data asta în engleză):

$ echo helo | ispell -a 
@(#) International Ispell Version 3.1.20 10/10/95
& helo 9 0: halo, held, hell, hello, helm, help, hero, he lo, he-lo
$

Convențiile prin care ispell răspunde sunt ușor complicate; pe scurt, în linia de mai sus a spus că nu crede că acel cuvînt e corect, (prin semnul &), și a indicat apoi 9 posibilități corecte, separate prin virgule.

Aceasta este o altă instanță a faimoasei separații dintre politică și mecanism: mecanismul de corectare nu implementează și politica de interacțiune.

Asta permite interfațarea altor programe cu ispell. De exemplu editorul de texte Emacs știe să converseze cu ispell, bagîndu-i pe gît (intrarea standard) cuvintele dintr-un buffer unul cîte unul. În funcție de răspuns discută el însuși cu utilizatorul, pentru a înlocui cuvintele greșite.

Fișierul de stil pentru LATEX

Pentru că îmi tehnoredactez fișierele în LATEX, era natural să caut o metodă de a folosi convenția de scriere cu apostroafe direct în LATEX. Nu a fost prea dificil, pentru că am dat peste un fișier de stil construit de Alexandru și Dan Corlan pe care mi l-am însușit, și în care am operat niște minuscule modificări. Fișierul pune la-ndemînă un nou ``environment'', numit romana, în interiorul căruia semnul apostrof și respectiv ghilimelele produc diacritice. Practic pot scrie acum texte astfel:

\documentstyle[romana-]{article}
\begin{document}
'In aceast'a parte apostroful
nu are nici o influen't'a.
\begin{romana}
Dar 'in aceast'a parte se 
transform'a 'in diacritice.
\end{romana}
\end{document}

și voi genera următorul document:

'In aceast'a parte apostroful nu are nici o influen't'a.

Dar în această parte se transformă în diacritice.

Fișierul de stil ar putea beneficia de mici îmbunătățiri, pentru că anumite combinații se comportă ciudat (de exemplu nu se mai pot scrie acolade după ghilimele), dar este mai adesea util decît dăunător.

Interfața corectorului de limba română cu utilizatorul

Instalare

Pentru a putea folosi corect, trebuie întîi sa aveți pachetul cu ispell. Necesare sunt fișierele buildhash și ispell; de celelalte vă puteți lipsi. Dacă aveți un sistem Unix, le puteți lua de la ftp://prep.ai.mit.edu/pub/gnu.

Pagina lui ispell este la http://fmg-www.cs.ucla.edu/fmg-members/geoff/ispell.html; acolo mai puteți afla o grămadă de lucruri utile despre acest program.

Cel care instalează pachetul de fișiere are o misiune relativ simplă: trebuie să decidă locul unde fișierele se vor plasa și cum ajung utilizatorii la ele. Există două variante de bază:

  1. Instalarea este făcută pentru întregul sistem (de administrator, în așa fel încît toți utilizatorii să poată beneficia);
  2. Un utilizator fără privilegii își instalează pachetul pentru uzul personal în contul lui.

Cel care instalează va trebui să citească Makefile-ul și să modifice cîteva variabile. Valorile care ar fi interesante sunt ROMSPELLBASE și LATEXDIR, și indică unde se vor plasa dicționarele, respectiv fișierul de stil pentru LATEX.

Pentru ca utilizatorii să poată accesa fișierul de stil, el trebuie să fie într-un loc în care LATEXsă-l poată căuta. Administratorul îl poate pune acolo unde sistemul local are toate celelalte fișiere de stil. Un utilizator obișnuit îl poate pune oriunde, și apoi poate indica lui LATEXacel loc folosind variabila TEXINPUT. De exemplu, eu mi-am pus fișierul romana-.sty în $HOME/data/tex și am pus variabila astfel:

export TEXINPUTS=".:$HOME/data/tex:"

În plus, pentru ca Emacs să poată invoca ispell pentru a corecta texte românești, fișierul for-emacs, care este generat automat, ar trebui executat de Emacs-ul tuturor utilizatorilor care scriu în română. Iarăși, există două variante: fiecare utilizator poate concatena acest fișier la propriul fișier de inițializare .emacs, sau acest fișier poate fi pus de administrator într-un fișier global de inițializare al lui Emacs (de exemplu site-start.el).

Utilizare

După ce administratorul a făcut treburile murdare de instalare, folosirea corectorului ar trebui să fie banală. Datorită unui mic script, tot ce trebuie făcut pentru a corecta un text este de a tasta:

corect fisier-de-corectat

Simplu ca bună ziua!

(Dacă fișierul este scris în română cu diacritice, tastați corect -s fisier.)

Pentru a corecta din Emacs folosiți comenzile Emacs:

M-x ispell-change-dictionary

La întrebarea care urmează, răspundeți romana, respectiv rom-diacritice, după cum doriți. Apoi tastați:

M-x ispell-buffer



Footnotes

... unelte1
Prin antiteză cu programele care fac ceva util ele însele: aplicațiile.
... cm2
grosime.
...ispell3
Ca dovadă că principiile enumerate mai sus au fost bune, inițial alesem semnul \ pentru diacritic; schimbarea la apostrof a fost însă foarte simplă, și a fost cauzată de dorința de a inter-opera cu LATEX pentru care semnul \ are o semnificație specială.