[cstex] automatické rozdělení align v TeXu

Zdenek Wagner zdenek.wagner at gmail.com
Thu Jun 28 11:07:36 CEST 2012


Dne 28. června 2012 9:48 Vit Zyka <vit.zyka at gmail.com> napsal(a):
> Dobrý den,
>
> nevím, zda některá z odpovědí již váš problém nevyřešila. Obávám se však, že
> ne, protože vaším požadavkem bylo, aby zarovnání matematických výrazů bylo
> optimalizovalo nikoliv přes všechny stránky, ale po každé stránce zvlášť.
> Domnívám se, že tento požadavek může být řešen jen zásahem do výstupní
> rutiny. V ní ukončíte prostředí align a porovnáte registr \pagetotal oproti
> \pagegoal (doufám, že si to ještě pamatuji dobře) a v případě, že na stránce
> již bude dost materiálu (\pagetotal>=a*\pagegoal, kde a bude zhruba z
> intervalu <0.8,1>), tak dokončíte výstupní rutinu (dojde k \shipout) a do
> vstupního proudu vložíte \begin{align}. Musíte zajistit, aby tato změněná
> rutina byla aktivní jen tehdy, pokud máte otevřené prostředí align.
>
Nejsem si jist, zda tohle pomůže. Pokud mě paměť neklame, výstupní
rutina se volá ve dvou případech:

1. Penalta za zlom v daném místě je <= -10000
2. V přípravné oblasti je více materiálu, než se na danou stránku vejde

Bod 1 znamená vynucený konec stránky, makro \newpage expanduje na
\penalty -10000. Menší hodnoty využívá LaTeX pro \marginpar a pro
práci s plovoucími objekty, protože \output si umí zjistit, s jakou
penaltou se do ní vstupovalo, a podle toho větví svoji činnost. V
případě 2 mi jižnějaký text přebývá. Samozřejmě, pokud přejdu na novou
stránku raději s předstihem, nemusím nic v přípravné oblasti nechávat.
Sačilo by předefinovat \\ pro align tak, aby do vertikálního režimu
vložilo např. \penalty -20000, a v \output přidat větev pro tuto
hodnotu penalty.

Zatím to vypadá jakžtakž řešitelně, ale napadá mě horší věc, proč to
nepůjde. Standardní prostředí array, tabular a mnoho amstexových
prostředí načtou celý obsah naráz, jako by to byl argument makra. Výše
uvedený postup by tedy vyžadoval, aby výstupní rutina mohla zasáhnout
do procesu expanze maker. Obávám se, že v TeXu toto nejde, i když lua
k tomu možná prostředky má.

Napadá mě jiná věc, k níž se dostanu trošku oklikou. Ve Zpravodaji
1/2006 (http://bulletin.cstug.cz/bul20061.shtml) najdete článek Petra
Březiny Hrstka tipů pro TeXovskou sazbu. Je tam zajímavá ukázka, jak
vysadit první řádek odstavce kapitálkami. Podívejte se, jak se v tom
makru cvičí s boxy, aby bylo možno určit, kde končí první řádek a co
se již bude sázet základním fontem. Napadá mě, že analogicky můžete
postupně přidávat žádky do \vboxu. Jakmile je box větší, než se na
stránku vejde, vrátíte přebývající řádek zpět do vstupního proudu a
zpracovanou část pošlete na výstup. Zbývá jediný problém, za jistých
okolností nemusí \pagegoal a \pagetotal ještě zahrnout prostor pro
inserty. Navíc LaTeX má vlastní komplikované registry pro plovoucí
objekty, takže modifikace \output může být dost pracná, má-li být
zcela obecná.

Kdysi jsem dělal makro na tabulku, která měla mít přibližně tisíc
stran. Potřeboval jsem vlastnosti, které nemá longtable ani
supertabular. Nevím, jestli bych to ještě našel, ale to makro včetně
úpravy \output mělo určitě více než 10 stran kódu.

> Zdraví
> Vít Zýka
>
>
> On 25.6.2012 14:02, Josef Tkadlec wrote:
>>
>> Martin Plesinger napsal(a):
>>>
>>> misto \\
>>>
>>> pouzit \displaybreak[3] \\
>>>
>>> by mohlo pomoct.
>>
>>
>> To nepomůže - umožňuje to přejít na druhou stránku (a něco takového je
>> nutné, jinak by se vůbec neodstránkovalo), ale až poté, co se zarovnají
>> všechny řádky, tedy zpracuje celý obsah align*.
>>
>> Pavel Striz napsal(a):
>>>
>>> Kratší tip, pokud vám nevadí matematický režim v každé buňce, tj.
>>> balíček longtable nebo tabu+longtable.
>>> ps s pozdravy
>>
>>
>> Díky za námět, to funguje (stačí longtable), při prvním průchodu se
>> zarovnávají skupiny 20 řádků na dosud největší šířky, při případném
>> druhém se to dorovná.
>>
>> Bohužel moje řádky jsou komplikované matematické výrazy se zlomky a
>> longtable se na to moc nehodí.
>>
>> Je tu ještě jeden problém, který jsem si předtím neuvědomil - když se
>> vezmou nejširší položky v každém sloupci přes celý soubor, může to vyjít
>> moc široké, zatímco když se zarovnává jen v rámci jedné stránky (nebo
>> skupiny třeba 20 řádků), tak je šířka přijatelná.
>>
>> S pozdravem, Josef Tkadlec
>>
>>>> Zdravím,
>>>>
>>>> může mi, prosím, někdo poradit, zda existuje nějaké relativně jednoduché
>>>> řešení následujícího problému?
>>>>
>>>> Počítačově generuji řádky v prostředí align* (amsmath, každý řádek je
>>>> ukončen \\). Může jich být hodně, takže při LaTeXovém zpracování dojde k
>>>> přetečení. Chtěl bych dosáhnout toho, aby se při LaTeXovém zpracování
>>>> soubor
>>>> řádků rozdělil na části, které se vejdou na jednu stránku a
>>>> "alignovaly" se
>>>> po těchto částech. Maximální počet řádků na jedné stránce by se mohl
>>>> zadat
>>>> (nemusel by se zjišťovat z výšek jednotlivých řádků).
>>>>
>>>> Mám řešení na úrovni programu, který ty řádky generuje - zadám si
>>>> maximální
>>>> počet řádků na stránce a po dosažení tohoto počtu align* ukončím a znovu
>>>> začnu. Nevýhoda tohoto postupu je, že po vygenerování následuje
>>>> vypouštění
>>>> některých řádků, čímž vniknou zbytečně krátké stránky (nebo bych
>>>> musel konce
>>>> a začátky align* přeeditovat).
>>>>
>>>> Josef Tkadlec
>>
>> _______________________________________________
>> csTeX mailing list
>> csTeX at cs.felk.cvut.cz
>> http://lists.felk.cvut.cz/mailman/listinfo/cstex
>>
>
>
> _______________________________________________
> csTeX mailing list
> csTeX at cs.felk.cvut.cz
> http://lists.felk.cvut.cz/mailman/listinfo/cstex



-- 
Zdeněk Wagner
http://hroch486.icpf.cas.cz/wagner/
http://icebearsoft.euweb.cz




More information about the csTeX mailing list