% \iffalse meta-comment
% Line endings: UNIX
% Tab size:     4
%
% Copyright 2004 Jonathan Sauer
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either version 1.3
% of this license or (at your option) any later version.
% The latest version of this license is in
%
%   http://www.latex-project.org/lppl.txt
%
% and version 1.3 or later is part of all distributions of LaTeX
% version 2003/12/01 or later.
%
% This work has the LPPL maintenance status "maintained".
%
% The Current Maintainer of this work is Jonathan Sauer
% (<jonathan.sauer@gmx.de>).
%
% This work consists of the files metainfo.dtx and metainfo.ins
% and the derived file metainfo.sty.
%
% \fi
%
% \iffalse
%
%<*driver>
\documentclass{ltxdoc}
\usepackage{metainfo}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
% Modification of verbatim for tabs in listings
\makeatletter
{\catcode`\ =\active%
\catcode`\^^I=\active%
\gdef\@vobeyspaces{%
\catcode`\ \active\let \@xobeysp%
\catcode`\^^I\active\def^^I{~~}%
}}%
\makeatother
\begin{document}
	\DocInput{\jobname.dtx}
\end{document}
%</driver>
%
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{metainfo}
%<package>   [2004/11/25 v0.9.1 typeset document metainfo]
%
% \fi
%
% \CheckSum{386}
% \CharacterTable
%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%   Digits        \0\1\2\3\4\5\6\7\8\9
%   Exclamation   \!     Double quote  \"     Hash (number) \#
%   Dollar        \$     Percent       \%     Ampersand     \&
%   Acute accent  \'     Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \<
%   Equals        \=     Greater than  \>     Question mark \?
%   Commercial at \@     Left bracket  \[     Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%   Right brace   \}     Tilde         \~}
%
% \DoNotIndex{\@@input,\|}
% \DoNotIndex{\@ifundefined,\@ehc,\@empty,\@gobbletwo,\@nil}
% \DoNotIndex{\@startsection,\@tempa,\active,\baselineskip}
% \DoNotIndex{\begin,\bfseries,\bgroup,\catcode,\DeclareOption}
% \DoNotIndex{\def,\egroup,\else,\end,\endinput,\expandafter}
% \DoNotIndex{\fi,\futurelet,\gdef,\ifmmode,\ifcat,\ifx}
% \DoNotIndex{\index,\item,\let,\long,\newcommand,\newif}
% \DoNotIndex{\noexpand,\noindent,\normalfont,\normalsize}
% \DoNotIndex{\PackageError,\par,\ProcessOptions,\relax,\space}
% \DoNotIndex{\string,\textbf,\z@}
% 
% \GetFileInfo{\jobname.sty}
%
% \title{The \textsf{metainfo} package\thanks{This document
% corresponds to \textsf{\filename}~\fileversion, dated \filedate.}}
%
% \author{Jonathan Sauer \\ \texttt{jonathan.sauer@gmx.de}}
%
% \date{\filedate}
%
% \maketitle
%
% \begin{abstract}
% This file describes the \textsf{metainfo} package that typesets only
% special comments of a \TeX\ file.
%
% \end{abstract}
%
% \tableofcontents
%
% \section{Introduction}
%
% Suppose you write a text and include some annotations for yourself
% that are not printed, i.e. an explanation of a pun or a short
% summary of the current chapter in order to be able to later create a
% summary of the whole text. Then it would be nice to be able to
% extract these annotations and typeset them separately. This package
% provides the macro |\typesetmetainfo| to typeset only these
% annotations (herein called `metainfo', as they are information about
% the information contained in the text).
%
%
%
%
% \section{Macros}
%
% \DescribeMacro{\typesetmetainfo} Usage: |\typesetmetainfo|
% \marg{file}.
%
% Typesets the metainfo of the \TeX\ file \meta{file}. Anything not a
% metainfo---text, preamble---is skipped.
%
%
%
%
% \section{Formatting}
%
% \subsection{Metainfo after a heading}
%
% Any comments following a line with a heading are considered a
% metainfo and are typeset as if they were normal text. The first line
% that does not begin with a percent sign finishes the metainfo.
%
% A heading is started by a macro defined in |\\mi@@MIbeginnings|.
% Normally this macro contains |\chapter|, |\section|, |\subsection|,
% and |\subsubsection|, but you can of course redefine it.
%
% The heading itself is typeset as well, before the metainfo,
% resulting all metainfo being typeset using the outline of the normal
% document. Note that when writing a heading, some restriction apply:
%
% \begin{enumerate}
%	\item	The heading macro must be at the beginning of the line.
%
%	\item	Any parameters of the macro must be on the same line.
%			(parameters split over several lines might work, but they
%			are not guaranteed to)
%
% \end{enumerate}
%
%
%
%
% \subsection{Local metainfo}
%
% There is another way to include metainfo in a document, that is as a
% \emph{local metainfo}. A local metainfo is a metainfo not following
% a heading; instead they can appear anywhere in the text. They start
% with a double percent sign at the beginning of the line (|%%|); the
% line itself is then typeset as a metainfo as well as all the
% following lines beginning with a |%| (just as a metainfo following a
% heading). The first line that does not begin with a percent sign
% finishes the local metainfo.
%
% You can format a local metainfo using three macros. (see section
% \ref{sec:ExLoMI} on page \pageref{sec:ExLoMI} for an example how to
% customize them.)
%
% \begin{enumerate}
%	\item	|\mi@@firstlocalMItext|: The contents of this macro is
%			inserted before the first local metainfo of a chapter.
%
%	\item	|\mi@@lastlocalMItext|: The contents of this macro is
%			inserted after the last local metainfo of a chapter.
%
%	\item	|\mi@@everylocalMItext|: The contents of this macro is
%			inserted before every local metainfo.
%
% \end{enumerate}
%
% \paragraph{Note} If you change these macros in your document
% preamble or your main document opposed to a package file, you must
% surround them with |\makeatletter| and |\makeatother|, as shown in
% the example below.
%
%
%
%
% \section{Package options}\label{sec:Options}
%
% The following package options exist:
%
% \begin{description}
%	\item[compactheadings] Changes the section headings to be more
%		compact in order to save some space.
%
%	\item[indexshorthand] Provides shorthands for indexing.
%		|^|\marg{text} indexes and typesets \meta{text}, |^^|\marg{text}
%		only indexes it.\footnote{These shorthands have been inspired by
%		Donald E. Knuth's own index macros used for the \TeX book.}
%		For indexing, the standard index macro |\index| is used.
%
%		These macros only work in text mode; in math mode, |^| is a
%		superscript as predefined in \LaTeX.
%
%	\item[listlocalmetainfo] Changes the macros |\mi@@firstlocalMItext|,
%		|\mi@@lastlocalMItext| and |\mi@@everylocalMItext| (described in
%		the section above) to |itemize| the local metainfo.
% \end{description}
%
%
%
%
% \section{Driver files}
%
% In order to typeset only the metainfo of a document, a special
% driver file is needed. This driver loads the packages necessary for
% typesetting the metainfo (at least the package \textsf{metainfo})
% and inputs the document to be typeset using |\typesetmetainfo|.
%
% \paragraph{Note} No package of the document processed using
% |\typesetmetainfo| is loaded, as the |\usepackage| macros are
% skipped. The same is true for any definitions in the document
% preamble or elsewhere: They are skipped, so if the metainfo relies
% on these definitions, they have to be included in the driver as
% well.
%
%
%
%
% \section{Examples}
%
% \subsection{Example driver file}
%
% The following driver file typesets the metainfo of the \TeX\ file
% `example.tex' using compact headings:
%
% \begin{verbatim}
% \documentclass{book}
% \usepackage[compactheadings]{metainfo}
%
% \begin{document}
% \typesetmetainfo{example}
% \end{document}
% \end{verbatim}
%
%
%
%
% \subsection{Example document}
%
% If we save the following file as `example.tex' and process it using
% the driver file in the example above \ldots
%
% \begin{verbatim}
% \documentclass{minimal}
% \usepackage{testpackage}
%
% \begin{document}
%
% \chapter{Chapter 1}
% % Metainfo for chapter `Chapter 1'
%
% \section{Section 1}
% % Metainfo for section `Section 1'
%
% This is some text.
%
% \chapter{Chapter 2}
% \section{Section 2}
% % Metainfo for section `Section 2'
%
% This is some more text.
%
% %% Local metainfo. This metainfo is a bit longer, but only
% % a little bit.
%
% \section{Section 3}
% % Metainfo for section `Section 3'
% \end{document}
% \end{verbatim}
%
% \ldots\ this results in:\footnote{Approximately, as the real
% formatting will differ slightly from the text typeset here.}
%
% \addvspace{\baselineskip}
% \textbf{Chapter 1}\par
%  Metainfo for chapter `Chapter 1'
%
% \addvspace{\baselineskip}
% \textbf{Section 1}\par
%  Metainfo for section `Section 1'
%
% \addvspace{\baselineskip}
% \textbf{Chapter 2}\par
% \textbf{Section 2}\par
%  Metainfo for section `Section 2'
%
% \addvspace{\baselineskip}
% Annotations:\par
% Local metainfo. This metainfo is a bit longer, but only a little
% bit.
%
% \addvspace{\baselineskip}
% \textbf{Section 3}\par
%  Metainfo for section `Section 3'
%
%
%
%
% \subsection{Example local metainfo formatting}\label{sec:ExLoMI}
%
% The following macros prefix local metainfo with `Annotations:' in
% bold typeface and typesets the local metainfo in an |itemize|
% environment:\footnote{Similar to the package option
% \texttt{listlocalmetainfo}, described in section \ref{sec:Options}
% on page \pageref{sec:Options} does.}
%
% \begin{verbatim}
% \makeatletter
% \def\mi@@firstlocalMItext{%
% 	\addvspace{\baselineskip}%
% 	\noindent\textbf{Annotations:}%
% 	\begin{itemize}%
% }
% \def\mi@@lastlocalMItext{%
% 	\end{itemize}%
% }
% \def\mi@@everylocalMItext{%
% 	\item\relax%
% }
% \makeatother
% \end{verbatim}
%
%
%
%
% \section{Notes/Limitations}
%
% \begin{itemize}
%	\item	Any text or macros on the same line as a heading are
%			processed as well, immediately after the heading. Thus
%			you can type |\section{foo}\label{sec:foo}| and refer
%			to this section inside a metainfo using the label
%			|sec:foo|.
%
%	\item	The document included using |\typesetmetainfo| must
%			be a valid \LaTeX\ document insofar as that it must
%			contain a |document| environment, because |\end{document}|
%			serves as the ending delimiter for typesetting the
%			metainfo.
%
%			That also means that any metainfo following |\end{document}|
%			is \emph{not} typeset.
%
% \end{itemize}
%
%
%
%
% \StopEventually{}
%
% \section{Implementation}
%
% \subsection{Main environments and macros}
%
% \begin{macro}{\typesetmetainfo}
%
% Usage: |\typesetmetainfo| \marg{file}.
%
% Typesets the metainfo of a document.
%
%    \begin{macrocode}
\newcommand{\typesetmetainfo}[1]{%
	\bgroup%
	\mi@activenewline%
	\mi@emptyactivepercent%
	\mi@otherbraces%
	\ifmi@indexmacros\mi@activehat\fi%
%    \end{macrocode}
%
% We provide support for the standard \LaTeX\ |verbatim| environment:
%
%    \begin{macrocode}
	\let\mi@old@verbatim\@verbatim%
	\def\@verbatim{%
		\mi@old@verbatim%
		\mi@verbatimnewline%
	}%
%    \end{macrocode}
%
% We use the original \TeX\ definition of |\input| (saved by \LaTeX\
% in |\@@input|), because we must continue with our special processing
% immediately after \meta{file} has been opened. This is a job for the
% original \TeX\ |\input|, as it simply switches the input stream to
% \meta{file} and expands to nothing.
%
% The |\relax| delimits the filename.
%
%    \begin{macrocode}
	\expandafter\mi@skiplines\@@input#1\relax%
	\egroup%
}
%    \end{macrocode}
% \end{macro}
%
%
%
%
% \subsection{Package customization}
%
% \begin{macro}{\mi@@MIbeginnings}
%
% Stores all the macros that can begin a metainfo.
%
%    \begin{macrocode}
\def\mi@@MIbeginnings{\chapter\section\subsection\subsubsection}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\mi@@firstlocalMItext}
%
% Stores the text inserted before the first local metainfo.
%
%    \begin{macrocode}
\def\mi@@firstlocalMItext{\textbf{Annotations:}\par\noindent}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\mi@@lastlocalMItext}
%
% Stores the text inserted after the last local metainfo.
%
%    \begin{macrocode}
\def\mi@@lastlocalMItext{}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\mi@@everylocalMItext}
%
% Stores the text inserted before every local metainfo.
%
%    \begin{macrocode}
\def\mi@@everylocalMItext{}
%    \end{macrocode}
% \end{macro}
%
%
%
%
% \subsection{Package options}
%
% \subsubsection{Headings}
%
% We provide the possibility of changing the headings to a more
% compact formatting:
%
%    \begin{macrocode}
\DeclareOption{compactheadings}{%
	\@ifundefined{thechapter}{}{%
		\def\chapter{\@startsection{chapter}{0}{\z@}{-2\baselineskip}%
					{\baselineskip}{\normalfont\normalsize\bfseries}}%
	}%
	\def\section{\@startsection{section}{1}{\z@}{-2\baselineskip}%
				{\baselineskip}{\normalfont\normalsize\bfseries}}%
	\def\subsection{\@startsection{subsection}{2}{\z@}{-2\baselineskip}%
				{\baselineskip}{\normalfont\normalsize\bfseries}}%
	\def\subsubsection{\@startsection{subsubsection}{3}{\z@}%
				{-2\baselineskip}{\baselineskip}%
				{\normalfont\normalsize\bfseries}}%
}
%    \end{macrocode}
%
%
%
%
% \subsubsection{Index shorthand}
%
% \begin{macro}{\ifmi@indexmacros}
%
% |true|, if index shorthands specified using the package option
% |indexshorthand| are used, otherwise |false|:
%
%    \begin{macrocode}
\newif\ifmi@indexmacros
\mi@indexmacrosfalse
%    \end{macrocode}
% \end{macro}
%
% We provide the possibility of using the shorthand |^| for an index
% entry that is typeset, and |^^| for an index entry that is not
% typeset:
%
%    \begin{macrocode}
\DeclareOption{indexshorthand}{%
	\mi@indexmacrostrue%
%    \end{macrocode}
%
%
% \begin{macro}{\mi@hat}
%
% We save the original meaning of |^|. We do not simply use |^| in the
% |\mi@hat|\ldots-macros, because then we would assume that |^| is not
% already an active character before our catcode change (which we will
% make in |\typesetmetainfo|). Normally, |^| has catcode 7
% (superscript), but if is was active (i.e. because of another package
% changing |^|), we would store an active |^| in the definition of the
% |\mi@hat|\ldots-macros. When later used this |^| would point to our
% macro |\mi@hat|, resulting in an endless loop. So we save the
% original meaning of |^| instead using |\let|, which, if |^| is
% active, would save the macro |^| would have been |\let| to.
%
%    \begin{macrocode}
	\let\mi@@@hat^%
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\mi@hat}
%
% Main macro for indexing and first step in deciding how to index:
%
% \begin{itemize}
% 	\item	Math mode: Expand to the original definition of |^|.
%
% 	\item	Otherwise: Check the next token using |\mi@hat@|.
%
% \end{itemize}
%
%    \begin{macrocode}
	\def\mi@hat{%
		\ifmmode%
			\expandafter\mi@@@hat%
		\else%
			\expandafter\futurelet\expandafter\@tempa\expandafter\mi@hat@%
		\fi%
	}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\mi@hat@}
