Narzędzia osobiste

Jesteś w: pearl3.tex

# pearl3.tex

pearl3.tex — TeX document, 1 KB (2022 bytes)

## Zawartość pliku

\def\cs#1{{\catcode##=12	\tt\expandafter\string\csname#1\endcsname}}
\def\nocs#1{{\escapechar=-1 \cs{#1}}}

\def\begincode{$$\vbox\bgroup\tt% \catcode\\=12\catcode\#=12\catcode\%=12 \catcode\ =13% \catcode\{=12 \catcode\}=12 \catcode<=12 \catcode>=12% \obeylines\catcode&=0 } \def\endcode{\egroup$$}

{\catcode\ =13%
\gdef {\ }}

\def\{{\char\{}
\def\}{\char\}}

\noindent\vbox{\hbox{Storing the parameter text in a macro}\hrule}

\medskip
There happens quite often in package writing that we want to define a macro that defines a new type of someting, \cs{newif} for instance, and inside the definition of such a macro we need to write things like
\begincode
\expandafter\def\csname foo#1\endcsname##1{<a definition for \foo#1, using ##1>}
&endcode

Now suppose that the defining macro is \cs{NewTypeoftok#1#2{<code>}} and that if \nocs{#1={everypar}} and \nocs{#2={mypar}}, say, we want \cs{NewTypeoftok} to make the definition
\begincode
\def\strip@everypar@mypar##1\the@everypar@mypar##2\endof@fenixtok{##1##2}%
&endcode

Ok, but instead of everypar and mypar we need to build the definition with {\tt\#1} and {\tt\#2}. Is looks awkward to achieve this with chains of \cs{expandafter}'s mixed with \cs{csname}'s. We may hence define the parameter text itself (I have replaced the second @ with a /):
\begincode
%An auxiliary macro to make the code below more readable
\def\noexpname#1{\expandafter\noexpand\csname#1\endcsname}
%
\def\NewTypeoftok#1#2{%
% Some normal code here, and at the end
%
\edef\tempa{\noexpname{strip@#1/#2}####1\noexpname{the@#1/#2}}%
\expandafter\def\tempa##2\endof@fenixtok{{##1##2}}% the ####1 of \tempa is now ##1
}
&endcode

(By the way, the standard'' definition of \cs{strip@#1/#2} would be

\begincode
\expandafter\def\csname strip@#1/#2\expandafter\endcsname
\expandafter##\expandafter1\csname the@#1/#2\endcsname##2\endof@fenixtok{##1##2}
&endcode

and it needs the \cs{expandafter}\cs{endcsname} trick.)
\end`

Akcje Dokumentu