Discussion:
book/memoir; wdowy sieroty; \paraskip i \lineskip problem.
(Wiadomość utworzona zbyt dawno temu. Odpowiedź niemożliwa.)
Tyler Durden
2011-05-05 01:41:12 UTC
Permalink
Problem dotyczy zwalczania wdów i sierot w klasie book/memoir oraz
parametrów \paraskip i \lineskip.

Deklarujemy:
\widowpenalty=10000
\clubpenalty=10000

Czyli bez wdów i sierot.

Pojawia się problem bo samotna linia z dołu strony zostaje przerzucona
na stronę kolejną i niniejszym nasza strona jest o linie krótsza.
LaTeX zamiast to jakoś sensownie wycentrować rozsuwając wszystko,
rozsuwa tylko paragrafy co jest nie do przyjęcia, zresztą w ogóle nie
chce żadnych dodatkowych odstępów między paragrafami. No to:

\setlength{\parskip}{0pt}

Text jest teraz równo rozłożony - nie ma dodatkowego pustego miejsca
miedzy paragrafami ale jedna strona jest o linię krótsza u dołu co
razi. Chcę żeby tekst został RÓWNO rozsunięty przez zwiększenie
interlinii na całym obszarze pola tekstowego.
No to:

\setlength{\lineskip}{4pt plus 0.2pt minus 0.2pt}
\lineskiplimit=\baselineskip

I... qpa! Jest nieco lepiej niż było ale nadal źle. Linie zostają
rozsunięte ale LaTeX wręcz złośliwie nie chce tego zrobić równo. Jakby
nie kombinować parametrami na 30-32 liniowej stronie ZAWSZE, z uporem
maniaka, zostawi jedną, a czasem dwie, linie wizualnie różniące się
interlinią od reszty. Najczęściej jest to jednolinijkowy paragraf -
rozsunie dobrze wszystkie duże paragrafy na stronie a mały,
jednolinijkowy (jeden z kilku - pozostałe "zrobi" dobrze), pomiędzy
nimi zostawi krzywo - zazwyczaj optycznie z większym odstępem od
paragrafu pod nim i mniejszym do tego nad nim. Opadają mi już ręce,
powiem szczerze.

Co z tym fantem zrobić? Jest jakiś kniff by linie na stronie były
WSZYSTKIE, bez względu na to czy są to linie wewnątrz paragrafu czy
pojedyncza linia tworząca krótki paragraf RÓWNO rozstrzelone?! Jakaś
klasa, makro, cokolwiek?! Jakiś inny patent na wdowy i sieroty?!

Help plz...