%
% Second step in deciding how to index. We know that we are not in
% math mode. The token following the hat has been prefetched and
% stored in |\@tempa|. (it has not been read yet)
%
% \begin{itemize}
% 	\item	A second hat (|^|): Check the next token using |\mi@hat@twohats|.
%
% 	\item	Opening brace: Typeset the index word and index it using
% 			it |\mi@indextypeset|.
%
% 	\item	Otherwise: Display an error, as |^^| must be followed by
%			a parameter in braces.
%
% \end{itemize}
%
%    \begin{macrocode}
	\def\mi@hat@{%
		\ifx\@tempa\mi@hat%
			\expandafter\mi@hat@twohats%
		\else\ifx\@tempa\bgroup%
			\expandafter\expandafter\expandafter\mi@indextypeset%
		\else%
			\mi@hat@errbrace%
		\fi\fi%
	}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\mi@hat@twohats}
%
% First step in deciding how to index a word not typeset. We know we
% have two hats in a row (|^^|), but the second hat is not read yet
% (only prefetched using |\futurelet|). Therefore we gobble it using
% |#1|.
%
%    \begin{macrocode}
	\def\mi@hat@twohats#1{%
		\futurelet\@tempa\mi@hat@twohats@%
	}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\mi@hat@twohats}
%
% Second step in deciding how to index a word not typeset. We know we
% have two hats in a row, both read. The token following the two hats
% has been prefetched and stored in |\@tempa|.
%
% Note that we could skip this step and simpy expand to |\index|,
% letting |\index| take care that a proper parameter follows.
%
%    \begin{macrocode}
	\def\mi@hat@twohats@{%
		\ifx\@tempa\bgroup%
			\expandafter\index%
		\else%
			\mi@hat@errbrace%
		\fi%
	}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\mi@indextypeset}
