[cstex] OPmac a velmi dlouhá poznámka pod čarou

Petr Olsak petr at olsak.net
Wed Aug 26 18:47:07 CEST 2015


Dobrý den,

má odpověď asi znovu sníží Vaši důvěru v TeX :).

Pomocí \dimen\footins=\vsize nelze zajistit, aby se do stránky nedostalo 
někdy trochu hlavního textu na stránkách, které obsahují pokračující 
dlouhou poznámku. Že se Vám to projevilo při použití varianty Vámi 
označované jako "OPmac" a ne "plain" je dílem náhody.

Upozorňuji a omlouvám se: vysvětlující text bude delší.

Nejprve vysvětlím princip, pak vysvětlím rozdíl mezi Vámi zaslanými dvěma
variantami.

Prncip. Na pokračující stránce s dlouhou poznámkou nejprve TeX interně 
udělá

\vsplit\footins to D

kde D je maximum z \vsize a \dimen\footins. Takto odlomený materiál s 
textem poznámky typicky nemá přesně výšku D a je díky meziřádkovým 
penaltám a pružnostem mezi odstavci ochoten se odlomit dřív než na výšce 
D, typicky mezi odstavci. Pak odlomený text splaskne na přirozený rozměr 
bez pružností. Dejme tomu, že přirozená výška odlomené poznámky je D-x. Do 
vzniklého místa x se TeX pokusí vložit \skip\footins (plainTeX ji 
nastavuje na 12 pt plus pružnost z \bigskip) a pokud stále je ještě místo, 
skusí tam TeX narvat řádky hlavního textu.

Je tedy zřejmé, že pokud je x > 12 pt a rozdíl je takový, že se tam vejdou
řádky hlavního textu a tyto řádky jsou od sebe odlomitelné (nejsou slepené
\nobreak penaltou), pak se na té stránce bohužel objeví.

Nyní vysvětlím rozdíl mezi variantou

A) \footnote{$^1$}{\typoscale[800/800] text poznámky}  a

B) \fnote{text poznámky} (z OPmac)

Především si můžete povšimnout, že první řešení A) je nesprávné, protože 
nedodrží správné řádkování u posledního odstavce poznámky, tedy na straně 
7 Vašeho díla. Je to tím, že \footnote z plain.tex expanduje (po vynechání 
expanze značky v hlavním textu) zhruba řečeno na:

\insert{nastavení \splittopskip=\ht\strutbox a dalších
         zahájení prvního odstavce poznámky značkou (tj. zde $^1$)
         {obsah parametru}%
         \strut
}

Můžete si všimnout, že obsah parametru je uzavřen do skupiny, takže 
poslední odstavec (formátovaný implicitním \par v místě konce \insert za 
\strut) už neobsahuje zmenšený \baselineskip, pokud toto nastavení 
provedete uvnitř parametru. Navíc uvozující značka $^1$ není zmenšena na 
80 %, protože zmenšení písma proběhne až na začátku obsahu parametru. 
Pokud byste chtěl opravit řádkování posledního odstavce tím, že byste 
obsah parametru ukončil \par, pak se Vám to povede jen se zavlečením další 
chyby, neboť nyní \strut v makru zahájí další, tentokrát prázdný odstavec, 
takže v poznámce na konci budete mít jeden (neviditelný) prázdný řádek, 
který se projeví, když si to pořádně změříte nebo když za jednou poznámkou 
následuje další.

Ale toto řešení mělo pro Vás čistě náhodu tu výhodu, že neprosákl hlavní
text na pokračující stránky.

B) OPmac obchází výše popsané problémy při zmenšování písma a řádkování 
tak, že \fnote zhruba řečeno expanduje na:

{\typoscale[800/800] \insert volaný pomocí plainTeXového \vfootnote}

tedy po rozepsání:

{\typoscale[800/800]
   \insert{nastavení \splittopskip=\ht\strutbox a dalších
           zahájení prvního odstavce poznámky značkou
           {obsah parametru}%
           \strut
   }%
}

Protože \typoscale[800/800] zmenšuje nejen \baselineskip, ale i další 
parametry závislé na řádkování (například \strutbox) a protože 
\splittopskip je nastaven v plainTeXovém \vfootnote na výšku \strutboxu, 
je při \fnote z OPmac nastaven menší \splittopskip (o 1.7 pt) než při 
klasické \footnote. Výsledek zlomu poznámky je tedy o 1.7 pt menší a tedy 
x je o 1.7 pt větší. A tak se stalo, že do takto zvětšeného x se už vešel 
řádek z hlavního textu.

Je tedy vidět, že OPmac nastavuje věci správně, protože mít \splittopskip 
nastaven na výšku aktuálního (na 80 % zmenšeného) \strutboxu je daleko 
logičtější než ho mít podle strutboxu hlavního textu. Jen má pak OPmac tu 
smůlu, že když se dlouhá poznámka na pokračující stránce zlomí ve 
stejném místě, je ve výsledku x větší a může se asi s větší 
pravděpodobností stát, že se tam propasíruje řádek hlavního textu.

Nemám jednoduché řešení, které absolutně zajistí nepropasírování řádku
textu do mezýrky x. Pro Váš případ tedy by stačilo

\advance\skip\footins by1.7pt

coz dá do prostoru x větší mezeru a tím zmenší zbytek x na stejnou 
velikost, jako při Vašem řešení A). Ovšem mezera mezi hlavním textem a 
čárou poznámky je o 1.7 pt větší. Zatímco ve Vašem řešení A) je větší 
mezera mezi čarou poznámky a prvním řádkem poznámky (což právě způsobuje 
\splittopskip).

Uff. Zdravím

Petr Olšák



On Wed, 26 Aug 2015, Marcel Svitalský wrote:

> Dobrý den,
> 
> mám zde další možná bug report ? tentokrát k OPmac ?,možná jen dotaz. Mám v textu
> velmi ? velmi! ? dlouhou poznámku pod čarou, přes několik stránek. Proto nastavuji
> \dimen\footins = \vsize, aby na stránkách následujících začátek poznámky tato
> vyplnila celou stranu (má-li k tomu dost materiálu).
> 
> Toto řešení funguje dobře při použití plainovského makra \footnote, nefunguje
> však (někdy) s makrem \fnote z OPmac:
>       % toto funguje správně (číslo poznámky je v tomto příkladu natvrdo)
>       \long\def\fnoteBegin
>       #1\fnoteEnd{\footnote{$^1$)}{\typobase\typoscale[800/800]#1}}
>
>       % toto občas nefunguje správně
>       \long\def\fnoteBegin #1\fnoteEnd{\fnote{#1}}
> 
> Přikládám ilustrativní soubor dilo.tex vyTeXovaný jednou s prvou
> (dilo-footnote-plain.pdf) a podruhé se druhou (dilo-footnote-opmac.pdf) definicí.
> Ve druhém PDF souboru je na stránkách čtyři a pět nahoře vidět, že ač poznámka
> zdaleka není vyčerpána, na stránku se vecpaly jednou dva a jednou jeden řádek
> hlavního textu.
> 
> Nemohu samozřejmě vyloučit, že k témuž nedojde při jiné konfiguraci i s
> plainovským makrem footnote, ale mně se tak děje jen s OPmac variantou. Pokud se
> nejedná o bug, pokud je tedy takové chování při \dimen\footins rovné \vsize
> přípustné, rád bych se zeptal, jak zařídit, tedy jaké další parametry nastavit a
> na jaké hodnoty, aby k tomu nemohlo docházet.
> 
> Děkuji a zdravím
> Marcel Svitalský
> 
> --
> Marcel Svitalský 
> 
>


More information about the csTeX mailing list