(BTW: złożył może ktoś profesjonalnie książke w LaTeX i mógłby się
zliltować i udostępnić template?! na necie jest milion templatów do
wszystkiego tylko nie do książek...pociąć się można)
Jarosław Sokołowski
2011-05-05 12:34:20 UTC
Permalink
Post by Tyler Durden
Co z tym fantem zrobić? Jest jakiś kniff by linie na stronie były
WSZYSTKIE, bez względu na to czy są to linie wewnątrz paragrafu czy
pojedyncza linia tworząca krótki paragraf RÓWNO rozstrzelone?! Jakaś
klasa, makro, cokolwiek?!
\parskip0pt \advance\baselineskip 0pt plus 0.1pt -- tak sobie z głupia
frant napisałem i nie mogę dopatrzeć się różnic w odstępach. Może coś
źle robię (albo krzywo patrzę)?
Post by Tyler Durden
Jakiś inny patent na wdowy i sieroty?!
Zanim się dojdzie do rozwiązań ostatecznych, czyli równego rozstrzeliwania
wdów i sierot, można chwilkę poświęcić na próby zmiany długości akapitów
(za pomocą \looseness).
Post by Tyler Durden
(BTW: złożył może ktoś profesjonalnie książke w LaTeX
Eee... gdzieżby tam profesjonalnie. W TeXu to sami amatorzy składają.
--
Jarek
Tyler Durden
2011-05-05 13:32:18 UTC
Permalink
Dzięki za odpowiedź
\parskip0pt \advance\baselineskip 0pt plus 0.1pt  -- tak sobie z głupia
frant napisałem i nie mogę dopatrzeć się różnic w odstępach. Może coś
źle robię (albo krzywo patrzę)?
Jestem początkujący, może coś źle robię?

Wpisuję:
\setlength{\parskip}{0pt}
\advance\baselineskip 0pt plus 0.1pt

Nie działa. Tzn działa, ale nie daje tego efektu o jaki mi chodzi:
owszem linie tekstu są względem siebie równo rozłożone (tyle miałem
już wcześniej) ale jeśli jedna strona ma 32 linie a sąsiednia 31 to na
dole tej 31-linijkowej zostawia po prostu pustą linie... a ja chcę
żeby jej pole tekstowe było w pełni wypełnione by optycznie nie było
widać różnicy. Zwiększenie wartości z 0.1pt nie wydaje się dawać
żadnej różnicy?
Post by Tyler Durden
Jakiś inny patent na wdowy i sieroty?!
Zanim się dojdzie do rozwiązań ostatecznych, czyli równego rozstrzeliwania
wdów i sierot, można chwilkę poświęcić na próby zmiany długości akapitów
(za pomocą \looseness).
Raczej odpada, niestety. W tekście jest sporo dialogów lub krótkich
akapitów które przy zadanej wielkości papieru, pola tekstowego i
czcionki mają po 2-3 linie... używając \looseness czy zmieniając
kerning więcej bym pewnie popsuł niż poprawił, dodatkowo zajęło by mi
to wieki całe... Z różnych złych możliwości, to by nie było wdów i
sierot a by strony czasem różniły się długością jednej linii wydaje mi
się najbardziej do przyjęcia... tylko żeby ten diabelski LaTeX raczył
rozłożyć ten tekst RÓWNO zwiększając interlinię na stronie na której
jest mniej linii... więcej mi do szczęścia nie potrzeba... Wydaje mi
się że to powinno być banalne, nie wiem czemu nie chce zadziałać.. :(
Jarosław Sokołowski
2011-05-05 14:22:14 UTC
Permalink
Post by Tyler Durden
\parskip0pt \advance\baselineskip 0pt plus 0.1pt  -- tak sobie z głupia
frant napisałem i nie mogę dopatrzeć się różnic w odstępach. Może coś
źle robię (albo krzywo patrzę)?
Jestem początkujący, może coś źle robię?
Ja LaTeXa nie używam (prawie) wcale, więc szanse mamy wyrównane.
Post by Tyler Durden
\setlength{\parskip}{0pt}
\advance\baselineskip 0pt plus 0.1pt
owszem linie tekstu są względem siebie równo rozłożone (tyle miałem
już wcześniej) ale jeśli jedna strona ma 32 linie a sąsiednia 31 to
na dole tej 31-linijkowej zostawia po prostu pustą linie...
A jeśli ma, powiedzmy, 30 albo 29? Eksperymentalne postawienie "\break"
w miejscu gdzie ma nastąpić przejście do następnej strony powinno to
wyjaśnić.
Post by Tyler Durden
a ja chcę żeby jej pole tekstowe było w pełni wypełnione by optycznie
nie było widać różnicy. Zwiększenie wartości z 0.1pt nie wydaje się
dawać żadnej różnicy?
Domyślam się, że problem nie leży w kleju międzywierszowym, a w tym,
co \output dodaje na zakończenie każdej strony. Normalnie do sterowania
tym dodatkiem służą polecenia \raggedbottom i \normalbottom. Polecenia
te zdaje się działają również w LaTeXu, ale nie wiem czy tak samo, bo
procedury \output zostały tam mocno zmienione.
Post by Tyler Durden
Post by Tyler Durden
Jakiś inny patent na wdowy i sieroty?!
Zanim się dojdzie do rozwiązań ostatecznych, czyli równego rozstrzeliwania
wdów i sierot, można chwilkę poświęcić na próby zmiany długości akapitów
(za pomocą \looseness).
Raczej odpada, niestety. W tekście jest sporo dialogów lub krótkich
akapitów które przy zadanej wielkości papieru, pola tekstowego i
czcionki mają po 2-3 linie... używając \looseness czy zmieniając
kerning więcej bym pewnie popsuł niż poprawił,
\looseness niczego nie psuje, zmiana świateł międzywyrazowych odbywa
się w granicach dopuszczonych przez inne parametry. Jeśli nie potrafi
zmienić długości składu akapitu bez przekraczania norm, po prostu nie
zrobi nic.

Przy okazji taka ciekawostka -- może się zdarzyć, że dopisanie czegoś
do akapitu spowoduje skrócenie składu o jeden wiersz, a usunięcie
czegoś -- wydłużenie.
--
Jarek
Tyler Durden
2011-05-05 15:49:15 UTC
Permalink
Post by Jarosław Sokołowski
A jeśli ma, powiedzmy, 30 albo 29? Eksperymentalne postawienie "\break"
w miejscu gdzie ma nastąpić przejście do następnej strony powinno to
wyjaśnić.
Właśnie o to chodzi by nie wstawiać przejścia do nowej strony ręcznie
za każdym razem.
Przy wpisaniu:
\setlength{\lineskip}{4pt plus 0.2pt minus 0.2pt}
\lineskiplimit=\baselineskip
linia powinna moim zdaniem zostać albo odjęta albo dodana (i tak też
się dzieje) i różnica między stronami nigdy nie będzie większa niż 1
linia; jeśli przy normalnym, pełnym wypełnieniu jest 31 linii, to
zwalczając wdowy i sieroty LaTeX może zrobić 32 lub 30 linii w
zależności od sytuacji, ale jeśli zostaną one równo rozłożone na całą
wysokość pola tekstowego to optycznie nie powinno być to widoczne.
Tylko jak napisałem w pierwszym poście - wydaje mi się że
zadeklarowałem to poprawnie a nie chce to z jakiegoś powodu zadziałać
jak trzeba (interlinie nie są wszędzie równe) i nie mogę dojść
dlaczego.
Post by Jarosław Sokołowski
Domyślam się, że problem nie leży w kleju międzywierszowym, a w tym,
co \output dodaje na zakończenie każdej strony. Normalnie do sterowania
tym dodatkiem służą polecenia \raggedbottom i \normalbottom. Polecenia
te zdaje się działają również w LaTeXu, ale nie wiem czy tak samo, bo
procedury \output zostały tam mocno zmienione.
Nie wiem, dół jest OK, wygląda właśnie jakby z tym klejem było coś nie
tak.
Post by Jarosław Sokołowski
\looseness niczego nie psuje, zmiana świateł międzywyrazowych odbywa
się w granicach dopuszczonych przez inne parametry. Jeśli nie potrafi
zmienić długości składu akapitu bez przekraczania norm, po prostu nie
zrobi nic.
Może spróbuję - ale tak czy inaczej chciałbym dojść co jest nie tak i
czemu "mój sposób" nie działa i jak to poprawić, lub jak uzyskać taki
efekt innym sposobem.
Krzysztof Bieniasz
2011-05-05 17:09:08 UTC
Permalink
Post by Tyler Durden
Dzięki za odpowiedź
\parskip0pt \advance\baselineskip 0pt plus 0.1pt  -- tak sobie z głupia
frant napisałem i nie mogę dopatrzeć się różnic w odstępach. Może coś
źle robię (albo krzywo patrzę)?
Jestem początkujący, może coś źle robię?
\setlength{\parskip}{0pt}
\advance\baselineskip 0pt plus 0.1pt
owszem linie tekstu są względem siebie równo rozłożone (tyle miałem już
wcześniej) ale jeśli jedna strona ma 32 linie a sąsiednia 31 to na dole
tej 31-linijkowej zostawia po prostu pustą linie... a ja chcę żeby jej
pole tekstowe było w pełni wypełnione by optycznie nie było widać
różnicy. Zwiększenie wartości z 0.1pt nie wydaje się dawać żadnej
różnicy?
Nie jestem pewien, czy dobrze rozumiem, ale i tak coś zaproponuję.
Spróbuj wstawić \flushbottom gdzieś na początku. To polecenie rozsuwa
nieco linijki tekstu, żeby wypełniać strony do samego dołu. O ile
rozumiem, to jest domyślnie włączone w klasie book LaTeXa. Jeśli nie
o to chodzi to przepraszam, że się wtrącam.

Pozdrawiam,
KTB
Jarosław Sokołowski
2011-05-05 21:38:33 UTC
Permalink
Pan Krzysztof Bieniasz nie jest pewien, czy dobrze rozumie,
Post by Krzysztof Bieniasz
Spróbuj wstawić \flushbottom gdzieś na początku.
Bardzo słuszna rada.
Post by Krzysztof Bieniasz
To polecenie rozsuwa nieco linijki tekstu, żeby wypełniać strony
do samego dołu.
Nie tyle rozsuwa, co umożliwia rozsuwanie. A jeszcze dokładniej --
uniemożliwia dodanie światła po ostatnim wierszu na stronie. Czyli
odwrotnie niż \raggedbottom. LaTeXowe \flushbottom robi mniej więcej
to samo, co wsponiane wcześniej plainowe \normalbottom.
Post by Krzysztof Bieniasz
O ile rozumiem, to jest domyślnie włączone w klasie book LaTeXa.
W pliku book.cls (na samym końcu) jest:

\***@twoside
\else
\raggedbottom
\fi

Czyli książka drukowana obustronnie ma strony wyrównane od dołu,
a jednostronnie -- nie.
Post by Krzysztof Bieniasz
Jeśli nie o to chodzi to przepraszam, że się wtrącam.
Ależ nie ma za co, proszę bardzo.
--
Jarek
Tyler Durden
2011-05-06 01:07:42 UTC
Permalink
Oka, dzięki za rady, Panowie.

\flushbottom jest chyba domyślnie włączone i w memoir i w standardowym
book - dopisałem na wszelki wypadek, ale nic nie dało.

Olewam sprawę - szkoda nerwów, myślałem że uda mi się zrobić fajny
szablon, który zautomatyzuje wiele rzeczy, ale albo jestem za cienki,
albo "to se ne da" jak mawiają bracia czesi - i chyba jednak to
drugie, bo gdyby dało się to łatwo zautomatyzować to sztuka składania
tekstów nie byłaby sztuką :)

Jarosław miał racje - podchodziłem jak do jeża do tego "\looseness=1"
- ale to działa całkiem dobrze, jeśli tylko wybrać odpowiedni
paragraf. Będę używał tej metody - sporo ręcznego "chrzanienia się"
ale efekt całkiem niezły (skład wygląda profesjonalnie), no i
wszystkie strony (prócz tych otwierających i zamykających rozdział)
mają jednakową ilość linii.

Jeszcze raz dzienks!
Jarosław Sokołowski
2011-05-06 15:49:14 UTC
Permalink
Post by Tyler Durden
Jarosław miał racje - podchodziłem jak do jeża do tego "\looseness=1"
- ale to działa całkiem dobrze, jeśli tylko wybrać odpowiedni
paragraf. Będę używał tej metody - sporo ręcznego "chrzanienia się"
ale efekt całkiem niezły (skład wygląda profesjonalnie),
Jeśli wybrać paragraf nieodpowiedni, to też działa całkiem dobrze.
Czyli nie działa wcale. W związku z tym może być tak, że najmniej
chrzanienia się jest wtedy, gdy piszemy w odpowiednich miejscach
"\everypar{\looseness=1}", "\everypar{\looseness=-1}" albo
"\everypar{\looseness=0}", najpepiej zdefiniowawszy sobie wcześniej
te zaklęcia. Definicja może być choćby taka:

\def\p#1{%
\ifx#1- \everypar{\looseness=-1}\fi
\ifx#1= \everypar{\looseness=0}\fi
\ifx#1+ \everypar{\looseness=1}\fi
}

