Delka retezu

Miroslav BALDA balda at cdm.it.cas.cz
Fri Apr 20 15:11:14 CEST 2001


Zdravim vsechny

odpoved na dotaz, ktery se tykal rozhodovani, zda retez ma jeden nebo
vice znaku tu jiz byla od pana Wagnera. Protoze vsak jde o dosti
zavaznou otazku, posilam makro \findchar, ktere otazku delky retezu
take resi:

\makeatletter
\newcount\n@
%---------------------------------------------------------------------
\def\Arg#1%             Get argument #1 as a number
{%  ~~~~~
 \ifcat A\@car#1\@nil \csname c@#1\endcsname% LaTeX counters
 \else
 \noexpand#1\fi%        integers, commands & TeX counters
}%--------------------------------------------------------------------
\def\findchar#1(#2)#3%  Find index #3 of char #1 in a string #2
{%  ~~~~~~~~~           #3<0 = if char not found=> #3 = -length
\n@\z@ \edef\C at b{#2}% \whiledo{\not\equal{\C at b}{}}%
{\advance\n@\m at ne \edef\C at a{\expandafter\@car\C at b\@nil}%
 \ifthenelse{\equal{\C at a}{#1}}%
{\edef\C at b{}\n at -\n@}{\edef\C at b{\expandafter\@cdr\C at b\@nil}}}%
\Arg{#3}\n@%
}%--------------------------------------------------------------------
\makeatother

Vola se (pozor na kulate zavorky u prostredniho parametru!):

 \findchar{hledany_znak}(prohledavany_retez){poradi_znaku}

v citaci "poradi_znaku" bude index hledaneho znaku v retezu, ve
kterem nejsou mezery. Pokud tam budou, nebudou se pocitat.

Pokud retez nebude obsahovat hledany_znak, bude citac poradi_znaku
obsahovat zapornou delku retezu. Tu pak lze pouzit k rozhodovani.
Pro hledani delky tedy uzijeme znak, ktery se v retezech nebude nikdy
vyskytovat, napr. "?".

M. Balda
*****************************************************
 Prof.Ing.Miroslav BALDA,DrSc.
 Institute of Thermomechanics
 Academy of Sciences
 Veleslavinova 11            |    balda at cdm.cas.cz
 301 14  Plzen               | phone:  +42019 7236415
 Czech Republic              | fax  :  +42019 7220787
*****************************************************



More information about the csTeX mailing list