% \iffalse %<*header> %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% %% `svninfo' package to use with LaTeX2e. %% %% This package is used to extract the revision and file information provided %% by the Subversion revision control system. %% %% Copyright (C) 1995 Dr. Juergen Vollmer %% Copyright (C) 2003-2010 Achim D. Brucker %% %% License: %% This program can be redistributed and/or modified under the terms %% of the LaTeX Project Public License Distributed from CTAN %% archives in directory macros/latex/base/lppl.txt; either %% version 1 of the License, or any later version. %% %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %\iffalse % to test the checksum, uncomment \OnlyDescription % in the driver %\fi % %% \CheckSum{628} %% \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 \~} % %\fi % \DoNotIndex{\begin,\CodelineIndex,\CodelineNumbered,\def,\DisableCrossrefs} % \DoNotIndex{\DocInput,\documentclass,\EnableCrossrefs,\end,\GetFileInfo} % \DoNotIndex{\NeedsTeXFormat,\OnlyDescription,\RecordChanges,\usepackage} % \DoNotIndex{\ProvidesClass,\ProvidesPackage,\ProvidesFile,\RequirePackage} % \DoNotIndex{\LoadClass,\PassOptionsToClass,\PassOptionsToPackage} % \DoNotIndex{\DeclareOption,\CurrentOption,\ProcessOptions,\ExecuteOptions} % \DoNotIndex{\AtEndOfClass,\AtEndOfPackage,\AtBeginDocument,\AtEndDocument} % \DoNotIndex{\InputIfFileExists,\IfFileExists,\ClassError,\PackageError} % \DoNotIndex{\if,\else,\fi,\emph,\footnotesize,\footrulewidth,\let} % \DoNotIndex{\newcount,\newif,\number,\or,\parindent,\plainfootrulewidth} % \DoNotIndex{\PrintChanges,\PrintIndex,\relax,\setlength,\space} % \DoNotIndex{\the,\textwidth,\thepage,\newcommand,\texttt,\verb,\vfill} % \DoNotIndex{\input,\newpage,\setcounter,\newcounter,\\,\ ,\typeout,\today} % % \MakeShortVerb{\|} % \newcommand{\LatexToHtml}{\LaTeX 2\texttt{HTML}} % \def\param#1{\texttt{\##1}} % \newcommand{\Cmd}[1]{\texttt{$\backslash$#1}} % \newcommand{\Svn}{\emph{Subversion}} % \newcommand{\Svk}{\emph{svk}} % \newcommand{\blank}{{\tiny$_\sqcup$}} % \newcommand{\Id}{\texttt{\$Id\$}} % \newcommand{\SvnInfoCmd}[1]{\texttt{$\backslash$svnInfo\blank\$Id#1\$\blank}} % % \changes{v0.7.4}{2010/03/23}{Fixed localization of date formats, % e.g., \texttt{\\svnToday}.} % \changes{v0.7.3}{2008/08/09}{Fixed bug resulting in wrong date for maximal % revision} % \changes{v0.7.2}{2008/04/28}{Fixed documentation: the option for using % the \texttt{scrpage2} package is called \texttt{scrpage}. Fixed % support for \texttt{svk}.} % \changes{v0.7.1}{2007/04/27}{Fixed \texttt{\\svnMaxToday} and % introduced \texttt{\\svnInfoMaxToday} as an alternative % name. Improved documentation} % \changes{v0.7}{2007/03/26}{Added option \texttt{margin} for showing % version info in the margins of the document; added option % \texttt{svk} for supporting the keyword expansion of svk; added command % \texttt{\\svnMaxToday}; and fixed the use of \texttt{fancyhdr} for % single-sided documents.} % \changes{v0.6}{2006/05/11}{Added \texttt{\\svnInfoMinRevision} and % \texttt{\\svnInfoMaxRevision} together with the option % \texttt{revrange}. Also added support for \texttt{\textbackslash} in keywords.} % \changes{v0.5}{2006/01/11}{Removed support for \LatexToHtml{} (it is % non-free software and also seems to be unmaintained) and added new % command \texttt{\\svnKeyword} for defining arbitrary svn keywords % (e.g. \texttt{\string$Author:\string$}).} % \changes{v0.4}{2005/11/07}{Added new package options \texttt{draft}, \texttt{final}, % \texttt{eso-foot}, and \texttt{scrpage}. Fixed problem % with `\_' in file names.} % \changes{v0.3}{2005/09/30}{Added support for \texttt{\$Id:\$} keywords without % owner information.} % \changes{v0.2.1}{2005/04/07}{Added \texttt{\\svnId}.} % \changes{v0.2}{2005/01/17}{Removed \LatexToHtml{} build-dependency.} % \changes{v0.1}{2003/08/14}{Initial version, mainly a modified version % of the \texttt{rcsinfo} package.} % % \title{The \texttt{svninfo} package} % \author{Achim D.~Brucker\\ % {\footnotesize brucker@member.fsf.org}\\ % {\footnotesize http://www.brucker.ch/}} % \date{March 23, 2010\\Version 0.7.4} % % \maketitle % % \begin{abstract} % \noindent This package is used to extract the revision and file % information provided by the \Svn\ % (\texttt{http://subversion.tigris.org}) and the \Svk\ % (\texttt{http://svk.elixus.org}) revision control system. % \end{abstract} % %\section{Introduction} % % To maintain different versions of a document or to keep track on the % development of one, the document is kept under a revision control % system like \emph{SCCS}, \emph{CVS}, \Svn, or \Svk. This package % assumes you are using either the \Svn\ or the \Svk\ system. To % present the version information of a document, one needs to extract % it from somewhere. For example, \Svk\ and \Svn\ offer several keywords % that are expanded by the \Svn\ and \Svk\ \emph{update} % commands.\footnote{The expansion of keywords has to be enabled % manually, e.g., \texttt{svn propset svn:keywords "Id" % svninfo.dtx}.} The most informative keyword is |$Id: svninfo.dtx 4705 2010-03-23 19:57:29Z brucker $| which % contains a lot of useful information. This information is made % available through this package. Additionally, the package allows one % to extract also the information from the more specific keywords, % e.g., |$Author$| or |$Date$|. % % In this documentation we use \Svn\ in the examples; but the results % should be similar if you are using \Svk. Note that you have to use % the \texttt{svk} option if you use \Svk. % % Moreover, one has to set the \Svn\ property for keywords expansion of % that file, e.g., by executing: % \begin{verbatim} % svn propset svn:keywords "Id" svninfo.dtx % \end{verbatim} % Please consult the manual of \Svn\ (e.g., \emph{h}) or \Svk\ for further % details about keyword expansion. % % The information obtained from the expanded \Id\ string are % \begin{itemize} % \item the filename, % \item the revision number, % \item the date and time of the last \Svn\ \emph{co} command, and % \item name of the user who has done this action. % \end{itemize} % For each of these items a macro is defined. % When \emph{updating} a file, the \Svn\ keywords should be contained in % the \emph{updated} source. Further, one has to set the \Svn\ property % for keyword expansion of that file, e.g.\ % \begin{verbatim} % svn propset svn:keywords "Id" svninfo.dtx % \end{verbatim} % See the \Svn\ documentation for more details. % % If you want to read about the implementation, put a \% before % |\Only|\-|Description| in the code marked with |<*driver>| in the file % |svninfo.dtx|. % %\section{User Interface} % %\subsection{Options} % % Options for this package are: % \begin{description} % \item[svk] % Use \texttt{svk} for parsing the Id information generated by % \Svk. % \item[today] % Set the date of |\today| to the date obtained by the \Svn\ information. % If the \Id\ string is not expanded (see below), the current date is % used. % \item[notoday] % Don't use the \Svn\ date for |\today|. % \item[revrange] For multi-file documents, display minimum and % maximum revision. Every file of the document must either % include a |\svnInfo| or a |\svnKeyword $Revision:$| statement. % This is information needs two runs of \LaTeX{} to be correct. % \item[fancyhdr] % We use the \texttt{fancyhdr} package to fill the footline with % \Svn\ information: filename, revision-number and date. % % If the \texttt{fancyhdr} package is not already loaded, it will be % loaded % by this package. To use the footnotes, put something like:\\ % \hspace*{1em}|\pagestyle{fancyplain}|\\ % \hspace*{1em}|\fancyhead[RE,LO]{\leftmark}|\\ % \hspace*{1em}|\fancyhead[LE,RO]{\thepage}|\\ % in the preamble. % \item[nofancy] % We don't define the footline. The % \texttt{fancyhdr} package is not loaded. % \item[scrpage] % Use \texttt{scrpage2} instead of \texttt{fancyhdr}. % \item[eso-foot] % Use \texttt{eso-pic} for showing a tiny info line at the bottom % line of the paper. % \item[margin] Use \texttt{margin} for showing the version info in % the margin area. % \item[long] % If used together with \texttt{fancy} / \texttt{fancyhdr} the date % string is printed in the long format % as |\today| returns it. If \texttt{fancy} / \texttt{fancyhdr} % is not used, nothing. % \item[short] % If used together with \texttt{fancy} / \texttt{fancyhdr} the date % string is printed in the short % format \emph{YYYY-MM-DD}. % If \texttt{fancy} / \texttt{fancyhdr} is not used, nothing. % \item[final] Don't define the footline. If you want the \Svn\ in the % final document, please use\\ % \verb|\usepackage{draft}| % \item[draft] If \texttt{nofancy} is not used, show a footline with \Svn\ information. % \end{description} % If the \texttt{babel} package is used, the |\svnToday| string is language % dependent. % % The default options are: \emph{draft,today,long}. You may also % configure the default fancy heading packages in the configuration % file |svninfo.cfg|. % %\subsection{Commands} % % \subsubsection{Defining the \Svn\ Id information} % % There is only one macro to define the information: % |\svnInfo|\DescribeMacro{\svnInfo}. Since it must collaborate with % \Svn\ it has an ``unusual'' calling sequence: The arguments are % prefaced with a `\$' and completed with a `\$\blank' (note the final % space or carriage return). % The following arguments are valid:\\ % \hspace*{0.5em} \SvnInfoCmd{}\\ % \hspace*{0.5em} \SvnInfoCmd{:}\\ % \hspace*{0.5em} % \SvnInfoCmd{:\blank\emph{file}\blank\emph{rev}\blank\emph{YYYY-MM-DD}\blank\emph{hh:mm:ss}\blank\emph{owner}\blank} % % In the first two forms, \Svn\ has not expanded the \Id\ string. % This form will usually be used before the file is \emph{checked in} % the first time. % % \emph{YYYY-MM-DD} is a date, \emph{hh:mm:ss} a time. % Note: when you perform the \Svn\ \emph{check out} command, the \Id\ string % is expanded by \Svn\ automatically. % % To take effect, |\svnInfo| must follow the |\begin{document}|. % If you are using multiple files for a document, you could place % |\svnInfo| at the % beginning of each file, so the information from the current file is % obtained. % % \subsubsection{Accessing the \Svn\ Id information} % There are the following macros to access the information provided by \Svn. % If \Svn\ has not expanded the \Id\ string, or no |\svnInfo| command is given, % default values are returned. % % \begin{itemize} % \item \DescribeMacro{\svnInfoFile} The name of the source file. % Default: \texttt{--sourcefile--}. % \item \DescribeMacro{\svnInfoRevision} The revision number, of the % \emph{checked out} file. % Default: \texttt{--revision--}. % \item \DescribeMacro{\svnInfoMinRevision} The minimum revision % number of multi-file documents. Every file of the document must either % include a |\svnInfo| or a |\svnKeyword $Revision:$| statement. % This is information needs two runs of \LaTeX{} to be correct. % Default: \texttt{--minrevision--}. % \item \DescribeMacro{\svnInfoMaxRevision} The maximum revision % number of multi-file documents. Every file of the document must either % include a |\svnInfo| or a |\svnKeyword $Revision:$| statement. % This is information needs two runs of \LaTeX{} to be correct. % Default: \texttt{--maxrevision--}. % \item \DescribeMacro{\svnInfoDate} The date in the form \emph{YYYY-MM-DD}, % when the file was \emph{checked out}. % Default: the current date. % \item \DescribeMacro{\svnInfoTime} The time, when the file was % \emph{checked out}. % Default: \texttt{--time--}. % \item \DescribeMacro{\svnInfoOwner} The user name of the file owner. % Default: \texttt{--owner--}. % \item \DescribeMacro{\svnInfoYear} The year \emph{YYYY} of |\svnInfoDate|. % Default: the current year. % \item \DescribeMacro{\svnInfoMonth} The month \emph{MM} of |\svnInfoDate|. % Default: the current month. % \item \DescribeMacro{\svnInfoDay} The day \emph{DD} of |\svnInfoDate|. % Default: the current day. % \item \DescribeMacro{\svnInfoLongDate} The date in the form of |\today| % when the file was \emph{checked out}. This is language depended. % Default: the current date. % \item \DescribeMacro{\svnId} Mimics the behavior of the \Id\ strings, i.e.\ it % prints a string with a summary of the above described % information. % \item \DescribeMacro{\svnToday} The date obtained from the \Svn\ information % in the format |\today| is using. % \item \DescribeMacro{\svnInfoMaxToday} The date obtained from the latest % \Svn\ revision in the format |\today| is using. % \end{itemize} % \section{Examples} % % \newcommand{\svnExample}{ % \begin{tabular}[t]{rl} % \Cmd{svnInfoFile} & \svnInfoFile \\ % \Cmd{svnInfoRevision} & \svnInfoRevision \\ % \Cmd{svnInfoMinRevision} & \svnInfoMinRevision \\ % \Cmd{svnInfoMaxRevision} & \svnInfoMaxRevision \\ % \Cmd{svnInfoDate} & \svnInfoDate \\ % \Cmd{svnInfoTime} & \svnInfoTime \\ % \Cmd{svnInfoOwner} & \svnInfoOwner \\ % \end{tabular} % \begin{tabular}[t]{rl} % \Cmd{svnInfoYear} & \svnInfoYear \\ % \Cmd{svnInfoMonth} & \svnInfoMonth \\ % \Cmd{svnInfoDay} & \svnInfoDay \\ % \Cmd{svnInfoLongDate} & \svnInfoLongDate \\ % \Cmd{svnToday} & \svnToday \\ % \Cmd{svnInfoMaxYear} & \svnInfoMaxYear \\ % \Cmd{svnInfoMaxDay} & \svnInfoMaxDay \\ % \Cmd{svnInfoMaxMonth} & \svnInfoMaxMonth \\ % \Cmd{svnInfoMaxToday} & \svnInfoMaxToday \\ % \end{tabular}\\ % \Cmd{svnId} \svnId % \bigskip %} % % \svnInfo $Id: svninfo.dtx 4705 2010-03-23 19:57:29Z brucker $ % |\svnInfo| not expanded, no colon\\ % \verb+\svnInfo $+\verb+Id$+\\ % \svnExample % % \svnInfo $Id: svninfo.dtx 4705 2010-03-23 19:57:29Z brucker $ % |\svnInfo| not expanded, having colon\\ % \verb+\svnInfo $+\verb+Id:$+\\ % \svnExample % % \svnInfo $Id: svninfo.dtx 4705 2010-03-23 19:57:29Z brucker $ % |\svnInfo| standard version\\ % {\small\verb+\svnInfo $Id: svninfo.dtx 4705 2010-03-23 19:57:29Z brucker $+}\\ % \svnExample % % \svnInfo $Id: svninfo.dtx 4705 2010-03-23 19:57:29Z brucker $ % |\svnInfo| standard version without owner\\ % {\small\verb+\svnInfo $Id: svninfo.dtx 4705 2010-03-23 19:57:29Z brucker $+}\\ % \svnExample % % \svnInfo $Id: svninfo.dtx 4705 2010-03-23 19:57:29Z brucker $ % |\svnInfo| standard version with \\ in the owner \\ % {\small\verb+\svnInfo $Id: svninfo.dtx 4705 2010-03-23 19:57:29Z brucker $+}\\ % \svnExample % % \svnInfo Id: svninfo.dtx 12 2002-04-19 12:27:55 brucker $ % |\svnInfo| no leading \$\\ % {\footnotesize\verb+\svnInfo Id: svninfo.dtx 12 2002-04-19 12:27:55 brucker $+}\\ % \svnExample % % \section{The generic \Svn\ keyword interface} % In addition to the already presented |\svnInfo| macro which is % specially built for analyzing the \Svn\ |$Id: svninfo.dtx 4705 2010-03-23 19:57:29Z brucker $| information we also % provide a generic interface via % |\svnKeyword|\DescribeMacro{\svnKeyword}. This interface can % be used to extract information from the remaining keywords: % \begin{itemize} % \item |$Date$|: The date of the last commit with changes. This % information can also be accessed using the keyword % |$LastChangedDate$|. % \item |$Revision$|: The revision of the last commit with % changes. This information can also be accessed using the keyword % |$LastChangedRevision$| or |$Rev$|. % \item |$Author$|: The author of the last commit with changes. This % information can also be accessed using the keyword % |$LastChangeBy$|. % \item |$HeadURL$|: The the full URL to the latest version of the % file in the repository. This information can also be accessed % using the keyword |$URL$|. % \end{itemize} % These keywords can be accessed using the |\svnKeyword| % macro. This macro accepts a single argument that should be of the % form |$|\meta{Keyword}|$| (unexpanded) or % |$|\meta{Keyword}:\blank\meta{value}\blank|$| (expanded), e.g.: % \begin{verbatim} % \svnKeyword $Author: brucker $ % \end{verbatim} % The |\svnKeyword| updates the corresponding \Svn\ Id % information, e.g., our example updates |\svnInfoOwner|. In more % detail: % \begin{itemize} % \item |\svnKeyword $Date:$| updates the date and time % information, e.g., |\svnInfoDate|\DescribeMacro{\svnInfoDate}, % |\svnInfoMonth|\DescribeMacro{\svnInfoMonth}, or % |\svnInfoTime|\DescribeMacro{\svnInfoTime}. % \item |\svnKeyword $Revision:$| updates % |\svnInfoRevision|\DescribeMacro{\svnInfoRevision}. % \item |\svnKeyword $Author:$| updates % |\svnInfoOwner|\DescribeMacro{\svnInfoOwner}. % \item |\svnKeyword $HeadURL:$| updates % |\svnInfoHeadURL|\DescribeMacro{\svnInfoHeadURL}. % \end{itemize} % % Note, the parser used by |\svnKeyword| is not that powerful than % the one used by |\svnInfo|. Thus it is advisable to use % |\svnKeywordId| for the |$Id: svninfo.dtx 4705 2010-03-23 19:57:29Z brucker $| keyword and |\svnKeyword| % only for the keywords described in this section. % % Further, the |\svnKeyword| macro does not reset all keyword % definitions globally, i.e., you can combine the |$Revision$| % of one file, with the |$Author$| of another file. Please take % care of that! % % \section{Acknowledgments} % %%%%%%%%%%%%%%%%%%%%%%%%% % This package is based on \texttt{rcsinfo} from Dr.~J{\"u}rgen % Vollmer. The \texttt{rcsinfo} package is distributed via the CTAN % archives ('\texttt{macros/latex/contrib/rcsinfo}'). % % The code for parsing generic \Svn{} keywords was taken from the % \texttt{svn} packages written by Richard Lewis. The \texttt{svn} % package is distributed via the CTAN archives % ('\texttt{macros/latex/contrib/svn}'). % % Further I want to thank all the people that reported bugs and ideas % for improvements, often including patches: Andreas Haller, Benjamin % Hiller, Christophe Jacquet, Dries Kimpe, Jami Lawrence, Henning % Lenz, Stefan Mann, Nigel Metheringham, Igor Nikolic, Michael % Niedermair, Heiko Oberdiek, Oliver Pons, Bernd Raichle, Krzysztof % Retel, J\"org, Sommer, Arnout Standaert, Daniel Tr\"umper, Thomas % Weber, and Uwe Ziegenhagen. % % \section{Copyright and License} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % \begin{tabular}{ll} % Copyright (\copyright) 1995 & Dr. J{\"u}rgen Vollmer\\ % Copyright (\copyright) 2003--2010 & Achim D.~Brucker \texttt{brucker@member.fsf.org}\\ % \end{tabular} % % \noindent This program can be redistributed and/or modified under % the terms of the \LaTeX{} Project Public License Distributed from % CTAN archives in directory '\texttt{macros/latex/base/lppl.txt}'; % either version 1 of the License, or any later version. % % \StopEventually{} % % \section{The Documentation Driver File} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % The next bit of code contains the documentation driver file for % \TeX\, i.e., the file that will produce the documentation you are % currently reading. It will be extracted from this file by the % \texttt{docstrip} program. % % If you want to read about the implementation, put a \% before % |\OnlyDescription| in the following code. % \begin{macrocode} %<*driver> \documentclass{article} \usepackage{doc} \usepackage[nofancy]{svninfo} \OnlyDescription \makeatletter \if@svnInfoUseFancyhdr@ \pagestyle{fancyplain} \if@twoside \fancyhead[RE,LO]{\leftmark} \fancyhead[LE,RO]{\thepage} \else \fancyhead[R]{\leftmark} \fancyhead[L]{\thepage} \fi \fi \makeatother \RecordChanges \EnableCrossrefs \CodelineIndex \begin{document} \DocInput{svninfo.dtx} \PrintChanges \setcounter{IndexColumns}{2} \PrintIndex \end{document} % % \end{macrocode} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % \section{The Configuration File} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % You can set up the default fancy headings package in the file % |svninfo.cfg|. % Use the |fancyhdr| package, by setting the default option: |fancyhdr|. % \begin{macrocode} %<*config> \ExecuteOptions{fancyhdr} % % \end{macrocode} % % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % \section{The Implementation} % %%%%%%%%%%%%%%%%%%%%%%%%%%%% % % The implementation is based on cracking the \Id\ string. % % What do we need, and who we are: % \begin{macrocode} %<*package> \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{svninfo}[2010/03/22 v0.7.4] % \end{macrocode} % % Declare some local counters to store the \Svn\ date % \begin{macrocode} \newcount\@svnInfoDay \newcount\@svnInfoMonth \newcount\@svnInfoYear % \end{macrocode} % % To memorize, that we want to set |\svnToday| to the date obtained by the % \Svn\ information. % \begin{macrocode} \newif\if@svnInfoToday@ % \end{macrocode} % % |\svnToday| should return the date obtained by the \Svn\ information. % \begin{macrocode} \DeclareOption{today}{ \@svnInfoToday@true } % \end{macrocode} % % Ok we don't want do use it. % \begin{macrocode} \DeclareOption{notoday}{ \@svnInfoToday@false } % \end{macrocode} % To memorize if we should show ranges of revision (for multiple-file % documents): % \begin{macrocode} \newif\if@svnInfoRevRange@ \@svnInfoRevRange@false % \end{macrocode} % \begin{macrocode} \DeclareOption{revrange}{ \@svnInfoRevRange@true } % \end{macrocode} % \begin{macrocode} % To memorize if we are in final or draft mode: % \begin{macrocode} \newif\if@svnInfoDraft@ % \end{macrocode} % \begin{macrocode} \DeclareOption{final}{ \@svnInfoDraft@false } \DeclareOption{draft}{ \@svnInfoDraft@true } % \end{macrocode} % % To memorize, that we want to have the old \texttt{fancyheadings}, the new % \texttt{fancyhdr}, \texttt{srcpage2}, \texttt{eso-pic}, or \texttt{margin}. % footline filled with \Svn\ information. % \begin{macrocode} \newif\if@svnInfoNotPreamble@% \@svnInfoNotPreamble@false% \newif\if@svnInfoUseFancy@ \newif\if@svnInfoUseFancyhdr@ \newif\if@svnInfoUseScrpage@ \newif\if@svnInfoUseEsofoot@ \newif\if@svnInfoUseMargin@ \newif\if@svnInfoSVK@ % \end{macrocode} % % We want to use the \texttt{fancyhdr} % package, and set the footline with the \Svn\ information. % Only one option may be in effect. % \begin{macrocode} \DeclareOption{fancy}{ \@svnInfoUseFancy@true \@svnInfoUseFancyhdr@false \@svnInfoUseScrpage@false \@svnInfoUseEsofoot@false } \DeclareOption{fancyhdr}{ \@svnInfoUseFancy@false \@svnInfoUseFancyhdr@true \@svnInfoUseScrpage@false \@svnInfoUseEsofoot@false } \DeclareOption{scrpage}{ \@svnInfoUseFancy@false \@svnInfoUseFancyhdr@false \@svnInfoUseScrpage@true \@svnInfoUseEsofoot@false } \DeclareOption{eso-foot}{ \@svnInfoUseFancy@false \@svnInfoUseFancyhdr@false \@svnInfoUseScrpage@false \@svnInfoUseEsofoot@true } \DeclareOption{margin}{ \@svnInfoUseMargin@true } \DeclareOption{svk}{ \@svnInfoSVK@true } % \end{macrocode} % % Ok we don't want do use it. % \begin{macrocode} \DeclareOption{nofancy}{ \@svnInfoUseFancy@false \@svnInfoUseFancyhdr@false \@svnInfoUseScrpage@false \@svnInfoUseEsofoot@false } % \end{macrocode} % % To memorize, that we want to use the long date format. % \begin{macrocode} \newif\if@svnInfoLong@ % \end{macrocode} % % We want to use the long date format. % \begin{macrocode} \DeclareOption{long}{ \@svnInfoLong@true } % \end{macrocode} % % Ok we don't want do use it. % \begin{macrocode} \DeclareOption{short}{ \@svnInfoLong@false } % \end{macrocode} % % Use these default options, % \begin{macrocode} \ExecuteOptions{draft,today,long} % \end{macrocode} % % read the configuration file, to set the default fancy headings package, % \begin{macrocode} \IfFileExists{svninfo.cfg}{\input{svninfo.cfg}}{} % \end{macrocode} % % and the process the user options. % \begin{macrocode} \ProcessOptions*\relax % \end{macrocode} % Load packages for page headers of footers if necessary. % \begin{macrocode} \if@svnInfoDraft@ \if@svnInfoUseFancy@ \RequirePackage{fancyheadings} \fi \if@svnInfoUseFancyhdr@ \RequirePackage{fancyhdr} \fi \if@svnInfoUseScrpage@ \RequirePackage{scrpage2} \fi \if@svnInfoUseEsofoot@ \RequirePackage{eso-pic} \fi \fi % \end{macrocode} % % \begin{macrocode} \RequirePackage{ifthen} % \end{macrocode} % % If no language for the |babel| package is given in the document, % we have to redefine |\svnToday| (otherwise the changed |\year|, |\month| and % |\day| won't work). In this case use the English version of |\svnToday|. % \begin{macrocode} \def\svnToday{\@svnInfoToday} %ifcase\month\or % January\or February\or March\or April\or May\or June\or % July\or August\or September\or October\or November\or December\fi % \space\number\day, \number\year} % \end{macrocode} % % We have a problem, since the number of arguments of |\svnInfo| vary from % zero to five. % To deal with that, we use some kind ``continuation passing'' style of % programming. % |\@svnInfoNext| contains the action to be done next. % %\begin{macro}{\svnInfo} % Extract the \Svn\ information, and give commands shown above their values. % Check the catcode of |:| and set the flag. The restoration is done after the % |:| has been read. Allow \_ (underscore) in file names, hence change the % |\catcode| of it. % \begin{macrocode} % % Whenever reading another portion of the SVN/RCS info, % expand \@svnBeginRead before calling the reading macro % and call \@svnEndRead as first thing inside the reading macro. \def\@svnBeginRead{\begingroup \catcode`\_=13 % \catcode`:=12 % \catcode`\\=12 % } \def\@svnEndRead{\endgroup } \def\svnInfo {\@svnBeginRead \@svnInfoReadArgs } % \end{macrocode} %\end{macro} %\begin{macro}{\@svnInfoReadArgs} % First check, if the \Id\ string is not-expanded. % Set the default values, so that for not expanded \Id\ strings, we get them. % The \$ before |Id| may be omitted (I use this to avoid expansion of % \$Id-Tags to be expanded by SVN in some cases). % Restore the catcode of the |:|. % \begin{macrocode} \def\@svnInfoReadArgs #1Id#2 {\@svnEndRead \@svnInfoDefaults \if $#2 \expandafter\@svnInfoEat \else \@svnBeginRead \expandafter\@svnInfoEatColon \fi $Id#2 % } % \end{macrocode} %\end{macro} %\begin{macro}{\@svnInfoEat} % This macro eats up its argument, i.e.\ removes it from the input. % Reset the |\catcode| of the underscore. % \begin{macrocode} \def\@svnInfoEat #1 {} % \end{macrocode} %\end{macro} %\begin{macro}{\@svnInfoEatColon} % This macro eats up the colon following \texttt{Id}. % The colon may be followed by a \$, which means that the \Id\ string is not % expanded. % \begin{macrocode} \def\@svnInfoEatColon $Id:#1 {\@svnEndRead \if $#1 \expandafter\@svnInfoEat \else \@svnBeginRead \expandafter\@svnInfoCrackAndEat \fi #1 % } % \end{macrocode} %\end{macro} %\begin{macro}{\@svnInfoCrackAndEat} % Take an expanded \Id\ string pass it to the crack routine % |\@svnInfoCrack|\-|String|, which specifies what has to be done % after it. We have already eaten the \$. % Note: here we don't give an argument to |\@svnInfoNext|, since it is taken % form the source, in case of |\@svnInfoEat|. % We have to take the next 7 tokens. % Note, first argument (\verb|#1|) contains only spaces. % \begin{macrocode} \def\@svnInfoCrackAndEat #1 #2 #3 #4 #5 #6 {\@svnEndRead \@svnInfoCrackString #2 #3 #4 #5 #6 % } % \end{macrocode} %\end{macro} %\begin{macro}{\@svnInfoCrackString} % Take an expanded \Id\ string and crack it:\\ % \#1: filename, \#2 revision, \#3 date, \#4 time, \#5 owner\\ % Hence we have to consume the terminating \$ afterwards. Reset % the |\catcode| of the underscore. % % If the document checked into the repository without authentication, % the owner may be empty. In that case the argument \#5 is \$ and % we already consumed the terminating \$. % % Split the date into year,month and day. % If the option \texttt{today} is given, |\svnToday| returns from now % on the \Svn\ date. % % \begin{macrocode} \def\@svnInfoCrackString #1 #2 #3 #4 #5 {% \def\svnInfoFile{#1}% \def\svnInfoRevision{#2}% \def\svnInfoTime{#4}% % \@svnInfoSplitDate x#3r#2x% \@svnInfoMargin% \def\svnInfoLongDate{\@svnInfoToday}% % \if@svnInfoToday@ \year =\@svnInfoYear \month =\@svnInfoMonth \day =\@svnInfoDay \fi \ifthenelse{\(\equal{\svnInfoMaxRevision}{--maxrevision--}\) % \OR \( \svnInfoMaxRevision < #2 \)}{% \def\svnInfoMaxRevision{#2}% }{}% \ifthenelse{\(\equal{\svnInfoMinRevision}{--minrevision--}\) % \OR \( #2 < \svnInfoMinRevision \)}{\def\svnInfoMinRevision{#2}}{}% \if $#5 \def\svnInfoOwner{}%$% \def\svnId{#1\ #2\ #3\ #4}% \else \def\svnInfoOwner{#5}% \def\svnId{#1\ #2\ #3\ #4\ #5}% \expandafter\@svnInfoEat \fi } % \end{macrocode} %\end{macro} % %\begin{macro}{\@svnInfoSplitDate} % This macro sets |\svnInfoYear|, |\svnInfoMonth|, and |\svnInfoDay|. % It takes a \texttt{x}\emph{YYYY-MM-DD}\texttt{x} style of argument. % \begin{macrocode} \if@svnInfoSVK@ \def\@svnInfoSplitDate x#1-#2-#3T#4Zr#5x{% \@svnInfoDay =#3\relax \@svnInfoMonth=#2\relax \@svnInfoYear =#1\relax \ifthenelse{\(\equal{\svnInfoMaxRevision}{--maxrevision--}\) \OR \( \svnInfoMaxRevision < #5 \)}{% \def\svnInfoMaxYear{#1}% \def\svnInfoMaxMonth{#2}% \def\svnInfoMaxDay{#3}% }{}% } \else% \def\@svnInfoSplitDate x#1-#2-#3r#4x{% \@svnInfoDay =#3\relax \@svnInfoMonth=#2\relax \@svnInfoYear =#1\relax \ifthenelse{\(\equal{\svnInfoMaxRevision}{--maxrevision--}\) \OR \( \svnInfoMaxRevision < #4 \)}{% \def\svnInfoMaxYear{#1}% \def\svnInfoMaxMonth{#2}% \def\svnInfoMaxDay{#3}% }{}% } \fi% % \end{macrocode} %\end{macro} % %\begin{macro}{\@svnInfoToday} % Returns the \Svn\ date in the form as |\today| does it. % To do this, we set |\year|, |\month| and |\day| commands to the % corresponding \Svn\ information, let |\svnToday| does its work, i.e.\ % transforming the date into a language dependent string and reset % |\year|, |\month| and |\day| to their previous value. % % \begin{macrocode} \def\@svnInfoToday {% \begingroup \year =\@svnInfoYear \month =\@svnInfoMonth \day =\@svnInfoDay \today \endgroup } \def\@svnInfoMaxToday {% \begingroup \year =\svnInfoMaxYear \month =\svnInfoMaxMonth \day =\svnInfoMaxDay \today \endgroup } % \end{macrocode} %\end{macro} % %\begin{macro}{\@svnInfoDefaults} % This macro sets the default values. % \begin{macrocode} \def\@svnInfoDefaults {% \@svnInfoYear =\year \@svnInfoMonth =\month \@svnInfoDay =\day \ifthenelse{\isundefined{\svnInfoMaxYear}}{\def\svnInfoMaxYear{\the\year}}{} \ifthenelse{\isundefined{\svnInfoMaxMonth}}{\def\svnInfoMaxMonth{\the\month}}{} \ifthenelse{\isundefined{\svnInfoMaxDay}}{\def\svnInfoMaxDay{\the\day}}{} \def\svnInfoFile{--sourcefile--}% \def\svnInfoHeadURL{--head-url--}% \def\svnInfoDate{\the\@svnInfoYear-\two@digits\@svnInfoMonth-% \two@digits\@svnInfoDay}% \def\svnInfoTime{--time--}% \def\svnInfoRevision{--revision--}% \ifthenelse{\isundefined{\svnInfoMinRevision}}{\def\svnInfoMinRevision{--minrevision--}}{}% \ifthenelse{\isundefined{\svnInfoMaxRevision}}{\def\svnInfoMaxRevision{--maxrevision--}}{}% \def\svnInfoOwner{--owner--}% \def\svnInfoYear{\the\@svnInfoYear}% \def\svnInfoMonth{\the\@svnInfoMonth}% \def\svnInfoDay{\the\@svnInfoDay}% \def\svnInfoLongDate{\@svnInfoToday}% \def\svnInfoMaxToday{\@svnInfoMaxToday}% \def\svnMaxToday{\@svnInfoMaxToday}% \def\svnId{\svnInfoFile\ \svnInfoRevision\ \svnInfoTime\ \svnInfoOwner}% } % \end{macrocode} %\end{macro} % %\begin{macro}{\@svnInfoFancyFoot} % This defines the contents of the footline % \begin{macrocode} \def\@svnInfoFancyFoot {% \if@svnInfoRevRange@ \def\@svnInfoRevisionRange{{ (\svnInfoMinRevision : \svnInfoMaxRevision)}}% \else \def\@svnInfoRevisionRange{\relax}% \fi \if@svnInfoLong@ \def\@svnInfoFancyInfo{{\footnotesize \emph{Rev: \svnInfoRevision\@svnInfoRevisionRange, % \svnInfoLongDate}}}% \else \def\@svnInfoFancyInfo{{\footnotesize \emph{Rev: \svnInfoRevision\@svnInfoRevisionRange, % \svnInfoDate}}}% \fi \def\@svnInfoFancyFile{{\footnotesize\emph{\svnInfoFile}}}% % \end{macrocode} % and set it for the \texttt{fancyheadings} package, % package page style. % \begin{macrocode} \if@svnInfoDraft@ \if@svnInfoUseFancy@ \rfoot[\fancyplain{\@svnInfoFancyFile}{\@svnInfoFancyFile}]% {\fancyplain{\@svnInfoFancyInfo}{\@svnInfoFancyInfo}}% \lfoot[\fancyplain{\@svnInfoFancyInfo}{\@svnInfoFancyInfo}]% {\fancyplain{\@svnInfoFancyFile}{\@svnInfoFancyFile}}% \setlength{\footrulewidth}{0.4pt}% \setlength{\plainfootrulewidth}{0.4pt}% \fi \fi % \end{macrocode} % for the \texttt{fancyhdr} package, % \begin{macrocode} \if@svnInfoDraft@ \if@svnInfoUseFancyhdr@ \if@twoside \fancyfoot[LE,RO]{\@svnInfoFancyInfo}% \fancyfoot[LO,RE]{\@svnInfoFancyFile}% \fancyfoot[CO,CE]{\thepage}% \renewcommand{\footrulewidth}{0.4pt}% \fancypagestyle{plain}{% \fancyfoot[LE,RO]{\@svnInfoFancyInfo}% \fancyfoot[LO,RE]{\@svnInfoFancyFile}% \fancyfoot[CO,CE]{\thepage}% \renewcommand{\footrulewidth}{0.4pt}% } \else \fancyfoot[L]{\@svnInfoFancyInfo}% \fancyfoot[R]{\@svnInfoFancyFile}% \fancyfoot[C]{\thepage}% \renewcommand{\footrulewidth}{0.4pt}% \fancypagestyle{plain}{% \fancyfoot[L]{\@svnInfoFancyInfo}% \fancyfoot[R]{\@svnInfoFancyFile}% \fancyfoot[C]{\thepage}% \renewcommand{\footrulewidth}{0.4pt}% } \fi \fi \fi % \end{macrocode} % for the \texttt{srcpage2} package, % \begin{macrocode} \if@svnInfoDraft@ \if@svnInfoUseScrpage@ \clearscrheadfoot% \ohead{\headmark}% \cfoot[\emph{\@svnInfoFancyInfo}]{\emph{\@svnInfoFancyInfo}}% \ifoot[\@svnInfoFancyFile]{\@svnInfoFancyFile}% \ofoot[\pagemark]{\pagemark}% \pagestyle{scrheadings}% \fi \fi % \end{macrocode} % for the \texttt{eso-pic} package, % \begin{macrocode} \if@svnInfoDraft@ \if@svnInfoUseEsofoot@ \AddToShipoutPicture{% \setlength{\unitlength}{1mm}% \put(5,5){\tiny\svnInfoFile\quad\svnInfoRevision\quad\svnInfoDate% \quad\svnInfoTime\quad\svnInfoOwner}% } \fi \fi } % \end{macrocode} % \end{macro} % \begin{macro}{\@svnInfoMargin} % for the \texttt{margin} option. % \begin{macrocode} \def\@svnInfoMargin{ \if@svnInfoDraft@ \if@svnInfoNotPreamble@ \if@svnInfoUseMargin@ \expandafter\marginpar[% {\raggedleft\tiny\svnInfoFile, \svnInfoRevision, % \svnInfoDate, \svnInfoTime, \svnInfoOwner}% ]{% {\raggedright\tiny\svnInfoFile, \svnInfoRevision, % \svnInfoDate, \svnInfoTime, \svnInfoOwner}% }% \fi \fi \fi } % \end{macrocode} % % \end{macro} % % Initialize the defaults % \begin{macrocode} \@svnInfoDefaults % \end{macrocode} % At the start of the document, if we use the % \texttt{fancyhdr} footline, we should set it here. % \begin{macrocode} \AtBeginDocument{% \@svnInfoNotPreamble@true \if@svnInfoDraft@ \if@svnInfoUseFancy@ \@svnInfoFancyFoot \fi \if@svnInfoUseFancyhdr@ \@svnInfoFancyFoot \fi \if@svnInfoUseScrpage@ \@svnInfoFancyFoot \fi \if@svnInfoUseEsofoot@ \@svnInfoFancyFoot \fi \fi } % \end{macrocode} % At the end of the document % \begin{macrocode} \AtEndDocument{% \immediate\write\@mainaux{\string\gdef\string\svnInfoMinRevision{\svnInfoMinRevision}}% \immediate\write\@mainaux{\string\gdef\string\svnInfoMaxRevision{\svnInfoMaxRevision}}% \immediate\write\@mainaux{\string\gdef\string\svnInfoMaxDay{\svnInfoMaxDay}}% \immediate\write\@mainaux{\string\gdef\string\svnInfoMaxMonth{\svnInfoMaxMonth}}% \immediate\write\@mainaux{\string\gdef\string\svnInfoMaxYear{\svnInfoMaxYear}}% } % \end{macrocode} %\subsection{The generic \texttt{\string\svnKeyword} command} % \begin{macro}{\svnKeyword} % |\svnKeyword| is the main construct. The single argument % should be of the form |$|\meta{Keyword}|$| or % |$|\meta{Keyword}:\meta{space}\meta{value}\meta{space}|$|, where % \meta{Keyword} and \meta{value} must be non-empty as well as % brace- and |\if|--|\fi|- balanced. \meta{space} is a single space % (if more are present they will be subsumed into \meta{value}). If % `|$empty$|', `|$generic$|', |$Time$| or ever become keywords, or % if keywords containing |@| ever exist then we may have problems. % \begin{macrocode} \def\svnKeyword $#1${\svn@$#1: $} % \end{macrocode} % \end{macro} % % \begin{macro}{\svnKeywordempty} % If \meta{Keyword} is unexpanded then |\svnKeywordKeyword| is % set to the macro |\svnKeywordempty|, which is initially empty. % \begin{macrocode} \let\svnKeywordempty\relax % \end{macrocode} % \end{macro} % % \begin{macro}{\svn@} % \begin{macro}{\svn@tmp} % |\svn@| does the work for |\svnKeyword|. It takes two % arguments, the first is the \meta{Keyword}'s name, the second is % empty (in which case \meta{Keyword} was unexpanded) or % \meta{value}, the expansion of \meta{keyword}. % \begin{macrocode} \def\svn@$#1: #2${% \def\svn@tmp{#2}% % \end{macrocode} % \begin{macro}{\svn@suffix} % If \param2 is empty, then the keyword was unexpanded and % |\svn@suffix| is set to |@unexp|, otherwise we had an % expanded keyword so |\svn@suffix| is set to |@exp|. % \begin{macrocode} \ifx\svn@tmp\@empty \def\svn@suffix{@unexp}% \else \def\svn@suffix{@exp}% \fi % \end{macrocode} % If |\svnKeyword@|\param1\meta{suffix} is defined then run it % with arguments `\param1\param2', else run % |\svnKeyword@generic@|\meta{suffix} (again with argument % \param1\param2---by default this defines `|\svnKeyword|\meta{\param1}' to % be \param2, or |\svnKeywordempty| in the unexpanded case). % \begin{macrocode} \@ifundefined{svnKeyword@#1\svn@suffix}% {\@nameuse{svnKeyword@generic\svn@suffix}{#1}{#2}}% {\@nameuse{svnKeyword@#1\svn@suffix}{#1}{#2}}% } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \subsubsection{Dealing with general \texttt{\string$Keyword\string$}s} % \begin{macro}{\svnKeyword@generic@exp} % When we see |\svnKeyword $KeyWord: $|, and % |\svnKeyword@KeyWord@exp| is undefined, then we define the macro % |\svnKeywordKeyWord| to be || using % |\svnKeyword@generic@exp{KeyWord}{}|. % \begin{macrocode} \def\svnKeyword@generic@exp#1#2{% \expandafter\svn@set\csname svnKeyword#1\endcsname$#2$% } % \end{macrocode} % \end{macro} % % \begin{macro}{\svnKeyword@generic@unexp} % When we see |\svnKeyword $KeyWord$| and % |\svnKeyword@KeyWord@unexp| is undefined, we define % |\svnKeywordKeyWord| to be |\svnKeywordempty| using % |\svnKeyword@generic@unexp{KeyWord}|. % \begin{macrocode} \def\svnKeyword@generic@unexp#1#2{% \expandafter\global\expandafter\let\csname svnKeyword#1\endcsname\svnKeywordempty } % \end{macrocode} % \end{macro} % % \begin{macro}{\svn@set} % |\svn@set#1$#2$| defines the command in \param{1} to be \param{2} % without the trailing `\verb*| : |' that the call to |\svn@| added. % \begin{macrocode} \def\svn@set#1$#2 : ${\gdef#1{#2}} % \end{macrocode} % \end{macro} % % \subsubsection{Dealing with the \texttt{\string$Date\string$} keyword} % \begin{macro}{\svnKeyword@Date@unexp} % \begin{macro}{\svnKeyword@LastChangedDate@unexp} % \begin{macrocode} \def\svnKeyword@Date@unexp#1#2{}% \let\svnKeyword@LastChangedDate@unexp\svnKeyword@Date@unexp% % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\svnKeyword@Date@exp} % \begin{macro}{\svnKeyword@LastChangedDate@exp} % \begin{macrocode} \def\svnKeyword@Date@exp#1#2{% \svn@parse@date$#2$% }% \let\svnKeyword@LastChangedDate@exp\svnKeyword@Date@exp % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\svn@parse@date} % \begin{macrocode} \if@svnInfoSVK@ \def\svn@parse@date$#1-#2-#3T#4:#5:#6.#7${% \@svnInfoDay =#3\relax% \@svnInfoMonth=#2\relax% \@svnInfoYear =#1\relax% \def\svnInfoLongDate{\@svnInfoToday}% \if@svnInfoToday@ \year =\@svnInfoYear \month =\@svnInfoMonth \day =\@svnInfoDay \fi % \end{macrocode} % We could add `GMT' to |\svnKeywordTime|. Or not bother. % \begin{macrocode} \def\svnInfoTime{#4:#5:#6}% } \else \def\svn@parse@date$#1-#2-#3 #4:#5:#6 #7${% \@svnInfoDay =#3\relax% \@svnInfoMonth=#2\relax% \@svnInfoYear =#1\relax% \def\svnInfoLongDate{\@svnInfoToday}% \if@svnInfoToday@ \year =\@svnInfoYear \month =\@svnInfoMonth \day =\@svnInfoDay \fi \def\svnInfoTime{#4:#5:#6}% } \fi % \end{macrocode} % \end{macro} % \subsubsection{Dealing with the \texttt{\string$Id\string$} keyword} % \begin{macro}{\svnKeyword@Id@unexp} % \begin{macrocode} \def\svnKeyword@Id@unexp#1#2{}% % \end{macrocode} % \end{macro} % % \begin{macro}{\svnKeyword@Id@exp} % \begin{macrocode} \def\svnKeyword@Id@exp#1#2{% \svn@parse@id$#2$ }% \def\svn@parse@id$#1 : ${% \svnInfo $Id: svninfo.dtx 4705 2010-03-23 19:57:29Z brucker $ % }% % \end{macrocode} % \end{macro} % \subsubsection{Dealing with the \texttt{\string$Author\string$} keyword} % \begin{macro}{\svnKeyword@Author@unexp} % \begin{macro}{\svnKeyword@LastChangedBy@exp} % \begin{macrocode} \def\svnKeyword@Author@unexp#1#2{}% \let\svnKeyword@LastChangedBy@unexp\svnKeyword@Author@unexp% % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\svnKeyword@Author@exp} % \begin{macro}{\svnKeyword@LastChangedBy@exp} % \begin{macrocode} \def\svnKeyword@Author@exp#1#2{% \svn@parse@Author$#2$ }% \def\svn@parse@Author$#1 : ${% \def\svnInfoOwner{#1}% }% \let\svnKeyword@LastChangedBy\svnKeyword@Author@exp% % \end{macrocode} % \end{macro} % \end{macro} % \subsubsection{Dealing with the \texttt{\string$Revision\string$} keyword} % \begin{macro}{\svnKeyword@Revision@unexp} % \begin{macro}{\svnKeyword@LastChangedRevision@unexp} % \begin{macro}{\svnKeyword@Rev@unexp} % \begin{macrocode} \def\svnKeyword@Revision@unexp#1#2{}% \let\svnKeyword@LastChangedRevision@unexp\svnKeyword@Revision@unexp% \let\svnKeyword@Rev@unexp\svnKeyword@Revision@unexp% % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\svnKeyword@Revision@exp} % \begin{macro}{\svnKeyword@LastChangedRevision@exp} % \begin{macro}{\svnKeyword@Rev@exp} % \begin{macrocode} \def\svnKeyword@Revision@exp#1#2{% \svn@parse@Revision$#2$% }% \def\svn@parse@Revision$#1 : ${% \def\svnInfoRevision{#1}% \ifthenelse{\(\equal{\svnInfoMaxRevision}{--maxrevision--}\) % \OR \(#1 > \svnInfoMaxRevision \)}{\def\svnInfoMaxRevision{#1}}{}% \ifthenelse{\(\equal{\svnInfoMinRevision}{--minrevision--}\) % \OR \( #1 < \svnInfoMinRevision \)}{\def\svnInfoMinRevision{#1}}{}% }% \let\svnKeyword@LastChangedRevision@exp\svnKeyword@Revision@exp% \let\svnKeyword@Rev@unexp\svnKeyword@Revision@exp% % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \subsubsection{Dealing with the \texttt{\string$HeadURL\string$} keyword} % \begin{macro}{\svnKeyword@HeadURL@unexp} % \begin{macrocode} \def\svnKeyword@HeadURL@unexp#1#2{}% \let\svnKeyword@URL@unexp\svnKeyword@HeadURL@unexp% % \end{macrocode} % \end{macro} % % \begin{macro}{\svnKeyword@HeadURL@exp} % \begin{macrocode} \def\svnKeyword@HeadURL@exp#1#2{% \svn@parse@HeadURL$#2$% }% \def\svn@parse@HeadURL$#1 : ${% \def\svnInfoHeadURL{#1}% }% \let\svnKeyword@URL@exp\svnKeyword@HeadURL@exp% % % \end{macrocode} % \end{macro} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \centerline{That's the end} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % \Finale % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \iffalse % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % The following stuff does not show up in the documentation of the package: % svninfo.ins % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %<*ins> \def\batchfile{svninfo.ins} \input docstrip.tex \Msg{} \Msg{***********************************************************} \Msg{** Hello to the installation of the `svninfo' package.} \Msg{** Version 0.7.4, March 22, 2010} \Msg{***********************************************************} \Msg{} \generate{ \askforoverwritefalse % \file{svninfo.ins}{\from{svninfo.dtx}{header,ins}} \file{svninfo.sty}{\from{svninfo.dtx}{header,package}} \usepreamble\empty \usepostamble\empty \file{svninfo.perl}{\from{svninfo.dtx}{perl}} \file{svninfo.init}{\from{svninfo.dtx}{init}} \file{svninfo.cfg}{\from{svninfo.dtx}{header,config}} } \Msg{} \Msg{***********************************************************} \Msg{** Edit the file svninfo.cfg and set the default fancy headings package} \Msg{** To finish the installation move the file `svninfo.sty' and} \Msg{** svninfo.cfg to a place where LaTeX will find it.} \Msg{** To Get the documentation: `latex svninfo.dtx'} \Msg{** Happy TeXing} \Msg{***********************************************************} \Msg{} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % E N D of S V N I N F O . D T X % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %\fi