Stosowana późnej jako \p-, \p+ albo \p=.

Jarek

PS
Przepraszam, że dla tej definicji nie stworzyłem specjalnego repozytorium.
Ale ja jestem bezdyskusyjnie leniwy, nie chciało mi się.
--
Złapałem se jeża, do kiesznim schował,
Oj, com się sukinsyna potem nawyjmował
Tyler Durden
2011-05-06 16:26:39 UTC
Permalink
Hej,
Je li wybra paragraf nieodpowiedni, to te dzia a ca kiem dobrze.
Czyli nie dzia a wcale. W zwi zku z tym mo e by tak, e najmniej
chrzanienia si jest wtedy, gdy piszemy w odpowiednich miejscach
"\everypar{\looseness=1}", "\everypar{\looseness=-1}" albo
"\everypar{\looseness=0}", najpepiej zdefiniowawszy sobie wcze niej
Właśnie nie jest tak - przynajmniej u mnie - że działa zawsze dobrze,
a jak nie może to nie działa - być może dlatego, że składam z
parametrem "\sloppy".

\looseness=-1 nie działa mi w ogóle albo praktycznie w ogóle - akapity
są na tyle zbite, że w 99% przypadków latex nie jest w stanie ścieśnić
ich już bardziej.

\looseness=1 działa prawie zawsze, ale różnice są optycznie widoczne -
na niektórych akapitach "przegina" i robi za duże odstępy
międzywyrazowe. Paradoksalnie czasem lepiej zastosować go na jedno-dwu
linijkowym niż na takim na pół strony. (w "zbitym" jednolinijkowym
podzieli czasem ostatni wyraz, przerzuci do następnej linii końcówkę,
tyle by zakryło wcięcie akapitowe, i optycznie jest ok, może nie jest
to najelegantsze rozwiązanie, ale przekartkowałem kilka wybranych na
chybił trafił książek i niemal w każdej jest właśnie coś takiego
stosowane - tak mi się przynajmniej wydaje)

W sumie jak napisałem - jeśli wybrać odpowiedni akapit to jest ok i
optycznie wygląda to bardzo ładnie, a przynajmniej ja nie widzę
różnicy w odstępach. W ramach dążenia do perfekcji zastanowię się
jeszcze czy by nie przymieszać kerningiem...
Jarosław Sokołowski
2011-05-06 17:22:24 UTC
Permalink
Post by Tyler Durden
Je li wybra paragraf nieodpowiedni, to te dzia a ca kiem dobrze.
Czyli nie dzia a wcale. W zwi zku z tym mo e by tak, e najmniej
chrzanienia si jest wtedy, gdy piszemy w odpowiednich miejscach
"\everypar{\looseness=1}", "\everypar{\looseness=-1}" albo
"\everypar{\looseness=0}", najpepiej zdefiniowawszy sobie wcze niej
Właśnie nie jest tak - przynajmniej u mnie - że działa zawsze dobrze,
a jak nie może to nie działa - być może dlatego, że składam z
parametrem "\sloppy".
Właśnie to nazwałem "całkiem dobrym działaniem" -- nie może, to nie
robi nic. I tak być powinno.
Post by Tyler Durden
\looseness=-1 nie działa mi w ogóle albo praktycznie w ogóle - akapity
są na tyle zbite, że w 99% przypadków latex nie jest w stanie ścieśnić
ich już bardziej.
Procentów nie liczyłem, ale to wynika z faktu, że odstęp międzywyrazowy
ma w foncie zwykle zadeklarowaną większą rozciągliwość niż kurczliwość.
Ponadto jeśli dopuścimy większą tolerancję, to wtedy rozciągać można
w nieskończoność (czyli aż do szerokości składu), a zacieśnieć najwyżej
do zera.

