Postavite japanski roman na stranicu i prva stvar koju ćete primijetiti jest da tekst ide prema dolje unutar stupca, a ne popreko linije, i da se stupci pomiču od desnog ruba lista prema lijevom. Čitatelju koji je odrastao s tim, horizontalni tekst djeluje pomalo klinički. Inženjerski problem leži u tome što je PDF, kao i gotovo svaki digitalni tekstualni sustav, izgrađen oko horizontalne osnovne linije (baseline) koja raste slijeva nadesno, a struja sadržaja (content stream) nema pojam "umjesto toga piši ovaj odlomak prema dolje." Stoga, kada Delphi aplikacija mora izraditi certifikat, pjesmu, natpis ili tradicionalno formatiran pravni dokument za tajvanskog, japanskog ili korejskog čitatelja, raspored se mora složiti ručno: jedan znak ispod drugog, jedan stupac lijevo od prethodnog
HotPDF vam pruža prekidač koji umjesto vas obavlja vođenje evidencije za svaki znak. Font koji postavite nosi oznaku IsVertical, i nakon što je uključena, jedan poziv TextOut slaže cijeli niz (string) u vertikalni stupac umjesto da ga vodi po osnovnoj liniji. Smještaj stupca, redoslijed s desna na lijevo i jedna tiho važna zamjena glifova (glyph substitution) teme su koje ćemo proći na ostatku ove stranice

