% \iffalse meta-comment % % Copyright (C) 1993-2023 % % The LaTeX Project and any individual authors listed elsewhere % in this file. % % This file is part of the Standard LaTeX `Tools Bundle'. % ------------------------------------------------------- % % It may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3c % of this license or (at your option) any later version. % The latest version of this license is in % https://www.latex-project.org/lppl.txt % and version 1.3c or later is part of all distributions of LaTeX % version 2005/12/01 or later. % % The list of all files belonging to the LaTeX `Tools Bundle' is % given in the file `manifest.txt'. % % \fi % \title{The \textsf{somedefs} toolkit package} % \date{long time ago in a different century\ldots} % \author{Alan Jeffrey} % \MaintainedByLaTeXTeam{tools} % \maketitle % % % \changes{v0.03}{1994/06/01}{Use new style error commands. DPC} % \changes{v0.02}{1994/05/10}{Added a \cmd\relax, to stop arguments to % \cmd\newcommand\ being unbraced by \cmd\ProvidesCommand. Added % an error message for commands which are requested but never % defined. Spotted by DPC.} % % \section*{Overview} % % This is an example `programmers toolkit' package, for use by package % writers. It allows package writers to provide options which switch % definitions on and off. For example, a package |fred| might define a % large number of commands, including |\foo| and |\baz|, so: % \begin{verbatim} % \usepackage{fred} % \end{verbatim} % would use a lot of memory, even if |\foo| and |\baz| were the only % commands needed. However, if the author of |fred| used the |somedefs| % package, then the user would be able to say: % \begin{verbatim} % \usepackage[only,foo,baz]{fred} % \end{verbatim} % and only the commands |\foo| and |\baz| would be defined. % % To use the |somedefs| package in your own packages or classes, you % say: % \begin{verbatim} % \RequirePackage{somedefs} % \end{verbatim} % You can then use four new commands: % \begin{flushleft}\begin{itemize} % \item |\UseAllDefinitions| which says that all the commands in the % file should be defined. % \item |\UseSomeDefinitions| which says that only the commands % specified by |\UseDefinition| should be defined. % \item |\UseDefinition{|\meta{name}|}| which says that the command % |\name| should be defined. % \item |\ProvidesDefinition{|\meta{definition}|}| which provides one % definition, of the form |\definingcommand{\command}...| % \end{itemize}\end{flushleft} % For example, the package |fred| could say: % \begin{verbatim} % \RequirePackage{somedefs} % \UseAllDefinitions % \DeclareOption{only}{\UseSomeDefinitions} % \DeclareOption*{\UseDefinition{\CurrentOption}} % \ProcessOptions % \ProvidesDefinition{\newcommand{\foo}{...}} % \ProvidesDefinition{\newcommand{\baz}{...}} % \end{verbatim} % One of the commands |\UseAllDefinitions| or |\UseSomeDefinitions| % should always be used. You may have some commands which need other % commands, in which case you have to declare the options by hand. For % example, if the command |\bar| needs the command |\foo|, you could % say: % \begin{verbatim} % \DeclareOption{bar}{\UseDefinition{bar}\UseDefinition{foo}} % \end{verbatim} % For a longer example of the use of the |somedefs| package, look at the % |rawfonts| package. % % \MaybeStop{} % % \section*{Implementation} % % The driver for the documentation you're now reading. % \begin{macrocode} %<*driver> \documentclass{ltxdoc} \begin{document} \DocInput{somedefs.dtx} \end{document} % % \end{macrocode} % This is a \LaTeXe{} package. % \begin{macrocode} %<*package> \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{somedefs}[1994/06/01 v0.03 Toolkit for optional definitions] % \end{macrocode} % \begin{macro}{\UseSomeDefinitions} % \begin{macro}{\UseAllDefinitions} % \begin{macro}{\UseDefinition} % \begin{macro}{\ProvidesDefinition} % \begin{macro}{\@providesdefinition} % \begin{macro}{\@provides@definition} % \begin{macro}{\@unprovided@definition} % The package works by having |\UseDefinition{|\meta{name}|}| define % |\name| to be |\@unprovided@definition|. % If |\UseSomeDefinitions| has been called, % then |\ProvidesDefinition| looks to see if |\name| % is |\@unprovided@definition|. If % |\UseAllDefinitions| has been called, then |\ProvidesDefinition| % does nothing. If neither has been called, then % |\ProvidesDefinition| produces an error message. % \begin{macrocode} \def\UseSomeDefinitions{% \let\ProvidesDefinition\@providesdefinition } \def\UseAllDefinitions{% \let\ProvidesDefinition\@firstofone } \def\UseDefinition#1{% \expandafter\let\csname#1\endcsname\@unprovided@definition } \def\ProvidesDefinition#1{% \PackageError{somedefs}% {No \noexpand\UseSomeDefinitions or \string\UseAllDefinitions}% {The package which used the `somedefs' package has an error.}% } \def\@providesdefinition#1{\@provides@definition#1\relax \@provides@definition} \def\@provides@definition#1#2#3\@provides@definition{% \ifx#2\@unprovided@definition #1#2#3% \fi } \def\@unprovided@definition{% \PackageError{somedefs}% {Package `somedefs' error: this command was never defined}% {You have requested a command which does not exist.}% } \@onlypreamble\UseSomeDefinitions \@onlypreamble\UseAllDefinitions \@onlypreamble\UseDefinition \@onlypreamble\ProvidesDefinition \@onlypreamble\@providesdefinition \@onlypreamble\@provides@definition % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % That's it! % \begin{macrocode} % % \end{macrocode} % % \Finale % % \endinput