%
% Usage: |\mi@indextypeset| \marg{word}. Typesets \meta{word} and
% indexes it using |\index|.
%
%    \begin{macrocode}
	\def\mi@indextypeset#1{%
		#1\index{#1}%
	}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\mi@hat@errbrace}
%
% Error handling when a |^| or |^^| is not followed by a left brace.
%
%    \begin{macrocode}
	\def\mi@hat@errbrace{%
		\PackageError{metainfo}{`\string^' or `\string^\string^' not %
								followed by a left brace}\@ehc%
	}
%    \end{macrocode}
% \end{macro}
%
%
% End of |\DeclareOption{index}|:
%
%    \begin{macrocode}
}
%    \end{macrocode}
%
%
%
%
% \subsubsection{Other options}
%
%    \begin{macrocode}
\DeclareOption{listlocalmetainfo}{%
	\def\mi@@firstlocalMItext{%
		\begin{itemize}%
	}%
	\def\mi@@lastlocalMItext{%
		\end{itemize}%
	}%
	\def\mi@@everylocalMItext{%
		\item\relax%
	}%
}
%    \end{macrocode}
%
%
%
%
%    \begin{macrocode}
\ProcessOptions\relax
%    \end{macrocode}
%
%
%
%
% \subsection{Internal environments and macros}
%
% \subsubsection{General definitions and flags}
%
% \paragraph{Strategy for dealing with catcode changes} At the
% beginning of the processing, the catcodes are changed as follows:
%
% \begin{tabular}{cl}
% 	|^^M|	&	13 (active), set in |\mi@activenewline|	\\
% 	|%|		&	13, set in |\mi@emptyactivepercent|		\\
% 	|{|		&	12 (other), set in |\mi@otherbraces|	\\
% 	|}|		&	12, set in |\mi@otherbraces|			\\
%	|^|		&	13, optionally set in |\mi@activehat|	\\
% \end{tabular}
%
% If any macro changes the catcodes of these characters, it must reset
% them to these values after processing. If any macro needs the braces
% |{| and |}| for parameter grouping, it should use the macro
% |\mi@normalbraces| to change the catcodes accordingly.
%
%
% \begin{macro}{\ifmi@firstlocalMI}
%
% |true| if this is the first local metainfo, otherwise |false|. Used
% to insert |\mi@@firstlocalMItext| and |\mi@@lastlocalMItext|.
%
%    \begin{macrocode}
\newif\ifmi@firstlocalMI
\mi@firstlocalMItrue
%    \end{macrocode}
% \end{macro}
%
%
%
%
% \subsubsection{Modes}
%
% Three modes of processing exist:
%
% \begin{description}
%	\item[Skipping text]	Text is skipped line after line. If two
%			percent signs are found at the beginning of a new line,
%			a local metainfo is begun and the mode changed to
%			`Typesetting a metainfo'.
%
%			Main macro: |\mi@skiplines|.
%
%	\item[Beginning metainfo]	The appropriate heading is typeset
%			and the remaining line of text skipped. The mode is then
%			changed to `Typesetting a metainfo'.
%
%			Main macro: |\mi@checkbeginMI|.
%
%	\item[Typesetting a metainfo]	The text is typeset. If a line does
%			not start with a percent sign, the	metainfo is done. The
%			mode is then changed to `Skipping text'.
%
%			Main macro: |\mi@typesetMI|.
%
% \end{description}
%
%
% \begin{macro}{\mi@skiplines}
%
% Main macro. Skips lines and checks the first token of a line (stored
% in |#1|) for two special cases:
%
% \begin{enumerate}
%	\item	A percent sign |%|: We check if it starts a local metainfo
%			using |\mi@checkbeginlocalMI|.
%
%	\item	A control sequence: We check if it starts a new metainfo
%			using |\mi@checkbeginMI|.
%
% \end{enumerate}
%
%    \begin{macrocode}
\def\mi@skiplines#1{%
	\ifx#1\mi@percentempty%
%    \end{macrocode}
%
% A percent sign: We check if it starts a local metainfo.
%
%    \begin{macrocode}
		\expandafter\mi@checkbeginlocalMI%
	\else\ifcat\noexpand#1\relax%
%    \end{macrocode}
%
% A control sequence: We check if it starts a new metainfo.
%
%    \begin{macrocode}
		\expandafter\expandafter\expandafter\mi@checkbeginMI%
	\else%
%    \end{macrocode}
%
% Anything else: We skip it and the remaining line of text. Note that
% it could be a line ending (|^^M|), so it may be possible that we
% gobble only |#1|, which will be re-inserted into the stream below.
% That way we do not have to check if |#1| is a line ending.
%
%    \begin{macrocode}
		\expandafter\expandafter\expandafter\mi@gobbletolineend%
	\fi\fi%
%    \end{macrocode}
%
% We always insert the first token of a line back into the stream,
% even though it is not necessary for |\mi@checkbeginlocalMI|. But as
% normally most of the lines of a text will be skipped, we optimize
% for this case.
%
%    \begin{macrocode}
	#1%
}
%    \end{macrocode}
% \end{macro}
%
%
% The following macros require |^^M| to be active:
%
%    \begin{macrocode}
\bgroup
\catcode`\^^M=\active%
%    \end{macrocode}
%
%
% \begin{macro}{\mi@typesetMI}
%
% Prepares the typesetting of a metainfo.
%
%    \begin{macrocode}
\gdef\mi@typesetMI{%
	\mi@normalbraces%
%    \end{macrocode}
%
% Every CR we check if the next line continues the metainfo
% using |\mi@typesetMI@checkend|.
%
%    \begin{macrocode}
	\let^^M\mi@typesetMI@checkend%
%    \end{macrocode}
%
% Now we start typesetting the text. We let \TeX\ take completely
% control instead of reading one line after the other; we will regain
% control at the end of each line using our redefinition of |^^M|.
%
%    \begin{macrocode}
	\ignorespaces%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\mi@typesetMI@checkend}