Można oczywiście zadeklarowac karykaturalnie zmieniony odstęp, w rodzaju
"\spaceskip 40pt plus 0.1pt minus 35pt" i zobaczyć, że "\looseness"
zadziała nawet z parametrem -10, a będzie miał trudności z niewielkimi
dodatnimi parametrami.
Post by Tyler Durden
\looseness=1 działa prawie zawsze, ale różnice są optycznie widoczne -
na niektórych akapitach "przegina" i robi za duże odstępy międzywyrazowe.
Skłonność do przeginania można ograniczyć zminiejszając \tolerance.
Proszę zauważyć, że przegięcia są całkiem niezależne od \looseness
-- te duże odstępy mogą pojawić się również w innych akapitach.
Post by Tyler Durden
Paradoksalnie czasem lepiej zastosować go na jedno-dwu linijkowym niż
na takim na pół strony.
Może być lepiej, może być gorzej. I chyba nie ma co zgadywać, lepiej
spróbować. Czasem trzeba jeszcze wskazać miejsca przeniesienia wyrazów,
które nie zostały znalezione przez "hyphen.tex".
Post by Tyler Durden
W ramach dążenia do perfekcji zastanowię się jeszcze czy by nie
przymieszać kerningiem...
O nie, to zdecydowanie kiepski pomysł, a nie żadna perfekcja. Zmienny
kerning w foncie może być najwyżej traktowany jako półśrodek. Tak
postępowały systemy składu, które składały wiersz po wierszu, a nie
od razu cały akapit, jak to robi TeX. Zecerzy gazetowi też tak
postępowali, bo nie było czasu na co innego. Ci od książek, raczej nie.

Swoją drogą ciekawe, że przez tyle lat w systemach DTP odchodziło aż
takie dziadostwo. Dopiero twórcy inDesign zdecydowali się na skopiowanie
in extenso algorytmu podziału akapitu na wiersze z TeXa. Poprzednicy
wstydzili się brać z darmowego, czy co? Podobnie było z algorytmem
Lianga do wyznaczania miejsc przeniesień wyrazów. Minęło z dziesięć lat,
zanim w końcu go użyto poza TeXem (a nikt wcześniej niczego mądrego
w zamian nie wymyślił).
--
Jarek
Michal Jankowski
2011-05-06 08:48:55 UTC
Permalink
Post by Jarosław Sokołowski
Czyli książka drukowana obustronnie ma strony wyrównane od dołu,
A teraz przyjdzie gajowy Marucha i zażąda złożenia książki z
zachowaniem registru.

8-)

MJ
Jarosław Sokołowski
2011-05-06 15:42:58 UTC
Permalink
Ten wpis może być nieodpowiedni. Kliknij, aby go wyświetlić.
AMX
2011-05-06 19:11:01 UTC
Permalink
On Fri, 6 May 2011 15:42:58 +0000 (UTC),
Post by Jarosław Sokołowski
Z TeXa jest dobry zecer, ale metrampaż słaby (to taki gościu, co się
zajmował rozkładaniem zecerskiej roboty na strony). Knuth zdawał sobie
z tego sprawę w trakcie pisania systemu, ale wiedział, że pamięć
komputerów dostąpna w tamtych czasach na takie rzeczy nie pozwalała.
Idealnym rozwiązaniem by było zastosowanie algorytmu dzielącego akapit
na wiersze do podziału wierszy na strony.
Funkcję kary?
Post by Jarosław Sokołowski
Plus dodatkowe oddziaływanie
zwrotne na \looseness.
Chyba w oddziaływaniu zwrotnym jest cały pies pogrzebany.
Dlaczego akurat na \looseness? Chyba jest trochę więcej
możliwości?
Post by Jarosław Sokołowski
Na to jednak jest już za późno.
Dlaczego?


Od dawna mnie zastanawiało, dlaczego algorytm łamania stron
pozostał z czasów prehistorycznych.

A skoro temat wypłynął, więc chętnie bym się dowiedział czegoś
więcej.


AMX
--
adres w rot13
Nyrxfnaqre Znghfmnx r-***@b2.cy
Jarosław Sokołowski
2011-05-06 20:13:07 UTC
Permalink
Post by AMX
Post by Jarosław Sokołowski
Idealnym rozwiązaniem by było zastosowanie algorytmu dzielącego
akapit na wiersze do podziału wierszy na strony.
Funkcję kary?
Kara to tylko element systemu -- miara, którą posługuje się algorytm.
Istotą jest całościowe spojrzenie na dzielony obiekt. Prymitywne
systemy składaja akapit w ten sposób, że zaczynaja od pierwszej
linijki, dokładają kolejne wyrazy (lub ich niepodzielne części),
a gdy dojdą do elementu, który się nie mieści, przerzucają go do
następnego wiersza. I tak składają kolejne linijki aż się nie skończy
akapit. TeX rozpatruje cały akapit na raz i ze wszystkich potencjalnych
miejsc podziału na wiersze wybiera takie, dla których suma kar za
zwiększenie lub zmniejszenie odstępu międzywyrazowaego będzie
najmniejsza. Karane mogą być też inne przewinienia, na przykład
przeniesienie słowa. Oprócz karania, można też nagradzać -- zamiast
kijem można podziałać marchewką (ujemne \penalty) i nagrodzić podział
w preferowanych miejscach.

