diff options
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.dtx | 1838 |
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 |