%
% Called at a carriage return. If the token after the CR is equals to
% |\mi@percentempty|, the next line starts with a |%|, thus continuing
% the metainfo. Otherwise, the metainfo is finished.
%
%    \begin{macrocode}
\long\gdef\mi@typesetMI@checkend#1{%
	\ifx#1\mi@percentempty%
%    \end{macrocode}
%
% The next line continues the comment. We check for an empty line:
%
%    \begin{macrocode}
		\expandafter\mi@typesetMI@checkend@%
	\else%
%    \end{macrocode}
%
% The next line finishes the comment:
%
%    \begin{macrocode}
		\mi@otherbraces%
		\let^^M\@empty%
		\expandafter\mi@skiplines\expandafter#1%
	\fi%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\mi@typesetMI@checkend@}
%
% Checks if a |^^M| (CR) follows immediately after the |%|. Then we
% insert a |\par|. Note that any spaces between the |%| and the CR
% are automatically skipped by using a non-delimited parameter.
%
%    \begin{macrocode}
\long\gdef\mi@typesetMI@checkend@#1{%
	\ifx#1\mi@typesetMI@checkend%
		\par\expandafter\mi@typesetMI@checkend%
	\else%
%    \end{macrocode}
%
% We assume the line is |% |\meta{text} instead of |%|\meta{text},
% thus we insert back a space that was skipped before:
%
%    \begin{macrocode}
		\space%
		\expandafter#1%
	\fi%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\mi@checkbeginMI}