Podział na strony w TeXu jest bardziej prymitywny. Funkcja kary też
istnieje, ale procesor widzi tylko bieżącą stronę, i jak już ją wypchnie
przez \output, to nie ma do niej powrotu.
Post by AMX
Post by Jarosław Sokołowski
Plus dodatkowe oddziaływanie zwrotne na \looseness.
Chyba w oddziaływaniu zwrotnym jest cały pies pogrzebany.
Dlaczego akurat na \looseness? Chyba jest trochę więcej
możliwości?
Napisałem \looseness, bo akurat o tym była mowa. A teraz się nad tym
zastanawia i nic innego mi do głowy nie przychodzi. Algorytm podziału
na wiersze korzysta z pojęcia kleju poziomego -- tu dla odmiany mamy
klej pionowy. System kija i marchewki w obu przypadkach jest jednaki.
Pudełka składające się na akapit mają stałą długość, a tu *dodatkowo*
możemy zmienić liczbę wierszy w akapicie -- właśnie przez \looseness.
Innych pomysłów na wsteczną modyfikację nie mam.
Post by AMX
Post by Jarosław Sokołowski
Na to jednak jest już za późno.
Dlaczego?
To wynika z warunku zbieżności funkcji monotonicznej. Funkcja opisująca
numer wersji programu musi być niemalejąca (w czasie). Wiadomo też, że
wersja TeXa jest zbieżna do $\pi$. Jej aktualna wartość, to 3.141592,
oznaczmy ją jako $V_t$. Rozpatrzmy $\epsilon = \pi - V_t$. Wartość
$\epsilon$ rzędu 0.000000653589 nie jest wystarczająca do przeprowadzenia
tak rewolucyjnej zmiany.
Post by AMX
Od dawna mnie zastanawiało, dlaczego algorytm łamania stron pozostał
z czasów prehistorycznych.
Z czasów (nie tak odległych), gdy pomysły umieszczenia całej książki
na raz w pamięci operacyjnej komputera wydawały się nieodpowiedzialne.
Dlatego właśnie (co napisałem wyżej).
Post by AMX
A skoro temat wypłynął, więc chętnie bym się dowiedział czegoś więcej.
Ja mam tak samo. To chyba zdrowy objaw.

Jarek
--
Jest już za późno!
Nie jest za późno!
Jest już za późno!
Nie jest za późno!
AMX
2011-05-06 20:50:00 UTC
Permalink
On Fri, 6 May 2011 20:13:07 +0000 (UTC),
Post by Jarosław Sokołowski
Post by AMX
Post by Jarosław Sokołowski
Idealnym rozwiązaniem by było zastosowanie algorytmu dzielącego
akapit na wiersze do podziału wierszy na strony.
Funkcję kary?
Kara to tylko element systemu -- miara, którą posługuje się algorytm.
Istotą jest całościowe spojrzenie na dzielony obiekt. Prymitywne
systemy składaja akapit w ten sposób, że zaczynaja od pierwszej
linijki, dokładają kolejne wyrazy (lub ich niepodzielne części),
a gdy dojdą do elementu, który się nie mieści, przerzucają go do
następnego wiersza. I tak składają kolejne linijki aż się nie skończy
akapit. TeX rozpatruje cały akapit na raz i ze wszystkich potencjalnych
miejsc podziału na wiersze wybiera takie, dla których suma kar za
zwiększenie lub zmniejszenie odstępu międzywyrazowaego będzie
najmniejsza. Karane mogą być też inne przewinienia, na przykład
przeniesienie słowa. Oprócz karania, można też nagradzać -- zamiast
kijem można podziałać marchewką (ujemne \penalty) i nagrodzić podział
w preferowanych miejscach.
Podział na strony w TeXu jest bardziej prymitywny. Funkcja kary też
istnieje, ale procesor widzi tylko bieżącą stronę, i jak już ją wypchnie
przez \output, to nie ma do niej powrotu.
Czyli w zasadzie albo wszystko trzymamy w pamięci albo algorytm
składania jest wieloprzebiegowy. Sam nie wiem co byłoby lepsze.
Post by Jarosław Sokołowski
Post by AMX
Post by Jarosław Sokołowski
Plus dodatkowe oddziaływanie zwrotne na \looseness.
Chyba w oddziaływaniu zwrotnym jest cały pies pogrzebany.
Dlaczego akurat na \looseness? Chyba jest trochę więcej
możliwości?
Napisałem \looseness, bo akurat o tym była mowa. A teraz się nad tym
zastanawia i nic innego mi do głowy nie przychodzi. Algorytm podziału
na wiersze korzysta z pojęcia kleju poziomego -- tu dla odmiany mamy
klej pionowy. System kija i marchewki w obu przypadkach jest jednaki.
Pudełka składające się na akapit mają stałą długość, a tu *dodatkowo*
możemy zmienić liczbę wierszy w akapicie -- właśnie przez \looseness.
Innych pomysłów na wsteczną modyfikację nie mam.
Teoretyzując, (bo szczegółów życia wewnętrznego TeXa nie znam)
można zwiększyć/zmniejszyć odstępy międzywierszowe. To mogłoby
być niedobre przy składzie dwustronnym, jeśli na kolejnych
stronach byłyby różne ale nie powinno być globalnie tak
uciążliwe.


Można ciaśniej/luźniej składać same akapity. Tu jest ewidentna
interakcja składu strony i linii. No i duży problem z doborem
mnożnika między jedną wartością kary i drugą.

Chyba innych pomysłów nie mam...
Post by Jarosław Sokołowski
Post by AMX
Post by Jarosław Sokołowski
Na to jednak jest już za późno.
Dlaczego?
To wynika z warunku zbieżności funkcji monotonicznej. Funkcja opisująca
numer wersji programu musi być niemalejąca (w czasie). Wiadomo też, że
wersja TeXa jest zbieżna do $\pi$. Jej aktualna wartość, to 3.141592,
oznaczmy ją jako $V_t$. Rozpatrzmy $\epsilon = \pi - V_t$. Wartość
$\epsilon$ rzędu 0.000000653589 nie jest wystarczająca do przeprowadzenia
tak rewolucyjnej zmiany.
No, to już kwestia czysto TeXniczna. System nie musi (a nawet nie
mógłby) się nazywać TeX. Na razie nie bardzo jestem sobie w
stanie wyobrazić algorytm łamania stron. A do tego trzeba by
najpierw sprawdzić, że jest lepszy niż to, co w tej chwili jest w
TeXu.

Pozdrawiam serdecznie

