summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/ktv-texdata/ktv-texdata.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/latex/ktv-texdata/ktv-texdata.dtx')
-rw-r--r--Master/texmf-dist/source/latex/ktv-texdata/ktv-texdata.dtx1838
1 files changed, 1838 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/ktv-texdata/ktv-texdata.dtx b/Master/texmf-dist/source/latex/ktv-texdata/ktv-texdata.dtx
new file mode 100644
index 00000000000..ee20f06fd72
--- /dev/null
+++ b/Master/texmf-dist/source/latex/ktv-texdata/ktv-texdata.dtx
@@ -0,0 +1,1838 @@
+% \iffalse
+% File: ktv-texdata.dtx
+% Copyleft 2003 Ky Anh
+%
+% This program is free software; you can redistribute it and/or
+% modify it under the terms of the GNU General Public License
+% as published by the Free Software Foundation; either version 2
+% of the License, or (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+% See the GNU General Public License for more details.
+%
+% For error reports,
+% or offers to help improve the `ktv-texdata' package,
+% please mail to
+% Ky` Anh, kyanh@linuxmail.org
+% \fi
+%
+% \iffalse
+%<*dtx>
+\ProvidesFile{ktv-texdata.dtx}
+ [2003/11/20 v1468 KTV, Data Manager]
+%</dtx>
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{ktv-texdata}
+%<package>[2003/10/06 v05.34 KTV, Data Manager]
+%<*driver>
+\documentclass[oneside]{ltxdoc}
+\usepackage{ktv-buildnum}
+\CodelineIndex
+\RecordChanges
+\DocInput{ktv-texdata.dtx}
+\begin{thebibliography}{VE}
+\addcontentsline{toc}{section}{References}
+\bibitem[VE]{VE}
+ Victor EIJKHOUT, {\it \TeX\ by Topic}, Addison-Wesley, 1992.
+\end{thebibliography}
+\end{document}
+%</driver>
+%
+% \fi
+%
+% \GetFileInfo{ktv-texdata.dtx}
+%
+% \def\docversion{\the\buildnum}
+% \def\docdate{\filedate}
+%
+% \makeatletter
+% \let\@afterindentfalse\@afterindenttrue
+% \@afterindenttrue
+% \makeatother
+%
+% \def\pkg{{\bf ktv-texdata}}
+% \def\back:{$\backslash$}
+% \def\trick:{\DescribeMacro{Trick}{:: \bf TRICK}\hrulefill\par}
+%
+% \begin{document}
+% \title{\pkg\ package}
+% \author{K\`{y} Anh\\(\ttfamily{kyanh@inic.biz, kyanh@linuxmail.org})}
+% \date{\begin{tabular}{rll}
+% \texttt{package:}
+% &version 05.34, & last update 2003/10/06
+% \\
+% \texttt{documentation:}
+% &version \docversion, & last update \docdate
+% \end{tabular}}
+% \maketitle
+%
+% ^^M\CheckSum{656}
+%
+% \begin{abstract}
+%
+% This package provides a simple way to use
+% the \TeX\ input files whose contents
+% are in the numbered environments.
+%
+% This package is useful for
+% \underline{\bf the teachers of mathematics},
+% who often work with large libraries of mathematical exercises.
+%
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \section{How will you do?}
+% \label{sec:howwillyoudo}
+%
+% Assume that you have an input file (named `|foo.tex|')
+% that specifies 16 exercies
+% \begin{verbatim}
+% % --- first line of `foo.tex'
+% \begin{exercice}\label{ex:1}
+% This is the first exercice.
+% \end{exercice}
+%
+% \begin{exercice}\label{ex:2}
+% This is the second exercice.
+% \end{exercice}
+%
+% ...
+% \begin{exercice}[*]\label{ex:16}
+% This is the 16th exercice
+% (with a star mark *).
+% \end{exercice}
+% % --- last line of `foo.tex'
+% \end{verbatim}
+% On Tuesday, for e.g., you want to create a student test
+% that contains the first 8 exercises of the `|foo.tex|'.
+% However, on Wednesday, you want to create another test
+% that contains the last 8 exercises of the `|foo.tex|'.
+%
+% Of course, the simplest way to do that
+% is \emph{copying} and \emph{pasting}.
+% Of course, this way becomes too complex in case,
+% for e.g., you need only the exercies that are numbered oddly
+% (1, 3, 5, 7, 9, 11, 13, 15).
+%
+% You may think of a solution like this
+% \begin{verbatim}
+% \getonly{1,2,3,4,5,6,7,8} % on Tuesday
+% \getonly{9,10,11,12,13,14,15,16} % on Wednesday
+% \getonly{1,3,5,7,9,11,13,15} % on Friday
+% \end{verbatim}
+%
+% Yes, here we go....
+%
+% \section{Introduction}
+%
+% \subsection{Convention}
+%
+% Instead of using |#1|, |#2|, etc., to specify
+% the first, the second,... parameter or argument of a macro,
+% we will use |#foo|, |#xfoo|,... where |#foo| is
+% a short description of |#1|,
+% and |#xfoo| is a short description of |#2|, etc.
+%
+% \emph{Parameter} is something declared in the macro's definitons.
+%
+% \emph{Argument} is something you pass to a macro when you call it.
+%
+% The optional parameters are enclosed in the brackets (`|[|' and `|]|').
+%
+% \subsection{Data item `bxx'}
+%
+% \subsubsection{Form}
+% \label{ssec:bxx.form}
+%
+% Each `|bxx|', or a \emph{data item}, is of the form
+% \begin{center}
+% \begin{tabular}{l}
+% |\bxx(#env)[#thm]ID;|\\
+% \emph{something to typeset}\\
+% |\exx|
+% \end{tabular}
+% \end{center}
+% Note that `|\exx|' must be located at
+% \emph{the beginning of a new line}\\
+% and the semicolon `|;|' is mandatory.
+%
+% \DescribeMacro{ID}
+% |ID| is any non-empty string of
+% characters, numbers or punctuations:
+% \begin{center}
+% \begin{tabular}{rl}
+% |ID| &$\longrightarrow$ |char-num| / |xpunct| / |ID|\,|ID|\\
+% |char-num|&$\longrightarrow$ |a..z| / |A..Z| / |0..9|\\
+% |xpunct| &$\longrightarrow$ |:| / |.| / |,|
+% \end{tabular}
+% \end{center}
+% For example, `|ex:1|', `|Ex:2003|' are the |ID|s, but `|ex;1|' isnot.
+%
+% \DescribeMacro{#env}
+% |#env| is any predefined environment.
+% Parameter |(#env)| is \emph{optional}.
+%
+% \DescribeMacro{#thm}
+% |#thm|\, is the \emph{optional argument} for the environment |#env|.
+% It is also the \emph{optional parameter} for the macro |\bxx|,
+% because it is enclosed in the brackets;
+% so you can specify a `|bxx|' like this
+% \begin{center}
+% \begin{tabular}{l}
+% |\bxx(#env)ID;|\\
+% \emph{something to typeset}\\
+% |\exx|\\
+% \end{tabular}
+% \end{center}
+% or more simply (because |(#env)| is optional)
+% \begin{center}
+% \begin{tabular}{l}
+% |\bxx ID;|\\
+% \emph{something to typeset}\\
+% |\exx|\\
+% \end{tabular}
+% \end{center}
+%
+% \subsubsection{Meaning}
+%
+% \DescribeMacro{\bxx}
+% \DescribeMacro{\exx}
+% What does `|bxx|' mean?
+%
+% Yes, it's very familar with |\begin{#env}| and |\end{#env}|.
+% \begin{center}
+% \begin{tabular}{r@{\hspace{5mm}\emph{means}\hspace{5mm}}l}
+% |\bxx(#env)[#thm]ID;| & |\begin{#env}[#thm]|\\
+% \emph{something to typeset} & \emph{itself}\\
+% |\exx| & |\end{#env}|
+% \end{tabular}
+% \end{center}
+%
+% \subsubsection{Identifying the `bxx'}
+% \label{ssec:bxx.identify}
+%
+% We use |ID| and |#env| to identify a `|bxx|'
+% by associating that `|bxx|' with the string |#envID|.
+% This string is named \emph{string-id} of the `|bxx|'.
+% Then two `|bxx|'s are different
+% if their \emph{string-id}s are different.
+% For e.g., after the declaration
+% \begin{center}
+% \begin{verbatim}
+% \bxx(exercise)100;
+% ...
+% \exx
+% \end{verbatim}
+% \end{center}
+% the \emph{string-id} of the `|bxx|' is `|exercise100|'.
+%
+% \subsection{Data file. Example}
+%
+% An input file containing one or more `|bxx|'
+% is called a \emph{data fille}.
+% Using the `|bxx|', we reedit the `foo.tex' in the first section.
+% Then, `|foo.tex|' becomes a \emph{data file}.
+% \begin{verbatim}
+% % --- first line of the new `foo.tex'
+% \bxx(exercice)ex:1;
+% \label{ex:1}
+% This is the first exercice.
+% \exx
+% \bxx(exercice)ex:2; \label{ex:2}
+% This is the second exercice.
+% \exx
+% ...
+% \bxx(exercice)ex:16;\label{ex:16}
+% This is the 16th exercice.
+% \exx
+% % --- last line of the new `foo.tex'
+% \end{verbatim}
+%
+% \section{User's macros}
+%
+% \subsection{Turning on/off the detail(s)}
+%
+% \DescribeMacro{\xdetailon}
+% \DescribeMacro{\xdetailoff}
+% Syntax
+% \begin{center}
+% |\xdetailon| \\ |\xdetailoff|
+% \end{center}
+%
+% By default, the package shows \emph{string-id} of the `|bxx|'
+% you want to get on the margin. You can turn this feature
+% on/off by these marcos. The macros can be put anywhere in your
+% document. See the package's test for an illustration.
+%
+% You can also pass an option to the package, like this
+% \begin{center}
+% |\usepackage[detailon]{ktv-texdata}|, or\\
+% |\usepackage[detailoff]{ktv-texdata}|\phantom{xx}
+% \end{center}
+%
+% \subsection{Specifying the default environment}
+%
+% \DescribeMacro{\xenv}
+% Syntax
+% \begin{center}
+% |\xenv(#env)|
+% \end{center}
+% This macro specifies the default environment used for the macros
+% `|bxx|', `|\xget|', `|\xgetall|', etc.
+% Here |#env| is any predefined environment.
+%
+% This macro can be put anywhere.
+% It keeps the effect until the next |\xenv|.
+%
+% \subsection{Getting/Ignoring the `bxx'}
+%
+% There are 7 macros used to get/remove the `bxx' from the data file.
+% \begin{center}
+% \begin{tabular}{l@{ \ }l@{ \ }l}
+% |\xget| & |\xgetall| & |\xgetallbut|\\
+% |\xkill| & |\xkillall| & |\xkillallbut|\\
+% & |\xspec| &
+% \end{tabular}
+% \end{center}
+% The macro |\xspec| is described in subsection \ref{ssec:xspec}.
+%
+% \DescribeMacro{\xgetall}
+% \DescribeMacro{\xkillall}
+% Syntax
+% \begin{center}
+% |\xgetall|\\ |\xkillall|
+% \end{center}
+% |\xgetall| means that
+% you want to \emph{get all the data items from the data file},
+% while |\xkillall| means that you want to \emph{ignore all...}.
+% These macros remove the effects of any |\xget|, |\xkill|
+% that is called before them.
+%
+% \DescribeMacro{\xget}
+% Syntax
+% \begin{center}
+% |\xget(#env){#ID-list}|
+% \end{center}
+% where
+% \begin{itemize}
+% \item
+% |#env| is an environment name. The parameter |(#env)| is optional.
+% \item
+% |#ID-list| is a list of |ID|s that're seperated by the comma (`|,|'),
+% each |ID| can be prefixed by a plus sign (`|+|')
+% or by a minus sign (`|-|').
+% \end{itemize}
+% For e.g., the specification
+% \begin{center}
+% |\xget(exercise){-12,-3,+5,6,-99,+100}|
+% \end{center}
+% means that you want to get from the data file all the `|bxx|'s
+% whose \emph{string-id}s are
+% \begin{center}
+% |exercise5|, |exercise6|, |exercise100|
+% \end{center}
+% Because you specified |-12|, |-3|, |-99|,
+% all the `|bxx|' whose \emph{string-id}s are
+% |exercise12|, |exercise3|, |exercise99| are ignored.
+% Of course, |exercise7| is ignored, too.
+%
+% \trick:
+% The parameter |(#env)| is optional; so if you specified
+% \begin{center}
+% |\xenv(exercise)|
+% \end{center}
+% then you can write shortly
+% \begin{center}
+% |\xget{-12,-3,+5,6,-99,+100}|
+% \end{center}
+%
+% \trick:
+% A sequence of two |\xget|s can be replaced by one |\xget|, for e.g.,
+% \begin{center}
+% |\xget{1,6}| |\xget{3,-4}|
+% $\longrightarrow$ |\xget{1,6,3,-4}|
+% \end{center}
+%
+% \DescribeMacro{\xkill}
+% The syntax and tricks are the same as |\xget|.
+% Try to guess the usage of this macro.
+%
+% \DescribeMacro{\xgetallbut}
+% \DescribeMacro{\xkillallbut}
+% The syntax is the same as |\xget|.
+%
+% The macro |\xgetallbut| means that you want to
+% \emph{get all the data items} \underline{but}
+% \emph{the data items specified in the} |#ID-list|.
+%
+% Inversely, the macro |\xkillallbut| means that you want to
+% \emph{ignore all the data items} \underline{but}
+% \emph{the data items specified in the} |#ID-list|.
+%
+% \trick:
+% These macros are affected by |\xget| and |\xkill|.
+% For e.g., the sequence
+% \begin{center}
+% |\xget{1,2,3}| |\xgetallbut{3,4,7}|
+% \end{center}
+% will be understood as |\xgetallbut{1,2,3,4,7}|.
+%
+% Here're some other examples (may be useless for you)
+% \begin{center}
+% \begin{tabular}{r@{ }l@{ $\longrightarrow$ }l}
+% |\xget{1,2}| &|\xgetallbut{2,3,4}| &|\xgetallbut{1,2,3,4}|\\
+% |\xkill{1,2}| &|\xgetallbut{2,3,4}| &|\xgetallbut{2,3,4}|\\
+% |\xget{1,2}| &|\xkillallbut{2,3,4}| &|\xkillallbut{1,2,3,4}|\\
+% |\xkill{1,2}| &|\xkillallbut{2,3,4}| &|\xkillallbut{2,3,4}|\\[2mm]
+% |\xgetallbut{2,3,4}| &|\xget{1,2}| &|\xgetallbut{1,2,3,4}|\\
+% |\xgetallbut{2,3,4}| &|\xkill{1,2}| &|\xgetallbut{3,4}|\\
+% |\xkillallbut{2,3,4}|&|\xget{1,2}| &|\xkillallbut{1,2,3,4}|\\
+% |\xkillallbut{2,3,4}|&|\xkill{1,2}| &|\xkillallbut{3,4}|\\
+% \end{tabular}
+% \end{center}
+%
+% \subsection{Openning the data file}
+%
+% \DescribeMacro{\xopenlib}
+% Syntax
+% \begin{center}
+% |\xopenlib foo;|
+% \end{center}
+% where |foo|\footnote{The extension
+% `|.tex|' may be omitted, so \back:|xopenlib foo;|
+% is the same as \back:|xopenlib foo.tex;|.}
+% is a data file.
+% The semicolon `|;|' is mandatory.
+%
+% The commands |\xget|, |\xkill|, etc.,
+% in the previous section play no rule with the data file.
+% They just tell |\xopenlib| that the `|bxx|' should be got/ignored.
+% It's |\xopenlib| that opens the data file, looks for the `|bxx|'
+% and does many other things. So if you want to |\xget{1,3,2}|,
+% the really code is
+% \begin{center}
+% |\xget{1,3,2}| |\xopenlib foo;|
+% \end{center}
+% See subsection \ref{ssec:xlib} for a trick.
+%
+% \subsection{Specifying the default data file}
+% \label{ssec:xlib}
+%
+% \DescribeMacro{\xlib}
+% It's convenient to specify a default data file. Let's do it by
+% \begin{center}
+% |\xlib foo;|
+% \end{center}
+% The file extension `|.tex|' can be omitted.
+%
+% \trick:
+% After specifying the default data file, you can open that file by
+% \begin{center}
+% |\xopenlib;|
+% \end{center}
+%
+% \subsection{Getting orderly the data items}
+% \label{ssec:xspec}
+%
+% Do you have any questions about the order of the `bxx's?
+%
+% Yes, if you had, the answer is:
+% the calling of |\xget|, |\xgetall|, |\xkill|, etc.,
+% will produce the output in which the order of the data items
+% is same as the order of data items in the data file.
+% More concretely, if in `|foo.tex|' you specify
+% \begin{verbatim}
+% \bxx 15;
+% ITEMA.
+% \exx
+% \bxx 14;
+% ITEMB.
+% \exx
+% \end{verbatim}
+% then |\xget{14,15}| |\xopenlib foo;|\\
+% or\phantom{en} |\xget{15,14}| |\xopenlib foo;|\\
+% gives the same results:
+% `|ITEMA|' is put before `|ITEMB|'.
+%
+% So we need the macro described below.
+%
+% \DescribeMacro{\xspec}
+% Syntax (same as |\xget|)
+% \begin{center}
+% |\xspec(#env){#ID-list}|
+% \end{center}
+% |(#env)| is also an optional parameter.
+%
+% This macro opens the data file (so you needn't to
+% specify a |\xopenlib...| after it), extract the data items
+% from the data file within the order in the |#ID-list|.
+%
+% So if you want to put `|ITEMB|' before the `|ITEMA|'
+% (see above example), you should call
+% \begin{center}
+% |\xspec{14,15}|
+% \end{center}
+%
+% \section{Advanced features}
+%
+% \subsection{Enabling/Disabling section in data file}
+%
+% A data file may be divided into sections.
+% But when looking for data file, this package
+% will be typeset normally anything that isnot inside any a `|bxx|'
+% (for e.g, a |\section| command),
+% so you can see some strange outputs.
+%
+% \DescribeMacro{\xenablesection}
+% \DescribeMacro{\xdisablesection}
+% Syntax
+% \begin{center}
+% |\xdisablesection|\\|\xenablesection|
+% \end{center}
+% The first macro disables three commands
+% \begin{center}
+% |\section| |\subsection| |\subsubsection|
+% \end{center}
+% The second enables three above section commands
+% by restoring them to the values that this package
+% captured at the beginning of the document.
+% (So if you redefine a section command inside
+% |\begin{document}| and |\end{document}|,
+% you may lost that new command after using the sequence
+% |\xdisablesection| |\xenablesection|.
+%
+% {\bf NOTE:}
+%
+% |\xdisablesection| cannot disable the command
+% \begin{center}
+% |\section[optional]{...}|
+% \end{center}
+%
+% \subsection{Data item followed by `hint' environment}
+%
+% \DescribeEnv{hint}
+% If a data item, or a `|bxx|', in data file is an exercise,
+% it is often followed by a hint (a solution).
+% All the hints should be collected in a private place.
+% The `|hint|' environment helps you in this behaviour.
+% You put `|hint|' just after the declaration of a data item,
+% like this
+% \begin{verbatim}
+% \bxx 100;
+% This is Exercise A
+% \exx
+% \begin{hint}
+% This is the hint of excercise A.
+% \end{hint}
+% \end{verbatim}
+% When you get the above `|bxx|', for e.g., by |\xget{100}|,
+% the content of the hint, here's \emph{\lq\lq This is the hint...\rq\rq}
+% will be written automatically to a file called `|hintfile|'.
+%
+% \DescribeMacro{\xopenhint}
+% If you want to open the hint file, just call
+% \begin{center}
+% |\xopenhint|
+% \end{center}
+%
+% {\bf IF YOU WANT TO KNOW MORE...}
+%
+% The `|hintfile|' is really a data file, whose name is
+% \begin{center}
+% |\jobname.KTVhint|
+% \end{center}
+% |\jobname| is the name of current job,
+% and `|.KTVhint|' is the extension\footnote{If your system
+% doesnot support the long extension file name,
+% please report to the author.} provided by the author.
+%
+% By default, all the contents
+% of the `|hintfile|' will be loaded (|\xgetall|).
+%
+% It's too complex to explain the structure of the `|hintfile|'.
+% Let's typset the test, look for the `|hintfile|'
+% and the results for more details. Thank you!
+%
+% \section{Important notes (to the users)}
+%
+% \begin{itemize}
+% \item[a)]
+% (bug)
+% You must put |\xenv(#env)| before any calling |\xget|, |\xkill|, etc.
+% Try this bug to know how the package works.
+% \item[b)]
+% Donot put |\xdisablesection| just before |\tableofcontents|.
+% (Otherwise, an error will be reported.)
+% \item[c)]
+% The environment(s) of the data items in the data file must be predefined.
+% \item[d)]
+% |\xopenhint| should be called at the very end of the document,
+% and must be called after any |\xspec|, |\xopenlib| commands.
+% (|\xopenhint| will closed the `|hintfile|';
+% after that the writting operations have no effect on this file.)
+% \item[e)]
+% (bug)
+% Labelling the `|bxx|' maynot work well.
+% If you try to load twice a `|bxx|',
+% then two loadings will have a same label.
+% In next version, we will redefine the |\label| and |\ref| to fix this bug.
+% \end{itemize}
+%
+%
+% \section{Generating package and example}
+%
+% Excuting
+% \begin{center}
+% {{\bf latex} \ttfamily ktv-texdata.ins}
+% \end{center}
+% to generate the package ({\tt ktv-texdata.sty})
+% and a test
+% ({\it two files:} {\tt ktv-test.tex}; {\tt ktv-data.tex}).
+% Then typeset file {\ttfamily ktv-test.tex}.
+%
+% \section{Implementation}
+%
+% \subsection{Notes}
+%
+% \emph{The implementation} is the document
+% {\bf used only} by the package's hacker!!!
+%
+% This package is written by |top-down| technique:
+% A macro |\fooA| sometimes calls the macro |\fooB|
+% whose the definitions appears after the defintions of |\fooA|.
+%
+% This package uses some advanced and interesting macro techniques
+% (\emph{unknown-number-of-parameters-macro},
+% \emph{two-optional-parameters-macro}, and much more).
+% If you're a newbie of \LaTeX\ programming,
+% you will learn some new things by learning the code of package.
+%
+% \subsection{Requirements. Options}
+%
+% \begin{macrocode}
+%<*package>
+\RequirePackage{verbatim}
+% \end{macrocode}
+%
+% \begin{macro}{\@@xdetail}
+% This macro shows \emph{string-id} of the current `|bxx|'
+% on the margin.
+% \begin{macrocode}
+\def\@@xdetail{\marginpar{{\bf\@xenv}\@xlbl}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{environment}{detailon}
+% |detailon| is the default option.
+% Anything else means |detailoff|.
+% \begin{macrocode}
+\DeclareOption{detailon}{\let\@xdetail\@@xdetail}
+\DeclareOption*{\let\@xdetail\relax}
+\ExecuteOptions{detailon}
+\ProcessOptions
+% \end{macrocode}
+% \end{environment}
+%
+% \subsection{General purpose macros}
+%
+% \begin{macro}{\b@sy}
+% |\b@sy| means `not |\relax|'.
+% \begin{macrocode}
+\def\b@sy{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\if@xNIL}
+% Check if string |#1| is empty.
+%
+% \begin{macrocode}
+\def\if@xNIL#1;{\ifx\relax#1\relax}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Scanning and setting flag for \emph{string-id}}
+% \label{ssec:scanning}
+%
+% First, consider the example when the user calls
+% \begin{center}
+% |\xget(exercise){ex:1,-ex:3,ex:5,ex:7,ex:9,ex:11,ex:13,ex:15}|
+% \end{center}
+% Here he (the user) wants to get the `|bxx|'
+% that is numbered oddly,
+% and that uses the environment `|exercise|'
+% from the data file
+% (\underline{\bf but} he doesn't want to get |ex:3|).
+%
+% Because the number of exercises he wants to get is unknown
+% (he just specifies a list of the items he needs),
+% we must design a macro that scans for all the items in the list.
+% Moreover, this macro will set the flag `|get|' or `|donotget|'
+% for each item (in the above example, the flag for |ex:3|
+% is `|donotget|', for the others is `|get|').
+%
+% \begin{macro}{\usr@xenv}
+% \begin{macro}{\usr@xlbl}
+% These macros are used to store the result of the scanning.
+% \begin{macrocode}
+\def\usr@xenv{}
+\def\usr@xlbl{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@multact}
+% Scan and set the flag (|get|, |donotget|) for the items of a list.
+% The syntax is
+% \begin{center}
+% |\@multact(#usr-env){#ID-list}|
+% \end{center}
+% where |#ID-list| is a list of |ID|(s)\footnote{%
+% see subsection \ref{ssec:bxx.form}.}
+% that're seperated by the comma (`|,|').
+% Moreover, each |ID| can be prefixed by a plus/minus sign (|+|, |-|).
+% \begin{center}
+% \begin{tabular}{rl}
+% |#ID-list| &$\longrightarrow$ |XID| / |#ID-list|, |XID| \\
+% |XID| &$\longrightarrow$ |ID| / |+ID| / |-ID|
+% \end{tabular}
+% \end{center}
+% If |ID| is prefixed by a |+| (resp., a |-|), it means
+% that this |ID| has a `{\it positive}' (resp., `{\it negative}')
+% meaning\footnote{%
+% If the user wants to get something,
+% the |+| means `{\it he wants}', but |-| means `{\it he doesn't want}'.
+% If the user doesn't want to get someting,
+% the |+| means `{\it no, he doesn't want}',
+% while the |-| means `{\it yes, he wants}'.}
+% in the current context.
+% An |ID| without prefix is the same as |+ID|.
+%
+% The |#usr-env| is any environment (maynot be predefined).
+% This |#usr-env| is concatenated with every |ID| in the |#ID-list|.
+% The concatenation will create the \emph{string-id}(s)
+% for which we will later set the flag.
+%
+% Here we use (|#usr-env|) instead of (|#env|)
+% because the environment |#usr-env| is used at the time the user
+% wants to \emph{get some thing} from the data file (for e.g.,
+% by the command |\xget{ex:1,ex:2}|).
+% This environment may be different from the environment we
+% specify in the data file, it maynot even be predefined.
+%
+% Note that |(#usr-env)| is optional parameter of macro |\@multact|.
+% In case that |(#usr-env)| is omitted,
+% |#usr-env| will get the default value saved in |\@@xenv|.
+% \begin{macrocode}
+\def\@multact{\futurelet\@tchar\chk@multact}
+% \end{macrocode}
+% We first check if the next char is a `|(|'.
+% \begin{macrocode}
+\def\chk@multact{%
+ \ifx(\@tchar
+ \let\@txen\opt@multact
+ \else
+ \let\@txen\nop@multact
+ \fi
+ \@txen}
+% \end{macrocode}
+% If the next char is a `|(|'
+% \begin{macrocode}
+\def\opt@multact(#1)#2{%
+ \def\usr@xenv{#1}%
+% \end{macrocode}
+% then read the |#ID-list| by calling |\@xmultarg|%
+% (see subsection \ref{ssec:ID.extract} below)
+% \begin{macrocode}
+ \@xmultarg{#2}}
+% \end{macrocode}
+% If the next char is not a `|(|', |\usr@xenv| gets the default value
+% \begin{macrocode}
+\def\nop@multact#1{%
+ \def\usr@xenv{\@@xenv}
+% \end{macrocode}
+% then read the |#ID-list| by calling |\@xmultarg|
+% \begin{macrocode}
+ \@xmultarg{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Extracting ID from the \#ID-list}
+% \label{ssec:ID.extract}
+%
+% \begin{macro}{\@action}
+% |\@action| is \emph{something} we want to affect
+% each \emph{string-id}\footnote{\emph{string-id}%
+% is created by concatenation |\#usr-env| and |ID|.
+% See subsection \ref{ssec:bxx.identify}.
+% } found.
+% We first let |\@action| to |\relax|,
+% so we avoid seeing the error `|! Undefined control...|'.
+% (This letting existed in some previous versions of package.
+% Now the author doesnot know what's going on if this line is removed!)
+% \begin{macrocode}
+\let\@action\relax
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@MINUS}
+% \begin{macro}{\@@MINUS}
+% \begin{macro}{\@@ZERO}
+% There are three kinds of actions
+% (|plus| action, |minus| action, and |nosign| action).
+% We'll see in subsection \ref{ssec:action.collection} that
+% every action is named `|MINUS|\emph{something}',
+% or `|ZERO|\emph{something}', or `|PLUS|\emph{something}'.
+% \begin{macrocode}
+\def\@@MINUS{MINUS}
+\def\@@PLUS{PLUS}
+\def\@@ZERO{ZERO}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@xmultarg}
+% |\@xmultarg| is used to extract the |ID|(s) from the |#ID-list|.
+% Here we use the macro technique specified in \cite{VE}.
+% First, we add to the argument |#1| the terminator\footnote{Because
+% that `|@|' is never used to create an |ID|,
+% the terminator `|@@@|' works well.} |\@endlbl| (`|@@@|').
+% Then we call |\@@xmultarg|.
+% \begin{macrocode}
+\def\@xmultarg#1{\@@xmultarg#1,@@@,}
+\def\@endlbl{@@@}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@xmultarg}
+% Now is the extracting.
+% \begin{macrocode}
+\def\@@xmultarg#1,{%
+ \def\@xtempi{#1}
+ \ifx\@endlbl\@xtempi
+ % do nothing
+ \else\@@@xmultarg#1,
+ \expandafter\@@xmultarg
+ \fi}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@@xmultarg}
+% Every |ID| extracted will be concatenated
+% with the |#usr-env| to create the \emph{string-id}.
+% The \emph{string-id} will be affected
+% by one of three actions (|plus|, |minus| or |nosign|/|zero|).
+% We first check the sign of the |ID| in the |#ID-list|.
+% \begin{macrocode}
+\def\@@@xmultarg{\futurelet\@tchar\chk@@@xmultarg}
+\def\chk@@@xmultarg{% 2003/05/14
+ \ifx-\@tchar\relax
+ \let\@txen\@@MINUS
+ \else\ifx+\@tchar\relax
+ \let\@txen\@@PLUS
+ \else
+ \let\@txen\@@ZERO
+ \fi
+ \fi
+% \end{macrocode}
+% To affect |\@action| on the \emph{string-id},
+% we must specify `|type|' of the action.
+% The type is saved in |\@txen| (see previous codes).
+% \begin{macrocode}
+\csname\@txen\@action\endcsname}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Comment creator macro}
+%
+% \begin{macro}{\c@mm@nt}
+% If we donot want to get a `|bxx|' from the data file,
+% we just let temporarily macro `|\bxx|' to `|\c@mm@nt|'.
+% This macro scans and passes (or {\it ignore})
+% the input \emph{line by line}, until it finds the fisrt `|\exx|'.
+% That's why every `|bxx|' must be ended by a `|\exx|' in a single line!
+% And that's why `|bxx|' cannot be nested!
+% \begin{macrocode}
+\gdef\c@mm@nt{%
+ \begingroup
+ \catcode`\^^M=12 %
+ \x@comment}
+{\catcode`\^^M=12 \endlinechar=-1 %
+\gdef\x@comment#1^^M{%
+ \def\@xtest{#1}%
+ \ifx\@xtest\exx
+ \let\@txen=\endgroup
+ \else
+ \let\@txen\x@comment
+ \fi
+ \@txen}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Hint file. Hint creator environment}
+%
+% An exercise, for e.g., may be followed by a hint (or a solution).
+% In a test, a book of excercises,
+% all hints should be collected in a single file
+% (named `|hint file|') that is genererated automatically by the package.
+% The |hint file| is also a data file; of course, it contains
+% only the hint that follows the `|bxx|' we want to get from the data file
+% (the \emph{active} `|bxx|'s).
+%
+% Because a hint sometimes will be disabled,
+% we need a boolean test |\if@xhint|.
+% \begin{macrocode}
+\newif\if@xhint
+% \end{macrocode}
+% The name of hint file is `|\jobname.KTVhint|'.
+% \begin{macrocode}
+\newwrite\@xfhint
+\immediate\openout\@xfhint=\jobname.KTVhint
+% \end{macrocode}
+% We put some information in the first two lines of hint file.
+% \begin{macrocode}
+{\catcode`\%=12
+\immediate\write\@xfhint{%% File created automatically by `ktv-texdata'.}
+\immediate\write\@xfhint{%% DONOT EDIT THIS FILE MANUALLY.}}
+% \end{macrocode}
+%
+% \begin{environment}{hint}
+% Here is a trick about `hint' environment.
+% We collect hints in a same file.
+% So we need something to know exactly what `|bxx|'
+% a `hint' (in the hint file) associates with.
+% \emph{So.... we assume} that `|#env|'
+% specified in `|bxx|' (in the data file) is a numberable environment.
+% Then when a `hint' follows a `|bxx|' (named |bxxA|) is written to hint file,
+% its number is the same as the number of `|bxx|A' in the output.
+% So we need a counter\footnote{Please try to figure out this counter.}
+% to index the active `|bxx|'.
+% \begin{macrocode}
+\newcount\c@bxx
+% \end{macrocode}
+% \begin{macrocode}
+\newenvironment{hint}{% begin-part of `hint'
+% \end{macrocode}
+% If the hint is enabled
+% \begin{macrocode}
+\if@xhint
+ \let\exx\relax
+% \end{macrocode}
+% In the numbered environment `|#env|',
+% \LaTeX\ automatically creates a counter\footnote{%
+% We should not check for the existing of this counter:
+% the checking may eat so much time!}%
+% named `|c@#env|'.
+% We let `|c@bxx|' to the current value of `|c@#env|',
+% then subtract `|c@bxx|' by 1 (\LaTeX\ will increase `|c@bxx|' later).
+% We create an data item in the hint file,
+% whose \emph{string-id} is the same as the current `|bxx|'.
+% \begin{macrocode}
+ \c@bxx=\csname c@\@xenv\endcsname%
+ \advance\c@bxx by-1 %
+ \immediate\write\@xfhint{\string\setcounter{\@xenv}{\the\c@bxx}}
+ \immediate\write\@xfhint{\string\bxx(\@xenv)\@xlbl;}
+% \end{macrocode}
+% The contents of the hint environment now will be written to the hint file.
+% \begin{macrocode}
+ \let\do\@makeother\dospecials\catcode`\^^M\active%
+ \def\verbatim@processline{%
+ \immediate\write\@xfhint{\the\verbatim@line}}%
+ \expandafter\verbatim@start
+% \end{macrocode}
+% If the hint is disable, let it start a comment environment.
+% Here we use `|\comment|' defined in |verbatim| package,
+% not the `|\c@mm@nt|' defined in this package\protect\footnote{%
+% \emph{A fun story:} in the first version of package, the author
+% used `\back:|comment|' by a mistake, but package ran very well.
+% He later found this error, and changed `\back:|comment|'
+% to `\back:|c@mm@nt|', then the package dumped into the errors!}.
+% \begin{macrocode}
+\else
+ \def\exx{\exx}%
+ \expandafter\comment
+\fi}%
+% \end{macrocode}
+% Now the end-part of hint environment. If the hint is enabled,
+% we put an `|\exx|' to terminate `|\bxx|' in the hint file.
+% The line |\noexpand\exx| was added here but the author forgot the reason.
+% Please help him!
+% \begin{macrocode}
+{%
+\noexpand\exx
+\if@xhint
+ \immediate\write\@xfhint{\string\exx}
+\fi}
+% \end{macrocode}
+% \end{environment}
+%
+% \subsection{Replacements of macro \back:bxx}
+%
+% Macro |\bxx| will be replaced by one of these macros
+% |\@bxx|, |\@bxy|, |\@ball|, |\@bnone|, |\@bnonebut|, |\@ballbut|.
+% The replacement depends on what the macro |\xgetfoo|, |\xkillfoo|, ...
+% are specified by the user.
+%
+% For e.g., if the user calls |\xgetall|,
+% then |\bxx| is replaced by |\@ball|;
+% if they call |\xkillall|, then |\@bnone| takes place.
+%
+% For more details about the replacement,
+% see the definition of |\xget|, |\xgetall|, |\xkill|, |xkillall|, etc.
+% in the subsection \ref{ssec:user.macros}.
+%
+% Here's the summary of the replacements.
+% \begin{center}
+% \begin{tabular}{rl}
+% {Calling } & {The replacement of |\bxx|}
+% \\[3mm]\hline\\
+% |\xget| & |\@bxx|\\
+% |\xgetall| & |\@ball|\\
+% |\xgetallbut| & |\@ballbut|\\[3mm]
+% |\xkill| & |\@bxx|\\
+% |\xkillall| & |\@bnone|\\
+% |\xkillallbut| & |\@bnonebut|\\[3mm]
+% |\xspec| & |\@bxy|
+% \\\\\hline
+% \end{tabular}
+% \end{center}
+%
+% The common syntax for the macros |\@bfoo| is
+% \begin{center}
+% |\@bfoo(#env)[#thm]{#ID}|;
+% \end{center}
+% Here |#thm| is the optional argument of the environment |#env|.
+% Both `|[#thm]|' and `|(#env)|' are the optional parameters
+% of the |\@bfoo| (this means you can omit `|[#thm]|' or `|(#env)|'
+% or both of them while callling `|\@bfoo|').
+% \begin{macro}{\@bxx, \@bxy}
+% Each macro |\@bxx|, |\@bxy| does two things.
+%
+% \emph{Firstly,} it gets the information about the current `|bxx|'
+% (information contains: |#env|, |#thm| and |#ID|).
+% We use the |\@bxxarg| macro .
+%
+% \emph{Secondly,}
+% it calls |\@bfoodone| to typeset the content of the `|bxx|'.
+% \begin{macrocode}
+\def\@bxx#1;{%
+ \@bxxarg#1;%
+ \@bxxdone}
+\def\@bxy#1;{%
+ \@bxxarg#1;%
+ \@bxydone}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@ball}
+% Macro |\@ball| first gets the information about the `|bxx|'
+% (like |\@bxx|), but then it calls `|\@bdone@kern|',
+% the kernel of the |\@bdone|.
+% \begin{macrocode}
+\def\@ball#1;{%
+ \@bxxarg#1;%
+ \@bdone@kern}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@bnone}
+% Macro |\@bnone| starts the comment by calling |\c@mm@nt|.
+% This macro also disable the hint environment that follows the `|bxx|'.
+% \begin{macrocode}
+\def\@bnone#1;{%
+ \@xhintfalse
+ \def\exx{\exx}
+ \expandafter\c@mm@nt}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@bnonebut}
+% Macro |\@bnonebut| ignores the contents of the `|bxx|'
+% if and only if the command `|\csname\@xenv\@xlbl\endcsname|'
+% equals to `|\relax|'.
+%
+% First, the macro scans for information.
+% \begin{macrocode}
+\def\@bnonebut#1;{%
+ \@bxxarg#1;%
+% \end{macrocode}
+% Then it checks the status of the command
+% `|\csname\@xenv\@xlbl\endcsname|'.
+% If this command is undefined, we turn off the next `hint'
+% and start the comment command (to ignore the content of the `|bxx|').
+% \begin{macrocode}
+ \expandafter\ifx\csname\@xenv\@xlbl\endcsname\relax
+ \@xhintfalse
+ \def\exx{\exx}
+ \expandafter\c@mm@nt
+% \end{macrocode}
+% If this command is defined, the contents of the
+% `|bxx|' will be typeset. Before calling `|\@bdone@kern|',
+% we let the status of the command `|...\@xenv\@xlbl...|'
+% to `|\relax|'. By doing this, we ensure that two `|bxx|'s in the
+% data file that have the same \emph{string-id} will be typeset only once.
+% \begin{macrocode}
+ \else
+ \expandafter\let\csname\@xenv\@xlbl\endcsname\relax
+ \expandafter\@bdone@kern
+ \fi}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@ballbut}
+% Macro |\@ballbut| is inverse from the macro `|\@bnonebut|'.
+% \begin{macrocode}
+\def\@ballbut#1;{%
+ \@bxxarg#1;
+ \expandafter\ifx\csname\@xenv\@xlbl\endcsname\relax
+ \expandafter\@bdone@kern
+ \else
+ \expandafter\let\csname\@xenv\@xlbl\endcsname\relax
+ \@xhintfalse
+ \def\exx{\exx}
+ \expandafter\c@mm@nt
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Getting information from `bxx'}
+%
+% \begin{macro}{\@bxxarg}
+% This macro reads the information about the `|bxx|'.
+% The information contains |#env| (saved in `|\@xenv|'),
+% |#thm| (saved in `|\xhead|'), |#ID| (saved in `|\xlbl|').
+%
+% We first set the initial value for three macros:
+% \begin{macrocode}
+\def\@xenv{}
+\def\@xhed{}
+\def\@xlbl{}
+% \end{macrocode}
+% We define two macros that save the default values
+% for the |#env| and |#thm|. The default value of |#thm|
+% should be null (why?). Now the default |#thm|
+% is aslo null, but in the subsection \ref{ssec:user.macros},
+% we define macro |\xenv| to change this behaviour.
+% \begin{macrocode}
+\def\@@xenv{}
+\def\@@xhed{}
+% \end{macrocode}
+% Now we define |\@bxxarg|.
+% \begin{macrocode}
+\def\@bxxarg{\futurelet\@tchar\chk@bxxarg}
+% \end{macrocode}
+% We check if the next char is a `|(|'.
+% \begin{macrocode}
+\def\chk@bxxarg{%
+ \ifx(\@tchar
+ \let\@txen\env@bxxarg
+ \else
+ \let\@txen\nop@bxxarg
+ \fi
+ \@txen}
+% \end{macrocode}
+% If the next char is a `|(|', we hope that
+% the `|bxx|' specifies the `|(#env)|'.
+% Here the author uses an `|\edef|', but he really
+% doesnot know the reasons.
+% The `|\def|' version sometimes causes a strange error.
+% \begin{macrocode}
+\def\env@bxxarg(#1)#2;{%
+ \edef\@xenv{#1}%
+% \end{macrocode}
+% Now we look for the rest of the argument by calling |\@@bxxarg|.
+% \begin{macrocode}
+ \@@bxxarg#2;}
+% \end{macrocode}
+% If the next char isnot a `|(|',
+% `|bxx|' uses the default environment.
+% \begin{macrocode}
+\def\nop@bxxarg#1;{%
+ \edef\@xenv{\@@xenv}%
+% \end{macrocode}
+% Now we look for the rest of the argument (call |\@@bxxarg|).
+% \begin{macrocode}
+ \@@bxxarg#1;}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@bxxarg}
+% The calling of |\@@bxxarg| will first check if
+% the next char is a `|[|'.
+% \begin{macrocode}
+\def\@@bxxarg{\futurelet\@tchar\chk@@bxxarg}
+% \end{macrocode}
+% \begin{macrocode}
+\def\chk@@bxxarg{%
+ \ifx[\@tchar
+ \let\@txen\hed@@bxxarg
+ \else
+ \let\@txen\nop@@bxxarg
+ \fi
+ \@txen}
+% \end{macrocode}
+% If the next char is a `|[|',
+% we hope that `|bxx|' specifies the `|[#thm]|'
+% \begin{macrocode}
+\def\hed@@bxxarg[#1]#2;{%
+ \edef\@xhed{#1}%
+ \edef\@xlbl{#2}}
+% \end{macrocode}
+% If the next char isnot a `|[|', the `|#thm|' gets the default value.
+% \begin{macrocode}
+\def\nop@@bxxarg#1;{%
+ \edef\@xhed{\@@xhed}%
+ \edef\@xlbl{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Typesetting the content of `bxx'}
+%
+% \begin{macro}{\@bxxdone}
+% This macro starts a |\c@mm@nt| (if the command
+% `|...\@xenv\@xlbl...|' is `|\relax|'),
+% or calls |\@bdone@kern| (the kernel of the |\@bxxdone|).
+% \begin{macrocode}
+\def\@bxxdone{%
+ \expandafter\ifx\csname\@xenv\@xlbl\endcsname\relax
+ \@xhintfalse
+ \def\exx{\exx}
+ \expandafter\c@mm@nt
+ \else
+ \expandafter\let\csname\@xenv\@xlbl\endcsname\relax
+ \expandafter\@bdone@kern
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@bdone@kern}
+% This macro typesets the contents of the `|bxx|'
+% by starting the environment `|#env|'. It also turns on the
+% next hint environment.
+%
+% If the `|bxx|' specifies the `|#thm|',
+% we should call `|\begin{#env}[#thm]|';
+% otherwise, we just call `|\begin{#env}|'.
+% (Then the `|\exx|' equals to `|\end{#env}|'.)
+%
+% \emph{Note that} `|\begin{#env}[]|' is different from `|\begin{#env}|.
+% So we must check if the `|#thm|' is empty.
+% \begin{macrocode}
+\def\@bdone@kern{%
+ \@xhinttrue%
+ \def\exx{\end{\@xenv}}
+ \expandafter\if@xNIL\@xhed;
+ \def\@txen{%
+ \begin{\@xenv}\@xdetail}
+ \else
+ \def\@txen{%
+ \begin{\@xenv}[\@xhed]\@xdetail}
+ \fi
+ \@txen}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@bxydone}
+% This macro just passes the arguments to |\@bxy@kern|.
+% \begin{macrocode}
+\def\@bxydone{\@bxy@kern(\@xenv){\@xlbl}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@bxy@kern}
+% This macro is the kernel of |\@bxydone|.
+% It opens the data file, searchs for the `|bxx|'
+% whose \emph{string-id} is `|\@bxy@id|'.
+% If such `|bxx|' is found, the macro stops the seaching\footnote{%
+% We really donot stop the searching. We just ignore the other
+% `|bxx|'(s) in the data file.
+% \emph{Trick:} Each time this macro opens the data file,
+% it gets at most one data item,
+% while, for e.g., \back:|\@bdone@kern| may get more than one.}
+% and calls `|\@bdone@kern|' to typeset the contents of that `|bxx|'.
+% Any `|bxx|' in the data file whose \emph{string-id} doesnot match
+% the string saved in |\@bxy@id| will be ignored.
+%
+% Because a \emph{string-id} never accepts the value `@',
+% we just let |\@bxy@id| to `@' to stop the searching.
+% \begin{macrocode}
+\def\@bxy@id{@}
+\def\@bxy@kern(#1)#2{%
+ \edef\@xtempi{#1#2}
+ \ifx\@bxy@id\@xtempi
+ \def\@bxy@id{@}
+ \expandafter\@bdone@kern
+ \else
+ \@xhintfalse
+ \def\exx{\exx}
+ \expandafter\c@mm@nt
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@xspec@i}
+% If you read the above codes carefully,
+% you donot see anything about the `\emph{openning the data file}'.
+% Yes, the truth is that |\@bxy|, |\@bxydone| and aslo |\@bxy@kern|
+% are always used within the |\@xspec@i|.
+% This macro does the openning.
+% \begin{macrocode}
+\def\@xspec@i(#1)#2{
+ \let\bxx\@bxy
+ \edef\@bxy@id{#1#2}
+% \end{macrocode}
+% Now start the searching (openning)
+% \begin{macrocode}
+ \input \@xlib}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Actions affect on the \emph{string-id}}
+% \label{ssec:action.collection}
+%
+% Each action |foo| must be associated with 3 routines
+% \begin{center}
+% |PLUSfoo+#1|,\,\, |MINUSfoo-#1|,\,\, |ZEROfoo#1|,
+% \end{center}
+%
+% \begin{macro}{@@@setflag}
+% The positive meanings of this action is to define the command
+% \begin{center}
+% |\csname\usr@xenv#1\endcsname|
+% \end{center}
+% by letting this command to `|\b@sy|'.
+% \begin{macrocode}
+\def\PLUS@@@setflag+#1,{%
+ \expandafter\let\csname\usr@xenv#1\endcsname\b@sy}
+\def\MINUS@@@setflag-#1,{%
+ \expandafter\let\csname\usr@xenv#1\endcsname\relax}
+\def\ZERO@@@setflag#1,{%
+ \expandafter\let\csname\usr@xenv#1\endcsname\b@sy}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{@@@killflag}
+% The positive meanings of this action is to undefine the command
+% \begin{center}
+% |\csname\usr@xenv#1\endcsname|
+% \end{center}
+% by letting this command to `|\relax|'.
+% \begin{macrocode}
+\def\PLUS@@@killflag+#1,{%
+ \expandafter\let\csname\usr@xenv#1\endcsname\relax}
+\def\MINUS@@@killflag-#1,{%
+ \expandafter\let\csname\usr@xenv#1\endcsname\b@sy}
+\def\ZERO@@@killflag#1,{%
+ \expandafter\let\csname\usr@xenv#1\endcsname\relax}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{@@@xspec}
+% This action associates with the |\xspec| (see subsection
+% \ref{ssec:user.macros} for details).
+% This action, unlike |@@@killflag| nor |@@@setflag|,
+% doesnot define/undefine the command `|...\usr@xenv#1...|'.
+% The positive meaning of this action is
+% \emph{openning data file
+% and getting the specified {\normalfont `|bxx|'}}.
+% \begin{macrocode}
+\def\PLUS@@@xspec+#1,{%
+ \@xspec@i(\usr@xenv){#1}}
+\def\MINUS@@@xspec-#1,{}
+\def\ZERO@@@xspec#1,{%
+ \@xspec@i(\usr@xenv){#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Openning the data file}
+% \label{ssec:data.file.open}
+%
+% \begin{macro}{\@xlib}
+% \begin{macro}{\@@xlib}
+% |\@xlib| stores the data file specified by users.\\
+% |\@@xlib| stores the data file used by the |\@openlib|.\\
+% Currently, two macros save the null values.
+% \begin{macrocode}
+\def\@xlib{}
+\def\@@xlib{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\@openlib}
+% Open the data file. The syntax of this macro is |\@openlib#1;|,
+% where |#1| is the file name. If |#1| is omitted, the |\@openlib|
+% uses the data file whose name is stored in |\@xlib|. Note that
+% in this case, the calling of macro is |\@openlib;|.
+% \begin{macrocode}
+\def\@openlib#1;{%
+ \if@xNIL#1;
+ \expandafter\if@xNIL\@xlib;
+ % do nothing
+ \else
+ \def\@@xlib{\@xlib}
+ \fi
+ \else
+ \def\@@xlib{#1}
+ \fi
+ \input \@@xlib}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{User's macros}
+% \label{ssec:user.macros}
+%
+% \begin{macro}{\xspec}
+% This macro provides a special ways to read the data file.
+% After its scanning the data file, the order of the `|bxx|'s in the
+% ouput is the same the order of the |ID|s specified in the |#ID-list|.
+% \begin{macrocode}
+\def\xspec{%
+ \def\@action{@@@xspec}%
+ \@multact}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\xlib}
+% \begin{macro}{\xopenlib}
+% |\xlib| specifies the data file.
+% |\xopenlib| opens the data file.
+% \begin{macrocode}
+\def\xlib#1;{%
+ \edef\@xlib{#1}}
+\let\xopenlib\@openlib
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\xkill}
+% \begin{macro}{\xkillall}
+% \begin{macro}{\xkillallbut}
+% Macro's names speak that...
+% \begin{macrocode}
+\def\xkill{%
+ \let\bxx\@bxx
+ \def\@action{@@@killflag}%
+ \@multact}
+\def\xkillall{%
+ \let\bxx\@bnone}
+\def\xkillallbut{%
+ \let\bxx\@bnonebut
+ \def\@action{@@@setflag}%
+ \@multact}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\xget}
+% \begin{macro}{\xgetall}
+% \begin{macro}{\xgetallbut}
+% Macro's names speak that...
+% \begin{macrocode}
+\def\xget{%
+ \let\bxx\@bxx
+ \def\@action{@@@setflag}%
+ \@multact}
+\def\xgetall{%
+ \let\bxx\@ball}
+\def\xgetallbut{%
+ \let\bxx\@ballbut
+ \def\@action{@@@setflag}%
+ \@multact}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\xhintready}
+% The hint file must be closed (`ready') before being opened.
+% \begin{macrocode}
+{\catcode`\%=12
+\gdef\xhintready{
+ \begingroup\catcode`\%=12
+ \immediate\write\@xfhint{\string\endinput}
+ \immediate\write\@xfhint{%% END OF FILE %%}
+ \endgroup\immediate\closeout\@xfhint}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\xopenhint}
+% Open the hint file.
+% \begin{macrocode}
+\def\xopenhint{%
+ \xhintready
+ \xgetall
+ \xlib \jobname.KTVhint;
+ \xopenlib;}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\xenv}
+% Specify the default environment.
+% \begin{macrocode}
+\def\xenv(#1){%
+ \edef\@@xenv{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\xdetailon}
+% \begin{macro}{\xdetailoff}
+% Turn the details on/off.
+% \begin{macrocode}
+\def\xdetailon{%
+ \let\@xdetail\@@xdetail}
+\def\xdetailoff{%
+ \let\@xdetail\relax}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\xenablesection}
+% \begin{macro}{\xdisablesection}
+% If we put some `|\section|' commands in the data file,
+% we may want to disable/enable them.
+%
+% First, we define a null section.
+% \begin{macrocode}
+\def\nil@section#1{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% Then we save the old values of section-relatives
+% just before |\begin{document}|.
+% We mention only |\section|, |\subsection|, |\subsubsection|.
+% \begin{macrocode}
+\AtBeginDocument{%
+ \let\old@section\section
+ \let\old@subsection\subsection
+ \let\old@subsubsection\subsubsection}
+% \end{macrocode}
+% Everytime you want to disable the section,
+% we let |\section| to |\nil@section|.
+% \begin{macrocode}
+\def\xdisablesection{%
+ \let\section\nil@section%
+ \let\subsection\nil@section%
+ \let\subsubsection\nil@section}
+% \end{macrocode}
+% To restore, let |\section| to his old value
+% (that we captured at the beginning of document).
+% If you redefine |\section| inside |\begin{document}|
+% and |\end{document}|, you cannot get that new |\section|
+% after using any |\xdisablesection|.
+% \begin{macrocode}
+\def\xenablesection{%
+ \let\section\old@section%
+ \let\subsection\old@subsection%
+ \let\subsubsection\old@subsubsection}
+% \end{macrocode}
+%
+% \subsection{Initialization}
+%
+% See section \ref{sec:history} for a reason.
+% \begin{macrocode}
+\let\bxx\@bxx
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \section{History}
+% \label{sec:history}
+%
+% \begin{tabular}{ccl}
+% {\bf v01}.xx &2002/12/xx &the first design\\[2mm]
+% {\bf v02}.xx &2002/12/yy &\emph{changes forgotten}\\[2mm]
+% {\bf v03}.14 &2002/12/18 &the first good version\\
+% v03.15 &2003/03/26 &some litle changes\\
+% v03.17 &2003/04/19 &use two-step macro technique\\
+% & &|\bxx|,|\xlib|,|\xopenlib|
+% needn't any ended-char\\[2mm]
+% {\bf v04}.18 &2003/04/22 &modify: |\@bxy@kern|\\
+% v04.19 &2003/04/23 &change: use |\par| instead of
+% |\enlinechar| in def. of |\bxx|\\
+% v04.19 &2003/05/06 &use `|;|' as delimiter
+% in definition of |\bxx|\\
+% v04.20 &2003/05/11 &optimize: |\@bnone|\\
+% v04.21 &2003/05/12 &\emph{changes forgotten}\\[2mm]
+% {\bf v05}.23 &2003/05/13 &add: |\xgetallbut|, |\xkillallbut|;
+% optimize\\
+% v05.24 &2003/05/13 &remove: |\ifdetail|, |\if@xnil| (boolean var.)\\
+% & &and optimize\\
+% v05.25 &2003/05/14 &fix: some litle bugs;
+% remove: |\@act|\\
+% v05.26 &2003/05/14 &remove: bad options\\
+% v05.27 &2003/05/15 &bug: |\bxx(verbatim)...;| failed\\
+% v05.28 &2003/05/17 &bug: |\foo-section| cause error\\
+% & &move: |\foo-section| to the very end of package\\
+% v05.29 &2003/05/18 &bug: |\bxx| canot be nested.\\
+% & &(nesting: |deactive bxx| causes error)\\
+% & &(nesting: |\xgetall| works well, but\\
+% & &contents of |hint| is too bad.)\\
+% v05.30 &2003/08/xx &rewrite: document (vietnamese), optimize\\
+% v05.31 &2003/09/20 &rewrite: document (english), optimize\\
+% v05.32 &2003/09/20 &rewrite: document (english), optimize\\
+% & &remove: token list |\everyactivebxx| \\
+% & &bug: cannot use |\xgetallbut|, |\xkillallbut|,\\
+% & &|\xget|, etc., before any |\xenv(#env)|\\
+% v05.33 &2003/09/21 &remove: initialization\\
+% & &add: |\xopenhint|\\
+% v05.34 &2003/09/22 &bug: otions donot work.\\
+% & &fix: put |\@@xdetail|
+% before |\DeclareOption{detailon}|\\
+% & &bug: if |\xopenlib;| before any |\xget...|\\
+% & &then |\bxx| is |unknown control sequence|\\
+% & &fix: |\let\bxx\@bxx| to initialize\\
+% v05.39 &2003/09/20 &(future) optimize: |\@xspec|
+% \end{tabular}
+%
+% \section{Miscellanea}
+%
+% The author write this package because he
+% has some big libraries of mathematical exercises,
+% but he really doesn't like |copying| and |pasting|
+% everytime he edits a new test for students.
+%
+% This package may contains some bugs.
+% So the author hopes that you can help him, even a bit.
+%
+% In section \ref{sec:howwillyoudo},
+% the author mentioned the ability of getting the data items
+% whose |ID|s are numbered oddly....
+% Currently this feature is unsupported .
+% Please wait for the next version,
+% or you should do something by yourself!
+%
+% The author's English isnot quite well.
+% He often mis-spells and dumps into error.
+% He would like to be sorry!\\[1mm]
+%
+% If you find out that the package is useful for your private works,
+% please send to the author a little notice. Thank you very much!
+%
+% The emails of the author is\\
+% \centerline{\ttfamily kyanh@inic.biz, kyanh@linuxmail.org}
+%
+% \Finale
+%
+% \iffalse
+%
+%<*example>
+\documentclass{article}
+\usepackage{ktv-texdata}
+
+\usepackage{amsthm}
+
+\def\back:{$\backslash$}
+
+\begin{document}
+
+\begin{center}
+\Large\bf TEST :: package == {\tt ktv-texdata.sty}
+\end{center}
+
+\section{Create a data file}
+See file {\tt ktv-data.tex}.
+There're three part in the data file.
+In the first and the last part, all `\verb~bxx~'
+specify their own environment. In the second part,
+the data items omit the enrironment (use default).
+
+There're some special data items:
+the \verb~\bxx(yyy)2;..\exx~ is followed by a hint,
+the \verb~\bxx(yyy)[TT]5;..\exx~ specifies
+an optional argument for enrivonment \verb~yyy~.
+
+\section{Define the envrinoment}
+\begin{verbatim}
+\theoremstyle{definition}
+\newtheorem{xxx}{XX}
+\newtheorem{zzz}{ZZ}
+\newtheorem{yyy}{YY}
+\end{verbatim}
+\theoremstyle{definition}
+\newtheorem{xxx}{XX}
+\newtheorem{zzz}{ZZ}
+\newtheorem{yyy}{YY}
+
+\section{Specified default environment by \back:env(xxx)}
+
+\xenv(xxx)
+
+\begin{verbatim}
+\xenv(xxx)
+\end{verbatim}
+You should specify the default enrironment
+before any calling to \back:xget, \back:xkill, \back:xgetll,
+\back:xkillall, etc.
+
+Otherwise, if your data file contains some `\verb|bxx|'
+that doesnot specify the environment, you will receive an error!
+(In the source code of the test, remove the line \back:env(xxx)
+to see what will be going.)
+
+\section{Specified data file by \back:env(xxx)}
+\xlib ktv-data;
+
+\begin{verbatim}
+\xlib ktv-data;
+\end{verbatim}
+You also specify the the library, or data file.
+The above specification affects on any \back:xopenlib;
+that's put after this line in the source code of the test.
+
+\section{\back:xget\{2,4\}}
+\begin{verbatim}
+\xget{2,4}
+\xopenlib;
+\end{verbatim}
+\xget{2,4}
+\xopenlib;
+
+\section{Uneffect \back:xenv(zzz) after \back:xget\{1,4\}}
+\begin{verbatim}
+\xget{1,4}
+\xenv(zzz)
+\xopenlib;
+\end{verbatim}
+This example illustrate that any \back:xenv(...)
+that follows a \back:xget doesnot take any affect on that \back:xget.
+Try to figure out this illustration.
+\xget{1,4}
+\xenv(zzz)
+\xopenlib;
+
+\section{Now use \back:xenv(yyy)}
+...to change the default environment to zzz.
+\begin{verbatim}
+\xenv(yyy)
+\end{verbatim}
+\xenv(yyy)
+
+\section{Use \back:xgetallbut(zzz)\{1,2\}}
+\begin{verbatim}
+\xgetallbut(zzz){1,2}
+\xopenlib;
+\end{verbatim}
+\xgetallbut(zzz){1,2}
+\xopenlib;
+
+\section{Use \back:xkillallbut(zzz)\{1,2\}}
+\begin{verbatim}
+\xkillallbut(zzz){1,2}
+\xopenlib;
+\end{verbatim}
+\xkillallbut(zzz){1,2}
+\xopenlib;
+
+\section{Use \back:xspec}
+This macro reserves the order of the `bxx'
+that you specify in the argument.
+
+\subsection{This is \back:xspec\{1,5,2\}}
+\begin{verbatim}
+\xspec{1,5,2}
+\end{verbatim}
+This calling uses default environment \verb~zzz~.
+\xspec{1,5,2}
+
+\subsection{This is \back:xspec(zzz)\{1,5,2\}}
+\begin{verbatim}
+\xspec(zzz){1,5,2}
+\end{verbatim}
+\xspec(zzz){1,5,2}
+
+\section{Turn off the details by \back:xdetailoff}
+\xdetailoff
+\begin{verbatim}
+\xdetailoff
+\end{verbatim}
+You now cannot see anything on the right margin.
+
+\section{Hint}
+\begin{verbatim}
+\xopenhint
+\end{verbatim}
+Some exercise should have a hint.\\
+Of course, only hints of the active `bxx' will be accepted.
+\xopenhint
+
+\section{Now the time you try the package yourself!}
+Thank you for your enjoying.\\[3mm]
+Please send any bug, report,... to the author at
+\begin{verbatim}
+ kyanh@linuxmail.org
+\end{verbatim}
+\end{document}
+%</example>
+%
+%<*datafile>
+\bxx(yyy)1;
+This is {\it yyyyy}.one.
+\exx
+\bxx(yyy)2;
+This is {\it yyyyy}.two with hint.
+\exx
+\begin{hint}
+This is HINT of {\it yyyyy}.2
+\end{hint}
+\bxx(yyy)3;
+This is {\it yyyyy}.three.
+\exx
+\bxx(yyy)4;
+This is {\it yyyyy}.four.
+\exx
+\bxx(yyy)[TT]5;
+This is {\it yyyyy}.six with header TT
+\exx
+
+^^M % ------------------------------------------------------------------
+
+\bxx1;
+This is one.
+\\In the data file, this `bxx' doesnot specify the enrvironment.
+\\So this used default environment.
+\exx
+\bxx2;
+This is two with hint.
+\\In the data file, this `bxx' doesnot specify the enrvironment.
+\\So this used default environment.
+\exx
+\begin{hint}
+This is hint of two.
+\\In the data file, this `bxx' doesnot specify the enrvironment.
+\\So this used default environment.
+\end{hint}
+\bxx3;
+This is three.
+\\In the data file, this `bxx' doesnot specify the enrvironment.
+\\So this used default environment.
+\exx
+\bxx4;
+This is four.
+\\In the data file, this `bxx' doesnot specify the enrvironment.
+\\So this used default environment.
+\exx
+\bxx5;
+This is six.
+\\In the data file, this `bxx' doesnot specify the enrvironment.
+\\So this used default environment.
+\exx
+
+^^M % ------------------------------------------------------------------
+
+\bxx(zzz)1;
+This is ZZZZZZZ.one.
+\exx
+\bxx(zzz)2;
+This is ZZZZZZZ.two.
+\\Containning an equation:
+\begin{equation}
+\int_{0}^{\infty}f(x)\,dx = \pi
+\end{equation}
+\exx
+\bxx(zzz)3;
+This is ZZZZZZZ.three.
+\exx
+\bxx(zzz)4;
+This is ZZZZZZZ.four.
+\exx
+\bxx(zzz)[TT]5;
+This is ZZZZZZZ.six with header TT.
+\exx
+%</datafile>
+% \fi