rozpaleni vychodove radky

Stepan Kasal kasal at matsrv.math.cas.cz
Wed Mar 20 11:32:42 CET 2002


Dobry den,

On Mon, 11 Mar 2002, Slavek Herman <signa at seznam.cz> wrote:
> vyzkousel jsem napad pana Wagnera a sesmolil nasledujici makro:
>
> \def\rozpal{\penalty0\hbox to1em{\hss}
>   {\abovedisplayshortskip=-\baselineskip
>    \belowdisplayshortskip=-\baselineskip
>    \abovedisplayskip=-\baselineskip
>    \belowdisplayskip=-\baselineskip
>    $$\global\dimen0=\predisplaysize$$}
>   \ifdimen\dimen0=3em\vskip-\baselineskip\else\fi
> }

zda se mi, ze tady je preklep: misto 3em ma byt 1em.
(Ale asi jste na to neprisel proto, ze se to nikdy nepouzilo.
Vidite, dalsi dukaz, ze mel pravdu pan Tkadlec.)

Dovoluji si upozornit, ze po skonceni tohoto makra stale jeste neni
ukoncen odstavec.  Neptejte se mne, jestli jsme v horizontalnim modu
nebo ne, spis ano, ale kazdopadne jsme prave skoncili display math
a ocekava se pokracovani odstavce.
Bylo by vhodnejsi jej ukoncit, treba tim, ze zaver makra pozmenime takto:
	\else \endgraf \fi

> je hodne neohrabane, protoze moje TeXnicke znalosti nejsou zatim moc

Ale, ale, myslim si, ze Vase TeXnicke znalosti jsou uz dost skvele,
kdyz se dosti uspesne potykate s takovymito problemy.

> dobre, ale funguje. musi se vsak pridat na konec kazdeho radek, bylo
> tedy nasnade predefinovat \par:
> \def\par{\ifhmode\rozpal\else\endgraf}
>
> tady jsem ale havavroval, protoze se mi v pripade, kdy \hbox prepadl
> na druhou radku, \rozpal pustilo dvakrat. nevite v cem by mohl byt
> problem?

Patrne je pricinou neukonceny odstavec, viz vyse.
Nicmene \par ve vertikalnim modu nic nedela, neni duvod volat \endgraf.
Ja bych volil jeste opatrneji:
\def \par {\ifhmode \ifinner \else \rozpal \fi \fi }

------  Tolik komentar k Vasemu makru.

Nicmene povazuji za dulezite zopakovat, ze toto je sice hezke TeXnicke
cviceni, ale pan Tkadlec ma pravdu ve vsech bodech:

1) Pro naplneni prislusneho pravidla bohate staci zvetsit parfillskip
o 1em, resp. \parindent, stejne se to Ve vsech normalnich pripadech
povede zalomit, vyjimky lze resit rucne.
Je pravda, ze TeX casto zvoli prilis rozpaleny odstavec, jen aby mohl
na poslednim radku nechat jedno kratke slovo, ale tak velka chyba to neni.

2) Vase reseni, ktere voli zaplneni posledni radky, kdykoliv zbyva
pri TeXovem "optimalnim" zalomeni mene nez 1em mista, neni vhodne, protoze
prilis preferuje variantu zaplnene posl. radky.
Pritom je dost pravdepodobne, ze TeX ma v zaloze nekolik dalsich podobne
peknych moznosti zalomeni odstavce, ktere maji vychodovou radku v poradku.
Vy namisto toho rozpalite posledni radku, coz muze napr. v pripade, kdy
byla predposledni radka stazena, vest k vizualni nekompatibilite a naruseni
celkoveho vzhledu odstavce.

3) Lepsi reseni snad ani nestoji za tu praci.

Nicmene mi to stejne nedalo a lepsi reseni jsem vymyslel:

\def \mypar {%
	\unskip
	\penalty -1000
	\hskip \parindent plus 1 fill
	\penalty -2000
	\null
	\endgraf
	\kern -\baselineskip
}
\def \par {\ifhmode\ifinner\else\mypar\fi\fi}

\hsize 4cm
\hrule
Pes a
pes pes pes pes pes pes pes pes pes pes pes pes pes pes pes pes
pe jsek

dva
\bye

Je zalozeno na tom, ze TeX zlomi v jedne ze dvou penalty.
(Obe penalty jsou zaporne, tak si TeX takovou prilezitost snad neda
ujit.)
Pokud zlomi v prve penalty, bude vsechen material az do nasledujici
penalty vcetne zrusen.  Takze predposledni radek bude plny (rozpaleny),
posledni prazdny (\hbox{}\parfillskip).
Pokud TeX v prvni penalty nezlomi, jiste zlomi v nasledujici, protoze
dostava premiove body!
(Pozor, obe zaporne penalty nesmi byt prilis male, aby neprevazila
\linepenalty nebo tak neco, proste mechanismy, ktere nuti TeX nevyrobit
zbytecne moc radek.  Ale tyto mechanismy snad nejdou defaultne zapnuty.)

Jeste zbyva dodat, ze druha penalty by mela byt v absolutni hodnote
vetsi nebo rovna prvni.  Tim, ze je v abs. hod. vetsi, vyjadruji preferenci
nezaplneneho vychodoveho radku.

Nevyhodou tohoto reseni je, ze nebude nastaven parametr \prevdepth,
takze situace, kdy by mela byt vzdalenost ucari prvniho radku
nasledujiciho odstavce vetsi nez \baselineskip, je nutno osetrit rucne.

Pokud se rozhodnete me makro pouzit, napiste mi prosim, jak funguje a zejmena
v jakych situacich nefunguje.

Preji prijemne TeXovani,
	Stepan Kasal





More information about the csTeX mailing list