% \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] % %\NeedsTeXFormat{LaTeX2e} %\ProvidesPackage{ktv-texdata} %[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} % % % \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} % % \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} % % %<*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 % % \fi