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

Jaroslav Hajtmar hajtmar at gyza.cz
Sat Aug 18 14:58:22 CEST 2007


Nadherny trik, ktery funguje naprosto dokonale. Dekuji mnohokrat tohle 
je presne to co jsem potreboval ...
Moc mi to pomohlo..

S pozdravem a pranim pekneho dne Jarda Hajtmar



Zdenek Wagner napsal(a):
> 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
>
>
>   




More information about the csTeX mailing list