SGMLtools HOGYAN

Tímár András atimar@itp.hu

v1.0 1999. október 23.


Ez a dokumentum elmagyarázza, HOGYAN használjuk az SGMLtools csomag 1.0.9 verzióját (LinuxDoc DTD) magyar nyelvű dokumentumok előállítására. Ilyen dokumentumok például a linuxos HOWTO-k, amelyek magyarra fordítása közben fellépő nehézségek arra ösztönöztek, hogy a megoldásokat ilyen formában közzétegyem.

1. Bevezetés

1.1. Mi az SGML?

Az SGML (Standard Generalized Markup Language) egy szövegleíró nyelv. Leginkább a HTML-hez lehetne hasonlítani, valójában a HTML is az SGML nyelvből származtatható. A szöveg tagolását, formázását tag-ekkel oldják meg a HTML-hez hasonlóan, azonban a HTML-től eltérően a tag-eket mi definiálhatjuk tetszés szerint, olyan nevet adhatunk nekik, amit logikusnak tartunk. Ezeket a tag definíciókat egy DTD dokumentumleíró fájlban kell megadni. A linuxos dokumentációk ma még a LinuxDoc DTD-t használják, bár már egy ideje fontolgatják linuxos körökben a DocBook DTD-re való áttérést, amely világszerte elterjedt a technikai dokumentációk leírására; ez sokkal logikusabb felépítésű és gazdagabb, mint a LinuxDoc DTD. Az áttérés számos technikai nehézséggel jár, ezért aki most akar bekapcsolódni a Linux Documentation Project-be, annak még a LinuxDoc DTD-vel is meg kell ismerkednie.

1.2. Mi az SGMLtools?

Az SGML formátum előnye, hogy sokféle más formátumra könnyen konvertálható. Így elég az SGML dokumentumot karbantartani, és változtatás esetén egyszerűen legenerálhatóak a különböző formátumú változatok. Az SGMLtools csomag ebben az átalakításban segít. Ez a dokumentumban az SGMLtools 1.0.9-es verziójára vonatkozik, ez a legutolsó verzió, amely a LinuxDoc DTD-re alapul. Az csomag 2.x verziói már a DocBook DTD-t támogatják. Sajnos mindkét sorozat fejlesztése abbamaradt, mert a SGMLtools projekt vezetője más elfoglaltságai miatt abbahagyta a fejlesztést. A program letölthető a projekt honlapjáról.

A linuxos HOWTO-kat általában plain text, HTML, DVI és PostScript formátumban terjesztik, így az én leírásom is ezekre fog koncentrálni. Nem tárgyalom viszont az SGMLtools olyan tulajdonságait, amelyek a dokumentációjából is megismerhetők.

2. Az SGMLtools ,,magyarítása''

A továbbiakban feltételezem, hogy az SGMLtools 1.0.9 telepítve van a gépedre. Sajnos valami oknál fogva (magyarok lustasága?) az így feltelepített SGMLtools egyáltalán nem ismeri, és nem támogatja a magyar nyelvet. Az alábbiakban megpróbálom összefoglalni, hogyan lehet ,,magyar-kompatíbilisé'' tenni a programot.

Az magyar nyelv karaktereinek helyes megjelenítéséhez a Latin-2 karakterkészlet szükséges, azonban az SGMLtools csak a Latin-1 karakterekkel hajlandó dolgozni. Viszonylag szerencsések vagyunk, mert sok más kelet-európai néppel ellentétben a magyar szövegek Latin-1 karakterekkel is olvashatóak, a különbség mindössze a hosszú `ö' és a hosszú `ü' megjelenítésében van, ezek helyett a Latin-1-es kódtáblában `o~' illetve `u^` szerepel. Megpróbálhattam volna átírni a programot, hogy ezentúl a Latin-2 kódtáblát is tudja használni, de a célom nem ez volt. Én minél gyorsabban használni szerettem volna az SGMLtools-t a HOWTO-k magyarítására, nem akartam belemélyedni egy több tízezer soros program átírásába. Néhány csúnya, de működőképes változtatást eszközöltem a program egyes fájljain, így rövid idő alatt célhoz értem.

