[cstex] Vyhlledani znaku (retezce) v plainovskem makru po expanzi

Zdenek Wagner zdenek.wagner at gmail.com
Sat Aug 18 14:33:19 CEST 2007


18.8.07, Jaroslav Hajtmar <hajtmar at gyza.cz>:
> Dobry den.
> Uz se delsi dobu snazim pro jednu aplikaci vyresit tento problem :
> Mam v nejake textove databazi udaje a potrebuju odhalit radek, ktery
> obsahuje jistou skupinu znaku (pro jednoduchost by stacil vlastne i
> jeden znak).
> Ve skutecnosti jde vlastne o prohledavani textoveho retezce a zjisteni,
> zda tento retezec obsahuje dany znak ci nikoliv.
>
Tenhle trik jsem kdysi nasel v LaTeXovych makrech Franka Mittelbacha:

\def\nic{}
\def\hledej#1#2{%
  \def\ifnotfound##1#1##2\konec{\def\test{##2}\ifx\test\nic}%
  \ifnotfound#2#1\konec Nenalezeno!\else Nalezeno!\fi}

\hledej{jehla}{Je snad jehla v kupce sena?}

\hledej{jehla}{Najdi jehlu v kupce sena!}

Vysvetleni: Vnitrni makro ma dva parametry, prvni je ukoncen prvnim
parametrem vnejsiho makra \hledej, druhy je ukoncen tokenem \konec (je
nutno zvilit nejaky tokem, ktery urcite nebude v zadnem z parametru
makra \hledej). Druhy parametr se ulozi do pomocneho makra a pridame
neukoncenou podminku \ifx. Pri volani vnitriho makra obratime poradi
parametru a pridame ukoncovaci token \konec. Pokud v #2 neni obsacen
#1, pak ##2 v \ifnotfound bude prazdny a \ifx bude \iftrue. Pokud #1 v
#2 bude, pak v \ifnotfound ##2 bude obsahovat vse za hledanym stringem
vcetne pridaneho #1, takze podminka se vyhodnoti jako \iffalse. TeX
vzdy expanduje parametry, takze nepotrebujeme \expandafter. Pokud by
vsak oba retezce byly ulozeny v makrech, pak je asi nejpohodlnejsi
toto:

\def\jehla{jehla}
\def\seno{Je snad jehla v kupce sena?}
\edef\temp{\noexpand\hledej{\jehla}{\seno}}\temp


-- 
Zdeněk Wagner
http://hroch486.icpf.cas.cz/wagner/
http://icebearsoft.euweb.cz


More information about the csTeX mailing list