max
--
adres w rot13
Nyrxfnaqre Znghfmnx r-***@b2.cy
Jarosław Sokołowski
2011-05-06 21:32:37 UTC
Permalink
Post by AMX
Post by Jarosław Sokołowski
Podział na strony w TeXu jest bardziej prymitywny. Funkcja kary
też istnieje, ale procesor widzi tylko bieżącą stronę, i jak już
ją wypchnie przez \output, to nie ma do niej powrotu.
Czyli w zasadzie albo wszystko trzymamy w pamięci albo algorytm
składania jest wieloprzebiegowy. Sam nie wiem co byłoby lepsze.
Pewnie lepiej by było w pamięci, zwałaszcza że jest do tego algorytm,
który można zaadaptować. Ale wieloprzebiegowością też można się
podeprzeć -- daltego wysunąłem hipotezę, że może to dać niezłe
rezultaty. Tylko czy komuś będzie się chciało ją sprawdzić?
Post by AMX
Post by Jarosław Sokołowski
Post by AMX
Post by Jarosław Sokołowski
Plus dodatkowe oddziaływanie zwrotne na \looseness.
Chyba w oddziaływaniu zwrotnym jest cały pies pogrzebany.
Dlaczego akurat na \looseness? Chyba jest trochę więcej
możliwości?
Napisałem \looseness, bo akurat o tym była mowa. A teraz się nad tym
zastanawia i nic innego mi do głowy nie przychodzi. Algorytm podziału
na wiersze korzysta z pojęcia kleju poziomego -- tu dla odmiany mamy
klej pionowy. System kija i marchewki w obu przypadkach jest jednaki.
Pudełka składające się na akapit mają stałą długość, a tu *dodatkowo*
możemy zmienić liczbę wierszy w akapicie -- właśnie przez \looseness.
Innych pomysłów na wsteczną modyfikację nie mam.
Teoretyzując, (bo szczegółów życia wewnętrznego TeXa nie znam)
można zwiększyć/zmniejszyć odstępy międzywierszowe. To mogłoby
być niedobre przy składzie dwustronnym, jeśli na kolejnych
stronach byłyby różne ale nie powinno być globalnie tak uciążliwe.
To przecież jest -- \baselineskip może przybierać wartości elastyczne.
Teraz do mnie dotarło, że przy dobrym algorytmie, to by mogło być
*dobre* też do składu dwustronnego. System by musiał mieć baczenie na
to, aby po obu stronach kartki składanie odbyło się wedle tego samego
registru. Wtedy to nawet Michał Jankowski z gajowym Maruchą by nie
mieli powodów do zrzędzenia.
Post by AMX
Można ciaśniej/luźniej składać same akapity. Tu jest ewidentna
interakcja składu strony i linii.
No i to właśnie robi \looseness. Skraca lub wydłuża akapit o jedną
bądż kilka linijek. Przez ciaśniejszy/luźniejszy skład. I nic poza tym.
Post by AMX
No i duży problem z doborem mnożnika między jedną wartością kary
i drugą.
Teraz kary poziome i pionowe funkcjonują niezależnie. Jak TeX nie
umie złożyć akapitu mieszcząc się w limicie kary, robi "overfull",
czyli wiersz wystający na margines, co jest rozpaczliwym wołaniem
"człowieku, zrób coś z tym, bo ja lepiej nie potrafię". Pionowy
rozkład jest bardziej tolerancyjny, a błędy mniej spektakularne.
Zwykle powstaje pionowy "underfull", czyli dodanie gdzieś na stronie
ekstraordynaryjnego światła o łączniej wysokości jednej czy dwóch
interlinii. Myślę, że ta rozłączność mogłaby pozostać.
Post by AMX
Chyba innych pomysłów nie mam...
To tak jak ja.
Post by AMX
Post by Jarosław Sokołowski
Post by AMX
Post by Jarosław Sokołowski
Na to jednak jest już za późno.
Dlaczego?
To wynika z warunku zbieżności funkcji monotonicznej. Funkcja opisująca
numer wersji programu musi być niemalejąca (w czasie). Wiadomo też, że
wersja TeXa jest zbieżna do $\pi$. Jej aktualna wartość, to 3.141592,
oznaczmy ją jako $V_t$. Rozpatrzmy $\epsilon = \pi - V_t$. Wartość
$\epsilon$ rzędu 0.000000653589 nie jest wystarczająca do przeprowadzenia
tak rewolucyjnej zmiany.
No, to już kwestia czysto TeXniczna. System nie musi (a nawet nie
mógłby) się nazywać TeX. Na razie nie bardzo jestem sobie w
stanie wyobrazić algorytm łamania stron.
Taki jak łamanie akapitu -- bierzemy tekst od jednego sztywnego podziału
na strony do drugiego, a następnie za pomocą kija i marchewki znajdujemy
najlepsze podziały pomiędzy nimi.
Post by AMX
A do tego trzeba by najpierw sprawdzić, że jest lepszy niż to, co w tej
chwili jest w TeXu.
Można w ten sposób rozwiązać problem (1) wakatów na końcach rozdziałów,
(2) wdów i sierot, (3) registru, (4) nagłówków podrozdziałów, (5) bloków
powiązanych logicznie, które nie powinny (choć czasem mogą) być podzielone
na strony (6) innych rzeczy, o których w tej chwili nie pamiętam.
Post by AMX
Pozdrawiam serdecznie
Ja również
--
Jarek
AMX
2011-05-07 12:05:54 UTC
Permalink
On Fri, 6 May 2011 21:32:37 +0000 (UTC),
Post by Jarosław Sokołowski
Post by AMX
Czyli w zasadzie albo wszystko trzymamy w pamięci albo algorytm
składania jest wieloprzebiegowy. Sam nie wiem co byłoby lepsze.
Pewnie lepiej by było w pamięci, zwałaszcza że jest do tego algorytm,
który można zaadaptować. Ale wieloprzebiegowością też można się
podeprzeć -- daltego wysunąłem hipotezę, że może to dać niezłe
rezultaty. Tylko czy komuś będzie się chciało ją sprawdzić?
Czy komuś będzie się chciało sprawdzić to jedno. A czy ,,chcący''
będzie umiał to zrobić (i to w skończonym czasie) to drugie. =:-)

