% \iffalse meta-comment % An Infrastructure for marking up Metadata in LaTeX documents % $URL: https://svn.kwarc.info/repos/stex/trunk/sty/metakeys/metakeys.dtx $ % $Rev: 1999 $; last modified by $Author: kohlhase $ % $Date: 2012-01-28 08:32:11 +0100 (Sat, 28 Jan 2012) $ % Copyright (c) 2009 Michael Kohlhase, all rights reserved % this file is released under the % LaTeX Project Public License (LPPL) % \fi % % \iffalse %<*package> \NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesPackage{metakeys}[2012/01/28 v0.9 Framework for Metadata Keys] % %<*driver> \documentclass{ltxdoc} \usepackage{stex-logo,url,array,float} \usepackage[show]{ed} \usepackage{../ctansvn} \usepackage[eso-foot,today]{svninfo} \usepackage[hyperref=auto,style=alphabetic]{biblatex} \bibliography{kwarc} \svnInfo $Id: metakeys.dtx 1999 2012-01-28 07:32:11Z kohlhase $ \svnKeyword $HeadURL: https://svn.kwarc.info/repos/stex/trunk/sty/metakeys/metakeys.dtx $ \usepackage{hyperref} %\makeindex \floatstyle{boxed} \newfloat{exfig}{thp}{lop} \floatname{exfig}{Example} \def\tracissue#1{\cite{sTeX:online}, \hyperlink{http://trac.kwarc.info/sTeX/ticket/#1}{issue #1}} \usepackage[showmeta]{metakeys} \begin{document}\DocInput{metakeys.dtx}\end{document} % % \fi % %\CheckSum{176} % % \changes{v0.1}{2009/12/14}{First version} % \changes{v0.8}{2010/06/18}{This is almost done} % \changes{v0.9}{2010/09/02}{make sure that showkeys is always initialized} % % \GetFileInfo{metakeys.sty} % % \MakeShortVerb{\|} % \def\scsys#1{{{\sc #1}}\index{#1@{\sc #1}}} % \def\latexml{\scsys{LaTeXML}} % \def\omdoc{OMDoc} % \def\omdocv#1{\omdoc{#1}} % % \title{{\texttt{metakeys.sty}}: A generic framework for extensible Metadata in {\LaTeX}\thanks{Version {\fileversion} (last revised % {\filedate})}} % \author{Michael Kohlhase\\ % Jacobs University, Bremen\\ % \url{http://kwarc.info/kohlhase}} % \maketitle % \begin{abstract} % The |metakeys| package is part of the {\sTeX} collection, a version of {\TeX/\LaTeX} that % allows to markup {\TeX/\LaTeX} documents semantically without leaving the document % format, essentially turning {\TeX/\LaTeX} into a document format for mathematical % knowledge management (MKM). % % This package supplies the infrastructure for extending {\sTeX} macros with {\omdoc} % metadata. This package is mainly intended for authors of {\sTeX} extension packages. % \end{abstract} % % \setcounter{tocdepth}{2}\tableofcontents\newpage % % \section{The User Interface}\label{sec:user} % % Many of the {\stex} macros and environments take an optional first argument which uses % key/value pairs to specify metadata relations of the marked up objects. The |metakeys| % package supplies the infrastructure managing these key/value pairs. It also forms the % basis for the |rdfmeta| package which allows to use these for flexible, user-extensible % metadata relations (see~\ctancite{Kohlhase:rdfmeta} for details). % % \subsection{Package Options}\label{sec:user:options} % % The |metakeys| package takes a single option: \DescribeMacro{showmeta}|showmeta|. If % this is set, then the metadata keys defined by the |\addmetakey| are shown % (see~\ref{sec:user:showmeta}) % % \subsection{Adding Metadata Keys to Commands}\label{sec:user:keys} % % Key/value pairs in \stex are organized in \textbf{key groups}: every {\stex} macro and % environment that takes a key/value argument has an associtated key group, and only keys % that are registered in this group can be utilized. The |metakeys| package supplies the % \DescribeMacro{\addmetakey}|\addmetakey| macro to add a new key to a key group: If % \meta{group} is the name of a key group \meta{key} is a metadata keyword name, then % \begin{quote} % |\addmetakey[|\meta{default}|]{|\meta{group}|}{|\meta{key}|}[|\meta{dval}|]| % \end{quote} % registers \meta{key} in the metadata group \meta{group}, with an optional values % \meta{default} and \meta{dval} for \meta{key}. The \meta{default} is the default value % for \meta{key}, if it is not specified, and \meta{dval} the value it gets, if \meta{key} % is given without specifying a value. These two defaults are often used as % \begin{quote} % |\addmetakey[false]{|\meta{group}|}{|\meta{key}|}[true]| % \end{quote} % Then, the value of \meta{key} is |false| if \meta{key} is not given and |true|, if % \meta{key} is specified without value. This is often the best way if we want to use % \meta{key} as an indicator to have a feature of name \meta{key} (we can test that with % |\ifx\|\meta{group}|@|\meta{key}|\@true|, if we prepared the macro |\def\@true{true}| % earlier). % % The keys registered for a metadata group can be used for defining macros with a % key/value arguments via the \DescribeMacro{\metasetkeys}|\metasetkeys| macro, see for % instance the the definition in Figure~\ref{fig:foo}. % % The \DescribeMacro{\addmetalistkey}|\addmetalistkey| macro is a variant of |\addmetakey| % that adds a list-valued metadata key. The |\addmetalistkey{foo}{val}| in % Figure~\ref{fig:foo} would allows to use multiple occurrences of teh |val| keys in the % metadata argument of |\foo|, the values of the |val| keys are collected as a % comma-separated list in the token register |\foo@vals|. Note that the |val| key can also % deal with comma-separated lists for convenience. % % With these definitions in a used package\footnote{\makeatletter Recall that the % \texttt{@} character is only allowed in packages, where comma-separated lists can be % iterated over e.g. by the \texttt{\textbackslash{@}for} macro.} an invocation of % \begin{quote} % |\foo[type=bar,id=f4711,val=4,val=7,val={1,1}]| % \end{quote} % is formatted to % \begin{quote} % \addmetakey{foo}{id}\addmetakey{foo}{type}\addmetalistkey{foo}{val}\makeatletter % \newcommand\foo[1][]{\metasetkeys{foo}{#1} I have seen a \emph{foo} of type \texttt{\foo@type} % with identifier \texttt{\foo@id} and values % \let\@join=\relax\def\@thejoin{, and } % \@for\@I:=\foo@vals\do{\@join\@I\let\@join=\@thejoin}!}\makeatother % \foo[type=bar,id=f4711,val=4,val=7,val=1,val=1] % \end{quote} % % \begin{exfig}[ht] % \begin{verbatim} % \addmetakey{foo}{id} % \addmetakey{foo}{type} % \addmetakey[yes]{foo}{visible} % \addmetalistkey{foo}{val} % \def\@yes{yes} % \newcommand\foo[1][]{\metasetkeys{foo}{#1} % \ifx\foo@visible\@yes % testing for visibility % I have seen a \emph{foo} of type \texttt{\foo@type} with identifier % \texttt\foo@id and values \texttt\foo@vals. % \let\@join=\relax\def\@thejoin{, and } % \@for\@I:=\foo@vals\do{\@join\@I\let\@join=\@thejoin}! % \fi} % \end{verbatim} % \vspace*{-2em} % \caption{Defining a macro with metadata} % \label{fig:foo} % \end{exfig} % % \subsection{Showing Metadata Keys/Values}\label{sec:user:showmeta} % % If the |showmeta| package option is set, the |metakeys| package sets an internal switch that % shows the values of all keys specified with the |\addmetakey| macro. The default behavior % is to write the key/value pairs into the margin as \meta{key}|:|\meta{value}. Package % designers can customize this behavior by redefining the |\metakeys@show@key| and % |\metakeys@show@keys| macro. % % \DescribeMacro{\metakeys@show@key}|\metakeys@show@key{|\meta{key}|}{|\meta{value}|}| shows the a % single key value pair, and % \DescribeMacro{\metakeys@show@keys}|\metakeys@show@keys{|\meta{group}|}{|\meta{keys}|}| shows the % a list of keys metadata, by default we disregard the \meta{group} and show \meta{keys} % in a marginpar. % % For keys that should not be shown in this manner, the |\addmetakey| macro has a variant % \DescribeMacro{\addmetakey*}|\addmetakey*|. Its behavior is exactly the same, only that % it keeps the key from being shown by the |showmeta| option. % % Note that setting the |showmeta| option will enable metadata presentation on the whole % document. But sometimes we want to disable that, e.g. inside figures, where |\marginpar| % is not allowed. Therefore the |metakeys| package provides the % \DescribeMacro{\hidemetakeys}|\hidemetakeys| macro that reverses this. The % \DescribeMacro{\showmetakeys}|\showmetakeys| macro re-enables metadata presentation. % % % \section{Limitations}\label{sec:limitations} % % In this section we document known limitations. If you want to help alleviate them, % please feel free to contact the package author. Some of them are currently discussed in % the \sTeX TRAC~\cite{sTeX:online}. % \begin{compactenum} % \item none reported yet % \end{compactenum} % % \StopEventually{\newpage\PrintChanges\printbibliography} % % \section{The Implementation}\label{sec:impl} % % The |metakeys| package generates two files: the {\LaTeX} package (all the code between % {\textsf{$\langle$*package$\rangle$}} and {\textsf{$\langle$/package$\rangle$}}) and the % {\latexml} bindings (between {\textsf{$\langle$*ltxml$\rangle$ and % $\langle$/ltxml$\rangle$}}). We keep the corresponding code fragments together, since % the documentation applies to both of them and to prevent them from getting out of sync. % % \subsection{Package Options}\label{sec:impl:options} % % We declare some switches which will modify the behavior according to the package % options. Generally, an option |xxx| will just set the appropriate switches to true % (otherwise they stay false). First we have the general options % \begin{macrocode} %<*package> \newif\ifmetakeys@showmeta\metakeys@showmetafalse \DeclareOption{showmeta}{\metakeys@showmetatrue} % \end{macrocode} % Finally, we need to declare the end of the option declaration section to {\LaTeX}. % \begin{macrocode} \ProcessOptions % \end{macrocode} % % We build on the |keyval| package which we first need to load. % \begin{macrocode} \RequirePackage{keyval}[1997/11/10] % % \end{macrocode} % % \subsection{Adding Metadata Keys}\label{sec:impl:keys} % % \begin{macro}{\addmetakey} % The |\addmetakey| macro looks at the next character and invokes helper macros accordingly. % \begin{macrocode} %<*package> \newcommand\addmetakey{\@ifstar\addmetakey@star\addmetakey@nostar} % % \end{macrocode} % \end{macro} % % \begin{macro}{\addmetakey@star} % |\addmetakey@star| takes care of the starred form of |\addmetakey|. An invocation of % |\addmetakey@star{|\meta{default}|}{|\meta{group}|}{|\meta{key}|}| macro first extends the % |\metakeys@clear@|\meta{group}|@keys| macro then defines the key \meta{key} with the % |\define@key| macro from the |keyval| package. This stores the key value given in the % local macro |\|\meta{group}|@|\meta{key}. % \begin{macrocode} %<*package> \newcommand\addmetakey@star[3][]% {\@ifnextchar[{\addmetakey@star@aux[#1]{#2}{#3}}{\addmetakey@star@aux[#1]{#2}{#3}[]}} \def\addmetakey@star@aux[#1]#2#3[#4]{\metakeys@ext@clear@keys{#2}{#3}{#1}% \metakeys@initialize@showkeys{#2}% \define@key{#2}{#3}[#4]{\expandafter\gdef\csname #2@#3\endcsname{##1}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\addmetakey@nostar} % |\addmetakey@nostar| takes care of the starred form of |\addmetakey| by first extending the % |\metakeys@|\meta{group}|@showkeys| macro which contains those keys that should be % shown and then calling |\addmetakey@star|. % \begin{macrocode} \newcommand\addmetakey@nostar[3][]% {\metakeys@ext@showkeys{#2}{#3}\addmetakey@star[#1]{#2}{#3}} % % \end{macrocode} % \end{macro} % % \begin{macro}{\metasetkeys} % The |\metasetkeys{|\meta{group}|}| clears/presets the key of \meta{group} via % |\clear@|\meta{group}|@clearkeys|, (if the |showmeta| option is set) shows them, and % then sets the keys via |keyval|s |\setkeys| command. % \begin{macrocode} %<*package> \newcommand\metasetkeys[2]{\@nameuse{clear@#1@keys}\setkeys{#1}{#2}% \ifmetakeys@showmeta% \edef\@@keys{\@nameuse{#1@showkeys}}% \metakeys@show@keys{#1}{\@for\@I:=\@@keys\do{\metakeys@show@keyval{#1}{\@I}}}% \fi} % % \end{macrocode} % \end{macro} % % \begin{macro}{\metakeys@ext@clear@keys} % |\metakeys@ext@clear@keys{|\meta{group}|}{|\meta{key}|}{|\meta{default}|}| extends (or % sets up if this is the first |\addmetakey| for \meta{group}) the % |\clear@|\meta{group}|@keys| macro to set the default value \meta{default} for % \meta{key}. The |\clear@|\meta{group}|@keys| macro is used in the generic % |\metasetkeys| macro below. The variant |\@metakeys@ext@clear@keys| is provided for % use in the |sref| package. % \begin{macrocode} %<*package> \newcommand\metakeys@ext@clear@keys[3]{\@metakeys@ext@clear@keys{#1}{#1@#2}{#3}} \newcommand\@metakeys@ext@clear@keys[3]{\@ifundefined{clear@#1@keys}% {\expandafter\gdef\csname clear@#1@keys\endcsname% {\expandafter\gdef\csname #2\endcsname{#3}}}% {\expandafter\g@addto@macro\csname clear@#1@keys\endcsname% {\expandafter\gdef\csname #2\endcsname{#3}}}} % % \end{macrocode} % \end{macro} % % \begin{macro}{\addmetalistkey} % \begin{macrocode} %<*package> \newcommand\addmetalistkey{\@ifstar\addmetalistkey@star\addmetalistkey@nostar} \newcommand\addmetalistkey@star[3][]{\metakeys@ext@clear@keys{#2}{#3}{#1}% \metakeys@initialize@showkeys{#2}% \expandafter\gdef\csname #2@#3s\endcsname{} \define@key{#2}{#3}[#1]{% \expandafter\ifx\csname #2@#3s\endcsname\@empty\expandafter\gdef\csname #2@#3s\endcsname{##1}% \else\expandafter\xdef\csname #2@#3s\endcsname{\csname #2@#3s\endcsname,##1}% \fi}} \newcommand\addmetalistkey@nostar[3][]% {\metakeys@ext@showkeys{#2}{#3}\addmetalistkey@star[#1]{#2}{#3}} % % \end{macrocode} % \end{macro} % % \subsection{Showing Metadata Keys/Values}\label{sec:impl:showmeta} % % \begin{macro}{\metakeys@initialize@showkeys} % |\metakeys@initialize@showkeys{|\meta{group}|}| sets up the |\|\meta{group}|@showkeys| % macro which is is used to store the keys to be shown of the metadata in in the generic % |\setmetakeys| macro below. % \begin{macrocode} %<*package> \newcommand\metakeys@initialize@showkeys[1]% {\@ifundefined{#1@showkeys}{\expandafter\def\csname #1@showkeys\endcsname{}}{}}% % \end{macrocode} % \end{macro} % % \begin{macro}{\metakeys@ext@showkeys} % |\metakeys@ext@showkeys{|\meta{group}|}{|\meta{key}|}| extends (or sets up) the % |\|\meta{group}|@showkeys| macro which is is used to store the keys to be shown of the % metadata in in the generic |\setmetakeys| macro below. % \begin{macrocode} \newcommand\metakeys@ext@showkeys[2]{\@ifundefined{#1@showkeys}% {\expandafter\def\csname #1@showkeys\endcsname{#2}}% {\expandafter\edef\csname #1@showkeys\endcsname{\csname #1@showkeys\endcsname,#2}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\metakeys@show@key} % |\metakeys@show@key{|\meta{key}|}{|\meta{value}|}| shows the a single key value pair, as a % default we just write \meta{key}|:|\meta{value}. % \begin{macrocode} \newcommand\@metakeys@show@key[2]{\metakeys@show@key{#2}{#1}} \newcommand\metakeys@show@key[2]{\edef\@test{#2}\ifx\@test\@empty\else #1:#2\quad\fi} % \end{macrocode} % \end{macro} % % \begin{macro}{\metakeys@show@keys} % |\metakeys@show@keys{|\meta{group}|}{|\meta{keys}|}| shows the metadata, by default we % disregard the \meta{group} and show \meta{keys} in a marginpar. % \begin{macrocode} \newcommand\metakeys@show@keys[2]{\marginpar{{\scriptsize #2}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\metakeys@show@keyval} % |\metakeys@show@keyval{|\meta{group}|}|{|\meta{key}|} shows the key/value pair of a given key \meta{key}. % \begin{macrocode} \newcommand\metakeys@show@keyval[2]% {\expandafter\@metakeys@show@key\csname #1@#2\endcsname{#2}} % % \end{macrocode} % \end{macro} % % \begin{macro}{\showmetakeys} % \begin{macrocode} %<*package> \newcommand\showmetakeys{\metakeys@showmetatrue} % %<*ltxml> DefConstructor('\showmetakeys',''); % % \end{macrocode} % \end{macro} % % \begin{macro}{\hidemetakeys} % \begin{macrocode} %<*package> \newcommand\hidemetakeys{\metakeys@showmetafalse} % %<*ltxml> DefConstructor('\hidemetakeys',''); % % \end{macrocode} % \end{macro} % % \subsection{Using better defaults than empty} % % \begin{macro}{\addmetakeynew} % |\addmetakeynew| is an experimental version of |\addmetakey| which gives % |\omd@unspecified| as an optional argument, so that it is used as the default value % here and then test for it in |\omfidus|. But unfortunately, this does not work yet. % \begin{macrocode} %<*package> \newcommand\addmetakeynew[3][]{\metakeys@ext@clear@keys{#2}{#3}{#1}% \define@key{#2}{#3}{\expandafter\gdef\csname #2@#3\endcsname{##1}}} % \end{macrocode} % \end{macro} % % % \begin{macro}{\metakeys@unspecified} % Ain internal macro for unspecified values. It is used to initialize keys.\ednote{MK: % we could probably embed an package error or warning in here} % \begin{macrocode} \newcommand\metakeys@unspecified{an metakeys-defined key left unspecified} % \end{macrocode} % \end{macro} % % \begin{macro}{\metakeysifus} % This just tests for equality of the first arg with |\metakeys@unspecified| % \begin{macrocode} \newcommand\metakeysifus[4]{\message{testing #1@#2=\csname#1@#2\endcsname}% \expandafter\ifx\csname #1@#2\endcsname\metakeys@unspecified{#3}\else{#4}\fi} % % \end{macrocode} % \end{macro} % % \subsection{Finale} % % Finally, we need to terminate the file with a success mark for perl. % \begin{macrocode} %1; % \end{macrocode} % \Finale \endinput % \iffalse %%% Local Variables: %%% mode: doctex %%% TeX-master: t %%% End: % \fi % LocalWords: iffalse kohlhase Thu metakeys metakeys.dtx scsys sc sc latexml omdoc foo % LocalWords: omdocv texttt fileversion maketitle setcounter tocdepth newpage % LocalWords: tableofcontents ednote showmeta % LocalWords: makeatletter newcommand emph makeatother exfig vspace impl ltxml % LocalWords: printbibliography keyval clearkeys expandafter gdef csname ifx % LocalWords: endcsname setkeys ifundefined omfidus metakeysifus addmetakey % LocalWords: doctex metasetkeys metasetkeys marginpar hidemetakeys textsf omd % LocalWords: hidemetakeys showmetakeys showmetakeys langle textsf langle % LocalWords: newif ifmetakeys showmetafalse showmetatrue ifstar showkeys % LocalWords: nameuse setmetakeys addmetakeynew