diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/svn-prov |
Initial commit
Diffstat (limited to 'macros/latex/contrib/svn-prov')
-rw-r--r-- | macros/latex/contrib/svn-prov/Makefile | 144 | ||||
-rw-r--r-- | macros/latex/contrib/svn-prov/README | 17 | ||||
-rw-r--r-- | macros/latex/contrib/svn-prov/svn-prov.dtx | 791 | ||||
-rw-r--r-- | macros/latex/contrib/svn-prov/svn-prov.ins | 47 | ||||
-rw-r--r-- | macros/latex/contrib/svn-prov/svn-prov.pdf | bin | 0 -> 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& + \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&% + \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 Binary files differnew file mode 100644 index 0000000000..b4157fed46 --- /dev/null +++ b/macros/latex/contrib/svn-prov/svn-prov.pdf |