2.1. A `-hu' paraméter

Az első feladat az volt, hogy az SGMLtools elfogadja a magyar nyelvet, mint érvényes paramétert. Ez azért fontos, mert bizonyos szövegeket, amiket a HTML, plain text, stb. fájlokba beletesz a program, innen vesz. Rövid keresgélés után rábukkantam a /usr/lib/sgml-tools/SGMLtools/Lang.pm nevű fájlra, amit így módosítottam:

[... vágás ...]
@Languages = qw(
en english english
de deutsch german
nl nederlands dutch
fr français french
es espańol spanish
da dansk danish
no norsk norwegian
se svenska swedish
pt portuges portuguese
ca catalŕ catalan
it italiano italian
ro română romanian
hu magyar hungarian
);
[... vágás ...]
$translations = {
"Previous" => {
"nl" => "Terug",
"de" => "Zurück",
"es" => "Página anterior",
"fr" => "Page précédente",
"da" => "Forrige",
"no" => "Forrige",
"se" => "Föregĺende",
"pt" => "Página anterior",
"ca" => "Pŕgina anterior",
"it" => "Indietro",
"ro" => "Înapoi",
"hu" => "Előző"
},
"Next" => {
"nl" => "Verder",
"de" => "Weiter",
"es" => "Página siguiente",
"fr" => "Page suivante",
"da" => "Nćste",
"no" => "Neste",
"se" => "Nästa",
"pt" => "Página seguinte",
"ca" => "Pŕgina següent",
"it" => "Avanti",
"ro" => "Înainte",
"hu" => "Következő"
},
"Contents" => {
"nl" => "Inhoud",
"de" => "Inhalt",
"es" => "Índice general",
"fr" => "Table des matičres",
"da" => "Indhold",
"no" => "Innhold",
"se" => "Innehĺllsförteckning",
"pt" => "Índice",
"ca" => "Índex",
"it" => "Indice",
"ro" => "Cuprins",
"hu" => "Tartalom"
},
"Table of Contents" => {
"nl" => "Inhoudsopgave",
"de" => "Inhaltsverzeichnis",
"es" => "Índice general",
"fr" => "Table des matičres",
"da" => "Indholdsfortegnelse",
"no" => "Innholdsfortegnelse",
"se" => "Innehĺllsförteckning",
"pt" => "Índice geral",
"ca" => "Índex general",
"it" => "Indice Generale",
"ro" => "Cuprins",
"hu" => "Tartalomjegyzék"
}
};
[... vágás ...]

A módosítás hatására a magyar nyelvet is elfogadják az SGMLtools csomag részei parancssori paraméterként. Például az
sgml2txt -f -c latin -l hu <fájlnév>.sgml
parancs segítségével állíthatunk elő plain text formátumú dokumentumot.

2.2. Módosítások az ISO1lat entity map-ban

Az SGML szöveg írásakor két lehetőségünk van az ékezetes betűk leírására. Beírhatjuk őket közvetlenül, vagy parancs alakjukba. Például írhatjuk: `á' vagy `&aacute;'. Nyilvánvalóan az előbbi megoldás a kényelmesebb, de egyes SGML author tool-ok előnyben részesíthetik a második (szabványos) megoldást. Ebben a jelölésben a hosszú `ö' '&odblac;' és a hosszú `ü' '&udblac;'. Ezeket az úgynevezett entity-ket nagybetűs párjukkal együtt kénytelen voltam belevenni az ISO1lat entity map-ba. Ez a fájl az /usr/lib/entity-map/0.1.0/ könyvtárban található, legalábbis az általam vizsgált rendszereken.

ISOlat1

[... vágás ...]
<!ENTITY oacute SDATA "[oacute]"--=small o, acute accent-->
<!ENTITY Oacute SDATA "[Oacute]"--=capital O, acute accent-->
<!ENTITY odblac SDATA "[odblac]"--=small o, hungarumlaut accent-->
<!ENTITY Odblac SDATA "[Odblac]"--=capital O, hungarumlaut accent-->

<!ENTITY ocirc SDATA "[ocirc ]"--=small o, circumflex accent-->
<!ENTITY Ocirc SDATA "[Ocirc ]"--=capital O, circumflex accent-->
[... vágás ...]
<!ENTITY uacute SDATA "[uacute]"--=small u, acute accent-->
<!ENTITY Uacute SDATA "[Uacute]"--=capital U, acute accent-->
<!ENTITY udblac SDATA "[udblac]"--=small u, hungarumlaut accent-->
<!ENTITY Udblac SDATA "[Udblac]"--=capital U, hungarumlaut accent-->

<!ENTITY ucirc SDATA "[ucirc ]"--=small u, circumflex accent-->
<!ENTITY Ucirc SDATA "[Ucirc ]"--=capital U, circumflex accent-->
[... vágás ...]

2.3. További módosítások

Az alábbi fájlokat is módosítottam az /usr/lib/entity-map/0.1.0/ könyvtárban. Ezek egyike a plain text-ért felelős, de a többi kibővítése sem okozhat nagy bajt. Nem néztem részletesen utána...

ISOlat1.2ab

