From fed27f633aadbacbd3d1221da7993fed8d4efffe Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Sun, 15 Sep 2019 03:00:57 +0000 Subject: CTAN sync 201909150300 --- macros/latex-dev/required/tools/somedefs.dtx | 172 +++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 macros/latex-dev/required/tools/somedefs.dtx (limited to 'macros/latex-dev/required/tools/somedefs.dtx') diff --git a/macros/latex-dev/required/tools/somedefs.dtx b/macros/latex-dev/required/tools/somedefs.dtx new file mode 100644 index 0000000000..f73a45b787 --- /dev/null +++ b/macros/latex-dev/required/tools/somedefs.dtx @@ -0,0 +1,172 @@ +% \iffalse meta-comment +% +% Copyright (C) 1993-2019 +% +% The LaTeX3 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. +% +% \StopEventually{} +% +% \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 -- cgit v1.2.3