%
% Usage: |\mi@checkbeginMI|\meta{cs}.
%
% First step in the check for the begin of a metainfo: Checks if
% \meta{cs} is a control sequence that can begin a metainfo.
%
%    \begin{macrocode}
\gdef\mi@checkbeginMI#1{%
%    \end{macrocode}
%
% Handle |\end|:
%
%    \begin{macrocode}
	\ifx#1\end%
		\expandafter\mi@checkdocumentend%
	\else%
%    \end{macrocode}
%
% We check if \meta{cs} is a relevant control sequence. (these are
% stored in |\mi@@MIbeginnings|) Then we use |\mi@checkbeginMI@| to
% evaluate the result:
%
%    \begin{macrocode}
		\def\@tempa##1#1##2\@nil{\mi@checkbeginMI@{##2}#1}%
		\expandafter\expandafter\expandafter\@tempa%
			\expandafter\mi@@MIbeginnings\expandafter#1%
			\expandafter\@nil%
	\fi%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\mi@checkbeginMI@}
%
% Support macro for |\mi@checkbeginMI|. Checks if |#2| is a relevant
% control sequence by checking if |#1| is empty (|false|) or not
% (|true|).
%
%    \begin{macrocode}
\gdef\mi@checkbeginMI@#1#2{%
	\ifx^^M#1^^M%