[... vágás ...]
[oacute] o
[Oacute] O
[odblac] oe
[Odblac] Oe
[ocirc ] o
[Ocirc ] O
[... vágás ...]
[uacute] u
[Uacute] U
[udblac] ue
[Udblac] Ue
[ucirc ] u
[Ucirc ] U
[... vágás ...]

ISOlat1.2as

Most már nem részletezem annyira, mert unalmas. Ezeket kell beilleszteni:

[odblac] {odblac}
[Odblac] {Odblac}
[udblac] {udblac}
[Udblac] {Udblac}

ISOlat1.2l1b [odblac] ő
[Odblac] Ő
[udblac] ű
[Udblac] Ű

2.4. Konvertálás HTML-be

A HTML, mint a WWW-n megjelenő dokumentumok leíró nyelve, az egyik legfontosabb kimeneti formátum. Az /usr/lib/entity-map/0.1.0/ISOlat1.2html entity map az ékezetes karakterekre a HTML szabványokban rögzített írásmódot preferálja, tehát `á' = `&aacute;' stb. Sajnos azonban a magyar nyelvben előforduló {ő,ű} betűknek nincs kódjuk &blablabla; formában. Ha -- hibásan -- `&otilde;' és `&ucirc;' alakban írjuk őket, akkor egy Latin-2 fontra beállított browser egy fordított kérdőjellel, kockával, vagy valami hasonló karakterrel fogja ezeket megjeleníteni, teljesen jogosan, hiszen ez a két betű (`&otilde;' és `&ucirc;') nincs benne a Latin-2 karaktertáblában. Latin-1 fonttal megjelennek ugyan, de a hullámos `ö' és a kalapos `ü' gusztustalanul néz ki magyar szövegekben. Minden modern browser képes a 8 bites ékezetes karaktereket tartalmazó szöveg helyes megjelenítésére, ezért az ISOlat1.2html fájlban az összes magyar ékezetes betűt átírtam a parancs alakról a közvetlen alakra, és beillesztettem a következő sorokat:

[odblac] ő
[Odblac] Ő
[udblac] ű
[Udblac] Ű

2.5. Konvertálás DVI és PS formátumba

A DVI és a PostScript fromátumokat a TeX programcsomag segítségével állítja elő az SGMLtools. A TeX egy rendkívül sokoldalú, bonyolult tördelőprogram; tipográfiailag kifogástalan, nyomdai minőségű dokumentumok előállítására is képes. A továbbiakban feltételezem, hogy telepítve van egy viszonylag friss teTeX disztribúció, amely minden rendes Linux disztribúció része.

Vegyük sorra, milyen változtatások szükségesek az SGMLtools-ban és a TeX-ben, hogy a magyar tipográfiai konvencióknak megfelelő dokumentumokat kapjunk:

Korrekt ékezetek
Itt is a hosszú `ö' és hosszú `ü' betűkkel kell külön foglalkozni. Először is módosítanunk kell az /usr/lib/entity-map/0.1.0/ISOlat1.2tex fájlt a következőképpen:

Írjuk be ezeket a sorokat:

[odblac] \H{o}
[Odblac] \H{O}
[udblac] \H{u}
[Udblac] \H{U}

Módosítsuk így a következő sorokat:

[otilde] \H{o}
[Otilde] \H{O}
[ucirc ] \H{u}
[Ucirc ] \H{U}

Ez utóbbi módosításra azért van szükség, mert ha az SGML fájlt ékezetesen írjuk, az SGMLtools mindenképpen a Latin-1 kódtábla alapján próbálja azt átalakítani. Plain text és HTML esetén ennek nem volt jelentősége, hiszen a konzolon és a browserben is egy fontváltással megoldható, hogy a Latin-1 szöveget Latin-2 alakban jelenítsük meg. Módosítanuk kell az /usr/lib/sgml-tools/dist/sgmltool/latex2e/mapping fájlt is. Minden előforduló `latin1' karakterláncot cseréljünk le `latin2'-re. Ennek eredményeképpen a verbatim környezetekben is helyesen fognak megjelenni a hosszú `ö' és `ü' betűk.

Magyar elválasztás
A magyar elválasztási szabályokat tartalmazó fájl (huhyph.tex) része a mai teTeX disztribúcióknak, de alapértelmezésben a TeX nem használja. Adjuk ki a

texconfig hyphen latex

parancsot, töröljük ki a komment jelet (%) a huhyph.tex elől, és mentsük a fájlt. Ezek után a TeX tudni fogja, hogy magyar nyelvű dokumentumok elválasztásához a huhyph.tex fájlt kell használnia.

Fejezetcímek számozása, idézőjelek
A magyar könyvekben a fejezetcímek sorszáma után pontot kell tenni (pl. 2. fejezet, 3.2.3. alfejezet, stb.). A magyar idézőjelpár (,,Szia!'') is eltér a TeX és a SGMLtools által alapértelmezettként használt angolszász idézőjelpártól (``Hi there!''). Szerencsére ezt a két problémát már megoldották helyettünk, a javított magyar Babel modul (magyar.ldf) letölthető a Magyar LaTeX honlapról. Sajnos ez ma még nem része a standard TeX disztribúcióknak. De örömünk nem lehet felhőtlen, mert ez a javított modul egy újabb apró hibát hoz be. Ha az SGML forrásban van valami ilyesmi, hogy `<tt>make dep</tt>', akkor a új magyar.ldf-ben definiált ,,aktív aposztróf'' bekavar, és a </tt> nem érvényesül. Ennek hatása az, hogy a dokumentum innentől végig írógépbetűvel lesz szedve. Az ,,aktív aposztróf''-ra vonatkozó sorok ugyan kikommentezhetőek, de ezzel elvesznének a magyar idézőjelek, mert ezt ezzel oldották meg. Ismét bele kell nyúlnunk az /usr/lib/sgml-tools/dist/sgmltool/latex2e/mapping fájlba, és a következő ,,hotfixet'' eszközölni:

