Prvni radek jinym pismem

Petr Brezina petr-brezina at volny.cz
Thu Dec 16 05:44:32 CET 2004


Ad Matous Jan Fialka, 15. 12. 2004, 11:39:24
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

V nekterych knihach byva prvni radek prvniho odstavce kazde kapitoly
vysazen verzalkami ci kapitalkami. Patrne jste mel na mysli toto.
Byla by ostuda, kdyby TeX takovy typograficky pozadavek nezvladl,
a tak jsem svoji predchozi domnenku prehodnotil. Vycaroval jsem tedy
dve makra. Jedno vysazi prvni radek odstavce verzalkami, druhe makro
vysazi prvni radek odstavce libovolnym fontem. Kdyz tesne na zacatek
odstavce napisete \prvniradekV, vysazi se prvni radek verzalkami.
Kdyz na zacatek odstavce napisete \prvniradek\prepinacfontu, vysazi
se prvni radek tim fontem, do nejz prepina vami zvoleny
\prepinacfontu, napr. \prvniradek\it.

Jeste jsem tato makra prilis neodzkousel. Jiste budou mit sve mouchy.
Avsak lip carovat bohuzel nedovedu.

V nekterych nestandardnich situacich mohou makra skoncit chybovym
hlasenim "Chyba". To muze nastat napr. tehdy, kdyz bude prvni radek
overfull a zaroven bude \overfullrule nastaveno na nenulovou hodnotu.

V te casti textu, ktera odpovida prvnimu radku, nesmite uzit
\discretionary, prikaz \-vsak pouzit muzete.
Dale byste v teze casti textu nemeli pouzivat makra s parametry, napr.
\uv, misto toho pouzijte radeji \clqq a \crqq. Chcete-li zapsat
nejaky mene standardni akcent pomoci makra, cely prikaz uzavrete do
kudrnatych zavorek, napr. M{\"u}ller.

Na konci tohoto emailu najdete zminena makra spolu s ukazkou pouziti.

S pozdravem

Petr Brezina



% makro, ktere vysazi prvni radek odstavce
% verzalkami nebo jinym pismem nez zbytek odstavce
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\def\prvniradekV{\par
   \def\vysazejprvni{\uppercase\expandafter{\the\prvni}}
   \def\vysazejprvniR{\uppercase\expandafter{\the\prvni-}}
   \def\pismo##1{\uppercase{##1}}
   \xprvniradek}
\def\prvniradek#1{\par
   \def\vysazejprvni{#1\the\prvni}
   \def\vysazejprvniR{#1\the\prvni-}
   \def\pismo##1{#1##1}
   \xprvniradek}

\newcount\radek
\newdimen\sirka
\def\xprvniradek#1\par{
   \setbox0=\vbox{
      \parshape 2 0pt \hsize 0pt \maxdimen
      \pismo{#1}\par
      \radek=\prevgraf
      \loop
      \ifnum\radek>0
         \setbox0=\lastbox \unskip \unpenalty
         \advance\radek by-1
      \repeat
      \setbox0=\hbox{\unhbox0}
      \global\sirka=\wd0 }
      \prvni={}
      \zbytek={#1}
      \pridejslovo}

\newtoks\prvni
\newtoks\zbytek
\newtoks\oldprvni
\newtoks\oldzbytek
\newtoks\mezera
\def\pridejslovo{
   \oldprvni=\prvni
   \oldzbytek=\zbytek
   \expandafter\separujridicimezeru\the\zbytek\ \end
   \setbox0=\hbox{\let\-=\relax\indent\vysazejprvni}
   \ifdim\wd0=\sirka
      \let\next=\vysazejodstavec
   \else
      \edef\temp{\the\zbytek}
      \ifx\temp\empty
         \errmessage{Chyba}
         \let\next=\vysazejodstavec
      \else
         \ifdim\wd0<\sirka
            \edef\temp{\prvni={\the\prvni\the\mezera}}\temp
            \let\next=\pridejslovo
         \else
            \prvni=\oldprvni
            \zbytek=\oldzbytek
            \let\next=\pridejtoken
   \fi\fi\fi
   \next}
\def\separujridicimezeru#1\ #2\end{
   \def\temp{#2}
   \ifx\temp\empty
      \zbytek={}
      \mezera={}
   \else
      \smazridicimezeru#2\end
      \mezera={\ }
   \fi
   \expandafter\separujmezeru#1 \end}
\def\smazridicimezeru#1\ \end{\zbytek={#1}}
\def\separujmezeru#1 #2\end{
   \prvni=\expandafter{\the\prvni#1}
   \def\temp{#2}
   \ifx\temp\empty
   \else
      \edef\temp{\the\zbytek}
      \ifx\temp\empty
         \def\temp{#2}
         \expandafter\smazmezeru\temp\end
      \else
         \def\temp{#2}
         \expandafter\smazmezeru\temp\end
         \toks0=\expandafter{\the\toks0 \ }
      \fi
      \edef\temp{\zbytek={\the\toks0 \the\zbytek}}\temp
      \mezera={ }
   \fi}
\def\smazmezeru#1 \end{\toks0={#1}}
\def\pridejtoken{
   \expandafter\sejmitoken\the\zbytek\end
   \setbox0=\hbox{\let\-=\relax\indent\vysazejprvniR}
   \ifdim\wd0=\sirka
      \let\next=\vysazejodstavecR
   \else
      \ifx\temp\empty
         \errmessage{Chyba}
         \let\next=\vysazejodstavecR
      \else
         \ifdim\wd0<\sirka
            \let\next=\pridejtoken
         \else
            \errmessage{Chyba}
            \let\next=\vysazejodstavecR
   \fi\fi\fi
   \next}
\def\sejmitoken#1#2\end{
   \prvni=\expandafter{\the\prvni#1}
   \zbytek={#2}}

\def\vysazejodstavec{
   \noindent\line{\let\-=\relax\indent\vysazejprvni}
   \the\zbytek \par}
\def\vysazejodstavecR{
   \noindent\line{\let\-=\relax\indent\vysazejprvniR}
   \the\zbytek \par}


% ukazka funkcnosti
%%%%%%%%%%%%%%%%%%%

\chyph
\hsize=10cm

\font\sc=cscsc10 % kapitalky


\prvniradekV
Byla jedna princezna, ktera nechala po celem kralovstvi rozhlasit, ze
si nikoho jineho za manzela nevezme, lec kdo by tak umel zalhat, ze by
se tomu podivila a nedala mu za pravdu.
Hoj, to bylo pojednou namlouvacu, ze si nestacili dvere podavat! Jeden
kazdy vynalozil vsecku svou chytrost, jak by ji nejlepe obelhal:
lhali, jak by tiskl.

\prvniradek\sc
Byla jedna princezna, ktera nechala po celem kralovstvi rozhlasit, ze
si nikoho jineho za manzela nevezme, lec kdo by tak umel zalhat, ze by
se tomu podivila a nedala mu za pravdu.
Hoj, to bylo pojednou namlouvacu, ze si nestacili dvere podavat! Jeden
kazdy vynalozil vsecku svou chytrost, jak by ji nejlepe obelhal:
lhali, jak by tiskl.

\bye






More information about the csTeX mailing list