%    \end{macrocode}
%
% Not a relevant control sequence: Skip till the end of the line.
%
%    \begin{macrocode}
		\expandafter\mi@gobbletolineend%
	\else%
%    \end{macrocode}
%
% A relevant control sequence. If there has been any local metainfo
% before this macro, we finish it by inserting |\mi@@lastlocalMItext|:
%
%    \begin{macrocode}
		\ifmi@firstlocalMI\else\mi@@lastlocalMItext\fi%
%    \end{macrocode}
%
% We restore all character catcodes except for |^^M|, which we use to
% continue processing after the control sequence in question has been
% executed: (this is the reason a heading must appear on a single
% line, as otherweise |^^M| is executed more than once)
%
%    \begin{macrocode}
		\let^^M\mi@checkbeginMI@@%
		\mi@normalbraces%
		\mi@normalpercent%
%    \end{macrocode}
%
% In any case, a local metainfo following this macro is the first, so
% we set the flag accordingly:
%
%    \begin{macrocode}
		\mi@firstlocalMItrue%
		\expandafter#2%
	\fi%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\mi@checkbeginMI@@}
%
% Support macro for |\mi@checkbeginMI@|. Is called via |^^M| at the end
% of a line.
%
%    \begin{macrocode}
\gdef\mi@checkbeginMI@@{%
	\let^^M\@empty%
	\mi@otherbraces%
	\mi@emptyactivepercent%
	\mi@checkbeginMI@@@%
}
%    \end{macrocode}
% \end{macro}
%
%    \begin{macrocode}
\egroup
%    \end{macrocode}
%
%
% \begin{macro}{\mi@checkbeginMI@@@}
%
% Support macro for |\mi@checkbeginMI| and the second step in the
% check for the begin of a metainfo: Checks if the line after the
% control sequence begins with a percent sign.
%
%    \begin{macrocode}
\def\mi@checkbeginMI@@@#1{%
	\ifx#1\mi@percentempty%