<tt>          "{}{\\ttfamily "
</tt>         "}{}"

A beszúrt `{}' jelek (üres environment) gondoskodnak arról, hogy az ,,aktív aposztróf'' ne akadjon össze a fontformázó TeX paranccsal.

Egyéb apróságok
Az /usr/lib/sgml-tools/dist/sgmltool/latex2e/mapping fájban átírtam még a kereszthivatkozásokat leképező részt ist, mert nem tetszett az eredeti megoldás.
Az eredeti forma: Ezt és ezt lásd a 4.2 (Fejezetcím) fejezetben.
Az általam kitalált forma: Ezt és ezt lásd a 4.2. Fejezetcím fejezetben.
Ugye neked is jobban tetszik az én változatom? :-) Így kell módosítani a kereszthivatkozás definícióját a mapping fájlban:

<ref>          "{\\itshape \\ref{[ID]}. {[NAME]}\\/}
</ref>

Legyünk óvatosak, ha ilyen kifejezést látunk valahol:

DOS program switches are obtained with <tt>/switch</tt>, Linux
switches with <tt/-switch/ or <tt/--switch/.

Az idézet a Dos-Win-to-Linux-HOWTO.sgml-ből van, a hibás részt pirossal jelöltem. A probléma a következő: a `--' karaktersorozat a TeX-ben parancs, ezzel kell jelölni a nagykötőjelet (magyarban a gondolatjelet is), ez az úgynevezett en-dash karakter. Ha két `-' jelet szeretnénk egymás után írni, ami a szerző szándéka is volt ebben az esetben, akkor így tegyük:

A DOS alatt egy program kapcsolóit <tt>/kapcsoló</tt> formában
kell megadni, míg a Linux alatt a <tt/-kapcsoló/ vagy a <tt/-/<tt/-kapcsoló/
használatos.

3. Letöltés

Az SGMLtools magyarító csomag letölthető innen. A csomag tartalma:

-rw-r--r-- root/root      4251 1999-10-24 12:28 usr/lib/sgml-tools/SGMLTools/Lang.pm
-rw-r--r-- root/root     13586 1999-10-24 12:33 usr/lib/sgml-tools/dist/sgmltool/latex2e/mapping
-r--r--r-- root/root      4557 1999-10-24 12:24 usr/lib/entity-map/0.1.0/ISOlat1
-r--r--r-- root/root       748 1999-10-22 15:04 usr/lib/entity-map/0.1.0/ISOlat1.2ab
-r--r--r-- root/root      1144 1999-10-22 15:04 usr/lib/entity-map/0.1.0/ISOlat1.2as
-r--r--r-- root/root       728 1999-10-22 15:04 usr/lib/entity-map/0.1.0/ISOlat1.2l1b
-r--r--r-- root/root      1000 1999-10-22 15:04 usr/lib/entity-map/0.1.0/ISOlat1.2html
-rw-r--r-- root/root       910 1999-10-24 15:02 usr/lib/entity-map/0.1.0/ISOlat1.2tex

4. Felelősségvállalás, szerzői jog

Erre a dokumentumra nem vonatkozik semmilyen garancia. Nagyon igyekeztem, hogy hibátlan legyen, de mindenki csak a saját felelősségére használhatja az itt közölt információkat. Semmilyen esetben sem lehet engem felelőssé tenni az itt leírtak felhasználásából eredő károkért.

A visszajelzéseket örömmel veszem. Bármilyen kérdést, kérést, javaslatot szívesen meghallgatok.

Copyright (c) Tímár András, 1999.