From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/latex/contrib/keycommand/README | 37 + .../contrib/keycommand/keycommand-example.pdf | Bin 0 -> 166465 bytes .../contrib/keycommand/keycommand-example.tex | 115 ++ macros/latex/contrib/keycommand/keycommand.dtx | 1330 ++++++++++++++++++++ macros/latex/contrib/keycommand/keycommand.ins | 88 ++ macros/latex/contrib/keycommand/keycommand.pdf | Bin 0 -> 335420 bytes 6 files changed, 1570 insertions(+) create mode 100644 macros/latex/contrib/keycommand/README create mode 100644 macros/latex/contrib/keycommand/keycommand-example.pdf create mode 100644 macros/latex/contrib/keycommand/keycommand-example.tex create mode 100644 macros/latex/contrib/keycommand/keycommand.dtx create mode 100644 macros/latex/contrib/keycommand/keycommand.ins create mode 100644 macros/latex/contrib/keycommand/keycommand.pdf (limited to 'macros/latex/contrib/keycommand') diff --git a/macros/latex/contrib/keycommand/README b/macros/latex/contrib/keycommand/README new file mode 100644 index 0000000000..b41e8b81b0 --- /dev/null +++ b/macros/latex/contrib/keycommand/README @@ -0,0 +1,37 @@ +% keycommand is a package providing an easy way to define commands +% with keys in LaTeX. The code is based on kvsetkeys by Heiko +% Oberdiek. It does not rely on keyval. +% +% This work consists of the main source file keycommand.dtx +% and the derived files +% keycommand.sty, keycommand.pdf, keycommand.ins, +% keycommand-example.tex +% +% Unpacking: +% (a) If keycommand.ins is present: +% etex keycommand.ins +% (b) Without keycommand.ins: +% etex keycommand.dtx +% (c) If you insist on using LaTeX +% latex \let\install=y\input{keycommand.dtx} +% (quote the arguments according to the demands of your shell) +% +% Documentation: +% (pdf)latex keycommand.dtx +% +% ----------------------------------------------------------------- +% Typical example: +% +% \newkeycommand+[\|]\myFigure[ +% caption={\textcolor{red}{}, +% placement=h}][OtherKeys][1]{% +% |\begin{figure}|[\commandkey{placement}] +% |\includegraphics|[\commandkey{OtherKeys}]{#1} +% |\caption|{\commandkey{caption}}} +% Usage : +% +% \myFigure[caption=small image,page=12,viewport=20 50 136 95,clip]{image.pdf} +% ----------------------------------------------------------------- + + + diff --git a/macros/latex/contrib/keycommand/keycommand-example.pdf b/macros/latex/contrib/keycommand/keycommand-example.pdf new file mode 100644 index 0000000000..a0f02a3476 Binary files /dev/null and b/macros/latex/contrib/keycommand/keycommand-example.pdf differ diff --git a/macros/latex/contrib/keycommand/keycommand-example.tex b/macros/latex/contrib/keycommand/keycommand-example.tex new file mode 100644 index 0000000000..dec4d37c6e --- /dev/null +++ b/macros/latex/contrib/keycommand/keycommand-example.tex @@ -0,0 +1,115 @@ +%% +%% This is file `keycommand-example.tex', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% keycommand.dtx (with options: `example') +%% +%% This is a generated file. +%% +%% keycommand : key-value interface for commands and environments in LaTeX [v3.1415 2010/04/27] +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.3 of this license or (at your option) any later +%% version. The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% +%% This work consists of the main source file keycommand.dtx +%% and the derived files +%% keycommand.sty, keycommand.pdf, keycommand.ins, +%% keycommand-example.tex +%% +%% keycommand : an easy way to define commands with optional keys +%% Copyright (C) 2009-2010 by Florent Chervet +%% +\ProvidesFile{keycommand-example} +\documentclass[a4paper]{article} +\usepackage[T1]{fontenc} +\usepackage[latin1]{inputenc} +\usepackage[american]{babel} +\usepackage{keycommand,framed,fancyvrb} +\makeatletter +\parindent\z@ +\newkeycommand*\Rule[raise=.4ex,width=1em,thick=.4pt][1]{% + \rule[\commandkey{raise}]{\commandkey{width}}{\commandkey{thick}}% + #1% + \rule[\commandkey{raise}]{\commandkey{width}}{\commandkey{thick}}} + +\newkeycommand*\charleads[sep=1][2]{% + \ifhmode\else\leavevmode\fi\setbox\@tempboxa\hbox{#2}\@tempdima=1.584\wd\@tempboxa% + \cleaders\hb@xt@\commandkey{sep}\@tempdima{\hss\box\@tempboxa\hss}#1% + \setbox\@tempboxa\box\voidb@x} +\newcommand*\charfill[1][]{\charleads[{#1}]{\hfill\kern\z@}} +\newcommand*\charfil[1][]{\charleads[{#1}]{\hfil\kern\z@}} +\newkeyenvironment*{dblruled}[first=.4pt,second=.4pt,sep=1pt,left=\z@]{% + \def\FrameCommand{% + \vrule\@width\commandkey{first}% + \hskip\commandkey{sep} + \vrule\@width\commandkey{second}% + \hspace{\commandkey{left}}}% + \parindent\z@ + \MakeFramed {\advance\hsize-\width \FrameRestore}} + {\endMakeFramed} +\makeatother +\begin{document} +\title{This is {\tt keycommand-example.tex}} +\author{Florent Chervet} +\date{July 22, 2009} + +\maketitle + +{\Large Please refer to {\tt keycommand-example.tex} for definitions.} + +\section{Example of a keycommand : \texttt{\string\Rule}} + +\begin{tabular*}\textwidth{rl} +\verb+\Rule[width=2em]{hello}+:&\Rule[width=2em]{hello}\cr +\verb+\Rule[thick=1pt,width=2em]{hello}+:&\Rule[thick=1pt,width=2em]{hello}\cr +\verb+\Rule{hello}+:&\Rule{hello}\cr +\verb+\Rule[thick=1pt,raise=1ex]{hello}+:&\Rule[thick=1pt,raise=1ex]{hello} +\end{tabular*} + +\section{Example of a keycommand : \texttt{\string\charfill}} + +\begin{tabular*}\textwidth{rp{.4\textwidth}} +\verb+\charfill{$\star$}+: & \charfill{$\star$}\cr +\verb+\charfill[sep=2]{$\star$}+: & \charfill[sep=2]{$\star$} \\ +\verb+\charfill[sep=.7]{\textasteriskcentered}+: & \charfill[sep=.7]{\textasteriskcentered} +\end{tabular*} + +\section{Example of a keyenvironment : \texttt{dblruled}} + +Key environment \texttt{dblruled } uses \texttt{framed.sty} and therefore it can be used +even if a pagebreak occurs inside the environment: +\medskip + +\verb+\begin{dblruled}+\par +\verb+ test for dblruled key-environment\par+\par +\verb+ test for dblruled key-environment\par+\par +\verb+ test for dblruled key-environment+\par +\verb+\end{dblruled}+ + +\begin{dblruled} + test for dblruled key-environment\par + test for dblruled key-environment\par + test for dblruled key-environment +\end{dblruled} + +\verb+\begin{dblruled}[first=4pt,sep=2pt,second=.6pt,left=.2em]+\par +\verb+ test for dblruled key-environment\par+\par +\verb+ test for dblruled key-environment\par+\par +\verb+ test for dblruled key-environment+\par +\verb+\end{dblruled}+ + +\begin{dblruled}[first=4pt,sep=2pt,second=.6pt,left=.2em] + test for dblruled key-environment\par + test for dblruled key-environment\par + test for dblruled key-environment +\end{dblruled} + +\end{document} +\endinput +%% +%% End of file `keycommand-example.tex'. diff --git a/macros/latex/contrib/keycommand/keycommand.dtx b/macros/latex/contrib/keycommand/keycommand.dtx new file mode 100644 index 0000000000..5f5ac85f3a --- /dev/null +++ b/macros/latex/contrib/keycommand/keycommand.dtx @@ -0,0 +1,1330 @@ +% \iffalse meta-comment +% keycommand : key-value interface for commands and environments in LaTeX v3.1415 2010/04/27] +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either +% version 1.3 of this license or (at your option) any later +% version. The latest version of this license is in +% http://www.latex-project.org/lppl.txt +% +% This work consists of the main source file keycommand.dtx +% and the derived files +% keycommand.sty, keycommand.pdf, keycommand.ins, +% keycommand-example.tex +% +% Unpacking: +% (a) If keycommand.ins is present: +% etex keycommand.ins +% (b) Without keycommand.ins: +% etex keycommand.dtx +% (c) If you insist on using LaTeX +% latex \let\install=y\input{keycommand.dtx} +% (quote the arguments according to the demands of your shell) +% +% Documentation: +% (pdf)latex keycommand.dtx +% Copyright (C) 2009-2010 by Florent Chervet +%<*ignore> +\begingroup + \def\x{LaTeX2e}% +\expandafter\endgroup +\ifcase 0\ifx\install y1\fi\expandafter + \ifx\csname processbatchFile\endcsname\relax\else1\fi + \ifx\fmtname\x\else 1\fi\relax +\else\csname fi\endcsname +% +%<*install> +\input docstrip.tex +\Msg{************************************************************************} +\Msg{* Installation} +\Msg{* Package: keycommand 2010/04/27 v3.1415 key-value interface for commands and environments in LaTeX} +\Msg{************************************************************************} + +\keepsilent +\askforoverwritefalse + +\let\MetaPrefix\relax +\preamble + +This is a generated file. + +keycommand : key-value interface for commands and environments in LaTeX [v3.1415 2010/04/27] + +This work may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either +version 1.3 of this license or (at your option) any later +version. The latest version of this license is in + http://www.latex-project.org/lppl.txt + +This work consists of the main source file keycommand.dtx +and the derived files + keycommand.sty, keycommand.pdf, keycommand.ins, + keycommand-example.tex + +keycommand : an easy way to define commands with optional keys +Copyright (C) 2009-2010 by Florent Chervet + +\endpreamble +\let\MetaPrefix\DoubleperCent + +\generate{% + \file{keycommand.ins}{\from{keycommand.dtx}{install}}% + \file{keycommand.sty}{\from{keycommand.dtx}{package}}% + \file{keycommand-example.tex}{\from{keycommand.dtx}{example}}% +} + +\generate{% + \file{keycommand.drv}{\from{keycommand.dtx}{driver}}% +} + +\obeyspaces +\Msg{************************************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* file into a directory searched by TeX:} +\Msg{*} +\Msg{* keycommand.sty} +\Msg{*} +\Msg{* To produce the documentation run the file `keycommand.dtx'} +\Msg{* through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing!} +\Msg{*} +\Msg{************************************************************************} + +\endbatchfile +% +%<*ignore> +\fi +% +%<*driver> +\edef\thisfile{\jobname} +\def\thisinfo{key-value interface for commands and environments in \LaTeX.} +\def\thisdate{2010/04/27} +\def\thisversion{3.1415} +\let\loadclass\LoadClass +\def\LoadClass#1{\loadclass[abstracton]{scrartcl}\let\scrmaketitle\maketitle\AtEndOfClass{\let\maketitle\scrmaketitle}} +\documentclass[a4paper,oneside]{ltxdoc} +\usepackage[latin9]{inputenc} +\usepackage[american]{babel} +\usepackage[T1]{fontenc} +\usepackage{etex,etoolbox,holtxdoc,geometry,tocloft,graphicx,xspace,fancyhdr,color,bbding,embedfile,framed,multirow,txfonts,makecell,enumitem,arydshln} +\CodelineNumbered +\usepackage{keyval}\makeatletter\let\keyval@setkeys\setkeys\makeatother +\usepackage{xkeyval}\let\xsetkeys\setkeys +\usepackage{kvsetkeys} +\usepackage{fancyvrb} +\lastlinefit999 +\geometry{top=2cm,headheight=1cm,headsep=.3cm,bottom=1.4cm,footskip=.5cm,left=2.5cm,right=1cm} +\hypersetup{% + pdftitle={The keycommand package}, + pdfsubject={key-value interface for commands and environments in LaTeX.}, + pdfauthor={Florent CHERVET}, + colorlinks,linkcolor=reflink, + pdfstartview={FitH}, + pdfkeywords={tex, e-tex, latex, package, keys, keycommand, newcommand, keyval, kvsetkeys, programming}, + bookmarksopen=true,bookmarksopenlevel=3} +\embedfile{\thisfile.dtx} +\begin{document} + \DocInput{\thisfile.dtx} +\end{document} +% +% \fi +% +% \CheckSum{1111} +% +% \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 +% Lower-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 +% Digits \0\1\2\3\4\5\6\7\8\9 +% Exclamation \! Double quote \" Hash (number) \# +% Dollar \$ Percent \% Ampersand \& +% Acute accent \' Left paren \( Right paren \) +% Asterisk \* Plus \+ Comma \, +% Minus \- Point \. Solidus \/ +% Colon \: Semicolon \; Less than \< +% Equals \= Greater than \> Question mark \? +% Commercial at \@ Left bracket \[ Backslash \\ +% Right bracket \] Circumflex \^ Underscore \_ +% Grave accent \` Left brace \{ Vertical bar \| +% Right brace \} Tilde \~} +% +% \DoNotIndex{\begin,\CodelineIndex,\CodelineNumbered,\def,\DisableCrossrefs,\~,\@ifpackagelater} +% \DoNotIndex{\DocInput,\documentclass,\EnableCrossrefs,\end,\GetFileInfo} +% \DoNotIndex{\NeedsTeXFormat,\OnlyDescription,\RecordChanges,\usepackage} +% \DoNotIndex{\ProvidesClass,\ProvidesPackage,\ProvidesFile,\RequirePackage} +% \DoNotIndex{\filename,\fileversion,\filedate,\let} +% \DoNotIndex{\@listctr,\@nameuse,\csname,\else,\endcsname,\expandafter} +% \DoNotIndex{\gdef,\global,\if,\item,\newcommand,\nobibliography} +% \DoNotIndex{\par,\providecommand,\relax,\renewcommand,\renewenvironment} +% \DoNotIndex{\stepcounter,\usecounter,\nocite,\fi} +% \DoNotIndex{\@fileswfalse,\@gobble,\@ifstar,\@unexpandable@protect} +% \DoNotIndex{\AtBeginDocument,\AtEndDocument,\begingroup,\endgroup} +% \DoNotIndex{\frenchspacing,\MessageBreak,\newif,\PackageWarningNoLine} +% \DoNotIndex{\protect,\string,\xdef,\ifx,\texttt,\@biblabel,\bibitem} +% \DoNotIndex{\z@,\wd,\wheremsg,\vrule,\voidb@x,\verb,\bibitem} +% \DoNotIndex{\FrameCommand,\MakeFramed,\FrameRestore,\hskip,\hfil,\hfill,\hsize,\hspace,\hss,\hbox,\hb@xt@,\endMakeFramed,\escapechar} +% \DoNotIndex{\do,\date,\if@tempswa,\@tempdima,\@tempboxa,\@tempswatrue,\@tempswafalse,\ifdefined,\ifhmode,\ifmmode,\cr} +% \DoNotIndex{\box,\author,\advance,\multiply,\Command,\outer,\next,\leavevmode,\kern,\title,\toks@,\trcg@where,\tt} +% \DoNotIndex{\the,\width,\star,\space,\section,\subsection,\textasteriskcentered,\textwidth} +% \DoNotIndex{\",\:,\@empty,\@for,\@gtempa,\@latex@error,\@namedef,\@nameuse,\@tempa,\@testopt,\@width,\\,\m@ne,\makeatletter,\makeatother} +% \DoNotIndex{\maketitle,\parindent,\setbox,\x,\kernel@ifnextchar} +% \DoNotIndex{\KVS@CommaComma,\KVS@CommaSpace,\KVS@EqualsSpace,\KVS@Equals,\KVS@Global,\KVS@SpaceEquals,\KVS@SpaceComma,\KVS@Comma} +% \DoNotIndex{\DefineShortVerb,\DeleteShortVerb,\UndefineShortVerb,\MakeShortVerb,\endinput} +% \let\ClearPage\clearpage +% \makeatletter +% \MakeShortVerb{\+}\DeleteShortVerb{\|}\DefineShortVerb{\|} +% \catcode`\§ \active \def§{\@ifnextchar §{\par\nobreak\vskip-2\parskip}{\par\nobreak\vskip-\parskip}} +% \def\thispackage{\xpackage{\thisfile}\xspace} +% \def\ThisPackage{\Xpackage{\thisfile}\xspace} +% \def\Xpackage{\@dblarg\X@package} +% \def\X@package[#1]#2{% +% \xpackage{#2\footnote{\noindent\xpackage{#2}: \href{http://www.ctan.org/tex-archive/macros/latex/contrib/#1}{\nolinkurl{CTAN:macros/latex/contrib/#1}}}}} +% \def\Underbrace#1_#2{$\underbrace{\vtop to2ex{}\hbox{#1}}_{\footnotesize\hbox{#2}}$} +% +% \parindent\z@\parskip.4\baselineskip\topsep\parskip\partopsep\z@ +% \g@addto@macro\macro@font{\macrocodecolor\let\AltMacroFont\macro@font} +% \g@addto@macro\@list@extra{\parsep\parskip\topsep\z@\itemsep\z@} +% \def\smex{\leavevmode\hb@xt@2em{\hfil$\longrightarrow$\hfil}} +% \newrobustcmd\verbfont{\usefont{T1}{\ttdefault}{\f@series}{n}} \let\vb\verbfont +% \renewrobustcmd\#[1]{{\usefont{T1}{pcr}{bx}{n}\char`\##1}} +% \newrobustcmd\csred[1]{\textcolor{red}{\cs{#1}}} +% \renewrobustcmd\cs[2][]{\mbox{\vb#1\expandafter\@gobble\string\\#2}} +% \newrobustcmd\CSbf[1]{\textbf{\CS{#1}}} +% \newrobustcmd\csbf[2][]{\textbf{\cs[{#1}]{#2}}} +% \newrobustcmd\textttbf[1]{\textbf{\texttt{#1}}} +% \renewrobustcmd*\bf{\bfseries}\newcommand\nnn{\normalfont\mdseries\upshape}\newcommand\nbf{\normalfont\bfseries\upshape} +% \newrobustcmd*\blue{\color{blue}}\newcommand*\red{\color{dr}}\newcommand*\green{\color{green}}\newcommand\rred{\color{red}} +% \newrobustcmd\rrbf{\color{red}\bfseries} +% \definecolor{copper}{rgb}{0.67,0.33,0.00} \newcommand\copper{\color{copper}} +% \definecolor{dg}{rgb}{0.16,0.33,0.00} \newcommand\dg{\color{dg}} +% \definecolor{db}{rgb}{0,0,0.502} \newcommand\db{\color{db}} +% \definecolor{dr}{rgb}{0.49,0.00,0.00} \let\dr\red +% \newrobustcmd\bk{\color{black}}\newcommand\md{\mdseries} +% +% \fancyhf{}\fancyhead[L]{The \thispackage package -- \thisinfo} +% \fancyfoot[L]{\color[gray]{.35}\scriptsize\thispackage\quad[rev.\thisversion]\quad\copyright\oldstylenums{2009-2010}\,\lower.3ex\hbox{\NibRight}\,Florent Chervet} +% \fancyfoot[R]{\oldstylenums{\thepage} / \oldstylenums{\pageref{LastPage}}} +% \pagestyle{fancy} +% \fancypagestyle{plain}{% +% \let\headrulewidth\z@ +% \fancyhf{}% +% \fancyfoot[R]{\oldstylenums{\thepage} / \oldstylenums{\pageref{LastPage}}}} +% +% \newcommand\macrocodecolor{\color{macrocode}}\definecolor{macrocode}{rgb}{0.18,0.00,0.45} +% \newcommand\reflinkcolor{\color{reflink}}\definecolor{reflink}{rgb}{0.49,0.00,0.00} +% \font\umrandA=umranda at 20pt +% \def\@serp{\leavevmode\lower20pt\hbox{\umrandA\char'131}} +% \def\serp#1{\@serp\hfil #1\hfil\reflectbox{\@serp}} +% \newrobustcmd\stform{\@ifnextchar*{\@stform[]\textasteriskcentered\@gobble}\@stform} +% \newrobustcmd\@stform[2][\string]{\textttbf{\rred#1#2}\xspace} +% +% \makeatother +% +% \deffootnote{1em}{0pt}{\rlap{\textsuperscript{\thefootnotemark}}\kern1em} +% +% \title{\vskip-18pt\mdseries {\bfseries\ThisPackage}\kern.6em package} +% \author{\footnotesize\xemail{florent.chervet@free.fr}} +% \date{\thisdate~--~version \thisversion} +% \subtitle{\thisinfo} +% ^^A\subject{\vskip-2cm\serp{The completely redesigned}} +% \subject{\vskip-2cm\relax The \textit{free} and \textit{open source}} +% +% \maketitle +% +% \makeatletter\begingroup\let\@thefnmark\@empty\let\@makefntext\@firstofone +% \footnotetext{\noindent +% This documentation is produced with the +DocStrip+ utility. +% \begin{tabbing} +% \qquad\=\smex\=To get the documentation, \= run (thrice):\quad\= \texttt{pdflatex keycommand.dtx} \\ +% \qquad\>\>To get the index, \> run:\>\texttt{makeindex -s gind.ist keycommand.idx} \\ +% \>\smex\>To get the package, \> run:\> \texttt{etex keycommand.dtx} +% \end{tabbing}§ +% The \xext{dtx} file is embedded into this pdf file thank to \xpackage{embedfile} by H. Oberdiek.} +% \endgroup\makeatother +% +% \hypersetup{bookmarksopenlevel=3} +% \deffootnote{1em}{0pt}{\rlap{\thefootnotemark.}\kern1em} +% \vspace*{-18pt} +% \begin{abstract}\parindent0pt\noindent\leftskip1cm\rightskip\leftskip\lastlinefit0% +% +% \thispackage provides an easy way to define commands or environments +% with optional keys. +% \smallskip +% +% \csbf{newkeycommand} \cs{renewkeycommand} \cs{providekeycommand} and \csbf{newkeyenvironment},\linebreak +% \cs{renewkeyenvironment} are macros to define such commands and environments with keys. +% +% \thispackage is designed to make easier interface for user-defined commands. In particular, +% \csbf{newkeycommand}\stform+ permits the use of key-commands in every context. +% \medskip +% +% Keys are defined with the command itself in a very natural way. +% You can restrict the possible values for the keys by declaring them with a \textbf{type}. +% Available types for keys are : \textit{boolean}, \textit{enum} and \textit{choice} (see \ref{subsec:GeneralSyntax}). +% +% \smallskip +% +% The \thispackage package requires and is based on the package \xpackage{xkeyval} by Hendri Adriaens, and uses +% the \cs{kv@normalize} macro of \xpackage{kvsetkeys} (Heiko Oberdiek) for robustness, as shown +% in \ref{kvsetkeys-comparisons}). +% +% It works with an \eTeX{} distribution of \LaTeX. +% \end{abstract} +% +% \DeleteShortVerb{\+}\enlargethispage{2\baselineskip} +% \cftbeforesecskip=4pt plus2pt minus2pt +% \cftbeforesubsecskip=0pt plus2pt minus2pt +% \renewcommand\contentsname{Contents\quad\leaders\vrule height3.4pt depth-3pt\hfill\null\kern0pt\vskip-6pt} +% ^^A\vskip-.8\baselineskip +% \tableofcontents +% +% \clearpage\MakeShortVerb{\+} +% +% \def\B#1{\texttt{[}\meta{#1}\texttt{]}} +% +% \section{User Interface} +% +% \subsection{General syntax}\label{subsec:GeneralSyntax} +% +% \begin{declcs}{newkeycommand}% +% \Underbrace{\textcolor{red}{\textasteriskcentered\string+[short-unexpand]}}_{\makecell[c]{modifiers \\ Optional}}\,% +% \Underbrace{\M{command}}_{Required}\,% +% {\color{db}\Underbrace{\B{keys=defaults}\,\B{OptKey}\,\B{}}_{Optional}\,}% +% \Underbrace{\M{definition}}_{Required} +% \end{declcs} +% +% \cs{newkeycommand} will define \cs{command} as a new key-command!\quad well... +% +% Use the \stform* form when you do not want it to be a \cs{long} macro (as for \LaTeX{}-\cs{newcommand}). +% +% The +[keys=defaults]+ argument define the keys with their default values. It is optional, but a key-command +% without keys seems to be useless (at least for me...). Keys may be defined as : +% +% \newlist{myenum}{enumerate}{1} +% \setlist[myenum]{label={},topsep=-\parskip,itemsep=-\parskip,parsep=\parskip,after=\vskip-\baselineskip} +% +% \renewcommand\theadfont{\tt\bfseries} +% \noindent\begin{tabular}{|c|>{\db}c|m{8cm}|}\hline +% \thead{Type} & \thead{exemple} & \thead{value of \cs{commandkey}} \\ \hline +% general & color{\dg=red} & \cs{commandkey}\{{\db color}\} is `{\dg red}' and may be anything (text, number, macro...) \\ \hline +% boolean & {\rred bool} bold{\dg =true} & \cs{commandkey}\{{\db bold}\} is: +% \begin{myenum} +% \item {\tt 0}\quad (for {\dg false}) +% \item {\tt 1}\quad (for {\dg true}) +% \end{myenum} \\ \hline +% \multirow{2}*{enumerate} & {\rred enum} position{\dg=\{left,centered,right\}} & \cs{commandkey}\{{\db position}\} is: +% \begin{myenum} +% \item `{\dg left}'\quad by default and can be +% \item `{\dg centered}' or +% \item `{\dg right}' +% \end{myenum} \\ \cdashline{2-3}[1pt/2pt] +% & {\rred enum\textasteriskcentered} position{\dg=\{left,centered,right\}} & This is the same, except match is case \textbf{in}sensitive \bottopstrut \\ \hline +% \multirow{2}*{choice} & {\rred choice} position={\dg \{left,centered,right\}} & \cs{commandkey}\{{\db position}\} is: +% \begin{myenum} +% \item {\tt 0}\quad (for {\dg left} the default value), +% \item {\tt 1}\quad (for {\dg centered}) +% \item {\tt 2}\quad (for {\dg right}) +% \end{myenum} \\ \cdashline{2-3}[1pt/2pt] +% & {\rred choice\textasteriskcentered} position={\dg\{left,centered,right\}} & This is the same, except match is case \textbf{in}sensitive \bottopstrut \\ \hline +% \end{tabular} +% +% The {\db+OptKey+} argument is used if you wish to capture the +key=value+ pairs that are not specifically defined (more on this in the examples section \ref{sec:examples}). +% +% The key-command may have {\tt 0} up to {\tt 9} \textbf{mandatory} arguments : specify the number by ++ ({\tt 0} if omitted). +% +% The \stform+ form expands the \cs{commandkey} before executing the key-command itself, as explain in section \ref{sec:example:plus}. +% +% \subsection{First example :} +% +% \begin{tabbing}\label{textrule} +% \,\=\csbf{new}\=\textttbf{keycommand}\cs[\copper]{textrule}+[+{\color{db}+raise=.4ex,width=3em,thick=.4pt+}+][1]{%+ \\ ^^A+][1]{%+}\\ +% \>\>\cs{rule}+[+\cs[\red]{commandkey}+{+{\db+raise+}+}]{+\cs[\red]{commandkey}+{+{\db+width+}+}{+\cs[\red]{commandkey}+{+{\db+thick+}+}}+\\ +% \>\>\#1 \\ +% \>\>\cs{rule}+[+\cs[\red]{commandkey}+{+{\db+raise+}+}]{+\cs[\red]{commandkey}+{+{\db+width+}+}}{+\cs[\red]{commandkey}+{+{\db+thick+}+}}}+ +% \end{tabbing} +% +% defines the keys {\db+width+}, {\db+thick+} and {\db+raise+} with their default values (if not specified): +% {\db+3em+}, {\db+.4pt+} and {\db+.4ex+}. Now \cs[\copper]{textrule} can be used as follow: +% \begin{tabbing} +% \=1:\quad\=\cs[\copper]{textrule}+[width=2em]{hello}+\hskip2.5cm\=\smex\qquad\= \rule[.4ex]{2em}{.4pt}hello\rule[.4ex]{2em}{.4pt} \\ +% \>2:\>\cs[\copper]{textrule}+[thick=5pt,width=2em]{hello}+\>\smex\> \rule[.4ex]{2em}{5pt}hello\rule[.4ex]{2em}{5pt}\\ +% \>3:\>\cs[\copper]{textrule}+{hello}+\quad \>\smex\> \rule[.4ex]{3em}{.4pt}hello\rule[.4ex]{3em}{.4pt}\\ +% \>4:\>\cs[\copper]{textrule}+[thick=2pt,raise=1ex]{hello}+\>\smex\> \rule[1ex]{3em}{2pt}hello\rule[1ex]{3em}{2pt} \\ +% \> \textit{et c\ae tera}. +% \end{tabbing} +% +% \clearpage +% +% \subsection[Second example : the \string+ form]{Second example : the {\rred\bf\string+} form} +% \label{sec:example:plus} +% +% \DeleteShortVerb{\+} +% \begin{Verbatim}[gobble=1,commandchars=$(),frame=lines] +% ($bf\newkeycommand)($rred$bf+[\|])($copper\myfigure)[image, +% caption, +% enum placement={H,h,b,t,p}, +% width=\textwidth, +% label= +% ][($db OtherKeys)]{% +% ($rred|)($bf\begin){figure}($dr|)[($red\commandkey){placement}] +% ($rred|)($bf\includegraphics)($dr|)[width=($red\commandkey){width},($red\commandkey){($db OtherKeys)}]{% +% ($red\commandkey){image}}% +% ($dg\ifcommandkey){caption}{($rred|)\caption($rred|){($red\commandkey){caption}}}{}% +% ($dg\ifcommandkey){label}{($rred|)\label($rred|){($red\commandkey){label}}}{}% +% ($rred|)($bf\end){figure}($rred|)} +% \end{Verbatim} +% \MakeShortVerb{\+} +% +% With the \stform+ form of \cs{newkeycommand}, the definition will be expanded (at run time). The optional {\rred\bf+[\|]+} argument +% means that everything inside {\bf\rred+|+ ... +|+} is protected from expansion. +% +% {\dg\cs{ifcommandkey}}\{\meta{name}\}\{\meta{true}\}\{\meta{false}\}\quad expands \meta{true} if the commandkey \meta{name} is not blank. +% +% {\db \meta{Otherkeys}} captures the keys given by the user but not declared: they are simply given back to \cs{includegraphics} here... +% +% +% \subsection[Explanation of the \string+ form]{Explanation of the {\rred\bf\string+} form} +% \DeleteShortVerb{\+} +% The |\commankey{|\meta{name}|}| stuff is expanded at run time using the following scheme:§§ +% \begin{Verbatim}[gobble=1,commandchars=!(),frame=lines] +% (!bf\newkeycommand)(!copper\keyMacro)[A=\defA,B=\defB,C=\defC,D=\defD][1]{(!dg\begingroup) +% (!dg\edef)\keyMacro##1{(!dg\endgroup) +% (!dg\noexpand)\Macro{(!red\getcommandkey){A}} +% {(!red\getcommandkey){B}} +% {(!red\getcommandkey){C}} +% {(!red\getcommandkey){D}} +% }\keyMacro{#1}} +% \end{Verbatim} +% Therefore, the arguments of \cs{Macro} are ready: there is no more \cs{commandkey} stuff, but instead the values of the keys +% as you gave them to the key-command. \cs{getcommandkey}\{A\} is expanded to \cs{defA}. +% +% But \cs{defA} is not expanded of course: in the \stform+ form, \cs{commandkey} has the meaning of \cs{getcommandkey}. +% +% As you can see, the mandatory arguments \#1, \#2 etc. are \textbf{never expanded}: there is no need to protect them inside the special (usually {\rred\bf\textbar}) character. +% +% +% \MakeShortVerb{\+} +% \clearpage +% +% \subsection{key-environments} +% +% \begin{declcs}{newkeyenvironment}% +% \Underbrace{\textcolor{red}{\textasteriskcentered\string+[short-unexpand]}}_{\makecell[c]{modifiers \\ Optional}}\,% +% \Underbrace{\M{envir name}}_{Required}\,% +% {\db\Underbrace{\B{keys=defaults}\,\B{OptKey}\,\B{}}_{Optional}\,}% +% \Underbrace{\M{begin}}_{Required}\Underbrace{\M{end}}_{Required} +% \end{declcs} +% +% In the same way, you may define environments with optional keys as follow:§ +% \begin{tabbing} +% \qquad\=+\newkeyenvironment+\=+{EnvirWithKeys}[kOne=+default value,...+][n]+\\ +% \>\>+{+ commands at begin +EnvirWithKeys }+ \\ +% \>\>+{+ commands at end +EnvirWithKeys }+ +% \end{tabbing} +% +% Where $n$ is the number of mandatory other arguments (\emph{ie} without keys), if any. +% +% Key-environments may be defined with the \stform+ form in the same way as \cs{newkeycommand} is used. +% Be aware that each part of the environment: \meta{begin} and \meta{end} are expanded at run time then, +% and the optional {\rred\bf+[\|]+} argument protects from expansion in each of those parts. +% +% \subsection[Example of a \string+ key-environment]{Example of a {\rred\bf\string+} key-environment} +% +% \DeleteShortVerb{\+} +% \begin{Verbatim}[gobble=1,commandchars=$(),frame=lines] +% ($bf\newkeyenvironment)($rred$bf+[\|])({$copper myfigure)}[ +% caption, +% enum placement={H,h,b,t,p}, +% width=.5\linewidth, +% label +% ][($db OtherKeys)][1]% +% {% ($nbf$dg begin part) +% ($rred|)($bf\begin){figure}($rred|)[($red\commandkey){placement}] +% ($rred|)($bf\includegraphics)($rred|)[($red\commandkey){($db OtherKeys)},width=($red\commandkey){width}]{$#1}% +% } +% {% ($nbf$dg end part) +% ($dg\ifcommandkey){caption}{($rred|)\caption($rred|){($red\commandkey){caption} image file = $#1}}{}% +% ($dg\ifcommandkey){label}{($rred|)\label($rred|){($red\commandkey){label}}}{}% +% ($rred|)($bf\end){figure}($rred|)% +% } +% \end{Verbatim} +% \MakeShortVerb{\+} +% +% As you can see, \cs{commandkey} and mandatory arguments (\#1 here) are available both in the \meta{begin} +% and in the \meta{end} parts of the key-environment. +% +% +% \DefineShortVerb{\+} +% +% \section{Messages and more} +% +% \subsection{Invalid keys} +% +% If you use the command +\textule+ (defined in \ref{textrule}) with a key say: +height+ +% that has not been declared at the definition of the key-command, you will get an +% error message like this: +% \begin{quote}\tt +% The key-value pairs ``height=...''§ +% cannot be processed for key-command \string\textrule!§ +% See the definition of the keycommand! +% \end{quote} +% The error is recoverable: the key is ignored. +% +% If you assign a value to an \textit{enum} or a \textit{choice} key, which is not allowed in the definition, +% you will get the following message: +% \begin{quote}\tt +% The value ``...'' is not allowed in key ...§ +% for key-command \string\command§ +% I'll use the default value ``...'' for this key instead§ +% See the definition of the key-command! +% \end{quote} +% The error is recoverable: the key is assigned its default value. +% +% If you use a \cs{commandkey}\{\meta{name}\} in a key-command where \meta{name} is not defined as a key, +% you will get the \TeX{} generic error message :§ +% \qquad undefined control sequence : \cs{keycmd->...@name}. +% +% +% \subsection{Testing keys} +% +% \begin{declcs}{ifcommandkey}\,\M{key name}\,\M{commands if key is NOT blank}\,\M{commands if key is blank} +% \end{declcs} +% +% When you define a key command you may let the default value of a key empty. Then, you may wish to +% expand some commands only if the key has been given by the user (with a non empty value). This can +% be achieved using the macro |\ifcommandkey|. +% +% \clearpage +% \subsection{xkeyval, keyval and kvsetkeys comparison} +% +% \begin{tabbing} +% \quad\=\xpackage{xkeyval}: \expandafter\meaning\csname ver@xkeyval.sty\endcsname \\ +% \>\xpackage{keyval}: \expandafter\meaning\csname ver@keyval.sty\endcsname \\ +% \>\xpackage{kvsetkeys}: \expandafter\meaning\csname ver@kvsetkeys.sty\endcsname +% \end{tabbing} +% +% \makeatletter\def\theadfont{\tt\bfseries} +% \define@key{fam}{key}{\def\result{#1}} +% \begin{table}[h]\label{kvsetkeys-comparisons} +% \begin{tabular}{|l|l|>{\color{db}}l|>{\color{dg}}l|}\hline +% \thead{\bf Example} & \thead{keyval} & \thead{xkeyval} & \thead{\makecell{kvsetkeys\\and\\keycommand}} \\ \hline +% +\setkeys{fam}{key={{value}}}+ +% & \keyval@setkeys{fam}{key={{value}}}\meaning\result +% & \xsetkeys{fam}{key={{value}}}\meaning\result +% & \kvsetkeys{fam}{key={{value}}}\meaning\result \\\hline +% +\setkeys{fam}{key={{{value}}}}+ +% & \keyval@setkeys{fam}{key={{{value}}}}\meaning\result +% & \xsetkeys{fam}{key={{{value}}}}\meaning\result +% & \kvsetkeys{fam}{key={{{value}}}}\meaning\result \\\hline +% +\setkeys{fam}{key=+\textvisiblespace+{{{value}}}}+ +% & \keyval@setkeys{fam}{key= {{{value}}}}\meaning\result +% & \xsetkeys{fam}{key= {{{value}}}}\meaning\result +% & \kvsetkeys{fam}{key= {{{value}}}}\meaning\result \\\hline +% \end{tabular} +% \caption{Then it is clear that, at this time, \xpackage{kvsetkeys} has the only correct behaviour...} +% \end{table} +% +% In \thispackage the key-value pairs are first normalized using \xpackage{kvsetkeys}-\cs{kv@normalize}. Then braces are added +% around the values in order to keep the good behaviour of \xpackage{kvsetkeys} while using \xpackage{xkeyval}. +% \makeatother +% +% +% +% +% \StopEventually{ +% } +% +% \begin{center}\vskip6pt$\star$\hskip4em\lower12pt\hbox{$\star$}\hskip4em$\star$\vadjust{\vskip12pt}\end{center} +% +% \section{Implementation} \label{Implementation} +% \csdef{HDorg@PrintMacroName}#1{\hbox to4em{\strut \MacroFont \string #1\ \hss}} +% +% \subsection{Identification} +% +% This package is intended to use with \LaTeX{} so we don't check if it is loaded twice. +% +% \begin{macrocode} +%<*package> +\NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX) + [2005/12/01]% LaTeX must be 2005/12/01 or younger (see kvsetkeys.dtx). +\ProvidesPackage{keycommand} + [2010/04/27 v3.1415 - key-value interface for commands and environments in LaTeX] +% \end{macrocode} +% +% \subsection{Requirements} +% +% The package is based on \xpackage{xkeyval}. However, \xpackage{xkeyval} is far less reliable +% than \xpackage{kvsetkeys} as far as spaces and bracket (groups) are concerned, as shown in the section +% \ref{kvsetkeys-comparisons} of this documentation. +% +% Therefore, we also use the macros of \xpackage{kvsetkeys} in order to \textit{normalize} the \texttt{key=value} +% list before setting the keys. This way, we take advantage of both \xpackage{xkeyval} and \xpackage{kvsetkeys} ! +% +% As long as we use \eTeX{} primitives in \xpackage{keycommand} we also load the +% \xpackage{etex} package in order to get an error message if \eTeX{} is not running. +% +% The \xpackage{etoolbox} package gives some facility to write \xpackage{keycommand}. +% +% From version \texttt{3.141} onwards, \thispackage does not load \xpackage{etextools} anymore. +% +% \begin{macrocode} +\def\kcmd@pkg@name{keycommand} +\RequirePackage{etex,kvsetkeys,xkeyval,etoolbox} +% \end{macrocode} +% +% Save the \cs{setkeys} macro of \xpackage{xkeyval} package (in case it was overwritten by a +% subsequent load of \xpackage{kvsetkeys} or \xpackage{keyval} for example : +% \begin{macrocode} +\protected\def\kcmd@Xsetkeys{\XKV@sttrue\XKV@plfalse\XKV@testoptc\XKV@setkeys}% in case \setkeys +% was overwritten +% \end{macrocode} +% Some \cs{catcode} assertions internally used by \thispackage: +% \begin{macrocode} +\let\kcmd@AtEnd\@empty +\def\TMP@EnsureCode#1#2{% + \edef\kcmd@AtEnd{% + \kcmd@AtEnd + \catcode#1 \the\catcode#1\relax + }% + \catcode#1 #2\relax +} +\TMP@EnsureCode{32}{10}% space +\TMP@EnsureCode{61}{12}% = sign +\TMP@EnsureCode{45}{12}% - sign +\TMP@EnsureCode{62}{12}% > sign +\TMP@EnsureCode{46}{12}% . dot +\TMP@EnsureCode{47}{8}% / slash (etextools) +\AtEndOfPackage{\kcmd@AtEnd\undef\kcmd@AtEnd} +% \end{macrocode} +% +% \begin{macro}{\kcmd@ifstrdigit}\qquad\qquad +% This macro is used too test the optional arguments of \cs{newkeycommand}, +% in particular, one must know in an argument is a single digit (representing +% the number of mandatory arguments) or anything else (representing the \texttt{key=value} +% list or the ``special'' \texttt{OptKey} key: +% \begin{macrocode} +\iffalse%\ifdefined\pdfmatch% use \pdfmatch if present + \long\def\kcmd@ifstrdigit#1{\csname @\ifnum\pdfmatch + {\detokenize{^[[:space:]]*[[:digit:]][[:space:]]*$}}{\detokenize{#1}}=1 % + first\else second\fi oftwo\endcsname} +\else% use filter, very efficient ! +\def\kcmd@ifstrdigit#1{% + \kcmd@nbk#1//% + {\expandafter\expandafter\expandafter\kcmd@ifstrdigit@i + \expandafter\expandafter\expandafter{\detokenize\expandafter{\number\number0#1}}}% + {\@secondoftwo}//% +} +\def\kcmd@ifstrdigit@i#1{% + \def\kcmd@ifstrdigit@ii##1#1##2##3\kcmd@ifstrdigit@ii{% + \csname @\ifx##20first\else second\fi oftwo\endcsname + }\kcmd@ifstrdigit@ii 00 01 02 03 04 05 06 07 08 09 0#1 \relax\kcmd@ifstrdigit@ii +} +\fi +% \end{macrocode} +% \end{macro} +% +% \subsection{Defining (and undefining) command-keys} +%\begin{macro}{\kcmd@keyfam}\qquad +% The macro expands to the family-name, given the keycommand name: +% \begin{macrocode} +\def\kcmd@keyfam#1{\detokenize{keycmd->}\expandafter\@gobble\string#1} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\kcmd@nbk}\qquad is the optimized \cs{ifnotblank} macro of \xpackage{etoolbox} +% (with \textttbf{/} having a catcode of 8): +% \begin{macrocode} +\def\kcmd@nbk#1#2/#3#4#5//{#4}% +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\kcmd@normalize@setkeys}~\par +% This macro assigns the values to the keys (expansion of \xpackage{xkeyval}-\cs{setkeys} +% on the result of \xpackage{kvsetkeys}-\cs{kv@normalize}). Braces are normalized too so that +% \verb+key=+\textvisiblespace+{{{value}}}+ is the same as \verb+key={{{value}}}+ as explained in section \ref{kvsetkeys-comparisons}: +% \begin{macrocode} +\newrobustcmd\kcmd@normalize@setkeys[4]{% +% #1 = key-command, +% #2 = family, +% #3 = other-key, +% #4 = key-values pairs + \kv@normalize{#4}\toks@{}% + \expandafter\kv@parse@normalized\expandafter{\kv@list}{\kcmd@normalize@braces{#2}}% + \edef\kv@list{\kcmd@Xsetkeys{\unexpanded{#2}}{\the\toks@}}\kv@list + \kcmd@nbk#3//% undeclared keys are assigned to "OtherKeys" + {\cslet{#2@#3}\XKV@rm}% (if specified, ie not empty) + {\expandafter\kcmd@nbk\XKV@rm//% (otherwise a recoverable error is thown) + {\PackageError\kcmd@pkg@name{The key-value pairs :\MessageBreak + \XKV@rm\MessageBreak + cannot be processed for key-command \string#1\MessageBreak + See the definition of the key-command!}{}}{}//}//% +} +\long\def\kcmd@normalize@braces#1#2#3{% This is kvsetkeys processor for normalizing braces + \toks@\expandafter{\the\toks@,#2}% + \ifx @\detokenize{#3}@\else \toks@\expandafter{\the\toks@={{{#3}}}}\fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\kcmd@definekey}~\par +% \CS{kcmd@definekey} define the keys declared for the key-command. +% It is used as the \emph{processor} for the \cs{kv@parse} macro of \xpackage{kvsetkeys}. +% The macro appends the key names to the key list: ``\textit{family}.keylist''. +% +% keys are first checked for their type (bool, enum, enum*, choice or choice*) : +% +% \begin{macrocode} +\def\kcmd@check@typeofkey#1{% expands to +% 0 if key has no type, +% 1 if boolean, +% 2 if enum*, +% 3 if enum, +% 4 if choice*, +% 5 if choice + \kcmd@check@typeofkey@bool#1bool //% + {\kcmd@check@typeofkey@enumst#1enum* //% + {\kcmd@check@typeofkey@enum#1enum //% + {\kcmd@check@typeofkey@choicest#1choice* //% + {\kcmd@check@typeofkey@choice#1choice //% + 05//}4//}3//}2//}1//} +\def\kcmd@check@typeofkey@bool #1bool #2//{\kcmd@nbk#1//} +\def\kcmd@get@keyname@bool #1bool #2//{#2} +\def\kcmd@check@typeofkey@enumst #1enum* #2//{\kcmd@nbk#1//} +\def\kcmd@get@keyname@enumst #1enum* #2//{#2} +\def\kcmd@check@typeofkey@enum #1enum #2//{\kcmd@nbk#1//} +\def\kcmd@get@keyname@enum #1enum #2//{#2} +\def\kcmd@check@typeofkey@choicest #1choice* #2//{\kcmd@nbk#1//} +\def\kcmd@get@keyname@choicest #1choice* #2//{#2} +\def\kcmd@check@typeofkey@choice #1choice #2//{\kcmd@nbk#1//} +\def\kcmd@get@keyname@choice #1choice #2//{#2} +% +\protected\long\def\kcmd@definekey#1#2#3#4#5{% define the keys using xkeyval macros +% #1 = keycommand, +% #2 = \global, +% #3 = family, +% #4 = key (before = sign), +% #5 = default (after = sign) + \ifcase\kcmd@check@typeofkey{#4}\relax% standard + #2\csedef{#3.keylist}{\csname#3.keylist\endcsname,#4}% + \define@cmdkey{#3}[{#3@}]{#4}[{#5}]{}% + \or% bool + #2\csedef{#3.keylist}{\csname#3.keylist\endcsname,\kcmd@get@keyname@bool#4//}% + \kcmd@define@boolkey#1{#3}{\kcmd@get@keyname@bool#4//}{#5}% + \or% enum* + #2\csedef{#3.keylist}{\csname#3.keylist\endcsname,\kcmd@get@keyname@enumst#4//}% + \kcmd@define@choicekey#1*{#3}{\kcmd@get@keyname@enumst#4//}{#5}{\expandonce\val}% + \or% enum + #2\csedef{#3.keylist}{\csname#3.keylist\endcsname,\kcmd@get@keyname@enum#4//}% + \kcmd@define@choicekey#1{}{#3}{\kcmd@get@keyname@enum#4//}{#5}{\expandonce\val}% + \or% choice* + #2\csedef{#3.keylist}{\csname#3.keylist\endcsname,\kcmd@get@keyname@choicest#4//}% + \kcmd@define@choicekey#1*{#3}{\kcmd@get@keyname@choicest#4//}{#5}{\number\nr}% + \or% choice + #2\csedef{#3.keylist}{\csname#3.keylist\endcsname,\kcmd@get@keyname@choice#4//}% + \kcmd@define@choicekey#1{}{#3}{\kcmd@get@keyname@choice#4//}{#5}{\number\nr}% + \fi + \ifx#2\global\relax + #2\csletcs{KV@#3@#4}{KV@#3@#4}% globalize + #2\csletcs{KV@#3@#4@default}{KV@#3@#4@default}% globalize default value + \fi +} +% +\long\def\kcmd@firstchoiceof#1,#2\kcmd@nil{\unexpanded{#1}} +% +\long\def\kcmd@define@choicekey#1#2#3#4#5#6{% + \begingroup\edef\kcmd@define@choicekey{\endgroup + \noexpand\define@choicekey#2+{#3}{#4} + [\noexpand\val\noexpand\nr]% + {\unexpanded{#5}}% list of allowed values + [{\kcmd@firstchoiceof#5,\kcmd@nil}]% default value + {\csedef{#3@#4}{\unexpanded{#6}}}% define key value if in the allowed list + {\kcmd@error@handler\noexpand#1{#3}{#4}{\kcmd@firstchoiceof#5,\kcmd@nil}}% error handler + }\kcmd@define@choicekey +} +\def\kcmd@define@boolkey#1#2#3#4{\begingroup + \kcmd@nbk#4//{\def\default{#4}}{\def\default{true}}//% + \edef\kcmd@define@boolkey{\endgroup + \noexpand\define@choicekey*+{#2}{#3}[\noexpand\val\noexpand\nr]% + {false,true} + [{\unexpanded\expandafter{\default}}]% + {\csedef{#2@#3}{\noexpand\number\noexpand\nr}}% + {\kcmd@error@handler\noexpand#1{#2}{#3}{\unexpanded\expandafter{\default}}}% + }\kcmd@define@boolkey +} +% +\protected\long\def\kcmd@error@handler#1#2#3#4{% +% #1 = key-command, +% #2 = family, +% #3 = key, +% #4 = default + \PackageError\kcmd@pkg@name{% + Value `\val\space' is not allowed in key #3\MessageBreak + for key-command \string#1.\MessageBreak + I'll use the default value `#4' for this key.\MessageBreak + See the definition of the key-command!}{% + \csdef{#2@#3}{#4}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\kcmd@undefinekeys}~\par +% Now in case we redefine a key-command, we would like the old keys (\emph{ie} the keys +% associated to the old definition of the command) to be cleared, undefined. +% That's the job of \cs{kcmd@undefinekeys}. +% \begin{macrocode} +\protected\def\kcmd@undefinekeys#1#2{% #1 = global, #2 = family + \ifcsundef{#2.keylist} + {\cslet{#2.keylist}\@gobble} + {\expandafter\expandafter\expandafter\docsvlist + \expandafter\expandafter\expandafter{% + \csname #2.keylist\endcsname}% + \cslet{#2.keylist}\@gobble}% +} +\def\kcmd@undefinekey#1#2#3{% #1 = global, #2 = family, #3 = key + #1\csundef{KV@#2@#3}% + #1\csundef{KV@#2@#3@default}% +} +% \end{macrocode} +% \end{macro} +% +%\begin{macro}{\kcmd@setdefaults}\qquad\qquad +% sets the defaults values for the keys at the very beginning of the keycommand: +% \begin{macrocode} +\def\kcmd@setdefaults#1{% + \ifcsundef{#1.keylist}{} + {\expandafter\expandafter\expandafter\docsvlist + \expandafter\expandafter\expandafter{% + \csname#1.keylist\endcsname}}% +} +% \end{macrocode} +%\end{macro} +% +% +% +% \begin{macro}{\kcmd@def} +% checks \cs{@ifdefinable} and cancels definition if needed: +% \begin{macrocode} +\protected\long\def\kcmd@def#1#2[#3][#4][#5]#6#7{% + \ifx#1\kcmd@donot@provide \endgroup + \else + \@tempswafalse\@ifdefinable#1{\@tempswatrue}% + \if@tempswa + \edef\kcmd@fam{\kcmd@keyfam{#1}}% + \expandafter\kcmd@defcommand\expandafter{\kcmd@fam}#1[{#3}][{#4}][{#5}]{#6}{#2}{#7}% + \else\endgroup + \fi + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\kcmd@defcommand}\qquad\qquad prepares (expands) the arguments before closing the group opened at the very beginning. +% Then it proceeds (\cs{kcmd@yargdef} (normal interface) or \cs{kcmd@yargedef} (when \cs{newkeycommand}\stform+ is used)) +% \begin{macrocode} +\protected\long\def\kcmd@defcommand#1#2[#3][#4][#5]#6#7#8{% + \let\commandkey\relax \let\getcommandkey\relax \let#2\relax + \cslet{#1}\relax \cslet{#1.commankey}\relax \cslet{#1.getcommandkey}\relax + \def\do{\kcmd@undefinekey{\kcmd@gbl}{#1}}% + \edef\kcmd@defcommand{\endgroup + \kcmd@undefinekeys{\kcmd@gbl}{#1}% undefines all keys for this keycommand family + \ifx\kcmd@unexpandchar\@empty\else + \kcmd@mount@unexpandchar{#1}{\unexpanded\expandafter{\kcmd@unexpandchar}}% + \fi + \unexpanded{\kv@parse{#3,#4}}{\kcmd@definekey\noexpand#2{\kcmd@gbl}{#1}}% defines keys + \csdef{#1.commandkey}####1{\noexpand\csname#1@####1\endcsname}% + \csdef{#1.getcommandkey}####1{% + \unexpanded{\unexpanded\expandafter\expandafter\expandafter}{% + \noexpand\csname#1@####1\endcsname}}% + \kcmd@ifplus% \newkeycommand+ / \newkeyenvironment+ + \protected\csdef{#1}{% + \kcmd@yargedef{\kcmd@gbl}{\kcmd@long}\csname#1\endcsname + {\number#5}{\noexpand#7}{\csname#1.unexpandchar\endcsname}}% + \ifx#7\@gobble\else + \protected\def#7{\kcmd@yargedef#7}% + \fi + \else% \newkeycommand / \newkeyenvironment + \csdef{#1}{% + \kcmd@yargdef{\kcmd@gbl}{\kcmd@long}\csname#1\endcsname + {\number#5}{\noexpand#7}}% + \ifx#7\@gobble\else \def#7####1{% that means we have to define a key-environment + \def#7{% + \let\getcommandkey\csname#1.getcommandkey\endcsname + \let\commandkey\csname#1.commandkey\endcsname + ####1}% + }% + \fi + \fi + \def\noexpand\do####1{\unexpanded{\expandafter\noexpand\csname}KV@#1@####1@default% + \endcsname}% + \let\commandkey\relax \let\getcommandkey\relax \let#2\relax + \kcmd@gbl\protected\edef#2{% entry point + \let\getcommandkey\noexpand\noexpand\csname#1.getcommandkey\endcsname + \kcmd@ifplus \let\commandkey\getcommandkey + \else \let\commandkey\noexpand\noexpand\csname#1.commandkey\endcsname + \fi + \noexpand\kcmd@setdefaults{#1}% + \ifx#7\@gobble \noexpand\noexpand\noexpand\@testopt + {\kcmd@setkeys#2{#1}{\kcmd@otherkey{#4}}}{}% + \else \noexpand\noexpand\noexpand\@testopt + {\kcmd@setkeys#2{#1}{\kcmd@otherkey{#4}}}{}% + \fi + }% + \csname#1\endcsname% expand \kcmd@yargedef or \kcmd@yargdef + }\kcmd@defcommand{#6}{#8}% #6 = definition, #8 = definition end-envir +} +\protected\long\def\kcmd@setkeys#1#2#3[#4]{% #1=key-command, #2=family, #3=otherkey, #4=key=value pairs + \kcmd@normalize@setkeys{#1}{#2}{#3}{#4}\csname#2\endcsname +} +\long\def\kcmd@otherkey#1{\kcmd@nbk#1//{\kcmd@otherkey@name#1=\kcmd@nil}{}//} +\long\def\kcmd@otherkey@name#1=#2\kcmd@nil{#1} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\kcmd@mount@unexpandchar}~\par +% This macro defines the macro \cs{"\textit{family.unexpandchar}"}. +% \CS{"\textit{family.unexpandchar}"} activates the shortcut character +% for \cs{unexpanded} and defines its meaning. +% \begin{macrocode} +\protected \def \kcmd@mount@unexpandchar#1#2{% + \protected\csdef{#1.unexpandchar}{\begingroup + \catcode`\~\active \lccode`\~`#2 \lccode`#2 0\relax + \lowercase{% + \expandafter\endgroup\expandafter\def\expandafter~{% + \catcode`#2\active + \long\def~########1~{\unexpanded{########1}}}% + ~}% + }% +} +% \end{macrocode} +% \end{macro} +% +%---------------------------------------------------------------------------- +% \begin{macro}{\kcmd@yargdef}\qquad\qquad +% This is the ``{\tt argdef}'' macro for the normal (non \string+) form: +% \begin{macrocode} +\protected \def \kcmd@yargdef #1#2#3#4#5{\begingroup +% #1 = global or {} +% #2 = long or {} +% #3 = Command +% #4 = nr of args +% #5 = endenvir (or \@gobble if not an environment, or \relax if #3 is endenvir) + \def \kcmd@yargd@f ##1#4##2##{\afterassignment#5\endgroup + #1#2\expandafter\def\expandafter#3\@gobble ##1#4% + }\kcmd@yargd@f 0##1##2##3##4##5##6##7##8##9###4% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\kcmd@yargedef}\qquad\qquad +% This is the ``{\tt argdef}'' macro for the {\rred\bf\string+} form: +% \begin{macrocode} +\protected \def \kcmd@yargedef#1#2#3#4#5#6{\begingroup +% #1 = global or {} +% #2 = long or {} +% #3 = Command +% #4 = nr of args +% #5 = endenvir (or \@gobble if not an environment, or \relax if #3 is endenvir) +% #6 = unexpandchar mounting macro + \kcmd@nargs{#4}% + \protected\long\def\kcmd@yarg@edef##1##2{\endgroup + #1\edef#3{\begingroup #6% + #2\edef#3\unexpanded{##2}{\endgroup\unexpanded{##1}% + }#3}% + }% + \protected\def\kcmd@envir##1{% + \edef\next{\kcmd@yarg@edef{\def\noexpand#5{\expandonce{#5##1}}\expandonce{#3##1}}}\next + }% + \protected\def\kcmd@command##1{% + \edef\next{\kcmd@yarg@edef{\expandonce{#3##1}}}\next + }% + \protected\def\kcmd@yargedef##1{% + \kcmd@yargedef@##1 0####1####2####3####4####5####6####7####8####9#####4% + }% + \ifx#5\@gobble % keycommand + \def\next{\kcmd@command}% + \else % key-environmment + \def\next{\kcmd@envir}% + \fi + \let\@next\relax + \def\kcmd@yargedef@##1##2#4##3##{% + \ifx\@next\relax + \edef\@next{\next{\expandonce{\kcmd@nargs}}{\expandonce{\@gobble##2#4}}}% + \ifx#5\@gobble \edef\@next{\expandonce\@next\noexpand#5}% + \else \edef\@next{\edef\noexpand\@next{\noexpand\unexpanded{\expandonce\@next}}#5}% + \fi + \fi + \afterassignment\@next + \expandafter\def\expandafter##1\@gobble##2#4% + }% + \kcmd@yargedef#3% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\kcmd@nargs}\qquad +% Filter macros used by \cs{kcmd@yargedef} to get the correct number of arguments: +% \begin{macrocode} +\def\kcmd@nargs#1{\edef\kcmd@nargs%##1##2##3##4##5##6##7##8##9% + {\ifnum#1>0{####1% + \ifnum#1>1}{####2% + \ifnum#1>2}{####3% + \ifnum#1>3}{####4% + \ifnum#1>4}{####5% + \ifnum#1>5}{####6% + \ifnum#1>6}{####7% + \ifnum#1>7}{####8% + \ifnum#1>8}{####9% + \fi\fi\fi\fi\fi\fi\fi\fi}\fi}% +}% +% \end{macrocode} +% \end{macro} +% +% \subsection{new key-commands} +% +% \begin{macro}{\newkeycommand}\qquad\qquad +% Here are the entry points: +% \begin{macrocode} +\newrobustcmd*\newkeycommand{\begingroup + \let\kcmd@gbl\@empty\kcmd@star@or@long\new@keycommand} +\newrobustcmd*\renewkeycommand{\begingroup + \let\kcmd@gbl\@empty\kcmd@star@or@long\renew@keycommand} +\newrobustcmd*\providekeycommand{\begingroup + \let\kcmd@gbl\@empty\kcmd@star@or@long\provide@keycommand} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\kcmd@star@or@long}~\par +% This is the adaptation of \LaTeX's \cs{@star@or@long} macro: +% \begin{macrocode} +\def\kcmd@star@or@long#1{\@ifstar + {\let\kcmd@long\@empty\kcmd@plus#1} + {\def\kcmd@long{\long}\kcmd@plus#1}} +\def\kcmd@@ifplus#1{\@ifnextchar +{\@firstoftwo{#1}}}% same as LaTeX's \@ifstar +\def\kcmd@plus#1{\kcmd@@ifplus + {\def\kcmd@ifplus{\iftrue}\kcmd@testopt#1} + {\def\kcmd@ifplus{\iffalse}\kcmd@testopt#1}} +\def\kcmd@testopt#1{\@testopt{\kcmd@unexpandchar#1}{}} +% \end{macrocode} +% \end{macro} +% +%\begin{macro}{\kcmd@unexpandchar}\qquad\qquad\quad +% Reads the possible unexpand-char shortcut: +% \begin{macrocode} +\def\kcmd@unexpandchar#1[#2]{% + \kcmd@ifplus + \kcmd@nbk#2// + {\def\kcmd@unexpandchar{#2}% only once inside group... + \def\kcmd@unexpandchar@activate{\catcode`#2 \active}% + }{% + \let\kcmd@unexpandchar\@empty + \let\kcmd@unexpandchar@activate\relax + }//% + \else \let\kcmd@unexpandchar\@empty + \kcmd@nbk#2//% + {\PackageError\kcmd@pkg@name{shortcut option for \string\unexpanded\MessageBreak + You can't use a shortcut option for \string\unexpanded\MessageBreak + without the \string+ form of \string\newkeycommand!}% + {I will ignore this option and proceed.}% + }% + {}//% + \fi#1} +% \end{macrocode} +%\end{macro} +% +% \begin{macro}{\new@keycommand}\qquad\qquad +% Reads the key-command name (cs-token): +% \begin{macrocode} +\def\new@keycommand#1{\@testopt{\@newkeycommand#1}0} +% \end{macrocode} +% \end{macro} +% +%\begin{macro}{\@newkeycommand}\qquad\qquad +% Reads the first optional parameter (keys or number of mandatory args): +% \begin{macrocode} +\long\def\@newkeycommand#1[#2]{% #2 = key=values or N=mandatory args + \kcmd@ifplus \kcmd@unexpandchar@activate \fi% activates unexpand-char before reading definition + \kcmd@ifstrdigit{#2}% + {\@new@key@command#1[][][{#2}]}% no kv, no optkey, number of args + {\@testopt{\@new@keycommand#1[{#2}]}0}}% kv, check for optkey/nr of args +% \end{macrocode} +% \end{macro} +% +%\begin{macro}{\@new@keycommand}\qquad\qquad +% Reads the second optional parameter (opt key or number of mandatory args): +% \begin{macrocode} +\long\def\@new@keycommand#1[#2][#3]{% + \kcmd@ifstrdigit{#3}% + {\@new@key@command#1[{#2}][][{#3}]}% no optkey + {\@testopt{\@new@key@command#1[{#2}][{#3}]}0}} +% \end{macrocode} +%\end{macro} +% +%\begin{macro}{\@new@key@command}\qquad\qquad +% Reads the definition of the command (\cs{kcmd@def} handles both cases of commands and environements). +% The so called "unexpand-char shortcut" has been activated before reading command definition: +% \begin{macrocode} +\long\def\@new@key@command#1[#2][#3][#4]#5{% + \kcmd@def#1\@gobble[{#2}][{#3}][{#4}]{#5}{}} +% \end{macrocode} +%\end{macro} +% +% \begin{macro}{\renew@keycommand} +% \begin{macrocode} +\def\renew@keycommand#1{\begingroup + \escapechar\m@ne\edef\@gtempa{{\string#1}}% + \expandafter\@ifundefined\@gtempa + {\endgroup\@latex@error{\noexpand#1undefined}\@ehc} + \endgroup + \let\@ifdefinable\@rc@ifdefinable + \new@keycommand#1% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\provide@keycommand} +% \begin{macrocode} +\def\provide@keycommand#1{\begingroup + \escapechar\m@ne\edef\@gtempa{{\string#1}}% + \expandafter\@ifundefined\@gtempa + {\endgroup\new@keycommand#1} + {\endgroup\def\kcmd@donot@provide{\renew@keycommand\kcmd@donot@provide + }\kcmd@donot@provide}% +} +\let\kcmd@donot@provide\@empty% it must not be undefined +% \end{macrocode} +% \end{macro} +% +% \subsection{new key-environments} +% +% \begin{macro}{\newkeyenvironment} +% \begin{macrocode} +\newrobustcmd*\newkeyenvironment{\begingroup + \let\kcmd@gbl\@empty\kcmd@star@or@long\new@keyenvironment} +\newrobustcmd\renewkeyenvironment{\begingroup + \let\kcmd@gbl\@empty\kcmd@star@or@long\renew@keyenvironment} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\new@keyenvironment} +% \begin{macrocode} +\def\new@keyenvironment#1{\@testopt{\@newkeyenva{#1}}{}} +\long\def\@newkeyenva#1[#2]{% + \kcmd@ifstrdigit{#2}% + {\@newkeyenv{#1}{[][][{#2}]}} + {\@testopt{\@newkeyenvb{#1}[{#2}]}{}}} +\long\def\@newkeyenvb#1[#2][#3]{% + \kcmd@ifstrdigit{#3}% + {\@newkeyenv{#1}{[{#2}][][{#3}]}} + {\@testopt{\@newkeyenvc{#1}{[{#2}][{#3}]}}0}} +\long\def\@newkeyenvc#1#2[#3]{\@newkeyenv{#1}{#2[{#3}]}} +\long\def\@newkeyenv#1#2{% + \kcmd@ifplus \kcmd@unexpandchar@activate \fi + \kcmd@keyenvir@def{#1}{#2}% +} +\long\def\kcmd@keyenvir@def#1#2#3#4{% + \expandafter\let\csname end#1\endcsname\relax + \expandafter\kcmd@def\csname #1\expandafter\endcsname\csname end#1\endcsname#2{#3}{#4}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\renew@keyenvironment} +% \begin{macrocode} +\def\renew@keyenvironment#1{% + \@ifundefined{#1}% + {\@latex@error{Environment #1 undefined}\@ehc + }\relax + \cslet{#1}\relax + \new@keyenvironment{#1}} +% \end{macrocode} +% \end{macro} +% \iffalse +% +% +% \fi +% +% \subsection{Tests on keys} +% +% \begin{macro}{\ifcommandkey}\qquad +% \{\meta{key-name}\}\{\meta{true}\}\{\meta{false}\}\quad expands \meta{true} only if the value of the key +% is not blank: +% \begin{macrocode} +\newcommand*\ifcommandkey[1]{\csname @\expandafter\expandafter\expandafter + \kcmd@nbk\commandkey{#1}//{first}{second}//% + oftwo\endcsname} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\showcommandkeys}\qquad\qquad are helper macros essentially for debuging purpose... +% \begin{macrocode} +\newrobustcmd*\showcommandkeys[1]{\let\do\showcommandkey\docsvlist{#1}} +\newrobustcmd*\showcommandkey[1]{key \string"#1\string" = % + \detokenize\expandafter\expandafter\expandafter{\commandkey{#1}}\par} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macrocode} +% +% \end{macrocode} +% +% \section{Examples} +% \label{sec:examples} +% +% \begin{macrocode} +%<*example> +\ProvidesFile{keycommand-example} +\documentclass[a4paper]{article} +\usepackage[T1]{fontenc} +\usepackage[latin1]{inputenc} +\usepackage[american]{babel} +\usepackage{keycommand,framed,fancyvrb} +% +\makeatletter +\parindent\z@ +\newkeycommand*\Rule[raise=.4ex,width=1em,thick=.4pt][1]{% + \rule[\commandkey{raise}]{\commandkey{width}}{\commandkey{thick}}% + #1% + \rule[\commandkey{raise}]{\commandkey{width}}{\commandkey{thick}}} + +\newkeycommand*\charleads[sep=1][2]{% + \ifhmode\else\leavevmode\fi\setbox\@tempboxa\hbox{#2}\@tempdima=1.584\wd\@tempboxa% + \cleaders\hb@xt@\commandkey{sep}\@tempdima{\hss\box\@tempboxa\hss}#1% + \setbox\@tempboxa\box\voidb@x} +\newcommand*\charfill[1][]{\charleads[{#1}]{\hfill\kern\z@}} +\newcommand*\charfil[1][]{\charleads[{#1}]{\hfil\kern\z@}} +% +\newkeyenvironment*{dblruled}[first=.4pt,second=.4pt,sep=1pt,left=\z@]{% + \def\FrameCommand{% + \vrule\@width\commandkey{first}% + \hskip\commandkey{sep} + \vrule\@width\commandkey{second}% + \hspace{\commandkey{left}}}% + \parindent\z@ + \MakeFramed {\advance\hsize-\width \FrameRestore}} + {\endMakeFramed} +% +\makeatother +\begin{document} +\title{This is {\tt keycommand-example.tex}} +\author{Florent Chervet} +\date{July 22, 2009} + +\maketitle + +{\Large Please refer to {\tt keycommand-example.tex} for definitions.} + +\section{Example of a keycommand : \texttt{\string\Rule}} + +\begin{tabular*}\textwidth{rl} +\verb+\Rule[width=2em]{hello}+:&\Rule[width=2em]{hello}\cr +\verb+\Rule[thick=1pt,width=2em]{hello}+:&\Rule[thick=1pt,width=2em]{hello}\cr +\verb+\Rule{hello}+:&\Rule{hello}\cr +\verb+\Rule[thick=1pt,raise=1ex]{hello}+:&\Rule[thick=1pt,raise=1ex]{hello} +\end{tabular*} + +\section{Example of a keycommand : \texttt{\string\charfill}} + +\begin{tabular*}\textwidth{rp{.4\textwidth}} +\verb+\charfill{$\star$}+: & \charfill{$\star$}\cr +\verb+\charfill[sep=2]{$\star$}+: & \charfill[sep=2]{$\star$} \\ +\verb+\charfill[sep=.7]{\textasteriskcentered}+: & \charfill[sep=.7]{\textasteriskcentered} +\end{tabular*} + + +\section{Example of a keyenvironment : \texttt{dblruled}} + +Key environment \texttt{dblruled } uses \texttt{framed.sty} and therefore it can be used +even if a pagebreak occurs inside the environment: +\medskip + +\verb+\begin{dblruled}+\par +\verb+ test for dblruled key-environment\par+\par +\verb+ test for dblruled key-environment\par+\par +\verb+ test for dblruled key-environment+\par +\verb+\end{dblruled}+ + +\begin{dblruled} + test for dblruled key-environment\par + test for dblruled key-environment\par + test for dblruled key-environment +\end{dblruled} + + +\verb+\begin{dblruled}[first=4pt,sep=2pt,second=.6pt,left=.2em]+\par +\verb+ test for dblruled key-environment\par+\par +\verb+ test for dblruled key-environment\par+\par +\verb+ test for dblruled key-environment+\par +\verb+\end{dblruled}+ + +\begin{dblruled}[first=4pt,sep=2pt,second=.6pt,left=.2em] + test for dblruled key-environment\par + test for dblruled key-environment\par + test for dblruled key-environment +\end{dblruled} + +\end{document} +% +% \end{macrocode} +% \DeleteShortVerb{\+}^^A\UndefineShortVerb{\+} +% \begin{History} +% +% \begin{Version}{2010/04/27 v3.1415} +% \item Key-environment can now be nested ! (it's not too late... I hope so) +% \item Keys and mandatory arguments as well can be used in both \texttt{begin} end \texttt{end} part of the environment. +% \end{Version} +% +% \begin{Version}{2010/04/25 v3.141} +% \item No new feature but a real improvement in optimization. \\ +% In particular, \thispackage does not load \xpackage{etextools} anymore. \\ +% \item Bug fix for \cs{providekeycommand}. +% +% \end{Version} +% +% \begin{Version}{2010/04/18 v3.14} +% \item Correction of bug in the normalization process. \\ +% Correction of a bug in \cs{ifcommandkey} (undesirable space...) +% \item Modification of the pdf documentation for the \stform+ form of key-environments. +% \end{Version} +% +% \begin{Version}{2010/03/28 v3.0} +% \item Complete redesign of the implementation. \\ +% \xpackage{keycommand} is now based on some macros of \xpackage{etoolbox}. +% +% \item Adding the + prefix and the ability to capture keys that where not defined. +% +% \end{Version} +% +% \begin{Version}{2009/07/22 v1.0} +% \item +% First version. +% \end{Version} +% +% \end{History} +% +% \begin{thebibliography}{9} +% +% \bibitem{xkeyval} +% Hendri Adriaens: +% \textit{The \xpackage{xkeyval} package}; +% 2008/08/13 v2.6a; +% \CTAN{macros/latex/contrib/xkeyval.dtx} +% +% \bibitem{kvsetkeys} +% Heiko Oberdiek: +% \textit{The \xpackage{kvsetkeys} package}; +% 2007/09/29 v1.3; +% \CTAN{macros/latex/contrib/oberdiek/kvsetkeys.dtx}. +% +% \bibitem{keyval} +% David Carlisle: +% \textit{The \xpackage{keyval} package}; +% 1999/03/16 v1.13; +% \CTAN{macros/latex/required/graphics/keyval.dtx}. +% +% \end{thebibliography} +% +% \PrintIndex +% +% \label{LastPage} +% \Finale \ No newline at end of file diff --git a/macros/latex/contrib/keycommand/keycommand.ins b/macros/latex/contrib/keycommand/keycommand.ins new file mode 100644 index 0000000000..107da0a5e4 --- /dev/null +++ b/macros/latex/contrib/keycommand/keycommand.ins @@ -0,0 +1,88 @@ +%% +%% This is file `keycommand.ins', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% keycommand.dtx (with options: `install') +%% +%% This is a generated file. +%% +%% keycommand : key-value interface for commands and environments in LaTeX [v3.1415 2010/04/27] +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.3 of this license or (at your option) any later +%% version. The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% +%% This work consists of the main source file keycommand.dtx +%% and the derived files +%% keycommand.sty, keycommand.pdf, keycommand.ins, +%% keycommand-example.tex +%% +%% keycommand : an easy way to define commands with optional keys +%% Copyright (C) 2009-2010 by Florent Chervet +%% +\input docstrip.tex +\Msg{************************************************************************} +\Msg{* Installation} +\Msg{* Package: keycommand 2010/04/27 v3.1415 key-value interface for commands and environments in LaTeX} +\Msg{************************************************************************} + +\keepsilent +\askforoverwritefalse + +\let\MetaPrefix\relax +\preamble + +This is a generated file. + +keycommand : key-value interface for commands and environments in LaTeX [v3.1415 2010/04/27] + +This work may be distributed and/or modified under the +conditions of the LaTeX Project Public License, either +version 1.3 of this license or (at your option) any later +version. The latest version of this license is in + http://www.latex-project.org/lppl.txt + +This work consists of the main source file keycommand.dtx +and the derived files + keycommand.sty, keycommand.pdf, keycommand.ins, + keycommand-example.tex + +keycommand : an easy way to define commands with optional keys +Copyright (C) 2009-2010 by Florent Chervet + +\endpreamble +\let\MetaPrefix\DoubleperCent + +\generate{% + \file{keycommand.ins}{\from{keycommand.dtx}{install}}% + \file{keycommand.sty}{\from{keycommand.dtx}{package}}% + \file{keycommand-example.tex}{\from{keycommand.dtx}{example}}% +} + +\generate{% + \file{keycommand.drv}{\from{keycommand.dtx}{driver}}% +} + +\obeyspaces +\Msg{************************************************************************} +\Msg{*} +\Msg{* To finish the installation you have to move the following} +\Msg{* file into a directory searched by TeX:} +\Msg{*} +\Msg{* keycommand.sty} +\Msg{*} +\Msg{* To produce the documentation run the file `keycommand.dtx'} +\Msg{* through LaTeX.} +\Msg{*} +\Msg{* Happy TeXing!} +\Msg{*} +\Msg{************************************************************************} + +\endbatchfile +\endinput +%% +%% End of file `keycommand.ins'. diff --git a/macros/latex/contrib/keycommand/keycommand.pdf b/macros/latex/contrib/keycommand/keycommand.pdf new file mode 100644 index 0000000000..1a0b6dfe6b Binary files /dev/null and b/macros/latex/contrib/keycommand/keycommand.pdf differ -- cgit v1.2.3