From 97748b815092e16107c3fbfbe08795cff718a5fa Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Mon, 21 Sep 2009 22:39:03 +0000 Subject: dox 2.0 (21sep09) git-svn-id: svn://tug.org/texlive/trunk@15409 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/source/latex/dox/dox.dtx | 529 +++++++++++++++++++++++------ 1 file changed, 434 insertions(+), 95 deletions(-) (limited to 'Master/texmf-dist/source/latex/dox/dox.dtx') diff --git a/Master/texmf-dist/source/latex/dox/dox.dtx b/Master/texmf-dist/source/latex/dox/dox.dtx index 7e2557820e1..f7eabfa4fef 100644 --- a/Master/texmf-dist/source/latex/dox/dox.dtx +++ b/Master/texmf-dist/source/latex/dox/dox.dtx @@ -1,4 +1,4 @@ -% \iffalse -*- mode: LaTeX -*- +% \iffalse % % dox.dtx --- Doc file for the DoX package (code and documentation) % @@ -7,7 +7,7 @@ % Author: Didier Verna % Maintainer: Didier Verna % Created: Thu Sep 10 21:11:32 2009 -% Last Revision: Fri Sep 11 11:20:13 2009 +% Last Revision: Sat Sep 19 09:55:31 2009 % % This file is part of DoX. % @@ -48,7 +48,7 @@ % \fi % % \catcode`\¡=14 -% \CheckSum{157} +% \CheckSum{247} % \GetFileInfo{dox.inc} %% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z @@ -80,11 +80,17 @@ % \newcommand\packagecopyright{% % Copyright \copyright{} 2009 Didier Verna} % +% \newcommand\emacs{\textsf{[X]Emacs}\xspace} +% \newcommand\auctex{AUC-\TeX\xspace} +% \newcommand\api{\textsc{api}\xspace} +% % \pagestyle{mystyle} % \markright{\hskip-.5\marginparwidth \dox \fileversion{} (\filedate)} % % \date{\texttt{\fileversion{} (\filedate)}} -% \title{\dox{} -- \textsf{\textbf Doc}, \textbf only e\textbf Xtended} +% \title{\dox{} -- \textsf{\textbf Doc}, \textbf only e\textbf +% Xtended\footnote{\dox homepage: +% \texttt{http://www.lrde.epita.fr/\~{}didier/software/latex.php\#dox}}} % \author{Didier Verna\\ % \texttt{mailto:didier@lrde.epita.fr}\\ % \texttt{http://www.lrde.epita.fr/\~{}didier/}} @@ -93,30 +99,80 @@ % % \begin{abstract} % The \texttt{doc} package provides \LaTeX{} developers with means to -% describe the usage and the definition of new macros and environments. +% describe the usage and the definition of new commands and environments. % However, there is no simple way to extend this functionality to other -% items (options or counters for instance). The \texttt{dox} package is -% designed to circumvent this limitation. +% items (options or counters for instance). \dox is designed to circumvent +% this limitation, and provides some improvements over the existing +% functionality as well. +% +% The \dox package is \packagecopyright{}, and distributed under the +% terms of the LPPL license. % \end{abstract} % -% ^^A \tableofcontents +% \tableofcontents +% +% \section{Installation} +% \subsection{Extraction} +% If you are building \dox from the tarball you need to execute the following +% steps in order to extract the necessary files: +% \begin{verbatim} +% [pdf]latex dox.ins +% [pdf]latex dox.dtx +% [pdf]latex dox.dtx +% \end{verbatim} +% After that, you need to install the generated documentation and style files +% to a location where \LaTeX{} can find them. +% +% \subsection{TDS-compliant layout} +% For a TDS-compliant layout, the following locations are suggested: +% \begin{verbatim} +% [TEXMF]/tex/latex/dox/dox.sty +% [TEXMF]/doc/latex/dox/dox.[pdf|dvi] +% \end{verbatim} +% +% \subsection{\auctex support} +% \auctex is a powerful major mode for editing \TeX{} documents in \emacs. In +% particular, it provides automatic completion of command names once they are +% known. \dox supports \auctex by providing a style file named \texttt{dox.el} +% which contains \auctex definitions for the relevant commands. This file +% should be installed in a place where \auctex can find it. Please refer to +% the \auctex documentation for more information on this. +% % % \section{Usage} -% \emph{Note: we assume that you know about \texttt{doc}'s \cs{DescribeMacro}, -% \cs{DescribeEnv} and all other associated commands and environments}. -% -% \medskip\noindent -% \DescribeMacro{\doxitem}\marg{funcsname}\marg{singular}\marg{plural}\\ -% The \dox style provides a single user-level command to create new items with -% functionalities equivalent to what \texttt{doc} provides for macros and -% environments. Perhaps the simplest way to describe how it works is to give -% an example. Suppose you would like to describe package options. Here is what -% you need to do: +% \subsection{Initialization} +% \subsubsection{Requirements} +% In order to work properly, \dox requires the presence of some \LaTeX{} +% packages. You don't have to load them explicitly though. As long as +% \LaTeX{} can locate them, they will be used automatically. \dox currently +% depends on \texttt{kvoptions}. +% +% \subsubsection{Loading the package} +% In order to load \dox, simply say |\usepackage[|\meta{options}|]{dox}| +% in the preamble of your document. The package options will be discussed when +% appropriate. +% +% \subsection{Creating new documentation items} +% \begin{quotation} +% \emph{\textbf{Note}: we assume that you know about \texttt{doc}'s +% \cs{DescribeMacro}, \cs{DescribeEnv} and all other associated commands and +% environments}. +% \end{quotation} +% \DescribeMacro{\doxitem} +% \oarg{options}\marg{name}\marg{envname}\marg{idxcat}\\ +% \dox provides a command named \cs{doxitem} to create new documentation items +% with functionalities equivalent to what \texttt{doc} provides for commands +% and environments. A whole \api is created for every new item. +% +% \subsubsection{Example} +% Perhaps the simplest way to describe what it does is to give an example. +% Suppose you would like to describe package options. Here is what you need to +% do: % \begin{verbatim} % \usepackage{dox} % \doxitem{Option}{option}{options} % \end{verbatim} -% \dox then creates the following API for you: +% \dox then creates the following \api for you: % \begin{itemize} % \item \cs{DescribeOption} % \item the \texttt{option} environment @@ -125,8 +181,119 @@ % \item \cs{SpecialMainOptionIndex} % \item \cs{SpecialOptionIndex} % \end{itemize} +% \begin{sloppypar}\noindent +% In order to comply with \texttt{doc}'s original behavior, the commands +% \cs{PrintDescribeOption} and \cs{PrintOptionName} will only be defined if +% they do not already exist. +% \end{sloppypar} +% +% \subsubsection{Details} +% Here is a more precise description of the arguments to \cs{doxitem}. +% \begin{itemize} +% \item \meta{name} (\texttt{Option} in our example) is used to construct the +% names of the commands in the new \api. It usually starts with an upcase +% letter. +% \item \meta{envname} (\texttt{option} in our example) is the name of the +% created environment. Be sure to avoid name clashes here! If you start +% experimenting odd behavior, you've probably overridden an existing command +% with your new environment.\footnote{It is a pity that \LaTeX{} use the +% same namespace for commands and environments. The opening command for +% environment \texttt{env} should be named \cs{beginenv} and not just +% \cs{env}} +% \item \meta{idxcat} (\texttt{options} in our example) is the index category +% under which your items will appear. For example, all indexed options will +% be listed in the ``options:'' index entry. +% \end{itemize} +% +% \subsubsection{Options to \cs{doxitem}} +% The first (optional) argument to \cs{doxitem} may contain a comma-separated +% list of options. Currently, there is only one supported option: +% \texttt{idxtype}. +% +% We saw earlier that individual items appear under the \texttt{idxcat} index +% entry, but items also appear as standalone index entries, alphabetically +% sorted with their type in parenthesis. For instance, the \texttt{final} +% option would appear like this under the \texttt{F} index entry: +% \mbox{``\texttt{final} (option)''}. +% +% By default, the index type is the same as the environment's name (the +% \meta{envname} argument). However, you can change this by providing a value +% to the \texttt{idxtype} option. +% +% For instance, you may find the word ``environment'' too long for an index +% type. In that case, you may redefine the \texttt{environment} \api like +% this: +% \begin{verbatim} +% \doxitem[idxtype=env.]{Env}{environment}{environments} +% \end{verbatim} +% +% \subsection{Improvements over \texttt{doc}'s original \api} +% \begin{quotation}\itshape +% Please note that the improvements described in this section are also +% available in \texttt{doc}'s original command and environment \api's, +% because \dox redefines them. +% \end{quotation} +% +% \subsubsection{Additional (optional) argument} +% Compared to \texttt{doc}, the \api's created by \cs{doxitem} are extended +% with a first optional argument containing a comma-separated list of options, +% such that, continuing with our initial example, the real prototypes are in +% fact the following: +% \begin{verbatim} +% \DescribeOption[opt,...]{name} +% +% \begin{option}[opt,...]{name} +% %% ... +% \end{option} +% \end{verbatim} +% +% \subsubsection{Available options} +% The options currently supported are: +% \begin{description} +% \item[noprint] Avoid printing \meta{name} in the margin +% \item[noindex] Avoid indexing \meta{name} +% \end{description} +% These options are useful if you don't want printing or indexing locally for +% one particular item. Without them, one would need to locally \cs{let} the +% relevant commands to \cs{@gobble} which is very inconvenient. +% +% There is also another advantage in using the \texttt{noprint} option: in +% \texttt{doc}'s original implementation, a margin paragraph will still be +% created just to be empty, hence wasting float resources. If you're +% referencing a lot of items close to each other, this may lead to a ``Too +% many unprocessed floats'' error. With \dox, the \cs{marginpar} is avoided +% altogether. +% +% \subsubsection{Global effect} +% All options described in the previous section are also available to +% \cs{usepackage}. Their effect then becomes global. Because these options are +% boolean, it is still possible to counteract their global effect locally. For +% instance, one could do: +% \begin{verbatim} +% \usepackage[noprint]{dox} +% \end{verbatim} +% and then later: +% \begin{verbatim} +% \DescribeOption[noprint=false]{french} +% \end{verbatim} +% +% \section{Conclusion} +% If you want to see \dox in action, take a look at the documentation of the +% \textsf{FiXme} package (version 4.0 or later). In fact, I wrote \dox for it +% in the first place. +% +% \section{History} +% \begin{itemize} +% \item[v2.0] Optional argument to \cs{doxitem} (\texttt{idxtype} option to +% change the item's index type).\\ +% Optional argument to \cs{Describe}\meta{Item} and the \meta{item} +% environment (\texttt{noprint} to avoid marginal printing and +% \texttt{noindex} to avoid indexing).\\ +% Extend \cs{DescribeMacro}, \cs{DescribeEnv} and their corresponding +% environments with the same features. +% \item[v1.0] First public version +% \end{itemize} % -% That's about it. % \StopEventually{\vfill\hfill\small \packagecopyright{}.} % % \section{Implementation} @@ -134,68 +301,135 @@ % \begin{macrocode} %\NeedsTeXFormat{LaTeX2e} %<*header> -\ProvidesPackage{dox}[2009/09/11 v1.0 Extensions to the doc package] +\ProvidesPackage{dox}[2009/09/21 v2.0 Extensions to the doc package] % +%<*dox> +\RequirePackage{kvoptions} +\SetupKeyvalOptions{family=dox,prefix=dox@} + % \end{macrocode} -% \subsection{Real job execution} -% \begin{macro}{\doxm@cro@} -% \marg{item}\marg{contents}\\ -% In \texttt{doc.sty}, the macro and environment environments go through the -% \cs{m@cro@} command which implements specific parts by testing a boolean -% condition as its first argument. This mechanism is not extensible, so I -% have to hack away a more generic version that would work for any new -% \texttt{dox} item, only which looks pretty much like the original one: +% +% \subsection{\dox options} +% These two options are available for use in \cs{usepackage} or in the +% generated item \api's: % \begin{macrocode} -%<*dox> -\long\def\doxm@cro@#1#2{% +\DeclareBoolOption{noprint} +\DeclareBoolOption{noindex} +% \end{macrocode} +% This one is for \cs{doxitem} only: +% \begin{macrocode} +\DeclareStringOption{idxtype} + +% \end{macrocode} +% +% \subsection{\dox environments} +% \begin{macro}{\@@doxenv} +% \marg{item}\marg{name}\\ +% In \texttt{doc.sty}, the \texttt{macro} and \texttt{environment} +% environments go through the \cs{m@cro@} macro which implements specific +% parts by testing a boolean condition as its first argument. This mechanism +% is not extensible, so I have to hack away a more generic version that +% would work for any new \texttt{dox} item, only which looks pretty much +% like the original one. +% \begin{macrocode} +\long\def\@@doxenv#1#2{% \endgroup% - \topsep\MacroTopsep\trivlist - \def\makelabel##1{\llap{##1}}% - \if@inlabel - \let\@tempa\@empty - \count@\macro@cnt - \loop\ifnum\count@>\z@ - \edef\@tempa{\@tempa\hbox{\strut}}\advance\count@\m@ne% - \repeat - \edef\makelabel##1{% - \llap{\vtop to\baselineskip - {\@tempa\hbox{##1}\vss}}}% - \advance\macro@cnt\@ne - \else - \macro@cnt\@ne - \fi - \edef\@tempa{% - \noexpand\item[% -% \end{macrocode} -% That's the first modification: -% \begin{macrocode} - \expandafter\noexpand\csname Print#1Name\endcsname{\string#2}]}% - \@tempa - \global\advance\c@CodelineNo\@ne -% \end{macrocode} -% And that's the second one: -% \begin{macrocode} - \@nameuse{SpecialMain#1Index}{#2}\nobreak - \global\advance\c@CodelineNo\m@ne - \ignorespaces} + \topsep\MacroTopsep% + \trivlist% + \edef\saved@macroname{\string#2}% + \def\makelabel##1{\llap{##1}}% + \if@inlabel% + \let\@tempa\@empty% + \count@\macro@cnt% + \loop\ifnum\count@>\z@% + \edef\@tempa{\@tempa\hbox{\strut}}\advance\count@\m@ne% + \repeat% + \edef\makelabel##1{\llap{\vtop to\baselineskip{\@tempa\hbox{##1}\vss}}}% + \advance\macro@cnt\@ne% + \else% + \macro@cnt\@ne% + \fi% + \ifdox@noprint% + \item% + \else% + \edef\@tempa{% + \noexpand\item[% +% \end{macrocode} +% Apart from dependency on options, the first modification to the original +% macro involves dynamically constructing the name of the print macro: +% \begin{macrocode} + \expandafter\noexpand\csname Print#1Name\endcsname{\saved@macroname}]}% + \@tempa% + \fi% + \ifdox@noindex\else% + \global\advance\c@CodelineNo\@ne% +% \end{macrocode} +% and the second one involves dynamically constructing the name of the index +% macro: +% \begin{macrocode} + \@nameuse{SpecialMain#1Index}{#2}\nobreak% + \global\advance\c@CodelineNo\m@ne% + \fi% + \ignorespaces} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@doxenv} +% \marg{item}\oarg{options}\\ +% Handle optional arguments and call \cs{@@doxenv}. Because environments can +% be nested, we can't rely on grouping for getting options default values. +% Hence, we need to reset the options at every call. +% \begin{macrocode} +\def\@doxenv#1[#2]{% + \@nameuse{dox@noprint\dox@noprintdefault}% + \@nameuse{dox@noindex\dox@noindexdefault}% + \setkeys{dox}{#2}% + \begingroup% + \catcode`\\12% + \MakePrivateLetters% + \@@doxenv{#1}} % \end{macrocode} % \end{macro} -% \subsection{API creation} -% \begin{macro}{\doxitem} -% \marg{funcsname}\marg{singular}\marg{plural} +% +% \subsection{\dox descriptions} +% \begin{macro}{\@@doxdescribe} +% \marg{item}\marg{name}\\ +% The first closed group was the one opened to parse the \meta{name} +% argument. The second one was opened to handle local options. % \begin{macrocode} -\newcommand\doxitem[3]{% +\def\@@doxdescribe#1#2{% + \endgroup% + \ifdox@noprint\else% + \marginpar{\raggedleft\@nameuse{PrintDescribe#1}{#2}}% + \fi% + \ifdox@noindex\else% + \@nameuse{Special#1Index}{#2}% + \fi% + \endgroup% + \@esphack\ignorespaces} % \end{macrocode} -% The \cs{Print}\meta{item}\texttt{Name} macro: +% \end{macro} +% \begin{macro}{\@doxdescribe} +% \marg{item}\oarg{options}\\ +% Handle optional arguments and call \cs{@@doxdescribe}. % \begin{macrocode} - \@ifundefined{Print#1Name}{% - \expandafter\def\csname Print#1Name\endcsname##1{% - \strut\MacroFont\string##1\ }}{} +\def\@doxdescribe#1[#2]{% + \leavevmode\@bsphack% + \begingroup% + \setkeys{dox}{#2}% + \begingroup% + \MakePrivateLetters% + \@@doxdescribe{#1}} + % \end{macrocode} -% The \cs{SpecialMain}\meta{item}\texttt{Index} macro: +% \end{macro} +% +% \subsection{API construction} +% \begin{macro}{\@doxcreatespecialmainindex} +% \marg{item}\marg{idxtype}\marg{idxcat} % \begin{macrocode} +\def\@doxcreatespecialmainindex#1#2#3{% \expandafter\def\csname SpecialMain#1Index\endcsname##1{% \@bsphack% \special@index{% @@ -203,48 +437,153 @@ \special@index{% #3:\levelchar##1\actualchar% {\string\ttfamily\space##1}\encapchar main}% - \@esphack} -% \end{macrocode} -% The \cs{PrintDescribe}\meta{item} macro: -% \begin{macrocode} - \@ifundefined{PrintDescribe#1}{% - \expandafter\def\csname PrintDescribe#1\endcsname##1{% - \strut\MacroFont##1\ }}{} + \@esphack}} + % \end{macrocode} -% The \cs{Special}\meta{item}\texttt{Index} macro: +% \end{macro} +% \begin{macro}{\@doxcreatespecialindex} +% \marg{item}\marg{idxtype}\marg{idxcat} % \begin{macrocode} - \expandafter\def\csname Special#1Index\endcsname##1{\@bsphack +\def\@doxcreatespecialindex#1#2#3{% + \expandafter\def\csname Special#1Index\endcsname##1{% + \@bsphack% \index{##1\actualchar{\protect\ttfamily##1} (#2)\encapchar usage}% \index{#3:\levelchar##1\actualchar{\protect\ttfamily##1}\encapchar - usage}\@esphack} -% \end{macrocode} -% The \cs{Describe@}\meta{item} macro: -% \begin{macrocode} - \expandafter\def\csname Describe@#1\endcsname##1{% - \endgroup - \marginpar{\raggedleft\@nameuse{PrintDescribe#1}{##1}}% - \@nameuse{Special#1Index}{##1}\@esphack\ignorespaces} + usage}% + \@esphack}} + % \end{macrocode} -% The \cs{Describe}\meta{item} macro: +% \end{macro} +% +% \begin{macro}{\@doxcreatedescribe} +% \marg{item} % \begin{macrocode} +\def\@doxcreatedescribe#1{% \expandafter\def\csname Describe#1\endcsname{% - \leavevmode\@bsphack\begingroup\MakePrivateLetters - \@nameuse{Describe@#1}} + \@ifnextchar[%] + {\@doxdescribe{#1}}{\@doxdescribe{#1}[]}}} + % \end{macrocode} -% The \meta{item} environment: +% \end{macro} +% \begin{macro}{\@doxcreateenv} +% \marg{item}\marg{envname} % \begin{macrocode} +\def\@doxcreateenv#1#2{% \expandafter\def\csname #2\endcsname{% - \begingroup - \catcode`\\12 - \MakePrivateLetters\doxm@cro@{#1}} + \@ifnextchar[%] + {\@doxenv{#1}}{\@doxenv{#1}[]}} \expandafter\let\csname end#2\endcsname\endtrivlist} -% % \end{macrocode} % \end{macro} +% +% \subsection{\texttt{Doc} overrides} +% \subsubsection{Macro facilities} +% Making \cs{DescribeMacro} work the \dox way is straightforward. The only +% precaution we need is to to provide an alias to \cs{SpecialUsageIndex} +% because it should really be named \cs{SpecialMacroIndex}. +% \begin{macrocode} +\let\SpecialMacroIndex\SpecialUsageIndex +\@doxcreatedescribe{Macro} + +% \end{macrocode} +% Making the \texttt{macro} environment work the \dox way is straightforward. +% The only precaution we need is to to provide a \cs{SpecialMainMacroIndex} +% macro that does the job originally done in \texttt{doc}'s \cs{m@cro@}. +% \begin{macrocode} +\def\SpecialMainMacroIndex#1{% + \SpecialMainIndex{#1}\nobreak% + \DoNotIndex{#1}} +\@doxcreateenv{Macro}{macro} + +% \end{macrocode} +% +% \subsubsection{Environment facilities} +% Making \cs{DescribeEnv} and the \texttt{environment} environment work the +% \dox way is straightforward. +% \begin{macrocode} +\@doxcreatedescribe{Env} +\@doxcreateenv{Env}{environment} + +% \end{macrocode} +% +% \subsection{API creation} +% The whole user interface is created in one macro call. +% \begin{macro}{\doxitem} +% \oarg{options}\marg{name}\marg{envname}\marg{idxcat} +% \begin{macrocode} +\newcommand\doxitem[4][]{% + \def\dox@idxtype{#3}% + \setkeys{dox}{#1} +% \end{macrocode} +% \begin{macro}{\Print...Name} +% \marg{name} +% \begin{macrocode} + \@ifundefined{Print#2Name}{% + \expandafter\def\csname Print#2Name\endcsname##1{% + \strut\MacroFont##1\ }}{} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\SpecialMain...Index} +% \marg{name} +% \begin{macrocode} + \def\@doxexpr{\@doxcreatespecialmainindex{#2}}% + \expandafter\@doxexpr\expandafter{\dox@idxtype}{#4}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\PrintDescribe...} +% \marg{name} +% \begin{macrocode} + \@ifundefined{PrintDescribe#2}{% + \expandafter\def\csname PrintDescribe#2\endcsname##1{% + \strut\MacroFont##1\ }}{} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\Special...Index} +% \marg{name} +% \begin{macrocode} + \def\@doxexpr{\@doxcreatespecialindex{#2}}% + \expandafter\@doxexpr\expandafter{\dox@idxtype}{#4}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\Describe...} +% \oarg{options}\marg{name} +% \begin{macrocode} + \@doxcreatedescribe{#2} +% \end{macrocode} +% \end{macro} +% \begin{environment}{item} +% \oarg{options}\marg{name} +% \begin{macrocode} + \@doxcreateenv{#2}{#3}} + +% \end{macrocode} +% \end{environment} +% \end{macro} +% +% \subsection{Finale} +% We need to save the default value for every option because \dox environments +% need to reset them at every call. +% \begin{macrocode} +\ProcessKeyvalOptions* +\ifdox@noprint + \def\dox@noprintdefault{true} +\else + \def\dox@noprintdefault{false} +\fi +\ifdox@noindex + \def\dox@noindexdefault{true} +\else + \def\dox@noindexdefault{false} +\fi + +% +% \end{macrocode} % ^^A \PrintChanges -% ^^A \PrintIndex +% ^^A Nobody messes up with the marks in this document, but \index@prologue. +% ^^A That sucks. +% ^^A \makeatletter{\let\markboth\@gobbletwo\PrintIndex}\makeatother % \Finale % % ^^A dox.dtx ends here -- cgit v1.2.3