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

Josef Tkadlec tkadlec at fel.cvut.cz
Thu Jun 28 16:16:33 CEST 2012


Díky všem za náměty, vypadá to, že jednoduché řešení není a složité mi 
za práci nestojí. Trochu jsem doufal, že to někdo už řešil - longtable 
má k tomu hodně blízko.

Josef Tkadlec

Zdenek Wagner napsal(a):
> 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




More information about the csTeX mailing list