summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/svn-prov
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/svn-prov
Initial commit
Diffstat (limited to 'macros/latex/contrib/svn-prov')
-rw-r--r--macros/latex/contrib/svn-prov/Makefile144
-rw-r--r--macros/latex/contrib/svn-prov/README17
-rw-r--r--macros/latex/contrib/svn-prov/svn-prov.dtx791
-rw-r--r--macros/latex/contrib/svn-prov/svn-prov.ins47
-rw-r--r--macros/latex/contrib/svn-prov/svn-prov.pdfbin0 -> 299472 bytes
5 files changed, 999 insertions, 0 deletions
diff --git a/macros/latex/contrib/svn-prov/Makefile b/macros/latex/contrib/svn-prov/Makefile
new file mode 100644
index 0000000000..2587581d4e
--- /dev/null
+++ b/macros/latex/contrib/svn-prov/Makefile
@@ -0,0 +1,144 @@
+# $Id: Makefile 1762 2010-03-26 15:46:08Z martin $
+
+PACKAGE = svn-prov
+PACKAGE_STY = ${PACKAGE}.sty
+PACKAGE_DTX = ${PACKAGE}.dtx
+PACKAGE_SCR =
+PACKAGE_DOC = $(PACKAGE_DTX:.dtx=.pdf)
+PACKAGE_SRC = ${PACKAGE_DTX} ${PACKAGE}.ins Makefile
+PACKFILES = ${PACKAGE_SRC} ${PACKAGE_DOC} README
+
+TEXAUX = *.aux *.log *.glo *.ind *.idx *.out *.svn *.svx *.svt *.toc *.ilg *.gls *.hd *.fdb_latexmk
+INSGENERATED = ${PACKAGE_STY}
+GENERATED = ${INSGENERATED} ${PACKAGE}.pdf ${PACKAGE}.zip ${PACKAGE}.tar.gz ${TESTDIR}/test*.pdf
+ZIPFILE = ${PACKAGE}-${ZIPVERSION}.zip
+TDSZIPFILE = ${PACKAGE}-${ZIPVERSION}.tds.zip
+
+TESTDIR = tests
+TESTS = $(patsubst %.tex,%,$(subst ${TESTDIR}/,,$(wildcard ${TESTDIR}/test?.tex ${TESTDIR}/test??.tex))) # look for all test*.tex file names and remove the '.tex'
+TESTARGS = -output-directory ${TESTDIR}
+
+LATEX_OPTIONS = -interaction=batchmode
+LATEX = pdflatex ${LATEX_OPTIONS}
+
+TEXMFDIR = ${HOME}/texmf
+
+RED = \033[01;31m
+GREEN = \033[01;32m
+WHITE = \033[00m
+
+CP = cp -v
+MV = mv -v
+RMDIR = rm -rf
+MKDIR = mkdir -p
+
+.PHONY: all doc package clean fullclean example testclean ${TESTS} tds ${CHECK_LOG}
+
+###############################################################################
+
+all: package doc example
+new: fullclean all
+
+doc: ${PACKAGE_DOC} pdfopt
+
+package: ${PACKAGE_STY} ${PACKAGE_SCR}
+
+%.pdf: %.dtx
+ ${LATEX} $*.dtx
+ -makeindex -s gind.ist -o $*.ind $*.idx
+ -makeindex -s gglo.ist -o $*.gls $*.glo
+ ${LATEX} $*.dtx
+ ${LATEX} $*.dtx
+
+${PACKAGE}.pdf: ${PACKAGE}.sty
+
+${INSGENERATED}: ${PACKAGE_DTX} ${PACKAGE}.ins
+ yes | latex ${PACKAGE}.ins
+
+clean:
+ rm -f ${TEXAUX} $(addprefix ${TESTDIR}/, ${TEXAUX})
+
+fullclean: clean
+ rm -f ${GENERATED} *~ *.backup
+ rm -f ${PACKAGE}*.zip
+ rm -rf tds/
+
+
+zip: ${PACKFILES}
+ @${MAKE} --no-print-directory ${ZIPFILE}
+
+zip: ZIPVERSION=$(shell grep "Package: ${PACKAGE} " ${PACKAGE}.log | \
+ sed -e "s/.*Package: ${PACKAGE} ....\/..\/..\s\+\(v\S\+\).*/\1/")
+
+tdszip: ZIPVERSION=$(shell grep "Package: ${PACKAGE} " ${PACKAGE}.log | \
+ sed -e "s/.*Package: ${PACKAGE} ....\/..\/..\s\+\(v\S\+\).*/\1/")
+
+${PACKAGE}%.zip: ${PACKFILES}
+ @test -n "${IGNORE_CHECKSUM}" || grep -L '\* Checksum passed \*' ${PACKAGE_DTX:.dtx=.log} | wc -l | grep -q '^0$$'
+ ${RM} $@
+ zip $@ ${PACKFILES}
+ @echo
+ @echo "ZIP file $@ created!"
+
+release: fullclean package doc example tests zip
+
+pdfopt: .${PACKAGE}.opt
+.${PACKAGE}.opt: ${PACKAGE}.pdf
+ -pdfopt "$<" "$@" && cp "$@" "$<" && touch --reference="$<" "$@"
+
+###############################################################################
+
+# Make sure TeX finds the input files in TESTDIR
+tests ${TESTS}: export TEXINPUTS:=${TEXINPUTS}:${TESTDIR}
+tests ${TESTS}: LATEX_OPTIONS=
+
+testclean:
+ @${RM} $(foreach ext, aux log out pdf svn svx, tests/test*.${ext})
+
+tests: package testclean
+ @echo "Running tests: ${TESTS}:"
+ @${MAKE} -e -i --no-print-directory ${TESTS} \
+ TESTARGS="-interaction=batchmode -output-directory=${TESTDIR}"\
+ TESTPLOPT="-q"\
+ > /dev/null
+
+${TESTS}: % : ${TESTDIR}/%.tex package testclean
+ @-${LATEX} -interaction=nonstopmode ${TESTARGS} $< 1>/dev/null 2>/dev/null
+ @if (${LATEX} ${TESTARGS} $< && (test ! -e ${TESTDIR}/$*.pl || ${TESTDIR}/$*.pl ${TESTPLOPT})); \
+ then /bin/echo -e "${GREEN}$@ succeeded${WHITE}" >&2; \
+ else /bin/echo -e "${RED}$@ failed!!!!!!${WHITE}" >&2; fi
+
+###############################################################################
+
+tds: .tds
+
+.tds: ${PACKAGE_STY} ${PACKAGE_DOC} ${PACKAGE_SRC}
+ @grep -q '\* Checksum passed \*' ${PACKAGE}.log
+ ${RMDIR} tds
+ ${MKDIR} tds/
+ ${MKDIR} tds/tex/ tds/tex/latex/ tds/tex/latex/${PACKAGE}/
+ ${MKDIR} tds/doc/ tds/doc/latex/ tds/doc/latex/${PACKAGE}/
+ ${MKDIR} tds/source/ tds/source/latex/ tds/source/latex/${PACKAGE}/
+ -test -n "${PACKAGE_SCR}" && ${MKDIR} tds/scripts/ tds/scripts/${PACKAGE}/
+ ${CP} ${PACKAGE_STY} tds/tex/latex/${PACKAGE}/
+ ${CP} ${PACKAGE_DOC} tds/doc/latex/${PACKAGE}/
+ -${CP} ${PACKAGE_SRC} tds/source/latex/${PACKAGE}/
+ -test -n "${PACKAGE_SCR}" && ${CP} ${PACKAGE_SCR} tds/scripts/${PACKAGE}/
+ @touch $@
+
+tdszip: ${TDSZIPFILE}
+
+${TDSZIPFILE}: .tds
+ ${RM} ${TDSZIPFILE}
+ cd tds && zip -r ../${TDSZIPFILE} .
+
+###############################################################################
+
+install: .tds
+ test -d "${TEXMFDIR}" && ${CP} -a tds/* "${TEXMFDIR}/" && texhash ${TEXMFDIR}
+
+uninstall:
+ test -d "${TEXMFDIR}" && ${RM} -rv "${TEXMFDIR}/tex/latex/${PACKAGE}" \
+ "${TEXMFDIR}/doc/latex/${PACKAGE}" "${TEXMFDIR}/source/latex/${PACKAGE}" \
+ "${TEXMFDIR}/scripts/${PACKAGE}" && texhash ${TEXMFDIR}
+
diff --git a/macros/latex/contrib/svn-prov/README b/macros/latex/contrib/svn-prov/README
new file mode 100644
index 0000000000..e037a717da
--- /dev/null
+++ b/macros/latex/contrib/svn-prov/README
@@ -0,0 +1,17 @@
+Package svn-prov
+~~~~~~~~~~~~~~~~
+Copyright (C) 2009 Martin Scharrer <martin@scharrer-online.de>
+See the svn-prov.dtx or svn-prov.ins file for the licence information (LPPL).
+
+
+This package introduces Subversion variants of the standard LaTeX macros
+\ProvidesPackage, \ProvidesClass and \ProvidesFile where the file name and date
+is extracted from Subversion Id keywords. The file name can also be given
+explicitly as an optional argument.
+
+Syntax summary:
+
+\ProvidesPackageSVN [file name]{$Id: ... $}[Package Information (version, description)]
+\ProvidesClassSVN [file name]{$Id: ... $}[Class Information (version, description)]
+\ProvidesFileSVN [file name]{$Id: ... $}[File Information (version, description)]
+
diff --git a/macros/latex/contrib/svn-prov/svn-prov.dtx b/macros/latex/contrib/svn-prov/svn-prov.dtx
new file mode 100644
index 0000000000..ff0066fab4
--- /dev/null
+++ b/macros/latex/contrib/svn-prov/svn-prov.dtx
@@ -0,0 +1,791 @@
+% \iffalse meta-comment
+% $Id: svn-prov.dtx 1862 2010-04-24 14:19:07Z martin $
+%
+% Copyright (C) 2009-2010 by Martin Scharrer <martin@scharrer-online.de>
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3c
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+%
+% http://www.latex-project.org/lppl.txt
+%
+% and version 1.3c or later is part of all distributions of LaTeX
+% version 2008/05/04 or later.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Martin Scharrer.
+%
+% This work consists of the files svn-prov.dtx, svn-prov.ins
+% and the derived file svn-prov.sty.
+%
+% \fi
+%
+% \iffalse
+%<*driver>
+\RequirePackage{svn-prov}
+%</driver>
+%<*driver|package>
+\def\svnprov@version{v3.\rev}
+%</driver|package>
+%<*driver>
+\ProvidesFileSVN{$Id: svn-prov.dtx 1862 2010-04-24 14:19:07Z martin $}
+ [\svnprov@version\space DTX for \filebase.sty]
+\DefineFileInfoSVN
+\GetFileInfoSVN*
+% Re-require package to check date
+\RequirePackage{svn-prov}[\filedate]
+
+\documentclass{article}
+\usepackage{ydoc}
+\usepackage[hyperfootnotes=false]{hyperref}
+\usepackage{booktabs}
+
+\makeatletter
+%%% Examples %%%
+\RequirePackage{fancyvrb}
+\RequirePackage{listings}
+
+\renewenvironment{example}
+ {\begingroup\VerbatimOut[gobble=4]{\jobname.exa}}
+ {\endVerbatimOut\endgroup\formatexample}
+
+\usepackage{ifthen,calc}
+
+\def\examplebeforetext{The following code:}
+\def\exampleaftertext{is equivalent to:}
+
+\def\formatexample{%
+ \par\noindent\examplebeforetext
+ \lstinputlisting{\jobname.exa}\medskip
+ \exampleaftertext\\[\medskipamount]%
+ {\catcode`\%=14%
+ \input{\jobname.exa}}%
+ \par\bigskip
+}
+
+\lstset{%
+ %numbers=left,
+ numberstyle=\scriptsize\sffamily,
+ basicstyle=\ttfamily,
+ stepnumber=1,
+ language=[latex]tex,
+}%
+
+
+\usepackage{xspace}
+\let\pkg\relax
+\newcommand*{\pkg}[1]{%
+ \href{http://tug.ctan.org/pkg/#1}{\texttt{#1}}%
+ % URL footnote (for print-out) on first appearance:
+ \@ifundefined{seen@package@#1}{%
+ \footnote{CTAN: \url{http://tug.ctan.org/pkg/#1}}%
+ \@namedef{seen@package@#1}{1}%
+ }{}%
+ \xspace
+}
+
+\def\darg#1{\texttt{\frenchspacing\char`\{\$#1\$\char`\}}}
+
+\makeatother
+
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+
+\let\manualnewpage\newpage
+\listfiles
+\begin{document}
+ \DocInput{svn-prov.dtx}
+ \PrintChanges
+ \manualnewpage
+ \PrintIndex
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{423}
+%
+% \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 \~}
+%
+%
+% \changes{v0.922}{2009/04/26}{Initial version}
+% \changes{v1.}{2009/05/03}{Added \cs{DefineFileInfoSVN} macro.}
+% \changes{v2.}{2010/03/25}{Fixed issues when used in font definition \texttt{*.fd} files due to changed catcodes.
+% Also fixed error which occurred when Id line was not expanded.}
+%
+% ^^A \GetFileInfo{\jobname.dtx}
+%
+% \DoNotIndex{\newcommand,\newenvironment,\def,\edef,\gdef,\xdef,\let,\@tempa}
+% \DoNotIndex{\g@tempa,\textbackslash,\ifx,\if,\ifnum,\else,\fi,\relax,\space}
+% \DoNotIndex{\@ifnextchar,\@gobble,\@undefined,\begingroup,\endgroup,\empty}
+% \DoNotIndex{\expandafter,\NeedsTeXFormat}
+%
+% \title{The \textsf{svn-prov} package\\\large Use SVN Id keywords for package,
+% class and file header}
+% \author{Martin Scharrer \\ \url{martin@scharrer-online.de}}
+% \GetFileInfoSVN{svnprov}
+% \date{Version~\fileversion\ - \filetoday}
+%
+% \maketitle
+%
+% \section{Introduction}
+% This package is directed to authors of \LaTeX\ packages and classes which use
+% the version control software
+% \href{http://subversion.tigris.org/}{Subversion}\footnote
+% {WWW: \url{http://subversion.tigris.org/}} (SVN) for their source files. It
+% introduces three macros which are Subversion variants of the standard \LaTeX\
+% header macros \cs{ProvidesPackage}, \cs{ProvidesClass} and \cs{ProvidesFile}
+% which are used to identify package, class and other files, respectively.
+% Instead of providing the package/class/file name and date manually they are
+% extracted from a Subversion Id keywords string which
+% is updated automatically by every time the source file is committed to the
+% repository.
+%
+% A similar package exists for RCS, the pre-predecessor of Subversion, in the
+% \pkg{pgf} bundle which is called \texttt{pgfrcs}.
+% For further support for Subversion keywords see the author's other package
+% \pkg{svn-multi}.
+%
+% \section{Usage}
+% ^^A\subsection{Subversion Id Keyword}
+% The following macros need an Id keyword which can initially be written as
+% `|$||Id:$|' and will be expanded by Subversion into the following format at
+% the next commit:\par\smallskip
+% \texttt{\frenchspacing\${}Id: \meta{filename} \meta{revision} \meta{date}
+% \meta{time} \meta{author} \$}
+% \par\smallskip
+% \noindent e.g. for the source file of this document:\par\smallskip
+% |$Id: svn-prov.dtx 1862 2010-04-24 14:19:07Z martin $|
+% \par\smallskip
+% \noindent For this to work the Subversion \emph{property} \texttt{svn:keywords} must be
+% set to (at least) `|Id|' for the source file(s). e.g.\ using the command
+% line:\par\smallskip
+% \texttt{svn propset 'svn:keyword' 'Id' \meta{filename(s)}}
+% \par\smallskip\noindent
+% \nopagebreak[3]\unskip
+% More information about using Subversion in the \LaTeX\ workflow can be found in the
+% Prac\TeX{} Journal issue 2007-3\footnote
+% {URL:
+% \ttfamily\url{http://www.tug.org/pracjourn/2007-3/}\char`\{\href
+% {http://www.tug.org/pracjourn/2007-3/skiadas-svn}{skiadas-svn}\char`\|\href
+% {http://www.tug.org/pracjourn/2007-3/ziegenhagen}{ziegenhagen}\char`\|\href
+% {http://www.tug.org/pracjourn/2007-3/scharrer}{scharrer}\char`\}}.
+%
+% ^^A\subsection{Main Macros}
+% \manualnewpage%%
+% \DescribeMacro\ProvidesPackageSVN [<file name>] {\$Id:~\$} [<\small version and/or description>] [<\small description>]
+% \DescribeMacro\ProvidesClassSVN [<file name>] {\$Id:~\$} [<\small version and/or description>] [<\small description>]
+% \DescribeMacro\ProvidesFileSVN [<file name>] {\$Id:~\$} [<\small version and/or description>] [<\small description>]
+%
+% All of these macros await a valid Subversion Id keyword string as a mandatory
+% argument. The file name and date is extracted from this string. For cases when
+% the file source is not stored in the correct file but packed inside a
+% different one, like a |.dtx| file, the correct file name can be provided by an
+% optional argument. Because the file extension of package and class files is
+% predefined and therefore ignored this is not needed for them when they are
+% packed inside a corresponding |.dtx| file, i.e. one with the same base name.
+%
+% As with the standard macros mentioned above additional information can be given optionally.
+% Since v0.3 the SVN macro provide two optional arguments (before only one).
+% If only one optional argument is given it is taken as a description text which may start
+% with an potential version number. This version number must start with `|v|' and not include spaces
+% and is extracted from the description.
+% Alternatively the version number and the description can be provided using two separate optional arguments.
+% If no optional argument is given the default string \cs{revinfo} (see below) is used instead.
+%
+% All three optional arguments can include the following macros which are only valid
+% inside them, but not afterwards\footnote{They can be set using \cs{GetFileInfoSVN}}:
+% \begin{description}
+% \item[\cs{rev}] File revision.
+% \item[\cs{Rev}] File revision followed by a space.
+% \item[\cs{revinfo}] The default information used:
+% ``\texttt{\frenchspacing(SVN Rev: \meta{revision})}''.
+% \item[\cs{filebase}] File base name (file name without extension).
+% \item[\cs{fileext}] File extension (without leading dot).
+% \item[\cs{filename}] File name.
+% \item[\cs{filedate}] File date (in the format YYYY/MM/DD).
+% \item[\cs{filerev}] File revision, like \cs{rev}.
+% \end{description}
+%
+% ^^A\subsection{Other Macros}
+% \par\medskip
+% \DescribeMacro\GetFileInfoSVN{<name>}
+% \DescribeMacro\GetFileInfoSVN*
+% This macro\marginpar{\it\raggedright Non-star version added in v3. 2010/04/11}
+% sets the macros \cs{filebase}, \cs{fileext}, \cs{filename}, \cs{filedate}, \cs{fileversion}, \cs{filerev},
+% \cs{fileinfo} and \cs{filetoday} to the corresponding values of the file given by \meta{name}. The file must have been
+% read/loaded before and use both a \cs{Provides\ldots SVN} macro and \cs{DefineFileInfoSVN}, otherwise the above macros
+% will be set to |\relax|. The \meta{name} can be either the real filename or the optional short name used with
+% \cs{DefineFileInfoSVN}.
+%
+% The star version of this macro provides the file information of the last file which called one of the
+% \cs{Provides\ldots SVN} macros.
+%
+% The macros \cs{fileversion} and \cs{fileinfo} hold the file version and description taken from optional argument of
+% the \cs{Provide...SVN} macro. The version is defined only if this argument starts with `|v|' and is otherwise empty.
+% It includes all text up to the first space.
+% The \cs{filetoday} macro generates a text representation of the \cs{filedate} using the \cs{today} macro. The format can be
+% adjusted to a different language with the |\date|\meta{language} macro from the \pkg{babel} package.
+% The other macros are described above.
+%
+%
+% \par\medskip
+% \DescribeMacro\DefineFileInfoSVN[<name>]
+% Defined\marginpar{\it\raggedright New in v1. 2009/05/03}
+% a set of macros which provide the information collected by a previous
+% \cs{Provides\ldots} macro. The macros have the form
+% |\|\meta{name}|@|\meta{data} where \meta{name} is by default the filename
+% either with the file extension (general files) or without (packages and
+% classes). This default can be overwritten by the optional argument.
+% The \meta{data} stands for |version|, |rev| (revision), |date| and |info|
+% (the information part without the version number)
+% and, since v3,\marginpar{\it\raggedright Updated in v3. 2010/04/24}
+% file name |base| and |ext|(ension) as well as |today|, which prints
+% the |date| in the format of \cs{today}.
+%
+% \noindent
+% \textit{Example:} Applied to the |.dtx| file of this very package the
+% following macros are defined:\par\medskip
+% \begingroup
+% \makeatletter\centering
+% \begin{tabular}{ll}
+% \toprule
+% Macro & Definition \\
+% \midrule
+% \cs{svn-prov.dtx@version} & \@nameuse{svn-prov.dtx@version} \\
+% \cs{svn-prov.dtx@rev} & \@nameuse{svn-prov.dtx@rev} \\
+% \cs{svn-prov.dtx@date} & \@nameuse{svn-prov.dtx@date} \\
+% \cs{svn-prov.dtx@info} & \@nameuse{svn-prov.dtx@info} \\
+% \cs{svn-prov.dtx@base} & \@nameuse{svn-prov.dtx@base} \\
+% \cs{svn-prov.dtx@ext} & \@nameuse{svn-prov.dtx@ext} \\
+% \cs{svn-prov.dtx@today} & \@nameuse{svn-prov.dtx@today} \\
+% \bottomrule
+% \end{tabular}
+% \par\bigskip
+% The style file however would get macros like \cs{svn-prov@version}.
+% Because `|-|' is not a letter the macros can only be accessed using |\csname|.
+% Therefore the optional argument |[svnprov]| is used to name the macros
+% \cs{svnprov@version} etc..
+% \endgroup
+%
+%
+% \section{Examples}
+% \begingroup
+% \def\{{\texttt{\char`\{}}%
+% \def\}{\texttt{\char`\}}}%
+% \def\ProvidesPackage#1[#2]{\texttt{\cs{ProvidesPackage}\{#1\}[#2]}\\}%
+% \def\ProvidesClass#1[#2]{\texttt{\cs{ProvidesClass}\{#1\}[#2]}\\}%
+% \def\ProvidesFile#1[#2]{\texttt{\cs{ProvidesFile}\{#1\}[#2]}\\}%
+%
+% The following examples illustrate the usage of the provided macros and how
+% they call the equivalent standard macros internally. The example
+% \emph{results} are produced by expanding the corresponding example \emph{code}
+% while the standard provide macros are locally redefined to typeset their own
+% name and arguments in verbatim style. This does not only simplifies the
+% generation of this document but makes this examples also test cases which
+% allow the package author to test the result of the defined macros.
+%
+% While mostly the package macro is used here the usage is identical to the
+% class and file macros. Of course before this macros are used it must be made
+% sure that the \texttt{svn-prov} package is loaded which is done by using the
+% following code direct before them:\\[\smallskipamount]
+% |\RequirePackage{svn-prov}|\\
+%
+% \frenchspacing
+% \subsubsection*{Minimal usage}
+% \begin{example}
+% \ProvidesPackageSVN
+% {$Id: svn-prov.dtx 1862 2010-04-24 14:19:07Z martin $}
+% \end{example}
+% \begin{example}
+% \ProvidesClassSVN
+% {$Id: svn-prov.dtx 1862 2010-04-24 14:19:07Z martin $}
+% \end{example}
+% \begin{example}
+% \ProvidesFileSVN
+% {$Id: svn-prov.dtx 1862 2010-04-24 14:19:07Z martin $}
+% \end{example}
+%
+% \subsubsection*{Normal Usage}
+% \begin{example}
+% \ProvidesPackageSVN
+% {$Id: svn-prov.dtx 1862 2010-04-24 14:19:07Z martin $}
+% [v1.0 Example Description]
+% \end{example}
+% \begin{example}
+% \ProvidesClassSVN
+% {$Id: svn-prov.dtx 1862 2010-04-24 14:19:07Z martin $}
+% [v1.0 Example Description]
+% \end{example}
+% \begin{example}
+% \ProvidesFileSVN
+% {$Id: svn-prov.dtx 1862 2010-04-24 14:19:07Z martin $}
+% [v1.0 Example Description]
+% \end{example}
+%
+% \subsubsection*{Normal Usage with only Description}
+% \begin{example}
+% \ProvidesFileSVN
+% {$Id: svn-prov.dtx 1862 2010-04-24 14:19:07Z martin $}
+% [Example Description]
+% \end{example}
+%
+% \subsubsection*{Normal Usage with separate Version and Description}
+% \begin{example}
+% \ProvidesFileSVN
+% {$Id: svn-prov.dtx 1862 2010-04-24 14:19:07Z martin $}
+% [v1.0][Example Description]
+% \end{example}
+%
+% \subsubsection*{Overwriting Name}
+% \begin{example}
+% \ProvidesPackageSVN[othername]
+% {$Id: svn-prov.dtx 1862 2010-04-24 14:19:07Z martin $}
+% [v1.0 Example Description]
+% \end{example}
+%
+% \subsubsection*{Overwriting Name including unneeded Extension}
+% \begin{example}
+% \ProvidesPackageSVN[othername.sty]
+% {$Id: svn-prov.dtx 1862 2010-04-24 14:19:07Z martin $}
+% [v1.0 Example Description]
+% \end{example}
+%
+% \subsubsection*{Overwriting Name using Macros}
+% \begin{example}
+% \ProvidesFileSVN[\filebase.cfg]
+% {$Id: svn-prov.dtx 1862 2010-04-24 14:19:07Z martin $}
+% [v1.0 Example Description]
+% \end{example}
+%
+% \subsubsection*{Using Macros in File Information String}
+% \begin{example}
+% \ProvidesPackageSVN
+% {$Id: svn-prov.dtx 1862 2010-04-24 14:19:07Z martin $}
+% [v1.\Rev Example Description]
+% \end{example}
+%
+% \subsubsection*{Adding Text to Default Information}
+% \begin{example}
+% \ProvidesPackageSVN
+% {$Id: svn-prov.dtx 1862 2010-04-24 14:19:07Z martin $}
+% [v1.\Rev Extra Text \revinfo]
+% \end{example}
+%
+% \subsection*{Getting the File Information}
+% \def\exampleaftertext{results in:}
+% \def\ProvidesPackage#1[#2]{}%
+%
+% \begin{example}
+% \ProvidesPackageSVN
+% {$Id: svn-prov.dtx 1862 2010-04-24 14:19:07Z martin $}
+% [v1.\Rev Extra Text \revinfo]
+% \GetFileInfoSVN*
+% % ...
+% \begin{tabular}{l@{\ :\ \ }l}
+% File Name & \filename \\
+% File Base Name & \filebase \\
+% File Extension & \fileext \\
+% File Date & \filedate \\
+% File Revision & \filerev \\
+% File Version & \fileversion \\
+% File Info & \fileinfo \\
+% \end{tabular}
+% \end{example}
+% \noindent
+% The correct package file extension `|.sty|' for \cs{fileext} can be forced by
+% using |[\filebase.sty]| as a first optional argument.
+%
+% \endgroup
+% \StopEventually{}
+% \manualnewpage
+% \section{Implementation}
+%
+% \iffalse
+%<*package>
+% \fi
+%
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}[1999/12/01]
+% \end{macrocode}
+%
+% \begin{macro}{\ProvidesClassSVN}
+% Calls the generic macro with the original LaTeX macro and the string to be
+% used as filename.
+% \begin{macrocode}
+\def\ProvidesClassSVN{%
+ \svnprov@generic\ProvidesClass{\svnprov@filebase@}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ProvidesFileSVN}
+% Calls the generic macro with the original LaTeX macro and the string to be
+% used as filename.
+% \begin{macrocode}
+\def\ProvidesFileSVN{%
+ \svnprov@generic\ProvidesFile{\svnprov@filebase@.\svnprov@fileext@}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ProvidesPackageSVN}
+% Calls the generic macro with the original LaTeX macro and the string to be
+% used as filename.
+% \begin{macrocode}
+\def\ProvidesPackageSVN{%
+ \svnprov@generic\ProvidesPackage{\svnprov@filebase@}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\svnprov@generic}
+% Stores the arguments (1: original macro, 2: file mask (full filename if only
+% base is used?)). Then tests if a explicit file name was given as optional
+% argument. If not the file name from the SVN Id string is used.
+% \begin{macrocode}
+\def\svnprov@generic#1#2{%
+ \def\svnprov@ltxprov{#1}%
+ \def\svnprov@filemask{#2}%
+ \begingroup
+ \svnprov@catcodes
+ \@ifnextchar{[}%
+ {\svnprov@getid}%
+ {\svnprov@getid[\svnprov@svnfilename]}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\svnprov@catcodes}
+% Sets the normal catcodes for all characters required by the |getid| macro.
+% \begin{macrocode}
+\def\svnprov@catcodes{%
+ \catcode`\ =10%
+ \catcode`\$=3%
+ \@makeother\:%
+ \@makeother\-%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Enforce normal catcodes for the definition of the |Id| scanning macros.
+% This makes sure that all scan patterns have the same catcodes during definition and execution.
+% \begin{macrocode}
+\begingroup
+\svnprov@catcodes
+% \end{macrocode}
+%
+% \begin{macro}{\svnprov@getid}
+% Saves first argument as filename and calls the scan macro with the second.
+% A fall-back string is provided to avoid \TeX\ parsing errors.
+% \begin{macrocode}
+\gdef\svnprov@getid[#1]#2{%
+ \endgroup
+ \def\svnprov@filename{#1}%
+ \svnprov@scanid #2\relax $%
+ Id: unknown.xxx 0 0000-00-00 00:00:00Z user $\empty\svnprov@endmarker
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\svnprov@scanid}
+% Parses the Id string and tests if it is correct (\#1=empty, \#8=\cs{relax}).
+% If correct the values are stored in macros and the next macro is called.
+% Otherwise a warning message is printed. In both cases any remaining text of
+% the parsing procedure is gobbled before the next step.
+% \begin{macrocode}
+\gdef\svnprov@scanid#1$%
+ Id: #2 #3 #4-#5-#6 #7 $#8{%
+ \def\next{%
+ \begingroup
+ \PackageWarning{svn-prov}{Invalid SVN Id line found! File name might be
+ '#2' or '\expandafter\strip@prefix\meaning\@filef@und'. This occured}{}{}{}%
+ \endgroup
+ \svnprov@gobbleopt
+ }%
+ \ifx\relax#1\relax
+ \ifx\relax#8\empty
+ \def\svnprov@svnfilename{#2}%
+ \svnprov@splitfilename{#2}%
+ \def\svnprov@filerev@{#3}%
+ \def\svnprov@filedate@{#4/#5/#6}%
+ \def\svnprov@filetoday@{\svnprov@@today{#4}{#5}{#6}}%
+ \def\next{\begingroup\svnprov@catcodes\svnprov@buildstring}%
+ \fi
+ \fi
+ \expandafter\next\svnprov@gobblerest
+}% $
+% \end{macrocode}
+% \end{macro}
+%
+% End of area with enforced catcodes.
+% \begin{macrocode}
+\endgroup
+% \end{macrocode}
+%
+% \begin{macro}{\svnprov@@today}
+% Prints \cs{today} with the given date.
+% \begin{macrocode}
+\def\svnprov@@today#1#2#3{%
+ {\year#1\month#2\day#3\relax\today}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\svnprov@splitfilename}
+% Expands the argument and initialises the file base macro before it calls the
+% next macro with the expanded argument and a dot to protect for \TeX\ parsing
+% errors. The \cs{relax} is used as end marker.
+% \begin{macrocode}
+\def\svnprov@splitfilename#1{%
+ \edef\g@tempa{#1}%
+ \let\svnprov@filebase@\@gobble
+ \expandafter
+ \svnprov@splitfilename@\g@tempa.\relax
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\svnprov@splitfilename@}
+% The second argument is tested if it is empty (end of file name reached). If
+% not empty the first argument is concatenated to the file base macro and the
+% macro calls itself on the second argument. This ensures correct handling of
+% file name which contain multiple dots.
+%
+% If the second argument was empty it is tested if the file base name is still
+% in its initialised state which means that there is no file extension. Then the
+% file base is defined to the first argument and the extension as empty.
+% Otherwise the file extension is defined to the first argument and the file
+% base macro is unchanged because it is already correct.
+% \begin{macrocode}
+\def\svnprov@splitfilename@#1.#2\relax{%
+ \if&#2&
+ \ifx\svnprov@filebase@\@gobble
+ \gdef\svnprov@filebase@{#1}%
+ \gdef\svnprov@fileext@{}%
+ \else
+ \gdef\svnprov@fileext@{#1}%
+ \fi
+ \let\next\relax
+ \else
+ \xdef\svnprov@filebase@{\svnprov@filebase@.#1}%
+ \def\next{\svnprov@splitfilename@#2\relax}%
+ \fi
+ \next
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\svnprov@gobblerest}
+% Simply gobbles everything up to the next endmarker.
+% \begin{macrocode}
+\def\svnprov@gobblerest#1\svnprov@endmarker{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\svnprov@endmarker}
+% This is the end marker which should never be expanded. However it gets defined
+% and set to an unique definition which will gobble itself if ever expanded.
+% \begin{macrocode}
+\def\svnprov@endmarker{\@gobble{svn-prov endmarker}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\svnprov@gobbleopt}
+% Gobbles an optional argument if present.
+% \begin{macrocode}
+\newcommand*\svnprov@gobbleopt[1][]{}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\svnprov@defaultdesc}
+% Default description text to be used. Does not include the file date which is
+% prepended later.
+% \begin{macrocode}
+\def\svnprov@defaultdesc{%
+ (SVN Rev:\space\svnprov@filerev@)%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\svnprov@buildstring}
+% First aliases the internal macro to user-friendly names and then builds the
+% info string. Finally the stored original LaTeX macro is called with the
+% filename and information.
+% \begin{macrocode}
+\newcommand*\svnprov@buildstring[1][\svnprov@defaultdesc]{%
+ \@ifnextchar{[}%
+ {\svnprov@buildstring@{#1}}%
+ {\svnprov@buildstring@{#1}[\relax]}%
+}
+\def\svnprov@buildstring@#1[#2]{%
+ \endgroup
+ \begingroup
+ \let\rev\svnprov@filerev@
+ \let\filerev\svnprov@filerev@
+ \def\Rev{\rev\space}%
+ \let\revinfo\svnprov@defaultdesc
+ \let\filebase\svnprov@filebase@
+ \let\fileext\svnprov@fileext@
+ \ifx\fileversion\@undefined
+ \def\fileversion{v0.0}%
+ \fi
+ \edef\filename{\filebase.\fileext}%
+ \xdef\svnprov@filename{\svnprov@filename}%
+ \ifx\svnprov@filename\filename\else
+ \svnprov@splitfilename{\svnprov@filename}%
+ \fi
+ \let\filename\svnprov@filename
+ \ifx\relax#2\empty
+ \xdef\svnprov@fileinfo@{#1}%
+ \svnprov@getversion{#1}%
+ \global\let\svnprov@filedesc@\svnprov@filedesc@
+ \global\let\svnprov@fileinfo@\svnprov@fileinfo@
+ \else
+ \xdef\svnprov@fileversion@{#1}%
+ \xdef\svnprov@filedesc@{#2}%
+ \xdef\svnprov@fileinfo@{#1 #2}%
+ \fi
+ \endgroup
+ \svnprov@ltxprov{\svnprov@filemask}%
+ [\svnprov@filedate@
+ \ifx\svnprov@fileinfo@\empty\else
+ \space
+ \svnprov@fileinfo@
+ \fi
+ ]%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\GetFileInfoSVN}
+% \changes{v3.}{2010/04/01}{Added non-star version.}
+% The macro provides the file information of the given file, or (the star version) the last file which called one of the above \cs{Provides\ldots} macros.
+% For this the internal macros are simply copied to user-friendly names.
+%
+% This macro is inspired by the macro \cs{GetFileInfo}\marg{file name} from the
+% \texttt{doc} package.
+% \begin{macrocode}
+\def\GetFileInfoSVN#1{%
+ \ifx*#1\relax
+ \let\filebase\svnprov@filebase@
+ \let\fileext\svnprov@fileext@
+ \let\filename\svnprov@filename
+ \let\filedate\svnprov@filedate@
+ \let\filerev\svnprov@filerev@
+ \let\fileversion\svnprov@fileversion@
+ \let\fileinfo\svnprov@filedesc@
+ \let\filetoday\svnprov@filetoday@
+ \else
+% \end{macrocode}
+% Given argument could be filename or short name.
+% If a short name exists for the argument it was a filename is is defined as such,
+% otherwise the filename is read from the |\|\meta{short name}|@long| macro.
+% \begin{macrocode}
+ \expandafter\let\expandafter\@gtempa\csname#1@short\endcsname%
+ \ifx\@gtempa\relax
+ \def\@gtempa{#1}%
+ \expandafter\let\expandafter\filename\csname#1@long\endcsname
+ \else
+ \edef\filename{#1}%
+ \fi
+ \expandafter\let\expandafter\filebase\csname\@gtempa @base\endcsname
+ \expandafter\let\expandafter\fileext \csname\@gtempa @ext\endcsname
+ \expandafter\let\expandafter\filedate\csname\@gtempa @date\endcsname
+ \expandafter\let\expandafter\filerev \csname\@gtempa @rev\endcsname
+ \expandafter\let\expandafter\fileversion\csname\@gtempa @version\endcsname
+ \expandafter\let\expandafter\fileinfo\csname\@gtempa @info\endcsname
+ \expandafter\let\expandafter\filetoday\csname\@gtempa @today\endcsname
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\DefineFileInfoSVN}
+% Defines macros in the form |\|\meta{filename}|@|\meta{xxx}, where \meta{xxx} is |date|, |version|, |rev|(ision), |info|, (file name)|base| and |ext|(ension).
+% \changes{v3.}{2010/04/01}{Added file name `base' and 'ext'(ension).}
+% \begin{macrocode}
+\newcommand*\DefineFileInfoSVN[1][\svnprov@filemask]{%
+ \expandafter
+ \edef\csname\svnprov@filemask @short\endcsname{#1}%
+ \expandafter
+ \edef\csname#1@long\endcsname{\svnprov@filemask}%
+ \expandafter
+ \let\csname#1@base\endcsname\svnprov@filebase@
+ \expandafter
+ \let\csname#1@ext\endcsname\svnprov@fileext@
+ \expandafter
+ \let\csname#1@date\endcsname\svnprov@filedate@
+ \expandafter
+ \let\csname#1@version\endcsname\svnprov@fileversion@
+ \expandafter
+ \let\csname#1@rev\endcsname\svnprov@filerev@
+ \expandafter
+ \let\csname#1@info\endcsname\svnprov@filedesc@
+ \expandafter
+ \let\csname#1@today\endcsname\svnprov@filetoday@
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\svnprov@getversion}
+% Checks if the argument (a file description) starts with `|v|'. If so
+% everything until the first space is taken as version number. Otherwise
+% the whole text is taken as description without version.
+% Special care is taken to avoid a parser error if there is no space included.
+% \changes{v3.}{2010/04/01}{Changed to look for leading `v' not just everything up to the first space.}
+% \begin{macrocode}
+\def\svnprov@getversion#1{%
+ \edef\@tempa{#1\space}%
+ \expandafter\svnprov@@getversion\@tempa\svnprov@endmarker
+}
+\def\svnprov@@getversion{%
+ \@ifnextchar{v}%
+ {\svnprov@getversion@}%
+ {\svnprov@getversion@@}%
+}
+\def\svnprov@getversion@#1 #2\svnprov@endmarker{%
+ \gdef\svnprov@fileversion@{#1}%
+ \ifx&#2&%
+ \gdef\svnprov@filedesc@{}%
+ \else
+ \xdef\svnprov@filedesc@{\svnprov@zapspace#2\svnprov@endmarker}%
+ \fi
+}
+\def\svnprov@getversion@@#1 \svnprov@endmarker{%
+ \gdef\svnprov@fileversion@{}%
+ \gdef\svnprov@filedesc@{#1}%
+}
+\def\svnprov@zapspace#1 \svnprov@endmarker{#1}
+% \end{macrocode}
+% \end{macro}
+%
+% Finally, call the macros for this package itself.
+% \begin{macrocode}
+\ProvidesPackageSVN{$Id: svn-prov.dtx 1862 2010-04-24 14:19:07Z martin $}%
+ [\svnprov@version\space Package Date/Version from SVN Keywords]
+\DefineFileInfoSVN[svnprov]
+% \end{macrocode}
+%
+% \iffalse
+%</package>
+% \fi
+%
+% \Finale
+
diff --git a/macros/latex/contrib/svn-prov/svn-prov.ins b/macros/latex/contrib/svn-prov/svn-prov.ins
new file mode 100644
index 0000000000..1ad59c32ee
--- /dev/null
+++ b/macros/latex/contrib/svn-prov/svn-prov.ins
@@ -0,0 +1,47 @@
+%% $Id: svn-prov.ins 1039 2009-05-02 15:42:31Z martin $
+\input docstrip.tex
+\preamble
+
+Copyright (C) 2009 by Martin Scharrer <martin@scharrer-online.de>
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either version 1.3c
+of this license or (at your option) any later version.
+The latest version of this license is in
+
+ http://www.latex-project.org/lppl.txt
+
+and version 1.3c or later is part of all distributions of LaTeX
+version 2008/05/04 or later.
+
+This work has the LPPL maintenance status `maintained'.
+
+The Current Maintainer of this work is Martin Scharrer.
+
+This work consists of the files svn-prov.dtx, svn-prov.ins
+and the derived file svn-prov.sty.
+
+\endpreamble
+\keepsilent
+
+\usedir{tex/latex/svn-prov}
+
+\generate{\file{svn-prov.sty}{\from{svn-prov.dtx}{package}}}
+
+\obeyspaces
+\Msg{*************************************************************}
+\Msg{* *}
+\Msg{* To finish the installation you have to move the following *}
+\Msg{* file into a directory searched by TeX: *}
+\Msg{* *}
+\Msg{* svn-prov.sty *}
+\Msg{* *}
+\Msg{* To produce the documentation run the file svn-prov.dtx *}
+\Msg{* through LaTeX. *}
+\Msg{* *}
+\Msg{* Happy TeXing! *}
+\Msg{* *}
+\Msg{*************************************************************}
+
+\endbatchfile
+% vim: ft=tex
diff --git a/macros/latex/contrib/svn-prov/svn-prov.pdf b/macros/latex/contrib/svn-prov/svn-prov.pdf
new file mode 100644
index 0000000000..b4157fed46
--- /dev/null
+++ b/macros/latex/contrib/svn-prov/svn-prov.pdf
Binary files differ