Ruzny pocet parametru makra (plain)

David Necas (Yeti) yeti at physics.muni.cz
Sat Feb 15 23:21:19 CET 2003


On Sat, Feb 15, 2003 at 07:04:42PM +0100, Josef Polách wrote:
> Dobry den, 
> 
> Potrebuji napsat makro, ktere muze nekdy pracovat se dvema parametry a jindy 
> pouze s jednim. Vyskytne-li se pouze jeden, pouzije se na dvou mistech, pokud 
> jsou dva, pouzije se jeden na jednom a druhy na druhem miste. Pouziti napr. u 
> nadpisu kapitoly -- Obsah jednoho parametru se pouzije do textu, obsah 
> druheho (pokud je) do plovouciho zahlavi a do obsahu. Pokud druhy neni, 
> pouzije se vsude ten prvni. (Neco jako v LaTeXu \section{Nadpis do 
> textu}[Nadpis do obsahu] -- nebo jak to presne je, dlouho jsem s tim nedelal.)
> 
> Chci se samozrejme vyhnout brutalnimu reseni, abych psal pri kazdem pouziti 
> makra obe varianty nadpisu, i kdyz jsou (vetsinou) stejne.
> 
> Pokud mi navrhnete reseni z TBN, str. 38, radek 51 a dal, napiste mi prosim, 
> jak se to da prakticky pouzit. Nemohu prijit na zpusob, jak je zamontovat do 
> definice. 

Jsou-li parametry pouze jeden nebo dva a ne pole, je možná
vhodnější LaTeXová syntaxe s [] pro nepovinný parametr.
Je to mj. v TBN na str. 367, řádky 348-353

%%\catcode`\@=11
\def\macro{\futurelet\nextchar\@macro}
\def\@macro{\ifx[\nextchar \let\next\@macrowp \else \let\next\@macrowop \fi
  \next}

Kde \@macrowp a \@macrowop mohou být např.

\def\@macrowp[#1]#2{\@@macro{#1}{#2}}
\def\@macrowop#1{\@@macro{#1}{#1}}
\def\@@macro#1#2{\#1 je #1, \#2 je #1\par}

(Petr Olšák to má ovšem bez těch @, zatímco já nemám talent
na vymýšlení názvů pomocných maker, takže píšu zavináče ;-)

Nebo se dá převzít \@ifnextchar řešení z LaTeXu, které
trochu snižuje duplicitu kódu, pokud byste to potřeboval
u hodně maker.

Yeti





More information about the csTeX mailing list