PDFlibPas provodi zadržani odlomak kroz jedan do 64 stupca jednake širine pomoću DrawTextFlowColumns, a njegove retke prelama ograničenim rastavljanjem riječi svjesnim jezika čim pozovete SetTextFlowLanguage i SetTextFlowHyphenation. Podržano je devet jezika, a jezik se može naslijediti iz vrijednosti kataloga dokumenta /Lang umjesto da se postavlja po pojedinom toku
Obje značajke postoje iz istog razloga: uzak stupac mjesto je na kojem naivno prelamanje redaka prestaje izgledati kao slog, a počinje izgledati kao prijava greške
Zašto se obostrano poravnati tekst raspada u uskim stupcima?
Zato što obostrano poravnanje raspoređuje preostali prostor u razmake između riječi u retku, a količina preostalog prostora ovisi o tome što stane. Kod široke mjere preostatak je malen i oko ga nikad ne primijeti. Prepolovite širinu i jedna duga riječ koja ne stane gura se u sljedeći redak, ostavljajući prethodnicima da upiju sav taj prostor. Tri takva retka zaredom proizvode okomite bijele kanale koje tipografi nazivaju rijekama, a čitatelji ih doživljavaju kao tekst koji je teško pratiti, ne znajući zašto
Rastavljanje riječi rješava uzrok umjesto simptoma tako što dopušta prijelom unutar riječi. Njemačke i nizozemske složenice čine to neupitnim: imenica od 24 znaka u stupcu širine 60 milimetara nema dobar ishod bez točke prijeloma. Engleski bolje podnosi izostanak, zbog čega proizvodi orijentirani prvenstveno na engleski jezik često isporučuju kod za raspored koji se sruši čim ga prvi put pokrene njemački kupac
Koji jezici, i odakle dolazi jezik?
Rastavljanje riječi pokriva engleski, njemački, nizozemski, francuski, španjolski, talijanski, portugalski, ruski i turski. Postavite ga eksplicitno po toku pomoću SetTextFlowLanguage, ili dopustite da se naslijedi iz stavke kataloga dokumenta /Lang, koju označen i pristupačan dokument već nosi
To nasljeđivanje vrijedi koristiti, a ne nadjačavati. Dokument koji svoj jezik deklarira u katalogu govori čitačima zaslona, indeksatorima pretrage i mehanizmu za rastavljanje riječi istu činjenicu s jednog mjesta, a jedno je mjesto ondje gdje činjenica treba živjeti. Ako već proizvodite označen izlaz kako je opisano u članku automatsko označavanje za pristupačne PDF-ove, stavka jezika je postavljena i tok je jednostavno može slijediti
var
Lib: TPDFlib;
Flow, Drawn: Integer;
begin
Lib := TPDFlib.Create;
try
Lib.SetOrigin(1);
Lib.AddTrueTypeFont('Georgia', 1);
Lib.SetTextSize(10.5);
Flow := Lib.NewTextFlow(ArticleBody);
try
Lib.SetTextFlowLanguage(Flow, 'de');
// Uključi, najmanje 3 znaka prije prijeloma, 3 nakon
Lib.SetTextFlowHyphenation(Flow, 1, 3, 3);
Lib.SetTextFlowMinLines(Flow, 2); // nikad ne ostavlja usamljeni redak
repeat
// Tri stupca preko regije od 480 pt, razmaci od 18 pt, uravnoteženo
Drawn := Lib.DrawTextFlowColumns(Flow, 72, 720, 480, 620, 3, 18, 1);
if (Drawn = 0) or (Lib.TextFlowFinished(Flow) = 1) then
Break;
Lib.NewPage;
until False;
finally
Lib.ReleaseTextFlow(Flow);
end;
Lib.SaveToFile('newsletter.pdf');
finally
Lib.Free;
end;
end;
MinPrefix i MinSuffix su tipografija, a ne validacija
Dva cijela broja nakon zastavice uključivanja postavljaju minimalan broj znakova koji mora ostati prije i nakon prijeloma. Tri i tri konzervativna je zadana vrijednost koju prihvaća većina internih stilova. Dva i dva proizvode više prilika za prijelom i primjetno ružnije rezultate, jer dvoslovni fragment koji visi na kraju retka djeluje kao tipfeler
Podignite minimume kada je pismo veliko, gdje je svaki fragment vizualno istaknut, a spustite ih samo kada je stupac istinski uzak i kada ste odlučili da je uska mjera važnija od uredne. Ovo je odluka internog stila, a ne tehnička odluka, i upravo je zato parametar, a ne konstanta
Što „uravnoteženo” ovdje zapravo znači?
Parametar Balance mijenja ponašanje samo na kraju odlomka. Kada je uravnoteženje uključeno, stupci se skraćuju na točno jednak broj redaka kada sve što preostaje stane unutar regije, što sprječava da posljednja stranica prikaže dva puna stupca i treći s jednim usamljenim retkom. Kada odlomak ne stane, svaki stupac zadržava punu visinu, tako da stranica nosi koliko god teksta može, a ostatak se nastavlja na sljedećoj stranici
Ta je asimetrija ispravna zadana vrijednost za kontinuirane dokumente. Uravnoteženje usred članka koji teče trošilo bi okomiti prostor na svakoj stranici radi kozmetičkog učinka koji nitko ne vidi, budući da su stupci ionako puni. Uravnoteženje na kraju mjesto je na kojem oko to stvarno primijeti, i upravo se ondje primjenjuje
Prelamanje redaka mjeri cijele riječi
Algoritam prelamanja mjeri cijele riječi umjesto akumuliranja širina znakova, a rezervira ograničenu pretragu za preveliku znakovnu jedinicu koja uopće ne stane u redak, poput URL-a ili broja pristupnice. To uobičajen slučaj drži brzim, a patološki slučaj ograničenim, umjesto obrnuto
Neobavezne meke spojnice i automatske spojnice iscrtavaju se samo kada je prijelom koji označavaju upravo onaj prijelom koji je odabran. To zvuči očito, a klasična je greška: naivna implementacija zapisuje znak spojnice tijekom mjerenja, a ako se prijelom pomakne, spojnica ostaje zaostala usred retka. Ništa ne izgleda više kao pokvaren mehanizam za tekst nego zalutala spojnica usred riječi
var
Lib: TPDFlib;
Flow, Needed: Integer;
begin
// Odlučite raspored prije nego što bilo što nacrtate
Flow := Lib.NewTextFlow(ArticleBody);
try
Lib.SetTextFlowLanguage(Flow, 'fr');
Lib.SetTextFlowHyphenation(Flow, 1, 3, 3);
// Broj redaka koji ostatku odlomka treba pri širini jednog stupca
Needed := Lib.MeasureTextFlow(Flow, 148);
if Needed > 3 * LinesPerColumn then
UseTwoPageSpread
else
UseSinglePage;
Lib.DrawTextFlowColumns(Flow, 72, 720, 480, 620, 3, 18, 1);
if Lib.TextFlowFinished(Flow) <> 1 then
CarryOver(Lib.GetTextFlowRemaining(Flow));
finally
Lib.ReleaseTextFlow(Flow);
end;
end;
Držite postavke fonta identičnima kroz sve okvire
Jedno pravilo vlada svakim rasporedom temeljenim na toku, i vrijedi ga izreći izravno: DrawTextFlow, DrawTextFlowColumns i MeasureTextFlow svi prelamaju retke koristeći font odabran u trenutku poziva. Promijenite font ili veličinu između dva okvira istog toka, ili započnite novu stranicu bez ponovnog odabira fonta, i drugi će se okvir prelomiti drugačije od onoga što je izmjerio prvi
Simptom je frustrirajuć upravo zato što izgleda povremeno: tekst koji stane na prvu stranicu prelijeva se na drugoj, ili se izmjeren broj redaka ne slaže s onim što je nacrtano. Odaberite font jednom prije petlje, ponovno ga odaberite nakon svakog NewPage, i tok će se ponašati ispravno. Kada se u istom odlomku pojave mješovita pisma, rješenje opisano u članku automatski fallback fontova za CJK i emoji tekst primjenjuje se i na mjerenje i na crtanje, tako da širine ostaju dosljedne i kroz fallback dijelove
Za rasporede izvještaja gdje je tok samo jedan element među zaglavljima, podnožjima i blokovima temeljenim na podacima, obrasci kompozicije u članku mehanizam za izvještaje temeljene na skupu podataka čisto se kombiniraju s tokovima stupaca: prvo izmjerite, postavite fiksne elemente, a zatim toku dajte koja god regija preostane
PDFlibPas je PDF biblioteka za Delphi, C++Builder i Lazarus, a cijeli životni ciklus TextFlow-a, stvaranje, crtanje, mjerenje, inspekcija, premotavanje i oslobađanje, izložen je i kroz DLL i ActiveX sučelja. Potpuna dokumentacija nalazi se na stranici PDFlibPas Delphi PDF biblioteke