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