[..]
Post by Jarosław Sokołowski
Post by AMX
No i duży problem z doborem mnożnika między jedną wartością kary
i drugą.
Teraz kary poziome i pionowe funkcjonują niezależnie. Jak TeX nie
umie złożyć akapitu mieszcząc się w limicie kary, robi "overfull",
czyli wiersz wystający na margines, co jest rozpaczliwym wołaniem
"człowieku, zrób coś z tym, bo ja lepiej nie potrafię". Pionowy
rozkład jest bardziej tolerancyjny, a błędy mniej spektakularne.
Zwykle powstaje pionowy "underfull", czyli dodanie gdzieś na stronie
ekstraordynaryjnego światła o łączniej wysokości jednej czy dwóch
interlinii. Myślę, że ta rozłączność mogłaby pozostać.
No właśnie niekoniecznie. Jeśli tekst ma dwie strony, ale na
drugiej jest tylko jedna linia z dwoma wyrazami, to można albo
przerzucić ostatnią linię z pierwszej strony, albo postarać się
składać ciaśniej -- może dwa wyrazy się zmieszczą, albo składać
tekst luźniej -- wtedy na drugą stronę wyjdzie więcej tekstu i
nie będzie to źle wyglądało. Zdaje się, że pierwszy wariant jest
obecnie realizowany i rzeczywiście nie wymaga interakcji.

Natomiast dwa ostatnie wymagałyby, aby kara za składanie stron
wpływała na karę za składanie akapitów, dając w efekcie
ciaśniejszy/luźniejszy skład tychże.

Składam się w ciasnym ukłonie

max
--
adres w rot13
Nyrxfnaqre Znghfmnx r-***@b2.cy
Jarosław Sokołowski
2011-05-07 14:06:54 UTC
Permalink
Post by AMX
Post by Jarosław Sokołowski
Post by AMX
Czyli w zasadzie albo wszystko trzymamy w pamięci albo algorytm
składania jest wieloprzebiegowy. Sam nie wiem co byłoby lepsze.
Pewnie lepiej by było w pamięci, zwałaszcza że jest do tego algorytm,
który można zaadaptować. Ale wieloprzebiegowością też można się
podeprzeć -- daltego wysunąłem hipotezę, że może to dać niezłe
rezultaty. Tylko czy komuś będzie się chciało ją sprawdzić?
Czy komuś będzie się chciało sprawdzić to jedno. A czy ,,chcący''
będzie umiał to zrobić (i to w skończonym czasie) to drugie. =:-)
Ech, żeby mi się tak chciało jak mi się nie chce. Lepiej by wtedy
wszystko wyglądało (a przynajmniej bym wiedział, czy umiem).
Post by AMX
Post by Jarosław Sokołowski
Teraz kary poziome i pionowe funkcjonują niezależnie. Jak TeX nie
umie złożyć akapitu mieszcząc się w limicie kary, robi "overfull",
czyli wiersz wystający na margines, co jest rozpaczliwym wołaniem
"człowieku, zrób coś z tym, bo ja lepiej nie potrafię". Pionowy
rozkład jest bardziej tolerancyjny, a błędy mniej spektakularne.
Zwykle powstaje pionowy "underfull", czyli dodanie gdzieś na stronie
ekstraordynaryjnego światła o łączniej wysokości jednej czy dwóch
interlinii. Myślę, że ta rozłączność mogłaby pozostać.
No właśnie niekoniecznie. Jeśli tekst ma dwie strony, ale na
drugiej jest tylko jedna linia z dwoma wyrazami, to można albo
przerzucić ostatnią linię z pierwszej strony, albo postarać się
składać ciaśniej -- może dwa wyrazy się zmieszczą, albo składać
tekst luźniej -- wtedy na drugą stronę wyjdzie więcej tekstu i
nie będzie to źle wyglądało. Zdaje się, że pierwszy wariant jest
obecnie realizowany i rzeczywiście nie wymaga interakcji.
To co jest obecnie realizowane, wygląda trochę inaczej niż pierwszy
wariant. Karanie za wdowy i sieroty może spowodować wyrzucenie
dwóch wierszy zamiast jednego na następną stronę, albo wciągnięcie
samotnego wiersza. To zależy od tego, jakie pionowe klajstry są na
wyprowadzanej stronie.
Post by AMX
Natomiast dwa ostatnie wymagałyby, aby kara za składanie stron
wpływała na karę za składanie akapitów, dając w efekcie
ciaśniejszy/luźniejszy skład tychże.
Właśnie niekoniecznie tego wymagają. Jest wprawdzie tak, że TeX
(na przykład przy składaniu akapitu) stara się zminimalizować karę,
ale z drugiej strony, jeśli kara nie przekroczy ustalonego progu,
to zawsze skład uznawany jest za dobry i przechodzi przez TeXową
kontrolę jakości. Z tej zasady wynika, że może istnieć coś takiego
jak \looseness. Jeśli zadeklarujemy \tolerance=10000, to napisanie
przed dłuższym akapitem \looseness=7 przyniesie rzeczywiście wydłużenie
go o 7 wierszy.

Tu by więc *wystarczyło* aby TeX przed przystąpieniem do podziału na
strony dokonał składu akapitów we wszystkich możliwych wariantach,
od najkrótszego do najdłuższego. Wcale *nie musi* zmieniać systemu
kar w akapitach, wystarczy założenie, że muszą mieścić się w przyjętej
wcześniej normie.

Proszę zwrócić uwagę na to, że TeX nie upiera się przy tym, że wszystko
potrafi. Nie ma takiego założenia, że z automatu uzyskamy zawsze
idealny skład. Jest za to system kar i możliwość ustawienia tolerancji
mniejszej od nieskończoności (czyli 10000). Można oczywiście ustawić
\tolerance10000, wtedy skład będzie przypominał Worda. Ale rzadko się
tak robi. Lepszy algorytm podziału na strony też nie oznacza, że wszystko
się zrobi samo.
Post by AMX
Składam się w ciasnym ukłonie
I ja takoż

