Stanoveni delky odstavce

Jan Dvorak dvorakj at tarzan.math.jyu.fi
Sat Oct 21 16:59:46 CET 1995


> Dobry den,

Dobry den,

> Nevite nahodou, zda by se nedala v TeXu vytvorit promena, jejimz parametrem
> by byl odstavec a jeji hodnotou pocet radku tohoto odstavce po te, co se
> vysazi? Potreboval bych neco takoveho pro pripad, ze chci sazet odstavec do
> nejakeho predem urceneho tvaru --- napriklad do tvaru kruhu. Kdyz si zadam
> font  a  vzdalenost ucari, tak jeste samozrejme netusim jaky polomer by ten
> kruh mel mit, aby jej  zadany tex tvyplnil. Chtel bych tedy zadat pouze
> pocatecni polomer a ten by se pak zmensoval, nebo zvetsoval tak dlouho, az
> by pocet radku krat vzdalenost ucari byla stejna jako delka nejvetsiho
> radku. Jenze ja zatim  nedovedu pocet radku, kterych bylo pri sazbe dosazeno
> zjistit jinak, nez ze se podivam na vysledek.

Jste na dobre ceste. Akorat to s tou promenou je trochu zamotane.

Myslim, ze Vas problem je podobny sazbe do dvou sloupcu, ktere maji vyvazit
sve sirky tak, aby oba mely (priblizne) stejnou delku. Tyhle procedury
najdete v TeXbooku, dodatek D (Dirty Tricks -- ha!), stranky okolo 389.

Hlavni myslenka je ta, ze odstavec se nejprve vysazi do zkusebniho \vboxu,
jehoz sirka se stanovi z predchozich iteraci. Pro ruzne tvarovane odstavce
muzete pouzit \parshape. Pak se ziska vyska (\ht) plus hloubka (\dp) tohoto
zkusebniho \vboxu a na zaklade porovnani se rozhodne, zda je vysledek
uspokojivy, ci zda by se dalsimi iteracemi dal zlepsit. Metoda puleni intervalu
je zde velmi rozumny pristup. Jsme-li spokojeni, zkusebni \vbox se vysadi na
vystup.

Kdysi jsem neco takoveho napsal.
Posilam Vam to, abyste si to mohl upravit pro sve ucely.

%%
%%  Sazba odstavce do ctverce
%%  Jan Dvorak, 25.9.1993
%%  (komentare vyrazne obohacene 20.10.1995 abych nevypadal
%%     jako suverenni programator = blbec)
%%
%%  Hezky priklad pouziti metody puleni intervalu,
%%     ktera funguje pro monotonni funkce.
%%

% promenne
\newdimen\Strana
\newdimen\StranaMax
\newdimen\StranaMin
\newdimen\StranaTol   \StranaTol=1pt

\newdimen\tmp
\newcount\opakuj

% hlavni ridici posloupnost
\def\VysadOdstavecDoCtverce#1\KonecCtvercovehoOdstavce{{%
  \Strana=4.5in%              pocatecni sirka
  \StranaMax=\hsize%          maximalni sirka (pro puleni intervalu)
  \StranaMin=20pt%            minimalni sirka (pro puleni intervalu)
  \loop%                      to je ta hlavni smycka
    \setbox0=\vbox{%          zkusebni \vbox
      \hsize=\Strana%         sirka odstavce
      \tolerance=3000%        nejake parametry, abychom nedostavali Overfull
      \pretolerance=2000%
      #1%                     text odstavce
    }%
    \tmp=\ht0%                vyska
    \advance\tmp\dp0%         pricti hloubku
    \advance\tmp-\Strana%     odecti sirku, pro porovnavani
    \ifnum\tmp>\StranaTol%         vyrazne delsi nez sirsi?
       \StranaMin=\Strana%         sirku z horni poloviny intervalu
       \advance\Strana\StranaMax%
       \divide\Strana2%
       \opakuj=1%                  bude se pokracovat
    \else%
    \ifnum\tmp<-\StranaTol%        vyrazne sirsi nez delsi?
       \StranaMax=\Strana%         sirku z dolni poloviny intervalu
       \advance\Strana\StranaMin%
       \divide\Strana2%
       \opakuj=1%
    \else%                         jsme v toleranci
       \opakuj=0%                  bude se koncit
    \fi\fi%
  \relax%                     toto tu musi byt, jinak to nefunguje; proc, nevim
  \ifnum\opakuj=1\repeat%     opakuj, je-li treba
  \box0%                      koncime, vysadime posledni iteraci
}}%             hmno.

% zkouska:

\VysadOdstavecDoCtverce
      Prvni,  s  kym  jsme  se  ve  skole seznamili, byla vedouci
pracovnice studijniho oddeleni. Asi uz predem vedela, s kym ma tu
cest, protoze vsechny formulare  a papiry nam dopodrobna popsala,
ukazala, ktere dva  rohy maji byt dole a  ktere nahore, a prosila
nas, abychom  se premohli a vsichni  psali zleva doprava, protoze
formulare  pro jine  smery bohuzel  nema k  dispozici. Vyplnovani
indexu bylo zvlastni kapitolou. Zde  se opravdu vyradila, ale asi
postupovala  prilis rychle,  nebot i  ja jsem  zavahal a na misto
oznacene jako uredni podpis jsem se podepsal. Ji to ani nevyvedlo
z miry, jen polohlasem pronesla: "Ale tam se mel podepsat dekan!"
A taky se tam vesel.
\KonecCtvercovehoOdstavce

\vfill\eject\end

%%
%%   finis
%%

Jo, kdybyste pouzival LaTeX, tak pro nej uz nekdo udelal sazbu odstavcu
do ctverecku, kolecka, kosoctverecku i pravidelneho sestiuhelniku. Ten balik
se jmenuje nejak jako `shapepar' a je o nem zminka v knize The LaTeX Companion,
nekde ve treti kapitole.

                                S pozdravem
                                                Jan Dvorak
--
  Jan Dvorak
  dvorakj at karlin.mff.cuni.cz               (dvorakj at apollo.karlov.mff.cuni.cz)
  http://www.karlin.mff.cuni.cz/~dvorakj   /* append '/' in case of problems */



More information about the csTeX mailing list