%    \end{macrocode}
%
% A percent sign: It starts a metainfo. Change to metainfo.
%
%    \begin{macrocode}
		\par%
		\expandafter\mi@typesetMI%
	\else%
%    \end{macrocode}
%
% Anything else: No metainfo follows. Ignore it.
%
%    \begin{macrocode}
		\expandafter\mi@skiplines\expandafter#1%
	\fi%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\mi@checkbeginlocalMI}
%
% Usage: |\mi@checkbeginlocalMI|\meta{dummy}\meta{next token}.
%
% \meta{dummy} is the result of an optimization of |\mi@skiplines|.
% (see above)
%
%    \begin{macrocode}
\def\mi@checkbeginlocalMI#1#2{%
	\ifx#2\mi@percentempty%
%    \end{macrocode}
%
% A percent sign: It starts a local metainfo. Change to metainfo.
%
%    \begin{macrocode}
		\par%
		\ifmi@firstlocalMI\mi@@firstlocalMItext\fi%
		\mi@@everylocalMItext%
%    \end{macrocode}
%
% We have begun to typeset the local metainfo, therefore we take note
% that any local metainfo following this one is not the first.
%
%    \begin{macrocode}
		\mi@firstlocalMIfalse%
		\expandafter\mi@typesetMI%
	\else%
%    \end{macrocode}
%
% Anything else: No, it is just a simple comment. Ignore it.
%
%    \begin{macrocode}
		\expandafter\mi@gobbletolineend\expandafter#2%
	\fi%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\mi@checkdocumentend}
