Täysi tasaus on asettelu, joka saa tekstisarakkeen asettumaan riviin sekä vasemmasta että oikeasta reunasta, kuten painetulta kirjalta tai muodolliselta raportilta voi odottaakin. Se on helppo kuvailla ja yllättävän helppo saada väärin, koska vastaus kysymykseen "mihin ylimääräinen tila menee" ei ole sama englannin kuin japanin kielessä, ja koska naiivi tapa mitata kutakin riviä muuttaa nopean sivun hitaaksi. HotPDF antaa sinulle komentosarjatietoisen tasauksen yhden asettelupuhelun kautta, ja kyseisen kutsun alla on oppikirjan mukainen suorituskykykorjaus joka on ymmärtämisen arvoinen itsessään
Tässä artikkelissa käydään läpi molemmat. Ensinnäkin typografinen sääntö, joka päättää kuinka löysyys jaetaan skripteille joissa on sanavälit verrattuna skripteihin joissa niitä ei ole. Toiseksi mittauksen muutos, joka leikkasi tasauksen sivukohtaisia kustannuksia karkeasti kahdeksankymmentä kertaa, ilman näkyvää eroa tulostuksessa. Molemmilla on merkitystä, jos luot asiakirjoja suuressa määrin ja haluat, että niitä luetaan kuin aitoa ladontaa sen sijaan että niissä olisi tasattu tulostus joka venytetään sopivaksi
Mitä täysi perustelu oikeastaan vaatii
Luonnollisella leveydellä piirretty tekstirivi ei melkein koskaan ulotu sarakkeen oikeaan reunaan. Aina on jäännös (löysyys) siellä mihin viimeinen symboli päättyy ja sarakkeen reunan välillä. Vasemmiston tasaus jättää tilan oikealle. Oikea kohdistus siirtää sen vasemmalle. Keskitys jakaa sen. Täysi kohdistus (tasatut reunat) poistaa sen leventämällä itse riviä, kunnes molemmat reunat kohtaavat laatikon, ja ainoa rehellinen tapa tehdä tämä on työntää muodostelmat erilleen sisältäpäin
Sääntö, joka erottaa hyvän tasauksen huonosta on se, mihin laitat löysyyden. Käsikirjoituksella, joka kirjoittaa sanoja joiden välissä on välilyönti (kuten englanti ja muu latinalainen perhe), on luonnolliset saumat jokaisessa sanavälissä. Näiden tilojen leventäminen on näkymätön silmälle, koska lukijat hyväksyvät jo sanan aukkojen vaihtelevan. Kirjoituksessa, joka kirjoittaa ilman sanojen aukkoja, kuten kiinalaiset Han-merkit, japanilainen kana tai korealainen Hangul, ei ole tällaisia saumoja. Siellä löysyys on jaettava tasaisesti viereisten merkkien välillä, mikä on periaate, jota japanilaiset latomokoneet kutsuvat kintou-waritsuke:ksi (tasaväliseksi). Latinalaistyylisen sanavälien venyttämisen laittaminen CJK-linjalle tai kaiken löysyyden tunkeminen ainoaan paikkaan, jossa CJK-linjalla sattuu olemaan välilyönti, tuottaa amatööritulosteelle ominaisia "jokia" ja aukkoja
Kuinka HotPDF päättää minne tila menee
HotPDF tekee kyseisen päätöksen rakoa kohden, ei riviä kohden. Kun se oikeuttaa viivan se kulkee jokaisen vierekkäisen glyyfiparin läpi ja kysyy istuuko niiden välillä venyvä raja. Raja on venyvä, kun toinen osapuoli on välilyönti tai sarkain (latinalainen tapaus), tai kun molemmat puolet ovat CJK:n rikkoutuvia merkkejä (tasainen väli). Se laskee nämä rajat, jakaa linjan löysän tilan tasan niiden kesken ja lisää sen osuuden jokaiseen kelvolliseen rakoon
Seuraus on luonnollinen. Englanninkielisellä linjalla on venyviä rajoja vain sen sanavälissä, joten kaikki löysyys laskeutuu sinne ja sanat leviävät erilleen kirjainten säilyttäessä luonnollisen välinsä kunkin sanan sisällä. Han- tai kana-linjalla on venyvä raja lähes jokaisen kirjainparin välillä, joten löysyys jakautuu tasaisesti koko riville, juuri sen tarkan kirjainvälin jonka nämä kirjoitukset vaativat. Rivillä, joka on yksi pitkä latinalainen sana, jossa ei ole sisäistä tilaa, ei ole lainkaan venyvää rajaa, joten HotPDF jättää sen luonnolliseen leveyteensä sen sijaan, että se repeytyisi sanaa irti kirjain kerrallaan. Sama logiikka käsittelee sekoitettuja latinalaisia ja CJK-suorituksia yhdellä rivillä ilman erikoiskuorta, koska päätös on paikallinen kunkin rajan kohdalla
Yksi raja on tarkoituksella suljettu pois kaikkialla. Rivin lopullisen glyyfin perässä olevaa sijaintia ei koskaan käsitellä aukona, koska siellä venyttely vain toisi uudelleen oikean käden jäännöksen, joka on tasauksen vastakohta
Miksi viimeinen rivi jätetään rauhaan
Kappaleen viimeinen rivi on erityinen, ja sen tekeminen väärin on yleisin tasausvirhe. Kappaleen viimeinen rivi on yleensä lyhyt, usein vain muutaman sanan pituinen, ja sen venyttäminen koko sarakkeen leveyteen vetää nämä sanat sivun poikki harvaan, katkeilevaan riviin. Oikea typografia jättää viimeisen rivin luonnolliseen leveyteensä tasattuna vasemmalle
HotPDF havaitsee perässä olevan viivan aseman perusteella. Kun se kietoo tekstin riveiksi se tietää milloin sen juuri jakama rivi saavuttaa toimitetun merkkijonon lopun. Viimeinen rivi on säteilytetty yksinkertaisella vasemmalla kohdistuksella ja se säilyttää sen luonnollisen leveyden. Jokainen sitä edeltävä rivi on perusteltu molempiin reunoihin. Tekstiin kirjoittamasi kovat rivinvaihdot huomioidaan sellaisinaan, joten tarkoituksellista lyhyttä riviä ei myöskään koskaan venytetä. Lukija näkee puhtaan suorakaiteen muotoisen tekstilohkon, jonka viimeinen rivi päättyy luonnollisesti, mitä silmä odottaakin
Mittauskustannukset, jotka tekivät perustelusta hidasta
Linjan oikeuttamiseksi sinun on tiedettävä sen tarkka leveys ja jokaisen hahmon ennakko (advance), jotta voit sijoittaa ylimääräisen tilan tarkasti. Ensimmäinen toteutus sai kyseiset luvut selvästi. Se mittasi koko linjan täydellä Unicode-leveys -kyselyllä ja mittasi sitten etuliite etuliitteen jälkeen palauttaakseen kunkin kuvion ennakon eroilla. N:n hahmon riville tämä tarkoittaa N+1 puhelua mittauskoneeseen, ja jokainen soitto on täydellinen GDI-kierros, jossa käyttöjärjestelmää pyydetään muotoilemaan ja mittaamaan teksti ja antamaan vastaus takaisin
Riviä kohden se kuulostaa halvalta. Koko sivun poikki se ei sitä ole. Ota tiheä A4-sivu leipätekstiä, noin neljäkymmentäviisi riviä joissa kussakin on noin kahdeksankymmentä merkkiä. N+1 kiertomatkalla per rivi se tekee noin 81 kiertomatkaa jokaiselle riville ja karkeasti 3 645 sivulle, ja melkein koko aika menee tekstin uudelleenmittaukseen, jota moottori on jo hetkeä aiemmin katsonut. Kun erätyö tuottaa tuhansia sivuja kyseiset yläkustannukset hallitsevat asetteluaikaa, ja jokainen paluumatka ylittää prosessisi ja grafiikka-alijärjestelmän välisen rajan
Yksi puhelu N plus ykkösen sijaan
Korjaus on sellainen muutos, joka näyttää pieneltä ja kannattaa suuresti. GDI pystyy jo raportoimaan merkkijonon kokonaisleveyden ja jokaisen hahmon sijainnin yhdessä kyselyssä. HotPDF paljastaa tuon funktion GetWideCharAdvances kautta, joka täyttää joukon jokaisen kuvan luonnollisella etenemisellä, välistys mukaan lukien, ja palauttaa kokonaisleveyden yhdessä puhelussa eikä N+1:ssä. Perustelurutiini, _HPDFEmitJustifiedWideLine, pyytää kaikkia etukäteissummia kerran, laskee löysän tilan, jakaa sen venytetyille rajoille ja lähettää siiman
Saman A4-sivun kohdalla rivikohtainen mittaus putoaa noin 81:stä kiertomatkasta yhteen, joten sivu putoaa noin 3 645:stä edestakaisesta matkasta noin 45:een, mikä on lähes kahdeksankymmentä kertaa pienempi. Tulostus on tavu tavulta identtinen, koska mikään mittauksessa ei muuttunut paitsi se, kuinka monta kertaa sitä pyydetään. Sama GDI-kone, samat fonttimittarit, sama kerning ruokkivat samat luvut. Vain meno-paluumatkojen määrä laski. Kun mittaus on jo oikein, oikea optimointi on lopettaa sen toistuva pyytäminen, ei lähentyä sitä
Miten rivi saapuu sivulle
Kun löysä (slack) osa on jaettu, HotPDF lähettää rivin ExtTextOut -näppäimellä ja kunkin merkin lisäysmatriisilla (Dx array). Jokainen merkintä on etäisyys yhden hahmon alkuperästä toiseen, joka on hahmon luonnollinen eteneminen ja sen osuus löysyydestä, kun sitä seuraa venyvä raja. Tämä yhdistyy suoraan PDF-kuvausmalliin. Paikannettu teksti kirjoitetaan operaattorilla TJ, joka on joukko, joka limittää glyyfit yksiselitteisillä vaakasuuntaisilla säädöillä, ja kyseisistä arvoista Dx tulee juuri kyseiset säätöarvot. Tästä syystä ylimääräinen tila laskeutuu glyfien väliin tarkoissa alipistesijainneissa sen sijaan, että sitä väärennettiin täytemerkeillä (padding), ja siksi perusteltu HotPDF-rivi mittaa oikein, jos loppupään työkalu lukee sen takaisin
Et soita itse ExtTextOut -toimintoon tasatuksiin kappaleisiin. Aloituspiste on WideTextOutBox, joka käärii Unicode-merkkijonon ruutuun ja käyttää pyytämääsi tasausta. Se jakaa tekstin laatikon leveyteen sopiviksi riveiksi, asettaa jokaisen rivin alaspäin laatikon korkeudelle ja palauttaa merkkimäärän jonka se onnistui sovittamaan, ennen kuin pystysuora tila loppui. Kohdistuksen valitsee perustelun luettelointi
type
THPDFJustificationType = (jtLeft, jtCenter, jtRight, jtJustify);
Kolme ensimmäistä ovat itsestään selviä (vasemmalle, keskelle ja oikealle tasaus). Neljäs, jtJustify on tässä kuvattu täydellinen molempien reunojen perustelu (kohdistus), ja se on lukema jota WideTextOutBox käyttää skriptitietoisen välin ottamiseksi
Kappaleen täydentäminen käytännössä
Täydellinen esimerkki luo asiakirjan, määrittää kirjasimen ja kaataa kappaleen ruutuun, jolla on täysi kohdistus. Sama koodi oikeuttaa latinalaisen ja CJK-tekstin ilman lippumuutosta, koska komentosarjatietoisuus elää API:n alapuolella
uses
HPDFDoc;
procedure JustifyParagraph;
var
Pdf: THotPDF;
Body: WideString;
begin
Pdf := THotPDF.Create(nil);
try
Pdf.FileName := 'Justified.pdf';
Pdf.BeginDoc;
Pdf.CurrentPage.SetFont('Arial', 11);
Body :=
'Täysi tasaus levittää löysän kunkin täytetyn rivin päälle niin että ' +
'molemmat reunat kohtaavat sarakkeen, mutta viimeinen rivi säilyttää luonnollisen leveytensä. ' +
'Komentosarjoissa, joissa on sanaväli, tila laskeutuu sanojen väliin; ja ' +
'komentosarjoissa ilman niitä, se jakautuu tasaisesti kuvojen kesken.';
// X, Y, LineSpacing, BoxWidth, BoxHeight, Text, Align
Pdf.CurrentPage.WideTextOutBox(72, 72, 4, 380, 240, Body, jtJustify);
Pdf.EndDoc;
finally
Pdf.Free;
end;
end;
Voit piirtää saman lohkon vasemmalle, keskelle tai oikealle tasaamalla muuttamalla vain loppuargumentiksi arvoksi jtLeft, jtCenter tai jtRight. Kääre, siiman sijainti ja tuotto-arvo pysyvät samoina. Mitattu leveys, joka ohjaa kaikkia neljää polkua tulee kohteesta GetWideTextWidth, Unicoden tunnistavasta leveyskyselystä joka mittaa WideString-kohteen oikein, jos vanhempi tavukohtainen mittaus mitoittaisi minkä tahansa Latina-1:n ohi olevan, mikä saa käärenivelen CJK- ja korvikeparitekstin oikeaan kohtaan aloittaaksesi
Tasapainottaminen on yksi kerros suuremmassa tekstiä muokkaavassa pinossa. Kun rivi sisältää skriptejä, jotka järjestävät uudelleen tai liittävät niiden glyph:nsa toisiinsa, täällä tehdyt välipäätökset istuvat teoksen päällä, jota on kuvattu kohdassa monimutkaisten komentosarjojen tekstin muotoilua käsittelevässä artikkelissamme, ja kun fontti sisältää typografisia muunnelmia joita haluat valita, katso kohta miten ajaa OpenType GSUB -tyylivaihtoehtoja. Kaikki nämä toimivat HotPDF Componentilla, Delphille ja C++Builderille samanaikaisesti, laajemman tekstin, asettelun ja muiden asiakirjojen sovellusliittymien kanssa joita käsitellään muualla tässä blogissa