------------------------------------------ -- EZ A SZÁM CSAK TEXT FORMÁBAN LÉTEZIK -- ------------------------------------------ From contacts@phoenix.Princeton.EDU Fri Feb 23 02:02:54 1990 Return-Path: Date: Fri, 23 Feb 90 02:55:26 -0500 Subject: TIPP# 19 From RAVENserver Status: RO ============================ TIPP from RAVENserver ============================ >From toth@astrovax Thu Feb 22 21:28:30 1990 Date: Thu, 22 Feb 90 21:27:34 est From: toth@astrovax (Gabor Toth) To: contacts@phoenix Subject: send TIPP ############################################################################## ## A levelet a 'Kedves Tipp-olvaso1'-na1l kezdjed olvasni, a 3-21. sorok ## ## rendeltete1se az ott olvasottakbo1l fog kideru2lni. ## ## ## ## -- itt va1gd el ---- itt va1gd el ---- itt va1gd el ---- itt va1gd el -- ## ## ## ## Ha vi -t hasznalsz editorke1nt, akkor a mail a1ltal bei1rt felesleges ## ## sorokat a ko2vetkezo3 mo1don to2ro2lheted ki: ## ## ## ## sze1p lassan nyomogasd a 'd' betu3t, ami1g a ke1pernyo3 legfelso3 ## ## sora lesz a fenti "---- itt va1gd el ---- itt va1gd el ----" sor. ## ## ## ## A ke1sz file kimente1se1hez e1s az editorbo1l valo1 kile1pe1shez: ## ## nyomd le a Shift billentyu3t, e1s azt lenyomva tartva, ke1tszer 'z'-t ## ## ## ## majd a leve1l kicsomagola1sa1hoz az sh etex.mail parancsot i1rd be. ## ## ^^^^^^^^^^^^ ## echo etex.bevezeto 1>&2 cat >etex.bevezeto <<'End_of_bundled_file etex.bevezeto' Kedves TIPP-olvaso1! Bizonya1ra olvastad Kornai Andra1s levele1t, aki az e1kezetek jelo2le1se1nek fontossa1ga1ra hi1vta fel a figyelmet. Ba1r i1zle1s ke1rde1se, hogy saja1t leveleidben hogyan jelo2lo2d az e1kezeteket (ha egya1ltala1n van kedved jelo2lni), de vannak esetek, amikor a magyar betu3k haszna1lata elkeru2lhetetlen. Valo1szi1nu3leg nagyon sokan vagyunk olyanok, akik ido3ro3l ido3re magyar nyelvu3 leveleket is i1runk. Ezeket a to2bbse1g TeX-ben ke1szi1ti, amellyel gyo2nyo2ru3 magyar e1kezeteket lehet nyomtatni. Ha esetleg eddig me1g nem pro1ba1lta1l magyar nyelvu3 szo2veget nyomtatni, most itt az ideje hogy kipro1ba1ld (de csak ezen leve1l vegigolvasa1sa uta1n). Mindo2ssze ke1t "apro1" proble1ma van ezzel a megolda1ssal: - az e1kezeteket a TeX-es forma1ban bei1rni a szo2vegbe nem ce1lszeru3, mert egy betu3 helyett legala1bb ha1rom karaktert kell leu2tni, es ra1ada1sul ez a szo2veg megleheto3sen olvashatatlan is; - a TeX azokat a magyar szavakat, amelyek e1kezetes karaktert tartalmaznak, nem va1lasztja el, a to2bbit pedig az angol elva1laszta1si szaba1lyok szerint. Az elso3 proble1ma igen ko2nnyen megoldhato1, hiszen mind a sza1mozott jelo2le1s, mind a Babai-fe1le jelo2le1s igen egyszeru3en a1talaki1thato1 a TeX a1ltal elva1rt a1komba1komokra. Az elva1laszta1s azonban sokkal fogo1sabb ke1rde1s: a TeX-nek egy olyan szo2veget kell a1tadni, amely ma1r tartalmazza a lehetse1ges magyar elva1laszta1si pontokat. Az ETEX program mindke1t proble1ma1t megoldja. Az a1ltalad kedvelt e1kezet-jelo2le1si mo1dot a1talaki1tja a TeX jelo2le1seire e1s a helyes magyar elva1laszta1st is biztosi1tja a szo2vegben. Terme1szetesen a magyar maga1nhangzo1kat u1gy jelo2lo2d, ahogy kedved tartja, ez a program mu3ko2de1se1t nem befolya1solja. A program haszna1lata igen egyszeru3. Ha az eredeti szo2veg egy "szo2veg.hun" file-ban van, akkor az "etex szo2veg" utasi1ta1s egy szo2veg.tex file-t ke1szi1t, amit a TeX ma1r helyesen fog elva1lasztani. Az ETEX program nem ingyenes software. Megterveze1se, megvalo1si1ta1sa, ku2lo2nbo2zo3 opera1cio1s rendszerekre valo1 a1tu2ltete1se, tesztele1se, a lei1ra1s elke1szi1te1se mind-mind munkaige1nyes folyamatok voltak. Mindezt igen gondosan kellett ve1geznem, mert mindenki sza1ma1ra hibamentesse1 e1s ke1nyelmesse1 ki1va1ntam tenni a program haszna1lata1t. Reme1lem, hogy ez sikeru2lt. A programot most (ebben a leve1lben) elku2ldtem neked, teha1t kipro1ba1lhatod e1s a saja1t bela1ta1sod szerint do2nthetsz arro1l, hogy szu2kse1ged van-e ra1, vagy nincs e1s ha igen, megengedheted-e magadnak, hogy eze1rt ku2ldj nekem 13 (tizenha1rom) dolla1rt. Eze1rt az o2sszege1rt... ... a program egy pe1lda1nya1t korla1tlanul haszna1lhatod; ... egy e1vig ba1rmilyen ke1rdesedre a mail-en keresztu2l va1laszolok; ... ha egy e1ven belu2l meggondolod magad, a teljes o2sszeget visszaku2ldo2m. Ha u1gy gondolod, inka1bb magad megi1rod a programot, gondolj arra is, hogy egy a1tlagos o1rabe1r 10 dolla1r ko2ru2l van. Ha u1gy gondolod, hogy leginka1bb "csak u1gy" szeretne1d megtartani a programot -- nos, ugye erre nem gondolsz? Mindo2ssze annyit ke1rek, hogy aka1rhogyan is do2ntesz, mindenke1ppen i1rd meg nekem. Hogy megko2nnyi1tsem a va1laszola1st, i1me egy kis ETEX-KERDOIV (amelyet egy ugyanilyen nevu3 file-ban is megtala1lhatsz, ha u2zembe helyezed a programot): (1) Mail-ci1mem, nevem, va1ros, a1llam, orsza1g. (2) (A) Sikeresen kipro1ba1ltam a programot. (2) Nem tudom kipro1ba1lni, mert... (B) Nem Unix opera1cio1s rendszeren dolgozom (hanem...) (C) Az u2zembe helyeze1s nekem tu1l bonyolult (segi1ts u2zembe helyezni) (D) A leve1lbe beleto2ro2ltem (ku2ldj egy ma1sik levelet) (3) (A) Kipro1baltam es u1gy gondolom, szu2kse1gem van ra1. (3) Kipro1ba1ltam, de nincs ra1 szu2kse1gem, mert (B) Nem tudok magyarul, vagy el akarok felejteni (C) Tizenha1rom dolla1re1rt inka1bb megi1rom magam (D) Csak {Ha a 3. ke1rde1sre a va1laszod B-C-D, akkor ke1rlek, hogy ezt a levelemet e1s a belo3le ke1szi1tett file-okat to2ro2ld le. Ko2szo2no2m.} (4) (A) A 13 (tizenha1rom) dolla1rt a ci1medre feladtam. (4) A 13 (tizenha1rom) dolla1rt me1g nem ku2ldtem el, mert (B) Me1g gondolkodom (C) Nem az USA-ban vagyok e1s proble1ma1t okoz az elku2lde1se (tala1ljuk ki egyu2tt a megolda1st) (C) U1gy e1rzem, ennyit nekem nem e1r meg, csak X dolla1rt (D) Pillanatnyilag nincs ennyi ne1lku2lo2zheto3 pe1nzem, de amint egyenesbe jo2vo2k (hata1rozottan egy e1ven belu2l) elku2ldo2m Elo3re is nagyon ko2szo2no2m, hogy ha ma1sra nincs ido3d, legala1bb ro2viden a betu3kkel jelzed a va1laszod, pe1lda1ul 1. toth@astrovax.princeton.edu (To1th Ga1bor, Princeton, NJ, USA) 2. A. 3. A. 4. A. ---- A va1laszt a TOTH@ASTROVAX.PRINCETON.EDU ci1mre ku2ldd el, ---- e1s ne a TIPP-nek. ---- Ko2szo2no2m. ------------------------------------------------------------------------ A program igen egyszeru3en, egyetlen paranccsal u2zembe helyezheto3, ezt a levelet ugyanis u1gy szerkesztettem, hogy minden szu2kse1geset tartalmaz, es egyben ke1pes o2nmaga automatikus "kicsomagola1sa1ra". Mivel to2bbse1ge1ben vannak a Unix rendszereket haszna1lo1k, ez a leve1l elso3dlegesen az o3 ke1nyelmu2ket szolga1lja. Ha te ma1s opera1cio1s rendszert haszna1lsz, ezt le1gyszi1ves jelezd az ETEX-KERDOIVen. A program VMS e1s DOS va1ltozatban is le1tezik, de valo1szi1nu3leg me1g ezekto3l elte1ro3 opera1cio1s rendszerek esete1n is tudok tala1lni sza1modra megolda1st. Amennyiben Unix rendszeren dolgozol, akkor az ala1bb leirt utasi1ta1sokkal 'kibonthatod' levelet, azaz elindi1thatod a leve1l eleje1re i1rt UNIX programot. Ez elhelyezi a directoryban a leve1lben le1vo3 ETEX programot e1s a hozza1tartoxo1 file-okat, a C nyelvu3 programot lefordi1tja, majd a lefordi1tott program segi1tse1ge1vel a magyar nyelvu3 lei1ra1st (etexleiras.hun), amely az e1kezeteket a sza1mozott jelo2le1ssel tartalmazza a1talaki1tja TeX forma1tumra (etexleiras.tex), megjelo2lve benne a magyar elva1laszta1si helyeket. Ezuta1n TeX-el ro2gto2n le is fordi1tja az eredme1nyt, e1s egy kinyomtathato1 file-t hoz le1tre (etexleiras.dvi), melyet a na1latok haszna1latos utasi1ta1s segi1tse1ge1vel nyomtathatsz ki. A leve1l kibonta1sa egyre1szt az etexleiras.hun pe1lda1ja1n bemutatja az ETEX mu3ko2de1se1t, e1s leheto3ve1 teszi sza1modra az ETEX kipro1ba1la1sa1t, ma1sre1szt a lei1ra1st sokkal e1lvezetesebb lesz nyomtata1sban, valo1di e1kezetekkel olvasni, mint ezt a szo2veget a ke1pernyo3n. --- Teha1t javaslom, hogy most ke1szi1tsd el a lei1ra1st, e1s azt olvasd --- tova1bb. Elo3szo2r is mentsd ki ezt a levelet a mail-bo3l: w etex.mail --- a file-t helyezd el egy u2res directory-ba mkdir etex mv etex.mail etex --- egy editorral to2ro2ld ki a sorokat a level eleje1ro3l, --- ege1szen az "---- itt va1gd el ---- itt va1gd el ----" sorig. --- Ha nem vagy ja1ratos semilyen editor haszna1lata1ban, akkor haszna1ld --- a vi editort, e1s kovesd az etex.mail eleje1n le1vo3 utasi1ta1sokat, --- azaz sze1p lassan nyomogasd a 'd' billentyu3t, ami1g a mail a1ltal bei1rt --- felesleges sorok el nem fogynak. Az editor meghi1va1sa: vi etex.mail --- Miuta1n az editorbo1l kile1pte1l, i1rd be, hogy sh etex.mail Sok sikert, To1th Ga1bor E-mail: toth@astrovax.princeton.edu Me1g egyszer szeretne1lek megke1rni, hogy NE a TIPP ci1me1re va1laszolj, hanem erre a ci1mre. Ko2szo2no2m. A csekket az ala1bbi ci1mre ku2ldd: Ga1bor To1th Peyton Hall Princeton, NJ, 08544 USA A nevemet a csekkre Ga1bor To1th sorrendben i1rd ra1, e1kezetekkel egyu2tt. ########################################################## ## ## ## A LEVEL KOZVETLEN OLVASASRA IRT RESZE ITT VEGETERT ## ## ## ## Ha Unixon dolgozol, akkor a fenti utasita1sok ## ## segi1tse1ge1vel 'bonthatod ki' a levelet. ## ## ## ########################################################## End_of_bundled_file etex.bevezeto echo etex.c 1>&2 cat >etex.c <<'End_of_bundled_file etex.c' /* ** Code derived from program etexpas */ extern void exit(); /* ** Definitions for i/o */ # include typedef struct { FILE *fp; unsigned short eoln:1, eof:1, out:1, init:1, :12; char buf; } text; text input = { stdin, 0, 0 }; text output = { stdout, 0, 0 }; # define Fread(x, f) fread((char *)&x, sizeof(x), 1, f) # define Get(f) Fread((f).buf, (f).fp) # define Getx(f) (f).init = 1, (f).eoln = (((f).buf = fgetc((f).fp)) == '\n') ? (((f).buf = ' '), 1) : 0 # define Getchr(f) (f).buf, Getx(f) static FILE *Tmpfil; static long Tmplng; static double Tmpdbl; # define Fscan(f) (f).init ? ungetc((f).buf, (f).fp) : 0, Tmpfil = (f).fp # define Scan(p, a) Scanck(fscanf(Tmpfil, p, a)) void Scanck(); void Getl(); # define Eoln(f) ((f).eoln ? true : false) # define Eof(f) ((((f).init == 0) ? (Get(f)) : 0, ((f).eof ? 1 : feof((f).fp))) ? true : false) # define Fwrite(x, f) fwrite((char *)&x, sizeof(x), 1, f) # define Put(f) Fwrite((f).buf, (f).fp) # define Putx(f) (f).eoln = ((f).buf == '\n'), (void)fputc((f).buf, (f).fp) # define Putchr(c, f) (f).buf = (c), Putx(f) # define Putl(f, v) (f).eoln = v # define Finish(f) ((f).out && !(f).eoln) ? (Putchr('\n', f), 0) : 0, !fseek((f).fp, 0L, 0) extern int fseek(); # ifdef READONLY static char Rmode[] = "r"; # else static char Rmode[] = "r+"; # endif # define Reset(f, n, l) (f).init = (f).init ? !fseek((f).fp, 0L, 0) : (((f).fp = Fopen(n, l, Rmode)), 1), (f).eof = (f).out = 0, Get(f) # define Resetx(f, n, l) (f).init = (f).init ? (Finish(f)) : (((f).fp = Fopen(n, l, Rmode)), 1), (f).eof = (f).out = 0, Getx(f) # ifdef WRITEONLY static char Wmode[] = "w"; # else static char Wmode[] = "w+"; # endif # define Rewrite(f, n, l) (f).init = (f).init ? !fseek((f).fp, 0L, 0) : (((f).fp = Fopen(n, l, Wmode)), 1), (f).out = (f).eof = 1 # define Rewritex(f, n, l) (f).init = (f).init ? (Finish(f)) : (((f).fp = Fopen(n, l, Wmode)), 1), (f).out = (f).eof = (f).eoln = 1 FILE *Fopen(); # ifndef MAXFILENAME # define MAXFILENAME 128 # endif /* ** Definitions for case-statements ** and for non-local gotos */ # define Line __LINE__ void Caseerror(); /* ** Definitions for standard types */ typedef char boolean; # define false (boolean)0 # define true (boolean)1 /*char *Bools[];*/ typedef int integer; /* ** Definitions for set-operations */ # define Claimset() (void)Currset(0, (setptr)0) # define Newset() Currset(1, (setptr)0) # define Saveset(s) Currset(2, s) # define setbits 15 typedef unsigned short setword; typedef setword * setptr; boolean Member(), Le(), Ge(), Eq(), Ne(); setptr Union(), Diff(); setptr Insmem(), Mksubr(); setptr Currset(), Inter(); static setptr Tmpset; setptr Conset[]; void Setncpy(); # ifndef SETALIGN # define SETALIGN(x) Alignset(x) struct Set { unsigned short S[15+1]; } *Alignset(); # endif # ifndef STRALIGN # define STRALIGN(x) Alignstr(x) struct String { char A[127+1]; } *Alignstr(); # endif extern char *strncpy(); /* ** Definitions for argv-operations */ int argc; char **argv; void Argvgt(n, cp, l) int n; register int l; register char *cp; { register char *sp; for (sp = argv[n]; l > 0 && *sp; l--) *cp++ = *sp++; while (l-- > 0) *cp++ = ' '; } /* ** Start of program definitions */ # define languagec true # define maxstr 256 # define maxnmgh 100 # define maxekesmgh 18 typedef struct { char A[maxstr - 1 + 1]; } C50_static; typedef struct S76 { integer length; C50_static body; } string; typedef struct { setword S[9]; } carset; typedef struct { integer A[maxnmgh - 1 + 1]; } T62; typedef struct { string A[maxekesmgh - 1 + 1]; } T63; string tmp1str, tmp2str, tmp3str; text filvarin, filvarout, filvarini; string filename, filenamein, filenameout, strhun, strtex; string sor; string kotojel; carset betu, hatar, mgh, msh, ymsh, zmsh, jomsh, C51_switch, ekezet; char car, valasszel, nevalasszel; boolean on, sorvege, okword; integer i, worde, wordv, n, nmgh, nekesmgh; T62 me, mv; T63 texmgh, hunmgh; string vesszo, pontok, backslash, apostrophe, quotemark, szokoz; void limstr(num, min, max) integer *num; integer min, max; { if ((*num) > max) (*num) = max; else if ((*num) < min) (*num) = min; } void nulstr(s) string *s; { s->length = 0; } void chastr(s, ch, len) string *s; char ch; integer len; { register integer i; limstr(&len, 1, maxstr); { register struct S76 *W1 = &(*s); W1->body.A[1 - 1] = ch; { integer B2 = 2, B3 = len; if (B2 <= B3) for (i = B2; ; i++) { W1->body.A[i - 1] = ' '; if (i == B3) break; } } W1->length = len; } } void stastr(s, cc, len, nspace) string *s; C50_static cc; integer len, nspace; { register integer i; limstr(&len, 1, maxstr); limstr(&nspace, 0, maxstr - len); { register struct S76 *W4 = &(*s); W4->body = cc; { integer B5 = 1, B6 = nspace; if (B5 <= B6) for (i = B5; ; i++) { W4->body.A[len + i - 1] = ' '; if (i == B6) break; } } W4->length = len + nspace; } } void addstr(s, left, right) string *s; string left, right; { register integer i; { register struct S76 *W7 = &(*s); W7->length = left.length + right.length; limstr(&s->length, 0, maxstr); W7->body = left.body; { integer B8 = left.length + 1, B9 = W7->length; if (B8 <= B9) for (i = B8; ; i++) { W7->body.A[i - 1] = right.body.A[i - left.length - 1]; if (i == B9) break; } } } } void substr(sub, s, start, num) string *sub; string s; integer start, num; { register integer i; { register struct S76 *W10 = &s; if ((start > 0) && (start <= W10->length)) { limstr(&start, 1, W10->length); limstr(&num, 0, W10->length - start + 1); { integer B11 = 1, B12 = num; if (B11 <= B12) for (i = B11; ; i++) { sub->body.A[i - 1] = W10->body.A[start + i - 1 - 1]; if (i == B12) break; } } sub->length = num; } else nulstr(&(*sub)); } } integer lenstr(s) string *s; { register integer R64; R64 = s->length; return R64; } integer posstr(sub, s) string *sub, *s; { register integer R65; integer i, j; boolean found, equal; { register struct S76 *W13 = &(*s); i = 0; found = false; while ((i <= W13->length - sub->length) && !found) { i = i + 1; j = 0; equal = true; while ((j < sub->length) && equal) { j = j + 1; equal = (boolean)(sub->body.A[j - 1] == W13->body.A[i + j - 1 - 1]); } found = equal; } if (found) R65 = i; else R65 = 0; } return R65; } char indstr(s, i) string *s; integer i; { register char R66; { register struct S76 *W14 = &(*s); if ((i > 0) && (i <= W14->length)) R66 = W14->body.A[i - 1]; else R66 = 0; } return R66; } boolean equstr(s, t) string *s, *t; { register boolean R67; if (s->length != t->length) R67 = false; else R67 = (boolean)(posstr(&(*s), &(*t)) == 1); return R67; } void writefstr(f, s) text *f; string *s; { register integer i; { register struct S76 *W15 = &(*s); { integer B16 = 1, B17 = W15->length; if (B16 <= B17) for (i = B16; ; i++) { Putchr(W15->body.A[i - 1], (*f)); if (i == B17) break; } } } } void readcstr(s) string *s; { register integer i; char dummy[maxstr+1]; { register struct S76 *W18 = &(*s); gets(dummy); W18->length = strlen(dummy); { integer B19 = 1, B20 = W18->length; if (B19 <= B20) for (i = B19; ; i++) { W18->body.A[i - 1] = dummy[i - 1]; if (i == B20) break; } } } } void readfstr(f, s) text *f; string *s; { integer i; { register struct S76 *W21 = &(*s); i = 0; while (!Eoln((*f)) && !Eof((*f))) { i = i + 1; W21->body.A[i - 1] = Getchr((*f)); } if (!Eof((*f))) Getl(&(*f)); W21->length = i; } } void readstr(s) string *s; { if (languagec) readcstr(&(*s)); else readfstr(&input, &(*s)); } void setlenstr(s, len) string *s; integer len; { register integer i; limstr(&len, 0, maxstr); { register struct S76 *W22 = &(*s); { integer B23 = W22->length + 1, B24 = len; if (B23 <= B24) for (i = B23; ; i++) { W22->body.A[i - 1] = ' '; if (i == B24) break; } } W22->length = len; } } void delstr(strng, posit, lengt) string *strng; integer posit, lengt; { substr(&tmp1str, (*strng), 1, posit - 1); substr(&tmp2str, (*strng), posit + lengt, lenstr(&(*strng)) - posit - lengt + 1); addstr(&(*strng), tmp1str, tmp2str); } void insstr(strng, objec, posit) string *strng; string objec; integer posit; { substr(&tmp1str, (*strng), 1, posit - 1); addstr(&tmp2str, tmp1str, objec); substr(&tmp3str, (*strng), posit, lenstr(&(*strng)) - posit + 1); addstr(&(*strng), tmp2str, tmp3str); } void writestr(s) string *s; { writefstr(&output, &(*s)); } void writelnstr(s) string *s; { writefstr(&output, &(*s)); Putchr('\n', output); } void writelnfstr(f, s) text *f; string *s; { writefstr(&(*f), &(*s)); Putchr('\n', (*f)); } integer posfromstr(s, sub, from) string *s, *sub; integer from; { register integer R70; string stail; integer p; limstr(&from, 1, lenstr(&(*s))); substr(&stail, (*s), from, lenstr(&(*s)) - from + 1); p = posstr(&(*sub), &stail); if (p > 0) p = p + from - 1; R70 = p; return R70; } void inicial() { Resetx(filvarini, "etex.ini", -1); stastr(&kotojel, *((C50_static *)STRALIGN("\\-")), 2, 0); chastr(&backslash, '/', 1); chastr(&apostrophe, 39, 1); chastr("emark, 34, 1); addstr(&vesszo, backslash, apostrophe); addstr(&pontok, backslash, quotemark); valasszel = Getchr(filvarini),Getl(&filvarini); nevalasszel = Getchr(filvarini),Getl(&filvarini); Fscan(filvarini), Scan("%ld", &Tmplng), nekesmgh = Tmplng, Getx(filvarini),Getl(&filvarini); { integer B25 = 1, B26 = nekesmgh; if (B25 <= B26) for (i = B25; ; i++) { readfstr(&filvarini, &texmgh.A[i - 1]); readfstr(&filvarini, &hunmgh.A[i - 1]); if (i == B26) break; } } Setncpy(ekezet.S, (Tmpset = Newset(), (void)Insmem((unsigned)(34), Tmpset), (void)Insmem((unsigned)(39), Tmpset), Tmpset), sizeof(ekezet.S)); Setncpy(C51_switch.S, (Tmpset = Newset(), (void)Insmem((unsigned)('$'), Tmpset), (void)Insmem((unsigned)(valasszel), Tmpset), (void)Insmem((unsigned)(nevalasszel), Tmpset), Tmpset), sizeof(C51_switch.S)); Setncpy(hatar.S, Union(Union(Conset[0], ekezet.S), C51_switch.S), sizeof(hatar.S)); Claimset(); Setncpy(mgh.S, Conset[1], sizeof(mgh.S)); Setncpy(msh.S, Conset[2], sizeof(msh.S)); Setncpy(betu.S, Union(Union(mgh.S, msh.S), Conset[3]), sizeof(betu.S)); Claimset(); Setncpy(ymsh.S, Conset[4], sizeof(ymsh.S)); Setncpy(zmsh.S, Conset[5], sizeof(zmsh.S)); Setncpy(jomsh.S, Diff(msh.S, Conset[6]), sizeof(jomsh.S)); Claimset(); } void hunmghtotexmgh() { integer p; register integer i; string strhunmgh; { integer B27 = 1, B28 = nekesmgh; if (B27 <= B28) for (i = B27; ; i++) { strhunmgh = hunmgh.A[i - 1]; p = posstr(&strhunmgh, &sor); while (p > 0) { delstr(&sor, p, lenstr(&strhunmgh)); insstr(&sor, texmgh.A[i - 1], p); p = posfromstr(&sor, &strhunmgh, p + lenstr(&texmgh.A[i - 1])); } if (i == B28) break; } } } char next() { register char R71; i = i + 1; sorvege = (boolean)(i > lenstr(&sor)); if (sorvege) car = ' '; else car = indstr(&sor, i); if (Member((unsigned)(car), C51_switch.S)) if (car == '$') { if (i == 1) on = (boolean)(!on); else if (!(Member((unsigned)(indstr(&sor, i - 1)), Conset[7]))) on = (boolean)(!on); } else if (car == valasszel) { if (!on) { delstr(&sor, i, 1); i = i - 1; on = true; } } else if (car == nevalasszel) { if (on) { delstr(&sor, i, 1); i = i - 1; on = false; } } R71 = car; return R71; } boolean prev(x) carset x; { register boolean R72; i = i - 1; car = indstr(&sor, i); R72 = (boolean)(Member((unsigned)(car), x.S)); return R72; } void szet(i) integer i; { if (on) if ((i - worde - (mv.A[n - 1 - 1] - me.A[n - 1 - 1]) > 0) && (wordv - i - (mv.A[n - 1] - me.A[n - 1]) > 2)) { insstr(&sor, kotojel, i + 1); wordv = wordv + 2; } } void elvalaszt(n) integer n; { i = me.A[n - 1]; if (prev(*((carset *)SETALIGN(Union(mgh.S, Conset[8]))))) szet(i); else if (Member((unsigned)(car), jomsh.S)) szet(i - 1); else switch ((int)(car)) { case 'y': case 'Y': if (prev(ymsh)) if (!prev(*((carset *)SETALIGN((Tmpset = Newset(), (void)Insmem((unsigned)(car), Tmpset), Tmpset))))) szet(i); break ; case 'z': case 'Z': if (prev(zmsh)) { if (!prev(*((carset *)SETALIGN((Tmpset = Newset(), (void)Insmem((unsigned)(car), Tmpset), Tmpset))))) szet(i); } else szet(i); break ; case 's': case 'S': if (prev(*((carset *)SETALIGN(Conset[9])))) { if (!prev(*((carset *)SETALIGN((Tmpset = Newset(), (void)Insmem((unsigned)(car), Tmpset), Tmpset))))) { if (!(Member((unsigned)(car), Conset[10]))) szet(i); else if (!prev(*((carset *)SETALIGN((Tmpset = Newset(), (void)Insmem((unsigned)(car), Tmpset), Tmpset))))) szet(i); } } else if (Member((unsigned)(car), Conset[11])) { if (!prev(*((carset *)SETALIGN((Tmpset = Newset(), (void)Insmem((unsigned)(car), Tmpset), Tmpset))))) szet(i); } else szet(i); break ; case 'h': case 'H': if (prev(*((carset *)SETALIGN(Conset[12])))) szet(i - 1); else szet(i); break ; default: Caseerror(Line); } Claimset(); } boolean ekmgh() { register boolean R73; R73 = false; if (Member((unsigned)(next()), ekezet.S)) { if (Member((unsigned)(next()), mgh.S)) R73 = true; else if (car == ' ') { if (Member((unsigned)(next()), mgh.S)) R73 = true; } else if (car == '{') if (next() == '\\') if (next() == 'i') if (next() == '}') { car = indstr(&sor, i - 1); R73 = true; } } else if (Member((unsigned)(car), Conset[13])) if (next() == ' ') if (Member((unsigned)(next()), mgh.S)) R73 = true; return R73; } boolean letter() { register boolean R74; R74 = (boolean)(Member((unsigned)(car), betu.S)); okword = (boolean)(Member((unsigned)(car), Union(betu.S, hatar.S))); Claimset(); if (Member((unsigned)(car), Union(mgh.S, Conset[14]))) { nmgh = nmgh + 1; if (Member((unsigned)(car), mgh.S)) { me.A[nmgh - 1] = i; mv.A[nmgh - 1] = i; } else { me.A[nmgh - 1] = i; okword = ekmgh(); R74 = okword; mv.A[nmgh - 1] = i; } } Claimset(); return R74; } boolean doword() { register boolean R75; nmgh = 0; worde = i; while (letter()) car = next(); wordv = i; R75 = okword; return R75; } void line() { boolean okhatar; car = ' '; wordv = 0; sorvege = false; do { i = wordv; car = indstr(&sor, i); if (i == 0) car = ' '; do { okhatar = (boolean)(Member((unsigned)(car), hatar.S)); car = next(); } while (!((okhatar && (Member((unsigned)(car), betu.S))) || sorvege)); if (!sorvege) if (doword()) if (on) if (nmgh > 1) { integer B29 = nmgh, B30 = 2; if (B29 >= B30) for (n = B29; ; n--) { elvalaszt(n); if (n == B30) break; } } } while (!(sorvege)); } void transform(frominput) boolean frominput; { on = true; if (frominput) while (!feof(stdin)) { readstr(&sor); hunmghtotexmgh(); line(); writelnstr(&sor); } else while (!Eof(filvarin)) { readfstr(&filvarin, &sor); hunmghtotexmgh(); line(); writelnfstr(&filvarout, &sor); } } /* ** Start of program code */ main(_ac, _av) int _ac; char *_av[]; { argc = _ac; argv = _av; # ifdef STDINIT (void)(Getx(input)); # endif inicial(); if (argc > 1) { chastr(&filename, ' ', 79); Argvgt(1, filename.body.A, sizeof(filename.body.A)); chastr(&szokoz, ' ', 1); stastr(&strhun, *((C50_static *)STRALIGN(".hun")), 4, 0); stastr(&strtex, *((C50_static *)STRALIGN(".tex")), 4, 0); i = posstr(&szokoz, &filename); if (i > 1) substr(&filename, filename, 1, i - 1); i = posstr(&strhun, &filename); if (i > 0) substr(&filename, filename, 1, i - 1); addstr(&filenamein, filename, strhun); addstr(&filenameout, filename, strtex); (void)fprintf(output.fp, "Input: "), Putl(output, 0); writelnstr(&filenamein); (void)fprintf(output.fp, "Output: "), Putl(output, 0); writelnstr(&filenameout); Resetx(filvarin, filenamein.body.A, sizeof(filenamein.body.A)); Rewritex(filvarout, filenameout.body.A, sizeof(filenameout.body.A)); transform(false); } else { transform(true); } exit(0); /* NOTREACHED */ } # undef languagec # undef maxstr # undef maxnmgh # undef maxekesmgh /* ** End of program code */ static void Scanck(n) int n; { if (n != 1) { (void)fprintf(stderr, "Bad input\n"); exit(1); } } static void Getl(f) text *f; { while (f->eoln == 0) Getx(*f); Getx(*f); } static FILE * Fopen(n, l, m) char *n, *m; int l; { FILE *f; register char *s; static char ch = 'A'; static char tmp[MAXFILENAME]; extern int unlink(), strlen(); if (n == NULL) sprintf(tmp, "/tmp/ptc%d%c", getpid(), ch++); else { if (l < 0) l = strlen(n); strncpy(tmp, n, sizeof(tmp)); for (s = &tmp[sizeof(tmp)-1]; *s == ' ' || *s == '\0' || s - tmp > l; ) *s-- = '\0'; if (tmp[sizeof(tmp)-1]) { (void)fprintf(stderr, "Too long filename '%s'\n", n); exit(1); } } s = tmp; if ((f = fopen(s, m)) == NULL) { (void)fprintf(stderr, "Cannot open: %s\n", s); exit(1); } if (n == NULL) unlink(tmp); return (f); } static setword Q0[] = { 6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000 }; static setword Q1[] = { 7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0000, 0x0100 }; static setword Q2[] = { 7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0008 }; static setword Q3[] = { 7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x0008 }; static setword Q4[] = { 7, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0010 }; static setword Q5[] = { 8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0400, 0x0000, 0x0400 }; static setword Q6[] = { 8, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x2000 }; static setword Q7[] = { 6, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000, 0x1000 }; static setword Q8[] = { 8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0608, 0x0100, 0x0608 }; static setword Q9[] = { 8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0010, 0x0008, 0x0010, 0x0008 }; static setword Q10[] = { 8, 0x0000, 0x0000, 0x0000, 0x0000, 0x5080, 0x0010, 0x5080, 0x0010 }; static setword Q11[] = { 6, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1000 }; static setword Q12[] = { 8, 0x0000, 0x0000, 0x0000, 0x0000, 0x7DDC, 0x07DD, 0x7DDC, 0x07DD }; static setword Q13[] = { 8, 0x0000, 0x0000, 0x0000, 0x0000, 0x8222, 0x0020, 0x8222, 0x0020 }; static setword Q14[] = { 8, 0x0000, 0x0000, 0x7303, 0x8C00, 0x0000, 0x0000, 0x0000, 0x2800 }; static setword *Conset[] = { Q14, Q13, Q12, Q11, Q10, Q9, Q8, Q7, Q6, Q5, Q4, Q3, Q2, Q1, Q0 }; static setptr Union(p1, p2) register setptr p1, p2; { register int i, j, k; register setptr sp = Newset(), p3 = sp; j = *p1; *p3 = j; if (j > *p2) j = *p2; else *p3 = *p2; k = *p1 - *p2; p1++, p2++, p3++; for (i = 0; i < j; i++) *p3++ = (*p1++ | *p2++); while (k > 0) { *p3++ = *p1++; k--; } while (k < 0) { *p3++ = *p2++; k++; } return (Saveset(sp)); } static setptr Diff(p1, p2) register setptr p1, p2; { register int i, j, k; register setptr sp = Newset(), p3 = sp; j = *p1; *p3 = j; if (j > *p2) j = *p2; k = *p1 - *p2; p1++, p2++, p3++; for (i = 0; i < j; i++) *p3++ = (*p1++ & ~ (*p2++)); while (k > 0) { *p3++ = *p1++; k--; } return (Saveset(sp)); } static boolean Member(m, sp) register unsigned int m; register setptr sp; { register unsigned int i = m / (setbits+1) + 1; if ((i <= *sp) && (sp[i] & (1 << (m % (setbits+1))))) return (true); return (false); } static setptr Insmem(m, sp) register unsigned int m; register setptr sp; { register int i, j = m / (setbits+1) + 1; if (*sp < j) for (i = *sp + 1, *sp = j; i <= *sp; i++) sp[i] = 0; sp[j] |= (1 << (m % (setbits+1))); return (sp); } # ifndef SETSPACE # define SETSPACE 256 # endif static setptr Currset(n,sp) int n; setptr sp; { static setword Space[SETSPACE]; static setptr Top = Space; switch (n) { case 0: Top = Space; return (0); case 1: if (&Space[SETSPACE] - Top <= 15) { (void)fprintf(stderr, "Set-space exhausted\n"); exit(1); } *Top = 0; return (Top); case 2: if (Top <= &sp[*sp]) Top = &sp[*sp + 1]; return (sp); } /* NOTREACHED */ } static void Setncpy(S1, S2, N) register setptr S1, S2; register unsigned int N; { register unsigned int m; N /= sizeof(setword); *S1++ = --N; m = *S2++; while (m != 0 && N != 0) { *S1++ = *S2++; --N; --m; } while (N-- != 0) *S1++ = 0; } static struct Set * Alignset(Sp) register unsigned short *Sp; { static struct Set tmp; register unsigned short *tp = tmp.S; register int i = *Sp; while (i-- >= 0) *tp++ = *Sp++; return (&tmp); } static struct String * Alignstr(Cp) register char *Cp; { static struct String tmp; register char *sp = tmp.A; while (*sp++ = *Cp++) ; return (&tmp); } static void Caseerror(n) int n; { (void)fprintf(stderr, "Missing case limb: line %d\n", n); exit(1); /* NOTREACHED */ } End_of_bundled_file etex.c echo etex.demo 1>&2 cat >etex.demo <<'End_of_bundled_file etex.demo' Ez a pa1r sor csak egy pici bemutato1 abbo1l, mit is csina1l a szo2veggel az ETEX. Magad is kipro1ba1lhatod, ha elindi1tod a programot parame1ter ne1lku2l. End_of_bundled_file etex.demo echo etex.ini 1>&2 cat >etex.ini <<'End_of_bundled_file etex.ini' @ - elva1laszta1s bekapcsola1sa | - elva1laszta1s kikapcsola1sa 18 \'a a1 \'e e1 \'{\i} i1 \'o o1 \"o o2 \H o o3 \'u u1 \"u u2 \H u u3 \'A A1 \'E E1 \'I I1 \'O O1 \"O O2 \H O O3 \'U U1 \"U U2 \H U U3 End_of_bundled_file etex.ini echo etex.ini.babai 1>&2 cat >etex.ini.babai <<'End_of_bundled_file etex.ini.babai' @ - elva'laszta's bekapcsola'sa | - elva'laszta's kikapcsola'sa 18 \'a a' \'e e' \'{\i} i' \'o o' \~o o~ \H o o" \'u u' \~u u~ \H u u" \'A A' \'E E' \'I I' \'O O' \~O O~ \H O O" \'U U' \~U U~ \H U U" End_of_bundled_file etex.ini.babai echo etex.ini.szabva1ny 1>&2 cat >etex.ini.szabva1ny <<'End_of_bundled_file etex.ini.szabva1ny' @ - elva1laszta1s bekapcsola1sa | - elva1laszta1s kikapcsola1sa 18 \'a a1 \'e e1 \'{\i} i1 \'o o1 \"o o2 \H o o3 \'u u1 \"u u2 \H u u3 \'A A1 \'E E1 \'I I1 \'O O1 \"O O2 \H O O3 \'U U1 \"U U2 \H U U3 End_of_bundled_file etex.ini.szabva1ny echo etex.kerdoiv 1>&2 cat >etex.kerdoiv <<'End_of_bundled_file etex.kerdoiv' ETEX KE1RDO1IV (1) Mail-ci1mem, nevem, va1ros, a1llam, orsza1g. (2) (A) Sikeresen kipro1ba1ltam a programot. (2) Nem tudom kipro1ba1lni, mert... (B) Nem Unix opera1cio1s rendszeren dolgozom (hanem...) (C) Az u2zembe helyeze1s nekem tu1l bonyolult (segi1ts u2zembe helyezni) (D) A leve1lbe beleto2ro2ltem (ku2ldj egy ma1sik levelet) (3) (A) Kipro1baltam es u1gy gondolom, szu2kse1gem van ra1. (3) Kipro1ba1ltam, de nincs ra1 szu2kse1gem, mert (B) Nem tudok magyarul, vagy el akarok felejteni (C) Tizenha1rom dolla1re1rt inka1bb megi1rom magam (D) Csak {Ha a 3. ke1rde1sre a va1laszod B-C-D, akkor ke1rlek, hogy ezt a levelemet e1s a belo3le ke1szi1tett file-okat to2ro2ld le. Ko2szo2no2m.} (4) (A) A 13 (tizenha1rom) dolla1rt a ci1medre feladtam. (4) A 13 (tizenha1rom) dolla1rt me1g nem ku2ldtem el, mert (B) Me1g gondolkodom (C) Nem az USA-ban vagyok e1s proble1ma1t okoz az elku2lde1se (tala1ljuk ki egyu2tt a megolda1st) (C) U1gy e1rzem, ennyit nekem nem e1r meg, csak X dolla1rt (D) Pillanatnyilag nincs ennyi ne1lku2lo2zheto3 pe1nzem, de amint egyenesbe jo2vo2k (hata1rozottan egy e1ven belu2l) elku2ldo2m Elo3re is nagyon ko2szo2no2m, hogy ha ma1sra nincs ido3d, legala1bb ro2viden a betu3kkel jelzed a va1laszod, pe1lda1ul 1. toth@astrovax.princeton.edu (To1th Ga1bor, Princeton, NJ, USA) 2. A. 3. A. 4. A. Reme1lem programomat hasznosnak fogod tala1lni, To1th Ga1bor E-mail: toth@astrovax.princeton.edu Ke1rlek, hogy fenti E-mail ci1mre va1laszolj, e1s ne a TIPP-nek. Ko2szo2no2m. A csekket a ko2vetkezo3 ci1mre ku2ldd: Ga1bor To1th Peyton Hall Princeton University Princeton, NJ, 08544 USA A csekkre a nevemet Ga1bor To1th sorrendben i1rd ra1 az e1kezetekkel egyu2tt. Ko2szono2m. End_of_bundled_file etex.kerdoiv echo etexleiras.hun 1>&2 cat >etexleiras.hun <<'End_of_bundled_file etexleiras.hun' \magnification=1200 \parindent=0pt \parskip=15pt plus 2pt \def\\{$\backslash$} \def\<{$<$} \def\>{$>$} \def\({$\{$} \def\){$\}$} \def\pl{pl{.} \tt} \def\title#1{\bigskip\goodbreak\centerline{\bf #1}} \def\subtitle#1{\bigskip\centerline{#1}} \def\newln{\hfill\break} \title{ETEX Felhaszna1lo1i Lei1ra1s} Az ETEX magyar szo2vegek \TeX\ forma1tumra hoza1sa1t teszi leheto3ve1. Noha a program outputja a \TeX\ sza1ma1ra ke1szu2l, neked nem kell felte1tlenu2l ismerned a \TeX\ utasi1ta1sait. Az ala1bbi lei1ra1s alapja1n ko2nnyede1n \TeX-esi1theted e1s kinyomtathatod az E-mailen e1rkezo3, az a1ltalad i1rt vagy ma1s forra1sbo1l sza1rmazo1 magyar nyelvu3 szo2vegeket. Magad is meg fogsz lepo3dni, hogy milyen jo1l mutat a magyar e1kezetekkel ella1tott, a magyar helyesi1ra1s szaba1lyai szerint elva1lasztott e1s \TeX\ mino3se1gben kinyomtatott szo2veg.\footnote*{Ha ezt a szo2veget nem nyomtatott forma1ban olvasod, akkor az e1kezetes maga1nhangzo1kon ki1vu2l me1g ne1ha1ny specia1lis \TeX\ karakter helyett a nekik megfelelo3 \TeX\ defini1cio1kat la1tod majd a szo2vegben, ilyenek a kisebb (\<), nagyobb (\>), dolla1r (\$) e1s backslash (\\) jelek. A \\-sel kezdo3do3 \TeX\ utasi1ta1sok a1ltala1ban a nyomtata1si forma1t adja1k meg.} A tova1bbiakban konkre1t pe1ldake1nt mindig ennek a lei1ra1snak a fordi1ta1sa1ra fogok hivatkozni. Hogy kapod meg az eredeti fa1jlban (etexleiras.hun) le1vo3 sza1mokkal jelo2lt e1kezetekbo3l a \TeX\ sza1ma1ra szu2kse1geseket? Egyszeru3en elindi1tod a programot a kiege1szi1to3 ne1lku2li fa1jlne1vvel mint parame1terrel: {\tt etex etexleiras} A magyar szo2vegnek egy .hun kiege1szi1to3ju3 fa1jlban kell lennie (etexleiras.hun), a program ugyanazt a fa1jlnevet -- de .tex kiege1szi1to3vel -- adja az eredme1ny fa1jlnak (etexleiras.tex). A program a Unixban szoka1sos \< \> jelekkel is haszna1lhato1: {\tt etex \< etexleiras.hun \> etexleiras.tex} A program mu3ko2de1se1nek mege1rte1se1t megko2nnyi1ti, ha kipro1ba1lod, hogy a programot parame1terek e1s \< \> jelek ne1lku2l indi1tod el: {\tt etex} Ilyenkor az ETEX a billentyu3zetro3l olvas e1s a ke1pernyo3re i1r, teha1t i1rja1l be valamilyen magyar szo2veget az e1kezeteket 123-mal jelo2lve. Az $\langle$Return$\rangle$ lenyoma1sa uta1n az ETEX azonnal lefordi1tja a szo2veget, e1s visszai1rja a ke1pernyo3re, majd u1jabb sorra va1r. Pe1lda1ul: {\tt Az ETEX rendki{1}vu{2}l hasznos program. \newln Az ETEX rend\\-k\\'\(\\i\)\\-v\\"ul hasz\\-nos prog\\-ram. \newln Jo{1}l ismeri az elva{1}laszta{1}si szaba{1}lyokat. \newln J\\'ol is\\-me\\-ri az el\\-v\\'a\\-lasz\\-t\\'a\\-si sza\\-b\\'a\\-lyo\\-kat. } Ha ki akarsz le1pni, akkor {\tt Ctrl D}-t haszna1lj (a {\tt Ctrl} e1s a {\tt D} billentyu3t egyu2tt nyomd le). Mint la1thato1 az ETEX ke1t le1nyeges le1pe1st hajt ve1gre: \parskip=10pt\parindent=2cm \item{1.}A1ti1rja a magyar e1kezetes maga1nhangzo1kat \TeX\ forma1tumra. \item{2.}Bejelo2li az elva1laszta1si helyeket a \TeX\ sza1ma1ra. \parindent=0pt A ko2vetkezo3kben re1szletesen lei1rom mindke1t funkcio1t. \parskip=15pt plus 2pt \title{Elva1laszta1s} Az elva1laszta1s aze1rt le1nyeges, mert a \TeX\ csak az angol nyelv szaba1lyai szerint tud elva1lasztani, i1gy a magyar szavakat vagy rosszul, vagy egya1ltala1n nem va1lasztja el, ami tu1l to2mo2r, illetve tu1l hosszu1 sorokat eredme1nyez, e1s ez a \TeX-ele1skor egy 'Overfull hbox' hibau2zenetet eredme1nyez. Az ETEX viszont megadja a \TeX\ sza1ma1ra, hogy hol vannak a helyes elva1laszta1si pontok. Proble1ma egyedu2l o2sszetett szavakna1l meru2lhet fel ({\pl meg-a-kad} e1s nem {\tt me-ga-kad}, ahogy az a mechanikus szaba1lybo1l ko2vetkezne). Terme1szetesen ez csak akkor okoz te1nyleges hiba1t, ha a sor ve1ge e1pp egy ilyen helyre esik, ez azonban csak igen ritka1n fordul elo3 (kb. 20 oldalanke1nt egyszer). Ha me1gis, akkor backslash ko2to3jellel jelo2lheted be a helyes elva1laszta1s helye1t ({\pl meg\\-akad}), ami egye1bke1nt standard \TeX\ utasi1ta1s. Az ETEX nem va1lasztja el azokat a szavakat, amelyek betu3ko2n e1s az e1kezetes maga1nhangzo1k jelein ki1vu2l ma1s karaktert, pl. backslash-t tartalmaznak. I1gy az a1ltalad 'ke1zzel' elva1lasztott szavak, vagy a \TeX\ kulcsszavai e1rintetlenu2l maradnak. Az ETEX nem va1laszt el olyan helyen, amely ke1t betu3ne1l ro2videbb re1sz-szo1t eredme1nyezne ({\pl ala\\-nyai} e1s nem {\tt a\\-la\\-nya\\-i}). A hosszu1 ketto3s ma1ssalhangzo1k nem va1laszthato1k el az ETEX-el, ugyanis ilyenkor a szo1t nemcsak kette1va1gjuk a magyar nyelvben, hanem egy betu3t be is toldunk (mint {\pl asz-szony} e1s nem {\tt as-szony}). Ke1zzel is csak akkor va1laszthatod el a szo1t egy ilyen helyen, ha biztos vagy benne, hogy a sor ve1ge1re fog esni, ku2lo2nben az eredme1ny ko2nnyen {\tt |aszszony@} lehet. A legegyszeru3bb -- ezt teszi az ETEX is -- ha ilyen helyeken nem va1lasztasz el, ebbo3l szinte soha nincs to2rdele1si proble1ma. Tala1n e1rdemes megemli1teni, hogy az ETEX olyan szaba1lyokat is ismer, mint a {\tt ch}-t tartalmazo1 szavak helyes elva1laszta1sa ({\pl me\\-cha\\-ni\\-ka}). \title{\bf E1kezetes Maga1nhangzo1k} A magyar maga1nhangzo1k jelo2le1se1nek defini1cio1i az etex.ini fa1jlban tala1lhato1k. A programhoz melle1keltem a {\sl szabva{1}ny e{1}kezetes jelo{2}le1st} az etex.ini.szabva{1}ny fa1jlban (az etexleiras.hun is ezt haszna1lja), tova1bba1 a Babai La1szlo1 neve1hez fu3zo3do3 {\sl e'kezetes betu"ket} tartalmazo1 fa1jlt. Ha uto1bbit szeretne1d haszna1lni, akkor ma1sold a1t az etex.ini-be: {\tt cp etex.ini.babai etex.ini} Ha te ma1s jelo2le1seket haszna1lsz, akkor csak ki kell javi1tanod az etex.ini fa1jlt egy editorral. Javasolom azonban, hogy mindig o3rizz meg egy eredeti etex.ini.szabva{1}ny fa1jlt arra az esetre, ha a1t akarsz te1rni erre a jelo2le1sre, vagy elrontod a javi1ta1st. A ku2lo2nbo2zo3 maga1nhangzo1khoz ku2lo2nbo2zo3 jelo2le1seket kell hozza1rendelni (pl. az o2 e1s az o3 nem lehet egyforma), hiszen a program nem tudja kiko2vetkeztetni a szo2vegko2rnyezetbo3l, hogy melyik a helyes. Ha bizonyos ritka1bban haszna1lt e1kezetes maga1nhangzo1khoz nincs saja1t jeled, akkor vagy hagyd meg az ott levo3 jelet (legfeljebb nem haszna1lod), vagy to2ro2ld ki a \TeX\ pa1rja1val egyu2tt. Terme1szetesen a maga1nhangzo1k sza1ma1t ennek megfelelo3en mo1dosi1tani kell az etex.ini harmadik sora1ban. \title{Az elva1laszta1s be- e1s kikapcsola1sa} Az etex.ini elso3 ke1t sora1ban az elva1laszta1st be- e1s kikapcsolo1 karakterek tala1lhato1k: @ e1s $|$. Ha az ETEX ezeket la1tja a .hun fa1jlban, akkor be- illetve kikapcsolja az elva1laszta1si helyek bejelo2le1se1t. Hasznos lehet bizonyos szavak megve1de1se1re, amit nem akarsz elva1lasztani, {\pl $|$Ga1bor@}. A jeleket terme1szetesen kiveszi a szo2vegbo3l. Ezenfelu2l a \$ jel e1s a \$\$ is a1tva1lt, ugyanis \TeX-ben ezek jelentik a matematikai mo1d kezdete1t e1s ve1ge1t, ahol felteheto3en nem akarsz elva1lasztani. Ha dolla1r jelet szeretne1l kinyomtatni, akkor az ETEX-ben -- e1s a1ltala1ban \TeX-ben -- egy backslasht kell a dolla1r jel ele1 i1rni, ahogy ezt az elo3zo3 mondatban tettem (la1sd az elso3 oldal la1bjegyzete1t). Ha maga1t a be- vagy kikapcsolo1 jeleket akarod kinyomtatni, az sem okoz proble1ma1t. Ugyanis, ha az elva1laszta1s ma1r kikapcsolt a1llapotban van (pl. matematikai mo1dban), akkor az ETEX a tova1bbi kikapcsolo1 jeleket egyszeru3en bennehagyja a szo2vegben. Ez hasznos lehet az abszolu1te1rte1k jel haszna1lata1na1l: $|x|$. Hasonlo1an a bekapcsolo1 jel is benn marad, ha az ETEX ma1r eleve bekapcsolt a1llapotban van, mint pl. itt: "toth@astrovax.princeton.edu". Ve1gso3 megolda1ske1nt meg is va1ltoztathatod ezt a ke1t karaktert az etex.ini -ben. \title{Magyar szo2vegfa1jlok ETEX-esi1te1se} Ha minima1lis va1ltoztata1ssal e1lvezheto3 nyomtatva1nyt szeretne1l kihozni egy egyszeru3 szo2vegfa1jlbo1l, akkor a szo2veg eleje1re i1rd be a ko2vetkezo3 utasi1ta1sokat: {\tt \\magnification=1200 \\parindent=0pt \\parskip=15pt plus 2pt } e1ppu1gy mint az etexleiras.hun-ban la1thatod. Ha nem akarsz oldalsza1moza1st, akkor haszna1ld a {\tt \\nopagenumbers} utasi1ta1st. A file legve1ge1re pedig i1rd oda hogy {\tt \\bye } Ha adsz a ku2lalakra, akkor a bekezde1seket u2res sorral va1laszd el. Ezzel el is ke1szu2lt az eredeti szo2veget tartalmazo1 egyszeru3, de helyes szintaxisu1 .hun fa1jl. Ebbo3l a .tex fa1jlt az ETEX meghi1va1sa1val a1lli1thatod elo3 (ld. fent), majd a \TeX\ meghi1va1sa1val, {\tt tex etexleiras} ke1szi1theto3 el a nyomtathato1 etexleiras.dvi file. Ezt a rendszeren haszna1lt programmal lehet kinyomtatni, ennek neve mindenhol ma1s e1s ma1s. Az ETEX a magad a1ltal i1rt magyar nyelvu3 cikkek, hivatalos levelek, o2ne1letrajzok, stb. \TeX-esi1te1se1t rendki1vu2l megko2nnyi1ti. Az ETEX ilyen ce1lu1 felhaszna1la1sa1na1l e1rdemes betartani a ko2vetkezo3 ke1t szaba1lyt: \parindent=1.5cm\parskip=10pt \item{||@} Minden javi1ta1st a .hun fa1jlban ve1gezz, a .tex fa1jl csupa1n ideiglenes haszna1latra szolga1ljon, e1ppu1gy, mint a .dvi fa1jl. A .hun sokkal jobban olvashato1, e1s a .tex mindig elo3a1lli1thato1 belo3le, mi1g ez fordi1tva ma1r nem a1ll fenn. \item{||@} Ha sok TeX makro1t definia1lsz a fa1jl eleje1n, akkor e1rdemes kikapcsolni az ETEX-et ($|$) a defini1cio1k elo3tt, e1s a szo2veg kezdetekor visszakapcsolni (@). Ez egyre1szt gyorsi1tja a fordi1ta1st, ma1sre1szt ne1ha1ny \TeX\ utasi1ta1sban olyan szavak is szerepelnek, melyekben nincs \\ (ilyen lehet pl{.} a {\tt\\parskip 15pt minus 1pt}). Ha az ETEX ezt elva1lasztja ({\tt mi\\-nus}), akkor a \TeX\ fordi1to1 lea1ll hiba1val. \parindent=0pt \parskip=15pt plus 2pt Jo1 munka1t, e1s sok sze1p e1kezetes betu3t ki1va1nok \bigskip \leftline{To1th Ga1bor} \bigskip \bigskip \parindent=5cm\parskip=10pt \item{\hbox to 1.5cm{E-mail:\hfill}}toth@astrovax.princeton.edu \item{\hbox to 1.5cm{Ci1mem:\hfill}}Ga1bor To1th \newln Peyton Hall \newln Princeton University \newln Princeton, NJ, 08544 \newln USA \parindent=0pt\parskip=15pt plus 2pt A csekkre a nevemet Ga1bor To1th sorrendben i1rd ra1, e1kezetekkel egyu2tt. Ko2szo2no2m. \bye End_of_bundled_file etexleiras.hun echo --- echo --- echo --- " EEEEEEE TTTTTTT EEEEEEE X X" echo --- " E T E X X" echo --- " EEEE T EEEE XX" echo --- " E T E X X" echo --- " EEEEEEE T EEEEEEE X X" echo --- echo --- echo --- Ke1rlek, tu2relemmel va1rd meg a leve1lben le1vo3 echo --- utasi1ta1sok ve1grehajta1sa1t. A sebesse1g az a1ltalad echo --- haszna1lt rendszerto3l e1s annak terheltse1ge1to3l fu2gg. echo --- echo --- echo --- Most kezdo3dik a program fordi1ta1sa... echo echo cc -o etex etex.c cc -o etex etex.c echo echo --- A fordi1ta1s befejezo3do2tt. echo --- A ke1sz program neve '"etex"'. echo --- echo --- Most kezdo3dik a lei1ra1s lefordi1ta1sa TeX forma1tumra... echo echo etex etexleiras etex etexleiras echo echo --- A fordi1ta1s befejezo2do2tt. echo --- A ke1sz file neve '"etexleiras.tex"'. echo --- echo --- Most kezdo3dik a lei1ra1s TeX-ele1se... echo echo tex etexleiras tex etexleiras echo echo --- A TeX-ele1s befejezo3do2tt. echo --- echo --- A ke1sz etexleiras.dvi file kinyomtata1sa1ra minden rendszer ma1s-ma1s echo --- parancsot haszna1l. Ha nem ismered, ke1rdezz meg valakit, aki haszna1l echo --- TeX-et. Nyomtasd ki a lei1ra1st. echo --- echo --- A nyomtata1s uta1n a tova1bbiakat ma1r e1kes magyar nyelven olvashatod... echo --- echo --- echo --- echo --- " EEEEEEE TTTTTTT EEEEEEE X X" echo --- " E T E X X" echo --- " EEEE T EEEE XX" echo --- " E T E X X" echo --- " EEEEEEE T EEEEEEE X X" echo --- echo --- sleep 10 echo echo "cat etex.demo" echo cat etex.demo echo echo --- echo "etex < etex.demo" echo etex < etex.demo echo --- echo --- echo --- Ne felejtsd el kinyomtatni az etexleiras.dvi file-t! echo ---