%
% Checks if the |\end| just read ends the |document| environment.
%
%    \begin{macrocode}
\def\mi@checkdocumentend{%
%    \end{macrocode}
%
% We change the catcodes of braces back to normal in order to get the
% name of the environment as the only parameter of |\mi@checkdocumentend@|
% and not only the opening brace.
%
%    \begin{macrocode}
	\mi@normalbraces%
	\mi@checkdocumentend@%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\mi@checkdocumentend@}
%
% Support macro for |\mi@checkdocumentend|.
%
%    \begin{macrocode}
\def\mi@checkdocumentend@#1{%
	\def\@tempa{#1}%
	\ifx\@tempa\mi@textdocument%
%    \end{macrocode}
%
% If there has been any local metainfo before this macro, we finish it
% by inserting |\mi@@lastlocalMItext|:
%
%    \begin{macrocode}
		\ifmi@firstlocalMI\else\mi@@lastlocalMItext\fi%
		\expandafter\mi@gobbletolineend@any\expandafter\endinput%
	\else%
%    \end{macrocode}
%
% As are not done yet, we better set the catcode of braces to
% `letter':
%
%    \begin{macrocode}
		\mi@otherbraces%
		\expandafter\mi@skiplines%
	\fi%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\mi@textdocument}
%
% The text `document' for |\mi@checkdocumentend|.
%
%    \begin{macrocode}
\def\mi@textdocument{document}
%    \end{macrocode}
% \end{macro}
%
%
%
% \begin{macro}{\mi@percentempty}
%
%    \begin{macrocode}
\def\mi@percentempty{\@empty}
%    \end{macrocode}
% \end{macro}
%
%
%
%
% \subsubsection{Gobbling text}
%
%    \begin{macrocode}
\bgroup
\catcode`\^^M=\active%
%    \end{macrocode}
%
%
% \begin{macro}{\mi@gobbletolineend}
%
% Gobbles up any text till the end of the line. Continues with
% |\mi@skiplines|. (specialization of |\mi@gobbletolineend@any|)
%
%    \begin{macrocode}
\gdef\mi@gobbletolineend{%
	\mi@gobbletolineend@any\mi@skiplines%
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\mi@gobbletolineend@any}
%
% Usage: |\mi@gobbletolineend@any| \marg{macro}.
%
% Gobbles up any text till the end of the line. Continues with
% \meta{macro}. The macro is |long| in case the line (stored in |#2|)
% contains a |\par|.
%
%    \begin{macrocode}
\long\gdef\mi@gobbletolineend@any#1#2^^M{%
	#1%
}
\egroup
%    \end{macrocode}
% \end{macro}
%
%
%
% \subsubsection{Catcode changes}
%
% We define the macros for changing catcodes:
%
% \begin{macro}{\mi@activenewline}
% \begin{macro}{\mi@verbatimnewline}
% \begin{macro}{\mi@emptyactivepercent}
% \begin{macro}{\mi@activehat}
%
%    \begin{macrocode}
\bgroup
%    \end{macrocode}
%
% We use \verb+|+ as the comment character as we make |%| active:
%
%    \begin{macrocode}
\catcode`\|=14 %
\catcode`\^^M=\active%
\catcode`\%=\active|
\gdef\mi@activenewline{|
	\catcode`\^^M=\active|
	\let^^M\@empty|
}|
\gdef\mi@verbatimnewline{|
	\catcode`\^^M=\active|
	\def^^M{\par\@gobbletwo}|
}|
\gdef\mi@emptyactivepercent{|
	\catcode`\%=\active|
	\let%\mi@percentempty|
}|
\catcode`\^=\active|
\gdef\mi@activehat{|
	\catcode`\^\active|
	\let^\mi@hat|
}|
\egroup
%    \end{macrocode}
% \end{macro}
% \end{macro}
% \end{macro}
% \end{macro}
%
%
% \begin{macro}{\mi@normalpercent}
%
%    \begin{macrocode}
\def\mi@normalpercent{%
	\catcode`\%=14 %
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\mi@otherbraces}
%
%    \begin{macrocode}
\def\mi@otherbraces{%
	\catcode`\{=12 %
	\catcode`\}=12 %
}
%    \end{macrocode}
% \end{macro}
%
%
% \begin{macro}{\mi@normalbraces}
%
%    \begin{macrocode}
\def\mi@normalbraces{%
	\catcode`\{=1 %
	\catcode`\}=2 %
}
%    \end{macrocode}
% \end{macro}
%
%
%
% \Finale
% \PrintChanges
% \PrintIndex
\endinput