Jarek
--
Chmurno, durno, nieprzyjemnie,
luźna plomba dzwoni w zębie,
a za oknem w środku maja,
dudni grad jak strusie jaja
AMX
2011-05-07 20:09:13 UTC
Permalink
On Sat, 7 May 2011 14:06:54 +0000 (UTC),
Post by Jarosław Sokołowski
Post by AMX
Natomiast dwa ostatnie wymagałyby, aby kara za składanie stron
wpływała na karę za składanie akapitów, dając w efekcie
ciaśniejszy/luźniejszy skład tychże.
Właśnie niekoniecznie tego wymagają. Jest wprawdzie tak, że TeX
(na przykład przy składaniu akapitu) stara się zminimalizować karę,
ale z drugiej strony, jeśli kara nie przekroczy ustalonego progu,
to zawsze skład uznawany jest za dobry i przechodzi przez TeXową
kontrolę jakości. Z tej zasady wynika, że może istnieć coś takiego
jak \looseness. Jeśli zadeklarujemy \tolerance=10000, to napisanie
przed dłuższym akapitem \looseness=7 przyniesie rzeczywiście wydłużenie
go o 7 wierszy.
Próbuję przezwyciężyć swoją tępotę umysłową i zrozumieć jak to
działa. Czyli dokąd nie ma problemów -- akapit na środku strony,
to akapity są składane w sposób jednoznaczny. Co się dzieje z
karą, kiedy dochodzimy np. do tytułu rozdziału na samym dole
strony?
Post by Jarosław Sokołowski
Tu by więc *wystarczyło* aby TeX przed przystąpieniem do podziału na
strony dokonał składu akapitów we wszystkich możliwych wariantach,
od najkrótszego do najdłuższego. Wcale *nie musi* zmieniać systemu
kar w akapitach, wystarczy założenie, że muszą mieścić się w przyjętej
wcześniej normie.
No dobrze, ale nawet mając wszelkie możliwe podziały musi w jakiś
sposób potem dokonać wyboru. Czyli w ten czy inny sposób funkcja
kary. Tylko, że teraz są naraz dwa kryteria do spełnienia: jak
najlepszy wygląd strony, przy możliwie najmniej zepsutym
wyglądzie akapitów.

Z mojego punktu widzenia jest to dodanie premii za nieco
ciaśniejszy albo nieco luźniejszy skład. Czyli ingerencja w skład
akapitów. Żeby było trudniej, to jest to albo ciaśniejszy albo
luźniejszy. Nie można rozważać obu wariantów naraz.


Proszę mnie nie karać za ciasnotę umysłu i luźne rozważania

max
--
adres w rot13
Nyrxfnaqre Znghfmnx r-***@b2.cy
Jarosław Sokołowski
2011-05-07 21:08:01 UTC
Permalink
Post by AMX
Post by Jarosław Sokołowski
Post by AMX
Natomiast dwa ostatnie wymagałyby, aby kara za składanie stron
wpływała na karę za składanie akapitów, dając w efekcie
ciaśniejszy/luźniejszy skład tychże.
Właśnie niekoniecznie tego wymagają. Jest wprawdzie tak, że TeX
(na przykład przy składaniu akapitu) stara się zminimalizować karę,
ale z drugiej strony, jeśli kara nie przekroczy ustalonego progu,
to zawsze skład uznawany jest za dobry i przechodzi przez TeXową
kontrolę jakości. Z tej zasady wynika, że może istnieć coś takiego
jak \looseness. Jeśli zadeklarujemy \tolerance=10000, to napisanie
przed dłuższym akapitem \looseness=7 przyniesie rzeczywiście wydłużenie
go o 7 wierszy.
Próbuję przezwyciężyć swoją tępotę umysłową i zrozumieć jak to
działa. Czyli dokąd nie ma problemów -- akapit na środku strony,
to akapity są składane w sposób jednoznaczny. Co się dzieje z
karą, kiedy dochodzimy np. do tytułu rozdziału na samym dole
strony?
Rzecz w tym, że nie ma żadnego "dochodzenia do". Jest spojrzenie na
całość, na ciąg stron -- tak jak na ciąg wyrazów przy składaniu akapitu.

Wyobraźmy sobie, że mamy do złożenia rozdział, w którym siedem stron to
łatwy do złamania tekst, a w połowie ósmej pojawia się tabela na trzy
czwarte strony. TeX sobie z czymś takim nie radzi bez ludzkiej pomocy.
Trzeba każdą z ośmiu stron trochę porozsuwać w pionie (a więc pogorszyć
skład), a wtedy nadgonimy brakującą połówkę ósmej strony, a tabela
wypadnie na stronie dziewiątej.

W ten sposób TeX składa akapity -- jeśli w połowie akapitu jest długie
niepodzielne słowo, to kombinuje w ten sposób, by słowo to znalazło się
całe w którymś z wierszy, a nie wypadało na granicy łamania.
Post by AMX
Post by Jarosław Sokołowski
Tu by więc *wystarczyło* aby TeX przed przystąpieniem do podziału na
strony dokonał składu akapitów we wszystkich możliwych wariantach,
od najkrótszego do najdłuższego. Wcale *nie musi* zmieniać systemu
kar w akapitach, wystarczy założenie, że muszą mieścić się w przyjętej
wcześniej normie.
No dobrze, ale nawet mając wszelkie możliwe podziały musi w jakiś
sposób potem dokonać wyboru. Czyli w ten czy inny sposób funkcja
kary. Tylko, że teraz są naraz dwa kryteria do spełnienia: jak
najlepszy wygląd strony, przy możliwie najmniej zepsutym wyglądzie
akapitów.
Jeszcze raz powrórzę: nie ma w TeXu mniej i bardziej zepsutych akapitów.
Są akapity niezepsute, czyli takie, które maja kiepskość (badness)
mniejszą od zadeklarowanej tolerancji (tolerance). I są takie, których
*nie dało się złożyć* -- one mają 'overfull', czyli sterczące na
marginesie litery.
Post by AMX
Z mojego punktu widzenia jest to dodanie premii za nieco
ciaśniejszy albo nieco luźniejszy skład. Czyli ingerencja w skład
akapitów. Żeby było trudniej, to jest to albo ciaśniejszy albo
luźniejszy. Nie można rozważać obu wariantów naraz.
Już samo całościowe spojrzenie (które opisałem w pierwszym akapicie)
powinno rozwiązać wiele problemów z łamaniem na strony. Szczególnie
w tekscie o dużej "elastyczności pionowej" (takie są np. teksty ze
wzorami matematycznymi).

Dopiero gdy to nic nie da, zmienić długość akapitów i podjąć następną
próbę złamania na strony. Aż do skutku. Teoretycznie jest tu lepiej
niż przy składzie akapitu, gdzie słowa mają niezmienną długość (a jak
czasem nie da się złożyć, to trzeba zamiast "samochód" napisać "auto",
albo odwrotnie).
--
Jarek
Loading...