Yksi yleisistä käyttäjien avuntarpeista koskee sivujen asettelun hallinnointia. Koska DoX CMS:ssä tehdyt dokumentit koostetaan valikoiduista sisällöistä suoraan sivukohtaisesti kirjoittamisen sijaan, voivat tulokset joskus tuntua epätyydyttäviltä. Näiden tilanteiden välttämiseksi on kuitenkin mahdollista ottaa varotoimenpiteitä ennakkoon. Hätätilanteissa järjestelmä myös taipuu asettelun itse säätämiseen rajoitetuissa määrin. Käyn tässä artikkelissä läpi sekä keinoja välttää kyseiset tilanteet että keinoja säätää sivuasettelua itse tarvittaessa.
Jos joku muu kuin DoX CMS:n käyttäjä lukee tätä yleisenä CSS-ohjeistuksena, huomioi, kuinka CSS:ssä käytetyt luokitukset ovat monessa kohtaa järjestelmäkohtaisia.
Ennakkotoimenpiteet
Ennalta on mahdollista sekä määrittää tyylitiedostoon ohjeita sivunvaihtoja varten että kirjoittaa dokumentteja sivunvaihtojen kannalta ystävällisellämmällä tavalla.
Tyylitiedostoon voidaan kirjata sääntöjä sivunvaihtojen pakottamiseksi sekä sivunvaihtojen siirtämiseksi tai välttämiseksi. Lisäksi on mahdollista asettaa rajoituksia eri elementtien koon osalta.
Dokumenttien kirjoittamisen käytänteet vaikuttavat myös sivunvaihdoksien tarpeeseen. Eri sisältöjen asettelun tavat on osaltaan mahdollista rakentaa tiedettyjen sivunvaihtojen mukaisiksi.
Alla käsitellään kummatkin keinot. Tyylitiedostojen osalta annetaan myös suosituksia CSS-komentojen osalta.
Orvot ja lesket
Kaikkein yleisin syy tarpeelle hallinnoida sivunvaihtoja ovat orvot ja lesket rivit. Orvot rivit ovat yksittäisiä rivejä, jotka jäävät edellisen sivun loppuun. Lesket rivit ovat yksittäisiä rivejä, jotka jäävät seuraavan sivun alkuun. Kummassakin tapauksessa tulokset ovat rumia ja voivat häiritä myös käytettävyyttä.
Vaikka periaatteessa kyseiset ilmaisut koskevat lähinnä tekstikappaleiden sisältöjä, kertoo tämä osio myös, kuinka sama ongelma voidaan välttää listojen, taulukoiden, ja elementtien otsikoiden osalta.
Kappaleiden jakautuminen
Tekstikappaleiden jakautumiseen on olemassa omat CSS-sääntönsä. Tältä osin on hyvä huomioida, että DoX CMS:n käyttämä kevyt DITA (LW-DITA) sisällyttää kappale-elementit (p) myös esimerkiksi listojen jokaiseen kohtaan. Tämä tulee huomioida tyylitiedostoissa myös muista syistä, mutta se myös tarkoittaa, että näitä sääntöjä ei tarvitse määrittää erikseen muille tekstisisällöille.
Komento ’orphans: X;’, missä X on luonnollinen luku, toimii määreenä erilaisille tekstisisällöille ja se kertoo sallitun vähimmäismäärän sivun loppuun jätettäviä rivejä. Esimerkiksi siis seuraava lisäys tyylitiedostoon määrää, että kaikista kappaleista on jäätävä edelliselle sivulla vähintään kaksi riviä. Muussa tapauksessa sivua vaihdetaan siten, että koko kappale tulee seuraavalle sivulle.
p {
orphans: 2;
}
Vastaavasti komento ’widows: X;’, missä X on luonnollinen luku, kertoo sallitun vähimmäismäärän rivejä seuraavalle sivulle jatkettaessa. Jos rivejä tulisi muutoin vähemmän, edelliseltä sivulta siirretään enemmän sisältöä seuraavalle sivulle. Alla on lisätty myös tämä komento, ja esimerkki käskee PDF:n laatijaa lisäämään seuraavalle sivulle vähintään kaksi riviä, mikäli tekstikappale katkeaa sivujen välillä. Jos sisältöä jäisi liian vähän kummallekin sivulle, orpoja rivejä koskeva sääntö on vahvempi ja kaikki sisältö siirtyy seuraavalle sivulle.
p {
orphans: 2;
widows: 2;
}
Kuten kaikissa muissakin tapauksissa, on säännön soveltuvuusalue mahdollista määrittää tarkkarajaisemmin. Jos esimerkiksi listauksien tapauksessa yksittäisten kohtien rivimäärille per sivu halutaan antaa tarkemmat määreet, on niin mahdollista tehdä samoilla säännöillä. Tällöin säännöt tulisi esimerkiksi kohdistaa listojen kohtien (li) sisäisiin kappaleisiin (p).
Listat ja taulukot
Edellä mainitut komennot toimivat vain yhtenäisen tekstisisällön jakamiseen. Ne eivät siis salli kertoa, montako eri tyypin alaelementtiä kuten taulukon riviä on jätettävä kullekin sivulle. Näiden tilanteiden ennakoimiseksi on hyödynnettävä kohdistamista haluttuihin kohtiin laskemalla kyseisenlaisia elementtejä sekä alusta että lopusta.
Alla esitetyt esimerkit niin listoille kuin taulukoille olettavat, että kummankin osia on jätettävä vähintään kaksi kullekin sivulle. Siksi ne antavat ohjeet vain ensimmäistä ja viimeistä alaelementtiä koskien. Jos halutaan varmistaa kolmen tai useamman alaelementin pakottaminen samalle sivulle, tulee sama komento toistaa myös toiselle ja toiseksi viimeiselle elementille. Niiden kohdentamisen ohjeet löytyvät täältä ja täältä.
Käytettävät komennot ’break-after: avoid-page;’ ja ’break-before: avoid-page;’ kertovat PDF:n laatijalle, että kyseisten kohtien jälkeen tai ennen niitä tulee välttää sivunvaihtoja. Tällöin sivunvaihto siirtyy seuraavaan sallittuun kohtaan. Kannattaa huomioida, että näiden komentojen ylikäyttäminen voi johtaa kompromisseihin. Ne kertovat järjestelmää välttämään sivunvaihtoja kyseisissä kohdin mahdollisuuksien mukaan. Jos komentoja on kaikkialla, ei järjestelmälle jää samoissa määrin mahdollisuuksia noudattaa kaikkia niistä. Komento ’break-inside: avoid-page;’ puolestaan kertoo välttämään elementin sisällä tapahtuvia sivunvaihtoja. Sitä suositellaan käytettävän ainakin taulukkojen soluihin, jotta yksittäiset rivit eivät jakannu sivujen välillä.
// kaikki taulukot (all tables)
table th {
break-after: avoid-page;
}
table tr:first-child {
break-after: avoid-page;
}
table tr:last-child {
break-before: avoid-page;
}
td {
break-inside: avoid-page;
}
// numeroidut ja numeroimattomat listat (ordered and unordered lists)
ol li:first-child, ul li:first-child {
break-after: avoid-page;
}
ol li:last-child, ul li:last-child {
break-before: avoid-page;
}
Samaa logiikkaa on mahdollista hyödyntää myös muissa tilanteissa kuten määritelmälistoissa. Niitä ei kuitenkaan ole sisällytetty yllä annettuihin esimerkkeihin.
Otsikot
Joskus alaosioiden tai otsikoitujen elementtien otsikot voivat jäädä eri sivulle kuin itse sisältö. Niiden hallinnointi käyttää samoja komentoja kuin esitettiin myös yllä. Olennaisinta tältä osin on huomioida oikea kohdistus. Alla annettu esimerkki olettaa taulukoiden otsikoiden olevan sijoiteltu itse taulukkojen yläpuolelle ja kuvien otsikoiden olevan sijoiteltu niiden alapuolelle.
// osioiden otsikot (section titles)
.titleWrapper {
break-after: avoid-page;
}
// taulukot (titles of tables)
.dita-table .dita-title {
break-after: avoid-page;
}
// kuvat (titles of figures)
.dita-fig .dita-title {
break-before: avoid-page;
}
Jos ala-osiot tai muut elementit halutaan aina aloittaa uudelta sivulta, on myös pakotettu sivunvaihto ennen niitä mahdollista lisätä. Muiden elementtien kuin otsikoiden osalta tämä kannattaa tehdä DoX CMS:n elementtiluokkien kautta. Alla annettu esimerkki käyttää esimerkkiluokkaa ’UusiSivu’. Jos vain tietyn tason otsikoiden halutaan käyttäytyvän näin, voidaan niille käyttää tunnistetta ’.titleWrapper_LevelX’, missä X on otsikon hierarkiataso.
// osioiden otsikot (section titles)
.titleWrapper {
break-before: page;
}
// elementtiluokat (element classes)
[doxelementclass="UusiSivu"] {
break-before: page;
}
Elementtikoot
Jos yksittäinen elementti on liian suuri jättääkseen tilaa pakollisille muilla osioille kuten sen yhteyteen kuuluvalle otsikolle, voi järjestelmä joutua pilkkomaan muut osat eri sivulle huolimatta yllä ehdotetuista säännöistä. Tämä koskee ensisijaisesti taulukoiden tai kuvaelementtien (fig) sisältämiä kuvia. Taulukoiden tapauksessa ongelma voi myös pakottaa sisältöä sivujen tai solujen reunojen yli, mikäli sille ei ole muutoin tilaa.
Ratkaisu ongelmaan on maksimimittojen määrittäminen. Kuville kannattaa ylipäätään asettaa maksimileveys niiden venymisen yli sivun mitan välttämiseksi. Usein on myös hyvä ajatus hallinnoida niiden kokoa suoraan kuvakohtaisesti liitettyjen kuvatiedostojen DITA-ominaisuuksien kautta. Tästä kerrotaan enemmän alempana.
Alla esitetyssä esimerkissä annetaan rajat taulukoiden solujen sisäisille kuville ja kuvaelementtien (fig) sisään asetetuille kuville. Lisäksi annetaan yleismääre muille kuville, jotta ne eivät koskaan olisi sivun leveyttä suurempia. Nämä ovat esimerkkiarvoja, mutta niiden tarkoituksena on välttää tilanteita, joissa kuvien koko estää muun sisällön toimivan asettelun samalle sivulle.
// kuvatiedostot kaikkialla (image files everywhere)
img {
max-width: 100%;
}
// kuvaelementtien kuvatiedostot (image files in figures)
.dita-fig img {
max-height: 200mm;
}
// kuvat taulukoissa (image files in tables)
td img {
max-width: 50mm;
}
Kuvaelementtien (fig) ja taulukoiden osalta valitut arvot eivät ole prosentteina vaan A4-arkeille sovitettuina millimetriarvoina. Syynä on, että prosenttiarvot perustuvat ympäröivän elementin kokosuhteisiin. Varsinkaan korkeussuunnassa tämä ei välttämättä vastaa sivun korkeutta ja taulukoissa se voisi edelleen johtaa solujen liialliseen venymiseen. Mikäli eri tilanteissa tarvitaan erilaisia arvoja, voidaan ne määrittää kuvakohtaisesti niiden DITA-ominaisuuksissa tai käyttämällä elementtiluokkia.
Sisällön asettelu
Sisällön asetteluun vaikuttaa moni seikka. Aina sitä ei voi tehdä ihanteelliseksi sivuasettelun kannalta. Sivuasetteluun voidaan kuitenkin tarvittaessa vaikuttaa myös sisällön asettelulla.
Isot elementit ääripäihin
Isot elementit vaativat paljon tilaa. Siksi suosittelen asettamaan ne joko osioiden alkuun tai niiden loppuun. Alkuun sijoittelu toimii parhaiten, kun kukin osio alkaa omalta sivultaan, koska tämä varmistaa riittävän sivutilan heti osion otsikon jälkeen. Loppuun sijoittelu varmistaa, että tarvittaessa isoille elementeille voidaan varata omat sivunsa tarvitsematta katkoa muita elementtejä niiden sovittamiseksi. Tämä voi tarkoittaa, että yhden sivun loppuun jää iso tyhjä tila, mutta sama ei tällöin toistu useampaan kertaan per osio.
Isoja elementtejä ovat esimerkiksi kuvaelementit (fig) ja taulukot. Ne vaativat paljon tilaa ja niiden sisällöt ovat yleensä korkeampia kuin yksittäiset tekstirivit. Joissakin tapauksissa myös listat voivat vaatia, että niiden sisältö mahtuu varmuudella katkeamatta yhdelle sivulle.
Vältä ilmoitusketjuja
Varoitukset ja muut ilmoitukset lisätään yleensä huomioelementteinä (note). Niihin kuuluu usein joko asianmukainen kuva tai maininta ilmoitustyypistä tai molemmat. Useimmissa tapauksissa nämä yksityiskohdat on helpointa määritellä tyylitiedostojen kautta. Tämä kuitenkin myös tarkoittaa, että huomioelementteihin (note) liittyviin lisäosioihin kohdistuva lisätyylittely kuten sivunvaihtojen hallinta on vaikeampaa ellei mahdotonta. Mitä useampi tällainen elementti siis lisätään peräkkäin, sitä suurempi on niiden oikeaan asettumiseen liittyvä riski.
Riskeihin kuuluvat ainakin seuraavat:
- Ilmoitustyyppiteksti ja ilmoituksen sisältöä päätyvät eri sivuille,
- Ilmoituksen kuva ja sisältö päätyvät eri sivuille,
- Ilmoituksen kuva katkeaa sivujen välillä, tai
- Ilmoituksen kuva painuu alatunnisteen sisään.
Eri riskit liittyvät eri tapoihin toteuttaa ilmoituksia. Osaan niistä on mahdollista myös vastata CSS:llä, kun nämä osiot on toteutettu sen kanssa yhteensopivilla tavoille. Esimerkiksi kuvan asettaminen taustakuvaksi luo riskin sen katkeamisesta sivujen välillä. Jos kuitenkin huomioelementtien (note) sisäiset sivunvaihdot on estetty komennolla ’break-inside: avoid-page;’ (kts. yllä), voidaan tällaiset katkeamiset välttää. Useimmiten kuitenkin ainakin osa näistä lisäyksistä täytyy toteuttaa pseudo-elementeillä kuten ’::before’, ja tällöin sivunvaihtoa hallinnoivien komentojen täyttä toimivuutta ei voida taata DoX CMS:ään itseensä liittymättömistä syistä.
Tästä syystä on yleensä parasta välttää useita peräkkäisiä ilmoituselementtejä. Jos niitä käytetään usein esimerkiksi välittömästi ennen tai jälkeen kuvaelementtejä (fig), on kuvaelementtien maksimikoon hyvä kuvastaa ilmoituksien vaatimaa lisätilaa. Mikäli on välttämätöntä käyttää peräkkäin useampia ilmoituksia, kannattaa harkita pakotettua sivunvaihtoa ennen ensimmäistä niistä käyttämällä elementtiluokkaa, ja vain yhdelle sivulle varmasti mahtuvan ketjun käyttämistä.
Suora asettelun hallinta
Aina tyydyttävää ratkaisua ei kuitenkaan saa varmistettua ennakkotoimenpiteillä. Ne vähentävät huomattavasti huonon asettelun riskiä, mutta niillä ei voida täysin poistaa tätä mahdollisuutta. Kun ennakoivat keinot eivät riitä, täytyy ottaa käyttöön suora asettelun hallinta.
Suoraan asettelun hallintaan DoX CMS:ssä liittyy kuitenkin erinäisiä haasteita. Ensinnäkin, järjestelmästä puuttuu yksiselkoinen toiminto pakotetulle sivunvaihdolle muualla kuin otsikon alussa. Sen sijaan tämä täytyy toteuttaa lisäämällä sitä varten elementtiluokka. Toisekseen, rakennedokumentaation sisällöt on usein tarkoitettu käytettäviksi useammassa kuin yhdessä dokumentissa. Tällöin pakotettu sivunvaihto voi olla tarpeen yhdessä käyttötilanteessa muttei muissa. Tämä koskee myös eri kieliversioita samasta dokumentista.
Alla käsitellään, kuinka tällainen suora asettelu on tehtävissä DoX CMS:ssä ja mitä silloin tulee huomioida.
Lisää pakotetut sivunvaihdot
Yksittäisten osioiden tasolla on mahdollista pakottaa sivunvaihto ennen niiden alkua suoraan tekstieditorin yläriviltä. Jos kuitenkin tarvitaan niiden sisäisiä sivunvaihtoja, täytyy se tehdä elementtiluokkien avulla. Voit lisätä uusia elementtiluokkia niiden omassa valikossa Työkalut-ikonin alla. Kun kyseiset elementtiluokat on lisätty, voidaan niihin kytkeä komento, joka pakottaa PDF:n laatijan lisäämään sivunvaihdon joko ennen tai jälkeen valitun elementin. Alla on esitetty molemmat keinot ja esimerkkeinä käytetään elementtiluokkia ’UusiSivuEnnen’ ja ’UusiSivuJalkeen’. Muista, että lisäämäsi elementtiluokan nimen ja tyylitiedostossa annetun määreen täytyy vastata toisiaan. Muutoin nimellä ei ole mitään merkitystä toiminallisuuden kannalta.
// sivunvaihto ennen (page break before)
[doxelementclass="UusiSivuEnnen"] {
break-before: page;
}
// sivunvaihto jälkeen (page break after)
[doxelementclass="UusiSivuJalkeen"] {
break-after: page;
}
Lisätäksesi elementtiluokan sisältöön, valitse haluttu elementti ensin tekstieditorissa. Avaa sitten työkalupalkista lista elementtiluokista ja klikkaa sieltä haluttua elementtiluokkaa. Järjestelmä lisää kyseisen elementtiluokan valittuun elementtiin.
Ehdollista sivunvaihdot
Jos samaa sisältöä käytetään useammassa eri dokumentissa, ei samaa sivunvaihdon tarvetta juuri kyseisessä kohdassa ole välttämättä kaikista niissä. Jos tosin kyseinen osio alkaa aina uudelta sivulta, asettuvat sen sisällöt luultavasti pitkälti samaan tapaan kaikissa dokumenteissa, ellei osaa niistä ole joka tapauksessa ehdollistettu.
Tämän ongelman ohittamiseksi on yleensä parasta tehdä samasta elementistä ensin kopio ja vasta sitten laittaa toiseen haluttu elementtiluokka. Näin on mahdollista käyttää tageja kummankin ehdollistamiseksi siten, että ne tulevat oikein haluttuihin dokumentteihin. Käytännössä pakotetun sivunvaihdon aiheuttavan elementtiluokan omaavan elementin voi merkitä tageilla, jotka soveltuvat sivunvaihtoa vaativiin dokumentteihin. Sen kopion voi puolestaan merkitä saman kategorian tageilla, jotka soveltuvat muihin dokumentteihin. Tällöin vain yksi versio elementistä tulee kuhunkin dokumenttiin ja pakotettu sivunvaihto ei periydy kaikkiin kyseistä otsikkoa käyttäviin dokumentteihin.
Tarkista käännösversiot erikseen
Sama sisältö voi olla eri mittaista eri kielillä. Tästä syystä pakotetut sivunvaihdot eivät välttämättä asetu samoihin kohtiin sivua eri kielillä. Kun siis käytät pakotettuja sivunvaihtoja esitettyyn tapaan, täytyy sinun tarkistaa käännetyistä versioista, kuinka sisältö oikein asettuu niissä. Sivunvaihdon aiheuttavan elementtiluokan voi tarvittaessa poistaa tai sitä voi siirtää eri elementteihin eri kielillä.
Tehdäksesi tämän sinun täytyy ensin ottaa PDF-julkaisu dokumentista käännöskielellä ja selata se läpi. Jos pakotettua sivunvaihtoa tarvitaan eri kohdassa, voit avata kyseisen kielen revision otsikosta ja lisätä halutun elementtiluokan yllä selitettyyn tapaan. Jos joudut poistamaan elementtiluokan, voit tehdä sen vain sisällön koodinäkymässä.
Kun avaat sisällön koodinäkymässä, etsi kohta, missä kyseiselle elementille on annettu määre ’doxelementclass’ ja poista kokonaan sekä kyseinen muuttuja että sen arvo. Kun sen jälkeen palaat alkuperäiseen näkymään, tarkista ensin, ettei muutos aiheuttanut virheilmoitusta. Jos se aiheutti virheilmoituksen, sulje sisältö tallentamatta sitä ja yritä uudelleen. Jos virheilmoitusta ei syntynyt, voit tallentaa revision sisällön.
Säädä taulukoiden sarakeleveys käsin
Sivunvaihtojen asettelun lisäksi voi olla tarpeen, että asetat itse ainakin osan taulukoista sarakeleveyden. Oletusasetus on, että taulukkojen sarakkeiden leveys lasketaan automaattisesti. Tämä prosessi on kuitenkin altis tilanteille, missä tulokset ovat käyttökelvottomia.
Halutessasi voit asetella kaikkien taulukoiden sarakkeiden leveyden itse tai voit käyttää elementtiluokkaa tilanteisiin, missä on tarpeen tehdä niin. Myös automaattisen laskennan tapauksessa sinun on mahdollista määrittää yksittäisten sarakkeiden leveys käsin. Voit tehdä niin avaamalla sarakkeen ominaisuudet ja asettamalla sen leveydelle joko prosenttimäärän tai millimetrimäärän. Ilman alla annettua keinoa taulukko voi silti mennä rikki, vaikka tekisit näin taulukon jokaiselle sarakkeelle.
Rikkoutuminen on mahdollista välttää käyttämällä automaattisesti laskettujen sijaan säädetyn mittaisia sarakkeita. Tarkkaan ottaen myös ne voivat aiheuttaa rikkinäisiä taulukoita, mutta erona on hallittavuus. Automaattisesti lasketun levyiset sarakkeet voivat hajottaa itse taulukon. Säädetyn mittaiset sarakkeet voivat olla liian pieniä niiden sisällölle, jolloin kyseinen sisältö venyy yli niiden rajojen. Tämä on kuitenkin mahdollista korjata muokkaamalla kyseistä sisältöä tai tekemällä kyseisestä sarakkeesta leveämmän.
Säädetyn mittaisten sarakkeiden käyttämiseksi voit hyödyntää seuraavaa CSS-komentoa. Siitä on annettu sekä yleisversio että elementtiluokkakohtainen versio. Esimerkissä elementtiluokan nimeksi on annettu ’VakiTaulukko’. Leveyden määritys on pakollinen osa prosessia ja halutessasi voit käyttää vähemmän leveitä taulukoita.
// yleisversio (general version)
table {
table-layout: fixed;
width: 100%;
}
// elementtiluokka (as an element class)
[doxelementclass="VakiTaulukko"] {
table-layout: fixed;
width: 100%;
}
Yhteenveto
DoX CMS ei itsessään ole tekstin asetteluun soveltuva ohjelmisto. Se on sisällöntuotannon ohjelmisto, jolla on tarkoitus kirjoittaa uudelleenkäytettäviä ja modulaarisia sisältöjä.
Asettelu tapahtuu ensisijaisesti CSS:llä tehtyjen määrityksien kautta. On tärkeää huomioida ennalta tilanteet, missä asettelun halutaan tapahtuvan tietyllä tapaa. Tyylitiedostot sallivat kirjoittaa sääntöjä kyseisenlaisten tilanteiden ratkaisemiseksi ilman, että sinä joudut joka kerta asettelemaan lopputuloksen käsin.
On myös mahdollista vaikuttaa tarpeeseen asettelun jälkimuokkaukselle sisällön järjestyksen kautta. Ihanteellisesti sisältö kirjoitettaisiin alkujaankin muotoon, joka vähentäisi ennalta sivuasetteluun liittyviä riskejä.
Kun sinun on tarpeen lisätä pakotettuja sivunvaihtoja käyttämällä elementtiluokkia, huomioi saman sisällön erot sen eri käyttötilanteissa. Muista ehdollistaa sisältö vastaamaan myös tilanteita, missä sivunvaihtoa ei tarvita. Lisäksi sinun täytyy tällöin muistaa käydä läpi myös käännösversiot niiden sivuasettelun tarkistamiseksi.