Verbatim tak, aby vypsalo svuj zdrojak
Hans GINZEL
hgin2088 at mail.kolej.mff.cuni.cz
Wed Jun 9 13:02:19 CEST 1999
Dobry den.
> Mam na mysli obdobu ceckovskeho zdrojaku, ktery udela jedine, a totiz
> vypise svuj zdrojovy kod. Neco jako:
>
> verbatim.tex:
>
> ---------------------
> % Makra pro definici verbatim
> ...
> \beginverbatim
> \input verbatim.tex
> \endverbatim
>
> \end
> ---------------------
Tohle Vam ma podle definice verbatim prostredi vysazet backslash, slovo
input, mezeru, a text verbatim.tex, nikoliv inputovat soubor!
Muzete to obejit pomoci \expandafter:
\expandafter \beginverbatim \input verbatim.tex \endverbatim
Problem je v tom, ze Vam vypis skonci u prvni sekvence \endverbatim. V
makrech pro definici verbatim se lze sekvenci \endverbatim ubranit pomoci
\csname a \endcsname. Ale skonci to prave u toho \endverbatim za \input.
Makro nesmi byt definovene tak, ze cely text scanuje do parametru makra
az do sekvence \[kategorie 12]endverbatim, protoze by vyskyt takovehle
sekvence musel byt v makrech pro definici verbatim.
Odzkousel jsem dve moznosti, jak to obejit. Jedna byla primo definice
makra \inputverb, ktere inputuje verbatim soubor, specialne sama sebe.
V druhem pripade si vse naraficim do tokenregistru \buffer a nakonec dam
\the\buffer.
%%% %%% Self printing verbatim macro %%%
%%% Hans Ginzel <Hans at kolej.mff.cuni.cz>
%%% format: Plain date: 9.6.1999
%% v. 1.0 use of \inputverb, ending of verbatim
%% by macro parameters scanning mechanism
{\obeyspaces \gdef\activespace{\obeyspaces \let =\ }}
\def\setverb{\def\do##1{\catcode`##1=12}\dospecials}
\def\verb{\par\bgroup \setverb \activespace
\def\par{\futurelet\next\wheterpar}%
\def\wheterpar{\endgraf \ifx \next\par \leavevmode \fi}%
\obeylines \tt}
%%% Environment \begtt ...\endtt
\def\begtt{\verb \startverb}
{\catcode`\|=0 \catcode`\\=12
|gdef|startverb#1\endtt{#1|egroup}}
%%% Verbatim input of files
\def\inputverb #1 {\verb \input #1 \egroup}
%%% Print self
\inputverb verb.tex
\end
-------------------------------------------------------------------
%%% %%% Self printing verbatim macro %%%
%%% Hans Ginzel <Hans at kolej.mff.cuni.cz>
%%% format: Plain date: 9.6.1999
%% v. 1.0 use of \inputverb, ending of verbatim
%% by macro parameters scanning mechanism
%% v. 1.2 ending of verbatim by activated backslash
%% and testing next letters
%% v. 1.3 trickary with tokenregister \buffer in the end
{\obeyspaces \gdef\activespace{\obeyspaces \let =\ }}
\def\setverb{\def\do##1{\catcode`##1=12}\dospecials}
\def\verb{\par\bgroup \setverb \activespace
\def\par{\futurelet\next\whetherpar}%
\def\whetherpar{\endgraf \ifx \next\par \leavevmode \fi}%
\obeylines \tt}
\newtoks\buffer
\def\reset{\buffer={}}
\def\add#1{\buffer=\expandafter{\the\buffer #1}}
%%% Environment \begtt ... \@ndtt (@ means e [because of self print])
{\catcode`\|=0 \catcode`\\=\active
|gdef|begtt{|verb |catcode`|\=|active |let\=|test}}
\def\test{\futurelet\next\whetherletter}
\def\whetherletter{\ifcat \noexpand\next A\def\next##1{\add##1\test}%
\else \let\next=\maybeendtt \fi \next}
\def\maybeendtt{\edef\next{\the\buffer}%
\expandafter \ifx \csname endtt\endcsname \next \let\next=\egroup
\else \let\next=\relax \char`\\\the\buffer \fi \reset \next}
\expandafter \def \csname endtt\endcsname{endtt}
%%% Print self
\buffer={\reset \expandafter \begtt \input verb3.tex }
{\catcode`\|=0 \catcode`\\=\active
|global |add\}
\add{endtt\end}
%\escapechar=`\| \message{\the\buffer}
\the\buffer
------------------------------------------------------------------
Jestli mate zajem, napsal jsem obdobny programek i v Pascalu.
S pozdravem,
_ Hans
,~| |/ /~~~, ,
| /| / . /
|/ |/~/~~/ /~~/ \~~ | _ / /~~/ ~~/ /~~/ /
/| /| / /_ / / , \ \ / / / / / /~~~ /
~ ~ ~~~ ' ' ~~~ ~~~|' ' ' '~~ ~~~ '
Hans GINZEL /| Room: B509
Faculty of Mathematics / / Kolej 17. listopadu
and Physics ~~ Pa'tkova 3
Charles University Prague 182 00 Praha 8
MailTo:Hans at kolej.mff.cuni.cz CallTo:++420+2+8551040-49/761
More information about the csTeX
mailing list