Prekidač se nalazi na SetFont
Vertikalni raspored nije svojstvo stranice ili dokumenta. To je svojstvo fonta kojim crtate, a uključujete ga pomoću petog argumenta u SetFont:
// SetFont(FontName, FontStyle, Size, FontCharset, IsVertical)
// The 5th argument flips the current font into vertical mode.
Pdf.CurrentPage.SetFont('Arial Unicode MS', [], 12, DEFAULT_CHARSET, False); // horizontal
Pdf.CurrentPage.SetFont('Arial Unicode MS', [], 12, DEFAULT_CHARSET, True); // vertical
Budući da se oznaka veže na font, prebacivanje između horizontalnog i vertikalnog pisanja obavljate jednostavnim ponovnim pozivom SetFont s drugačijim posljednjim argumentom. Stranica može sadržavati horizontalni naslov na vrhu i vertikalni tekst tijela ispod njega, a HotPDF drži ova dva načina odvojena po objektu fonta umjesto po stranici. Upravo to omogućuje mješovite rasporede bez ikakvog posebnog upravljanja načinima rada s vaše strane: svaki TextOut nakon vertikalnog SetFont slaže tekst, svaki TextOut nakon horizontalnog teče po osnovnoj liniji, a posljednji SetFont pobjeđuje
Četvrti argument je Windows skup znakova, isti onaj koji preuzima i horizontalni poziv. Prosljeđivanje DEFAULT_CHARSET omogućuje sustavu da rješava glifove po nizu, što je ovdje važno jer vertikalni dokument često miješa pisma. Sve ostalo o fontu i dalje vrijedi: on mora biti instaliran na računalu na kojem se provodi build (izrada), i gotovo ćete uvijek htjeti FontEmbedding := True kako bi datoteka iscrtavala iste CJK glifove na čitaču (uređaju) koji nikada nije imao Arial Unicode MS
Jedan poziv TextOut je jedan stupac
S aktivnim vertikalnim fontom, poziv TextOut više ne širi svoj niz bočno od zadane točke. On postavlja prvi znak na vrh, a ostale spušta ravno prema dolje, pomičući se za visinu linije fonta za svaki glif. X koji proslijedite fiksira stupac; Y koji proslijedite fiksira mjesto gdje počinje vrh stupca. Stoga, da biste složili stvarni odlomak teksta, izdajete jedan TextOut po stupcu i pomičete X prema lijevo između poziva, jer se CJK stupci čitaju s desna na lijevo
var
Pdf: THotPDF;
const
ColTop = 760; // y of the first glyph in every column (points)
ColGap = 28; // horizontal distance between columns
begin
Pdf := THotPDF.Create(nil);
try
Pdf.FileName := 'VerticalText.pdf';
Pdf.FontEmbedding := True; // embed the CJK face for portable rendering
Pdf.BeginDoc;
Pdf.CurrentPage.Size := psA4;
// A horizontal heading first, in the ordinary writing mode.
Pdf.CurrentPage.SetFont('Arial Unicode MS', [], 16, DEFAULT_CHARSET, False);
Pdf.CurrentPage.TextOut(60, 800, 0, 'Tang poem, vertical layout');
// Switch the font into vertical mode; every TextOut below now stacks.
Pdf.CurrentPage.SetFont('Arial Unicode MS', [], 18, DEFAULT_CHARSET, True);
// Columns advance right to left, so X decreases with each call.
Pdf.CurrentPage.TextOut(520, ColTop, 0, '床前明月光');
Pdf.CurrentPage.TextOut(520 - ColGap, ColTop, 0, '疑是地上霜');
Pdf.CurrentPage.TextOut(520 - ColGap * 2, ColTop, 0, '舉頭望明月');
Pdf.CurrentPage.TextOut(520 - ColGap * 3, ColTop, 0, '低頭思故鄉');
Pdf.EndDoc;
finally
Pdf.Free;
end;
end;
Pjesma se čita kako treba: prvo krajnji desni stupac, odozgo prema dolje, zatim pogled skače lijevo na sljedeći stupac. Ništa u samom nizu ne kodira taj redoslijed. Vi ga kodirate u X koordinatama, smanjujući ih poziv po poziv. Ako pogriješite u smjeru, stih će izaći obrnut, što je najčešća pogreška pri prebacivanju horizontalnog rasporeda u vertikalni
Koordinate: niz stranicu, s desna na lijevo
U igri su dvije osi i one povlače u suprotnim smjerovima, stoga vrijedi biti precizan. HotPDF mjeri iz donjeg lijevog kuta stranice, pri čemu Y raste prema gore, u točkama (points). Vertikalni stupac, prema tome, započinje na visokom Y (blizu vrha lista) i znakovi se spuštaju od tamo dok HotPDF oduzima visinu linije za svaki od njih. Vi postavljate taj početni Y jednom po stupcu, a komponenta upravlja spuštanjem
Horizontalna os je ona kojom ručno upravljate. Svaki stupac nalazi se na vlastitom X, a uzastopni stupci koračaju prema manjim X vrijednostima jer se čita s desna na lijevo. Razuman ritam je odabrati X krajnjeg desnog stupca, a zatim oduzeti fiksni razmak između stupaca za svaki sljedeći poziv, kao što primjer radi s ColGap. Razmak birate sami; ako je preuzak, susjedni stupci se dodiruju, a ako je preširok, blok izgleda rijetko. Za tekst tijela (body text) na 12 do 18 točaka, razmak nešto veći od veličine fonta ugodan je za čitanje
Glifovi koji moraju promijeniti oblik
Nekoliko znakova nisu tek rotirane kopije njihovih horizontalnih verzija; moraju biti zamijenjeni kada tekst postane vertikalan. Onaj kojim HotPDF upravlja umjesto vas jest japanska oznaka produljenog zvuka ー (U+30FC), crtica za dugi samoglasnik koja se pojavljuje u katakana riječima kao što je コーヒー. Kada se crta horizontalno, to je kratka crtica na osnovnoj liniji. Da složite taj isti glif u stupac, on bi ležao popreko stupca, što je pogrešno: u vertikalnom japanskom, oznaka postaje vertikalna linija koja povezuje dva znaka između kojih se nalazi. HotPDF detektira U+30FC u vertikalnoj stazi i iscrtava ga kao vertikalnu traku (U+007C) tako da oznaka dugog samoglasnika pokazuje u pravom smjeru bez ikakvog posla s vaše strane
Ta jedna zamjena pokriva slučaj koji ruši većinu naivnih implementacija, ali vrijedi znati gdje općeniti problem postaje dublji. Puna vertikalna tipografija također rotira latinična slova i zapadnu interpunkciju za devedeset stupnjeva, pomiče malu kanu, te mijenja položaj zagrada i zareza u njihove vertikalne oblike, a potpuna implementacija toga nalazi se u OpenType vertikalnim značajkama fonta, a ne u fiksnim pravilima. HotPDF može koristiti te značajke kada ih font nosi: vertikalne alternative (značajke vert i vrt2 GSUB) i vertikalni kerning (GPOS pregledi vkrn i vpal) biraju se (opt-in), a primjenjuju se duž vertikalne staze samo kada ih aktivni font zapravo definira. Za mješoviti CJK tekst u jednom fontu široke pokrivenosti kao što je Arial Unicode MS, ugrađeno rukovanje znakom U+30FC uz ravnomjerni korak visine linije dovoljno je za stvaranje ispravnih, čitljivih stupaca; OpenType značajke važne su kada pređete na font dizajniran za fino vertikalno slaganje i želite njegovo nativno pozicioniranje kane i razmak između glifova
Miješanje pisama i orijentacija na jednoj stranici
Stvarni dokumenti su rijetko čisti. Vertikalna japanska stranica može nositi horizontalni engleski opis, broj stranice na dnu, ili blok korejskog teksta postavljen vertikalno pored japanskog. Budući da je vertikalna oznaka prekidač na razini fonta, te dokumente sastavljate izmjenom poziva SetFont umjesto da upravljate stanjem cijele stranice. Postavite horizontalni font, napišite zaglavlje i folio, postavite vertikalni font, položite stupce, i ponovno postavite horizontalni font za podnožje. Svaka regija preuzima način rada od posljednjeg SetFont, tako da je jedina potrebna disciplina da ga pozovete svaki put kada mijenjate smjer
Jedan detalj koji trebate isplanirati prilikom miješanja pisama: kineski, japanski i korejski ideogrami gotovo su kvadratni i slažu se s ravnomjernim korakom, ali latinični nizovi ugrađeni u vertikalni stupac nemaju taj ravnomjeran pomak (advance). Ako trebate nekoliko latiničnih riječi unutar inače vertikalnog teksta, namjerno odlučite hoće li one biti rotirane da teku prema dolje u stupcu ili postavljene uspravno kao kratki horizontalni umetak (inset), te pozicionirajte taj fragment vlastitim pozivom TextOut umjesto da ga pustite da prati vertikalni korak namijenjen ideogramima. Tretiranje mješovitog niza kao vlastitog problema s postavljanjem održava ritam stupca netaknutim
Od primjera do produkcije
Dijelovi su mali i slažu se predvidljivo. Uključite vertikalnu oznaku u SetFont, izdajte jedan TextOut po stupcu s fiksnog vrha Y i smanjujte X preko poziva tako da se stupci čitaju s desna na lijevo. Ugradite font kako bi CJK glifovi preživjeli put do čitateljevog uređaja i prepustite komponenti da obradi oznaku dugog samoglasnika U+30FC te, tamo gdje ih font podržava, OpenType vertikalne značajke. Od tog trenutka, priprema rasporeda za produkciju je većinom aritmetika: izvođenje X pozicija stupaca iz izmjerene širine bloka, lomljenje dugih odlomaka u stupce koji se uklapaju u visinu stranice i rezerviranje prostora za horizontalna zaglavlja i folija
Za širu površinu teksta i fontova na kojoj se ovo temelji, uključujući konvencije za horizontalni TextOut i registraciju Unicode fonta, pogledajte višejezični Hello World primjer i TextOut primjer. Ovdje prikazani SetFont vertikalni prekidač i pozivi TextOut dio su HotPDF komponente za Delphi i C++Builder