w_title(Strukturoitu teksti -- mitä vitun väliä on dokumenttimuodoilla?)dnl w_author(Panu A. Kalliokoski)dnl w_date($ $Date: 2004/02/12 16:57:59 $ $)dnl w_language(finnish)dnl ! Johdanto Jokainen meistä on varmasti törmännyt joskus hämmentävään ongelmaan: pitää kirjoittaa lappu, muistio, tiedote, pöytäkirja, muistiinpanoja, artikkeli, tai jotain muuta tietokoneella. Suurin osa ihmisistä kummempia ajattelematta avaa tekstinkäsittelyohjelman ("Millä muulla niitä sitten voi kirjoittaa?") tai jotkut PIM:n (/personal information manager/, eli siis henkilökohtainen tiedonhallintaohjelma). Tämä on "ihan hyvä" lähestymistapa, mutta jokainen, joka on joskus yrittänyt siirtää kaikki vanhat dokumenttinsa uuteen ympäristöön (uudelle koneelle, uuteen käyttöjärjestelmään tai edes vain uudelle versiolle tekstinkäsittelyohjelmaa), tietää, mikä tuska tästä voi seurata. Tässä artikkelissa on tarkoitus kartoittaa vaihtoehtoja periaatteessa yksinkertaisen ongelman ratkaisuun: millä ja mihin tiedostomuotoon kirjoitan satunnaiset lappuseni? ! Lähtökohta: WYSIWYG-dokumentit WYSIWYG[[ "What You See Is What You Get" ]] on yhteinen nimitys sille paradigmalle, jossa esitetään dokumentti näytöllä samassa muodossa, kuin miltä se oletettavasti näyttää "lopputuloksessa". Lopputuloksena voidaan pitää paperitulostetta, ''www''-sivua, tai sitä, mitä kaverin koneessa pomppaa näytölle, kun hän avaa dokumentin. WYSIWYG-ohjelmiksi kutsutaan ohjelmia, joissa dokumentteja työstetään tällä tavoin. Joihinkin ongelmiin WYSIWYG-ohjelmat ovat lähes ainoa järkevä ratkaisu: näitä ovat esimerkiksi lentolehtisten tai mainosten suunnittelu, jossa on paljon graafista sisältöä ja visuaalisten elementtien asettelu on tarkkaa. Mutta tähän WYSIWYG-ohjelmien "hyvä käyttö" suunnilleen jääkin. WYSIWYG-dokumenttien on todettu vääristävän ihmisten ajattelua tavattoman monella tavalla: # ne käyttävät tyypillisesti tiedostomuotoja, jotka vaihtelevat vähän väliä (tyypillisesti aina, kun päivittää tekstinkäsittelyohjelman, se käyttää jo uutta tiedostomuotoa), aiheuttavat mystisiä yhteensopimattomuusongelmia ja pakottavat organisaatiot valitsemaan yhden WYSIWYG-työkalun monien joukosta, jottei organisaation sisäisessä viestinnässä jouduttaisi koko ajan tappelemaan muunnosten (/konversioiden/) kanssa; # ne luovat ihmisille illuusion siitä, että WYSIWYG-dokumentti voi sisältää tarpeeksi tietoa näytettäväksi missä tahansa ympäristössä. Tämä tuottaa ongelmia esimerkiksi ''www''-sivujen tuottotyökalujen kanssa, kun sivujen tuottajat eivät käsitä, että lukijoilla voi olla eri selain, erikokoinen näyttö, erilaiset väriasetukset, erilainen kirjasinvalikoima, tai voidaanpa sivuja lukea jollain täysin epävisuaalisellakin, esim. puhesynteesiselaimella; # ne pakottavat ihmiset tekemään vähän väliä muotoiluja (lihavointeja, kursivointeja, kirjasinkoon muutoksia) tekstiin, jos sille haluaa jotain rakennetta. Tämä häiritsee ihmisten keskittymistä tekstin sisältöön, varsinaiseen asiaan. Lisäksi tämä estää tuottamasta dokumentista muotoilultaan erilaisia versioita, koska dokumentissa ei ole riittävästi tietoa esimerkiksi sen koneelliseen arvaamiseen, mikä on otsikko, jos otsikkojen ulkonäköä päättää joskus muuttaa; # ne houkuttelevat ihmisiä pelleilemään dokumentin ulkonäöllä: tekemään dokumentteja, jotka "luovasti" poikkeavat perinteistä tekstin asettelun, muotoilun ja järjestelyn suhteen. Näistä kaikista syistä pitäisi olla ilmeistä, ettei _mitään_ satunnaisia tekstejä tai muistioita pidä koskaan kirjoittaa WYSIWYG-työkaluilla. Tämä on tärkeää sekä oman että lähimmäistenne mielenterveyden ja -selkeyden takia. ! Raakateksti Yleensä ensimmäinen reaktio kaikkeen tähän on mennä suoraan raakatekstin käyttöön tai keskitason semanttisiin merkintäkieliin[[ Näistä puhutaan seuraavassa osiossa enemmän. ]]. Varsinkin laitoksella, missä on vahvat ''emacs''-perinteet, on paljon ihmisiä, jotka ymmärtävät raakatekstin olemuksen ja kauneuden -- mutta löytyy niitäkin, jotka käyttävät mieluummin Windowsin Notepadia kuin Wordia. "Raakateksti", niille, jotka eivät sitä tunne, on tiedostomuoto, jossa jokainen dokumentti on jono merkkejä. Muotoiluja on sen verran, että tietty merkki tarkoittaa rivinvaihtoa (siis uuden rivin aloitusta) tekstissä ja lisäksi on toinen merkki, jolla voi merkitä sarkainvaihtoja (tämä ''tab''-merkki toimii yleensä kuten kirjoituskoneiden ''tab'', eli kohdentaa tekstin jatkumaan seuraavasta 8:lla jaollisesta merkkisarakkeesta). Paljon muuta ei sitten olekaan. Ei lihavointeja, ei kappalevaihtoja (muuta kuin kaksi peräkkäistä rivinvaihtoa), ei kirjasimen vaihdoksia, ei alaviitteitä eikä mitään muutakaan. Raakateksti on tiedostomuotona pysynyt jotakuinkin muuttumattomana 70-luvulta lähtien. Raakateksti on itse asiassa erittäin hyvä muoto kaikenlaiselle kirjoitukselle. Esimerkiksi sähköpostin pitkä perinne raakatekstimuotoisena[[ ennen kuin HTML-muotoista sähköpostia alkoi tunkea joka paikasta. ]] osoittaa, että "mitä raakatekstillä ei voi tehdä, sitä ei tarvita". Vuosien aikana on kehittynyt tavaton määrä käytäntöjä, miten erilaisia asioita voi ilmaista raakatekstissä: korostus `*'tähdillä`*' sanan ympärillä, listat ranskalaisilla viivoilla, ja niin edelleen. Joitain ongelmia raakatekstissä kuitenkin on. Mitä, jos haluan tulostaa dokumenttini, ja _haluan_ sinne korostuksia? Mitä, jos muistiinpanoistani kasvaa artikkeli: eikö olisi kannattanut kirjoittaa se julkaisukelpoiseen muotoon alusta lähtien? Mitä, jos haluaisin raakatekstistäni ''www''-sivun? Näihin ongelmiin yksi vastaus on seuraavassa osiossa. ! Keskitason semanttiset merkintäkielet Keskitason semanttisilla merkintäkielillä tarkoitetaan tiedostomuotoja, johon on jollain standardilla tavalla merkitty eri tekstiosioiden typografinen merkitys: esimerkiksi "tässä on kappale, tuossa on lista, tämä on otsikko, tuo on huomautus". Yleensä nämä merkinnät tekstiosioiden merkityksistä ovat tekstin joukossa, mistä tuleekin nimitys "merkintäkieli" (/markup language/). Esimerkkejä keskitason semanttisista merkintäkielistä ovat HTML, XHTML, LaTeX, ms-makrot, DocBook jne. Myös jotkin WYSIWYG-ohjelmat[[ esimerkiksi MS Word ja Openoffice.org ]] antavat mahdollisuuden keskitason semanttisiin muotoiluihin; toinen asia on, älyävätkö käyttäjät käyttää näitä mahdollisuuksia. Esimerkiksi HTML on itse asiassa aika hyvä muoto kirjoittaa dokumenttinsa suoraan. HTML:n tuottoon ei saa käyttää WYSIWYG-työkaluja, koska silloin ei voi tietää, mitä varsinaiseen tiedostoon merkitään tai vastaako se ollenkaan tekstin todellista rakennetta. LaTeX on erinomainen merkintäkieli, jos aikoo tehdä vakavasti otettavia tieteellisiä julkaisuja. Molemmissa on itse asiassa aika matala oppimiskynnys (varsinkin, jos on tottunut käsittelemään raakatekstiä), ja molempia on melko miellyttävää lukea sellaisinaan (siis raakatekstinä). Ongelmiakin on. Vaikka oppimiskynnys on matalahko, se on kuitenkin olemassa, eikä kaikilla ole aikaa vaivata päätään tällaisella. Lisäksi merkinnöissä voi tehdä virheitä, jolloin dokumentti saattaa näyttää väärältä prosessoidessa tai dokumentin prosessointijärjestelmä (esim. ''latex''-komento) kieltäytyy kokonaan dokumentin käsittelemisestä ja jättää käyttäjän metsästämään paikkaa, jossa virhe piilee. HTML on myös sikäli ongelmallinen merkintäkieli, että sen laajentaminen omilla merkinnöillä (jos joskus sattuisi moisia tarvitsemaan) ei ole mahdollista, sillä HTML on laaja ja hitaasti kehittyvä standardi. Lisäksi näiden tiedostomuotojen muuntaminen toisikseen tai paperille tulostetuiksi dokumenteiksi (ylipäänsä mihinkään, mikä ei ole niiden primäärinen media) jättää joskus toivomisen varaa lopputuloksen tyylikkyydessä ja huolitelluudessa. ! Korkean tason semanttiset merkintäkielet On ehkä myös syytä sanoa sananen korkean tason semanttisista merkintäkielistä. Nämä ovat kieliä, joissa on merkitty, mitä dokumentissa oleva teksti oikeasti _tarkoittaa_ tai _on_. Esimerkiksi, sen sijaan että merkinnöissä sanottaisiin, että tässä on lista ja listassa on tällaiset kohdat, sanotaankin, että tässä on osanottajalista ja listassa on tällaisia nimiä ja tällaisia yhteisöjä. Esimerkkejä korkean tason semanttisista merkintäkielistä ovat erilaiset XML- ja SGML-sovellukset, erilaiset verkkoprotokollat, jne. Myös tietokantojen voi katsoa sisältävän korkean tason semanttista /metatietoa/ [[ tarkoittaa tietoa tiedosta: siis tietoa siitä, mitä jokin toinen tieto on. ]], vaikkeivät ne merkintäkieliä olekaan. Nämä kielet ovat usein kohdealueen mukaan erikoistuneita, eli suunnilleen jokaiselle tilanteelle elämässä (tai maailmassa) pitää olla oma merkintäkielensä, jolla voidaan merkitä tietoja kyseisestä todellisuuden alueesta. Dokumentit sisältävät yleensä riittävästi tietoa vaikka mihin muunnoksiin ja niistä pystyy tuottamaan kaikenlaisia yhteenvetoja ja muuta, mutta tällainen prosessointi edellyttää ohjelmointityötä ja jo pelkkä merkintäkielen määrittely muistuttaa deklaratiivista ohjelmointia. Suurimpaan osaan normaalielämän tarpeista nämä kielet ovat aivan ylimitoitettuja, ja niiden käyttämisen oppimiskynnys on varsin korkea. ! Strukturoitu teksti, vihdoin ja viimein Strukturoitu teksti on yritys liittää raakatekstin pitkä perinne keskitason semanttisten merkintäkielten hyviin puoliin. Raakatekstin suurimpia rasitteitahan on huono muunnettavuus muihin muotoihin: tiedostomuotoihin tai vaikkapa tyylikkääksi tulosteeksi. Strukturoitu teksti, lyhyesti sanottuna, on raakatekstiä, jossa noudatetaan tiukasti tiettyjä käytäntöjä erilaisten keskitason semanttisten muotoilujen merkitsemisessä. Enimmäkseen nämä merkintätavat tulevat raakatekstin perinteistä; kuitenkin siellä, missä perinteiset muotoilut ovat monitulkintaisia, edellytetään selkeää merkintää siitä, tarkoitetaanko muotoilulla sitä vai tätä. Esimerkkejä muotoiluista, jotka noudattavat täsmälleen sähköpostiperinteitä, ovat `*'tähdillä`*' tehdyt korostukset, kahdella rivinvaihdolla merkityt kappalevaihdot, listat ranskalaisilla viivoilla ja niin edelleen. Esimerkkejä rakenteista, joita on täytynyt yksiselitteistää, ovat: otsikot:: vanhastaan merkitty panemalla otsikko omalle rivilleen, jota edeltää ja seuraa tyhjä rivi. Seuraava rivi on saattanut sisältää viivoja ikään kuin "alleviivaukseksi" otsikolle. Strukturoidussa tekstissä otsikko merkitään aloittamalla rivi huutomerkillä. termi-määrittelylistat (kuten tämä tässä):: vanhastaan merkitty sisentämällä määrittelyt. Ei sisällä riittävästi tietoa termin varmaan tunnistamiseen: strukturoidussa tekstissä termi pitää panna omalle linjalleen ja lopettaa linja kahteen kaksoispisteeseen (''::''). pakotetut rivinvaihdot:: vanhastaan merkitty lisäämällä rivinvaihto. Ei erotettavissa automaattisesti tuotetusta rivinvaihdosta (esim. sähköpostissa rivin vakiopituus on enintään 72 merkkiä, minkä jälkeen viimeistään pitäisi tulla rivinvaihto); strukturoidussa tekstissä merkittävä rivin lopussa kahdella kauttaviivalla (''//''). Strukturoitu teksti ei olisi paljon mitään ilman toteutusta, jolla siitä voi tuottaa toisia tiedostomuotoja. Tällainen toteutus on sattumoisin olemassa, kirjoittaja on sattumoisin sen tekijä, ja koska kirjoittaja on myös yleisen kielitieteen ATK-ylläpitäjä, kyseinen ohjelma on sattumoisin asennettuna laitoksen ''venus''-palvelimelle. Ohjelman nimi on ''stx2any'' ja siitä saa lisää tietoa komennolla ''man stx2any''. Nämä ovat tavoitteet, jotka mielessä ''stx2any'' on kirjoitettu: - Lähdemuodon (strukturoidun tekstin) tulee olla vaivatonta oppia, tiivistä ja kaunista luettavaa sellaisenaan (siis raakatekstinä). - Säännöstön pitää olla varsin voimakas, eli strukturoituna tekstinä pitää voida esittää paljon ja monimutkaisia asioita. - Lähdemuodon pitää olla laajennettavissa sekä siten, että siihen voi lisätä omia merkintöjä, että siten, että sen sekaan voi kirjoittaa suoraan kohdemuodon (HTML tms.) merkintöjä. - Strukturoidusta tekstistä tuotettujen kohdemuotoisten dokumenttien tulee olla tyylikkäitä, kohdemuodolle ominaisia (esim. HTML-tulosteen pitää näyttää ''www''-sivulta eikä paperidokumentin ''www''-versiolta), ja säilyttää suunnilleen alkuperäisen dokumentin ulkonäkö. - Kohdemuotoisen dokumentin tulee olla kohtalaisen siisti myös sisäisesti, eli konversion tulokseen ei saa päätyä hirveää määrää kummallista moskaa (fonttimäärityksiä tms.). Lisäksi tuloksen tulee sisältää sen verran alkuperäisen dokumentin asettelusta kuin mahdollista, jotta sitä on miellyttävää lukea myös sellaisenaan (raakatekstinä). Tällä hetkellä ''stx2any'' osaa muuntaa strukturoitua tekstiä HTML-, man- ja LaTeX-muotoon. Uusia tulosmuotoja saatetaan lisätä tulevaisuudessa, mutta saatetaan olla lisäämättäkin, sillä näistä kolmesta muodosta dokumentin voi edelleen muuntaa lähes miksi tahansa maan ja taivaan välillä. Tämä artikkeli on kirjoitettu strukturoituna tekstinä. w_link(mailto:pkalliok@ling.helsinki.fi, Panu Kalliokoski) ---- ! Appendix: millä sitä raakatekstiä sitten kirjoitetaan? Jokaiseen ympäristöön on olemassa joitain ohjelmia, jotka osaavat käsitellä puhdasta raakatekstiä, ja jokaisessa ympäristössä on ainakin jokin sellainen valmiina. Niitä kutsutaan /editoreiksi/. Joissain ympäristöissä on valmiiksi erittäin hyviä editoreita, joissain taas joutuu näkemään vaivaa hommatakseen kunnollisen. Kirjoittajan kokemus on ensisijaisesti ''Linux''-ympäristöstä, joten tietämys muiden ympäristöjen editoreista on hatarahkoa. Linux:: Hyviä editoreita ovat esim. ''emacs'' ja ''vim'', joista jälkemmäisellä on hyvin korkea oppimiskynnys. Muita hyviä editoreita ovat ''joe'' ja ''jed''. Kohtalaisia editoreita ovat ''pico'', ''nano'' ja ''uemacs'' (eli "mikroemacs"). Useimmiten näistä on monia valmiiksi asennettuina. Windows:: Välttävä editori on Windowsin NotePad. WordPad ei tuota kunnon raakatekstiä. Parempiakin editoreita on saatavilla, esim. EditPad, mutta kirjoittaja ei tiedä näistä tarpeeksi. Macintosh:: Ainakin jossain vaiheessa jokaisen macin mukana tuli AppleScript joku-joku, joka oli varsin hyvä editori. Myös järjestelmän Teksturi II tuottaa hyvää raakatekstiä, vaikka onkin orientoitunut jonkin verran WYSIWYG-suuntaan. Teksturia ei pidä käyttää, sillä on vakavia kokorajoituksia dokumenteille. Hyviä editoreita on ainakin BBEdit (Lite) ja muistaakseni Alpha-niminen editori. KDE:: Kohtalainen editori on KEdit ja kunnollinen Kate. Tietysti voi myös käyttää alla olevan järjestelmän editoreita. Tämä artikkeli on kirjoitettu ''vim'':lla ''Linux''-ympäristössä.