summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/filemod
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/filemod
Initial commit
Diffstat (limited to 'macros/latex/contrib/filemod')
-rw-r--r--macros/latex/contrib/filemod/README58
-rw-r--r--macros/latex/contrib/filemod/filemod-expmin.sty91
-rw-r--r--macros/latex/contrib/filemod/filemod-expmin.tex92
-rw-r--r--macros/latex/contrib/filemod/filemod.pdfbin0 -> 279161 bytes
-rw-r--r--macros/latex/contrib/filemod/filemod.sty372
-rw-r--r--macros/latex/contrib/filemod/filemod.tex381
6 files changed, 994 insertions, 0 deletions
diff --git a/macros/latex/contrib/filemod/README b/macros/latex/contrib/filemod/README
new file mode 100644
index 0000000000..6f48dd2195
--- /dev/null
+++ b/macros/latex/contrib/filemod/README
@@ -0,0 +1,58 @@
+The filemod Package
+~~~~~~~~~~~~~~~~~~~
+Copyright (C) Martin Scharrer <martin@scharrer-online.de>
+
+This package provides macros to read and compare the modification dates
+of files. These files can be .tex files, images or other files as long as they can be
+found by the LaTeX compiler. It uses the \pdffilemoddate primitive of pdfLaTeX
+to receive the file modification date as PDF date string, parses it and returns
+the value to the user.
+The functionality is provided by purely expandable macros or by faster but non-expandable ones.
+
+This package will work with LaTeX and plain eTeX as long pdf(La)TeX (in
+PDF or DVI mode) or Lua(La)TeX is used. Xe(La)TeX is not supported because it
+does not provide \pdffilemoddate.
+
+Examples:
+ % Prints file modification date and time of main file
+ \filemodprint{\jobname}
+
+ % Include newest of a set of files:
+ \input{\filemodNewest{{file1}{file2}{file3}}}
+
+ % Include newest of a set of images:
+ % (\includegraphics doesn't expand its fully before parsing it)
+ \FilemodNewest{{file1}{file2}{file3}}
+ \includegraphics{\filemodresultfile}
+
+
+REQUIREMENTS:
+=============
+pdflatex v1.30.0 or later is required.
+Alternative LuaTeX can be used together with the `pdftexcmds` package.
+
+
+INSTALLATION:
+=============
+Compile the DTX file (with included INS file) through pdflatex:
+
+ pdflatex filemod.dtx
+ pdflatex filemod.dtx
+ pdflatex filemod.dtx
+
+Copy the files to the following directories which must be created beforehand.
+Example for a Unix/Linux OS, change accordantly for MS Windows and Mac, e.g.
+copy it using a graphics interface.
+
+ cp filemod*.sty ${TEXMF}/tex/latex/filemod/
+ cp filemod*.tex ${TEXMF}/tex/generic/filemod/
+
+OPTIONAL:
+The documentation can be installed by:
+ cp filemod.pdf README ${TEXMF}/doc/latex/filemod/
+
+The source can be installed by:
+ cp filemod.dtx ${TEXMF}/source/latex/filemod/
+
+The TEXMF is /usr/local/texlive/2010/texmf-dist, ${HOME}/texmf or similar.
+
diff --git a/macros/latex/contrib/filemod/filemod-expmin.sty b/macros/latex/contrib/filemod/filemod-expmin.sty
new file mode 100644
index 0000000000..2329a898d6
--- /dev/null
+++ b/macros/latex/contrib/filemod/filemod-expmin.sty
@@ -0,0 +1,91 @@
+%%
+%% Copyright (C) 2011 by Martin Scharrer <martin@scharrer.me>
+%% ----------------------------------------------------------
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3 or later is part of all distributions of LaTeX
+%% version 2005/12/01 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 filemod.dtx and filemod.ins
+%% and the derived files filemod.sty, filemod-expmin.sty,
+%% filemod.tex and filemod-expmin.tex.
+%%
+\ProvidesPackage{filemod-expmin}[%
+ 2011/09/19
+ v1.2
+ Get and compare file modification times (expandable; minimal)]
+\newif\iffilemod@direct
+\filemod@directtrue
+\ifx\pdffilemoddate\@undefined
+ \RequirePackage{pdftexcmds}
+ \filemod@directfalse
+ \ifx\pdf@filemoddate\@undefined
+ \edef\filemod@help
+ {The required command \string\pdffilemoddate\space is not defined.
+ This means that the used\space\space LaTeX compiler does not support it.
+ Please make sure that pdfLaTeX 1.30.0 or\space\space\space newer or LuaLaTeX is used.
+ XeLaTeX does not support reading file modification\space\space dates.
+ }%
+ \PackageError{filemod}{Required command \string\pdffilemoddate\space is not defined!}{\filemod@help}
+ \fi
+\fi
+\begingroup
+\catcode`\D=12
+\catcode`\Z=12
+\catcode`\:=12
+\newcommand*\filemodNumdate{}
+\iffilemod@direct
+\gdef\filemodNumdate#1{%
+ \expandafter\filemod@Numdate\pdffilemoddate{#1}D:00000000000000Z\relax
+}
+\else
+\gdef\filemodNumdate#1{%
+ \expandafter\expandafter
+ \expandafter\filemod@Numdate\pdf@filemoddate{#1}D:00000000000000Z\relax
+}
+\fi
+\gdef\filemod@Numdate D:#1#2#3#4#5#6#7#8#9\relax{%
+ #1#2#3#4#5#6#7#8%
+}
+\newcommand*\filemodNumtime{}
+\iffilemod@direct
+\gdef\filemodNumtime#1{%
+ \expandafter\filemod@Numtime\pdffilemoddate{#1}D:00000000000000Z\relax
+}
+\else
+\gdef\filemodNumtime#1{%
+ \expandafter\expandafter
+ \expandafter\filemod@Numtime\pdf@filemoddate{#1}D:00000000000000Z\relax
+}
+\fi
+\gdef\filemod@Numtime D:#1#2#3#4#5#6#7#8#9\relax{%
+ \filemod@@Numtime#9\relax
+}
+\gdef\filemod@@Numtime#1#2#3#4#5#6#7\relax{%
+ #1#2#3#4#5#6%
+}
+\endgroup
+\newcommand*\filemodCmp[2]%
+{%
+ \ifcase0%
+ \ifnum\filemodNumdate{#2}>\filemodNumdate{#1} 1\else
+ \ifnum\filemodNumdate{#2}=\filemodNumdate{#1} %
+ \ifnum\filemodNumtime{#2}>\filemodNumtime{#1} 1\fi
+ \fi
+ \fi
+ \space
+ \expandafter\@firstoftwo
+ \or
+ \expandafter\@secondoftwo
+ \fi
+}
+\endinput
+%%
+%% End of file `filemod-expmin.sty'.
diff --git a/macros/latex/contrib/filemod/filemod-expmin.tex b/macros/latex/contrib/filemod/filemod-expmin.tex
new file mode 100644
index 0000000000..dc43b328d6
--- /dev/null
+++ b/macros/latex/contrib/filemod/filemod-expmin.tex
@@ -0,0 +1,92 @@
+%%
+%% Copyright (C) 2011 by Martin Scharrer <martin@scharrer.me>
+%% ----------------------------------------------------------
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3 or later is part of all distributions of LaTeX
+%% version 2005/12/01 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 filemod.dtx and filemod.ins
+%% and the derived files filemod.sty, filemod-expmin.sty,
+%% filemod.tex and filemod-expmin.tex.
+%%
+\expandafter\edef\csname filemod@cat\endcsname{\noexpand\catcode`\noexpand\@=\the\catcode`\@\relax}
+\catcode`\@=11
+\newif\iffilemod@direct
+\filemod@directtrue
+\ifx\pdffilemoddate\@undefined
+ \input pdftexcmds.sty
+ \filemod@directfalse
+ \ifx\pdf@filemoddate\@undefined
+ \edef\filemod@help
+ {The required command \string\pdffilemoddate\space is not defined.
+ This means that the used\space\space LaTeX compiler does not support it.
+ Please make sure that pdfLaTeX 1.30.0 or\space\space\space newer or LuaLaTeX is used.
+ XeLaTeX does not support reading file modification\space\space dates.
+ }%
+ \errhelp\expandafter{\filemod@help}
+ \errmessage{filemod package: Required command \string\pdffilemoddate\space is not defined!}
+ \fi
+\fi
+\begingroup
+\catcode`\D=12
+\catcode`\Z=12
+\catcode`\:=12
+\iffilemod@direct
+\gdef\filemodNumdate#1{%
+ \expandafter\filemod@Numdate\pdffilemoddate{#1}D:00000000000000Z\relax
+}
+\else
+\gdef\filemodNumdate#1{%
+ \expandafter\expandafter
+ \expandafter\filemod@Numdate\pdf@filemoddate{#1}D:00000000000000Z\relax
+}
+\fi
+\gdef\filemod@Numdate D:#1#2#3#4#5#6#7#8#9\relax{%
+ #1#2#3#4#5#6#7#8%
+}
+\iffilemod@direct
+\gdef\filemodNumtime#1{%
+ \expandafter\filemod@Numtime\pdffilemoddate{#1}D:00000000000000Z\relax
+}
+\else
+\gdef\filemodNumtime#1{%
+ \expandafter\expandafter
+ \expandafter\filemod@Numtime\pdf@filemoddate{#1}D:00000000000000Z\relax
+}
+\fi
+\gdef\filemod@Numtime D:#1#2#3#4#5#6#7#8#9\relax{%
+ \filemod@@Numtime#9\relax
+}
+\gdef\filemod@@Numtime#1#2#3#4#5#6#7\relax{%
+ #1#2#3#4#5#6%
+}
+\endgroup
+\def\filemodCmp#1#2%
+{%
+ \ifcase0%
+ \ifnum\filemodNumdate{#2}>\filemodNumdate{#1} 1\else
+ \ifnum\filemodNumdate{#2}=\filemodNumdate{#1} %
+ \ifnum\filemodNumtime{#2}>\filemodNumtime{#1} 1\fi
+ \fi
+ \fi
+ \space
+ \expandafter\@firstoftwo
+ \or
+ \expandafter\@secondoftwo
+ \fi
+}
+\long\def\@firstoftwo#1#2{#1}
+\long\def\@secondoftwo#1#2{#2}
+\filemod@cat
+\expandafter\let\csname filemod@cat\endcsname\relax
+\endinput
+%%
+%% End of file `filemod-expmin.tex'.
diff --git a/macros/latex/contrib/filemod/filemod.pdf b/macros/latex/contrib/filemod/filemod.pdf
new file mode 100644
index 0000000000..c19dc38af1
--- /dev/null
+++ b/macros/latex/contrib/filemod/filemod.pdf
Binary files differ
diff --git a/macros/latex/contrib/filemod/filemod.sty b/macros/latex/contrib/filemod/filemod.sty
new file mode 100644
index 0000000000..7c860761d7
--- /dev/null
+++ b/macros/latex/contrib/filemod/filemod.sty
@@ -0,0 +1,372 @@
+%%
+%% Copyright (C) 2011 by Martin Scharrer <martin@scharrer.me>
+%% ----------------------------------------------------------
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3 or later is part of all distributions of LaTeX
+%% version 2005/12/01 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 filemod.dtx and filemod.ins
+%% and the derived files filemod.sty, filemod-expmin.sty,
+%% filemod.tex and filemod-expmin.tex.
+%%
+\ProvidesPackage{filemod}[%
+ 2011/09/19
+ v1.2
+ Get and compare file modification times]
+\RequirePackage{filemod-expmin}
+\newcommand*\filemodparse{}
+\iffilemod@direct
+\def\filemodparse#1#2{%
+ \expandafter\filemod@parse\pdffilemoddate{#2}\relax{#1}%
+}
+\else
+\def\filemodparse#1#2{%
+ \expandafter\expandafter
+ \expandafter\filemod@parse\pdf@filemoddate{#2}\relax{#1}%
+}
+\fi
+\def\filemod@parse#1\relax#2{%
+ \ifx\relax#1\relax
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+ {\filemodnotexists{#2}}%
+ {\filemod@parse@#1\empty{#2}\relax}%
+}
+\begingroup
+\catcode`\D=12
+\catcode`\Z=12
+\catcode`\:=12
+\gdef\filemod@parse@ D:#1#2#3#4#5#6#7#8#9\relax{%
+ \filemod@parse@@{{#1#2#3#4}{#5#6}{#7#8}}#9\relax
+}
+\newcommand*\filemodnotexists{}
+\gdef\filemodnotexists#1{%
+ #1{0000}{00}{00}{00}{00}{00}{Z}%
+}
+\endgroup
+\def\filemod@parse@@#1#2#3#4#5#6#7#8\empty#9\relax{%
+ #9#1{#2#3}{#4#5}{#6#7}{#8}%
+}
+\newcommand*%
+\filemodnumdate{\filemodparse\filemod@numdate}
+\def\filemod@numdate#1#2#3#4#5#6#7{#1#2#3}
+\newcommand*%
+\filemodnumtime{\filemodparse\filemod@numtime}
+\def\filemod@numtime#1#2#3#4#5#6#7{#4#5#6}
+\def\filemod@opt#1#2#3{%
+ \expandafter
+ \remove@to@nnil@exec
+ \ifx[#3\@nnil\remove@to@nnil
+ \expandafter#1%
+ \else\@nnil\empty
+ \expandafter#2%
+ \expandafter\filemodoptdefault
+ \fi
+ {#3}%
+}
+\def\remove@to@nnil@exec#1\@nnil#2{%
+ \ifx\@nnil#1\@nnil\else
+ \expandafter#2
+ \fi
+}
+\newcommand*%
+\filemodcmp{%
+ \filemod@opt\filemod@cmp@opt\filemod@cmp
+}
+\newcommand*%
+\filemodoptdefault{1}
+\def\filemod@cmp@opt#1#2]{%
+ \filemod@cmp{#2}%
+}
+\def\filemod@cmp{\filemod@@cmp>}
+\def\filemod@@cmp#1#2#3#4{%
+ \ifcase0%
+ \ifnum\filemodnumdate{#4}#1\filemodnumdate{#3} 1\else
+ \ifnum\filemodnumdate{#4}=\filemodnumdate{#3} %
+ \ifnum\filemodnumtime{#4}#1\filemodnumtime{#3} 1\else
+ \ifnum\filemodnumtime{#4}=\filemodnumtime{#3} 2\fi
+ \fi
+ \fi
+ \fi
+ \space
+ \csname @firstoft\ifnum#2>2 hree\else wo\fi\expandafter\endcsname
+ \or
+ \csname @secondoft\ifnum#2>2 hree\else wo\fi\expandafter\endcsname
+ \else
+ \csname @%
+ \ifcase#2%
+ gobbletwo%
+ \or
+ firstoftwo%
+ \or
+ secondoftwo%
+ \else
+ thirdofthree%
+ \fi
+ \expandafter
+ \endcsname
+ \fi
+}
+\long\def\@firstofthree#1#2#3{#1}
+\long\def\@secondofthree#1#2#3{#2}
+\newcommand*%
+\filemodnewest{%
+ \filemod@opt\filemod@newest@opt\filemod@newest
+}
+\def\filemod@newest@opt#1#2]{%
+ \filemod@newest{#2}%
+}
+\def\filemod@newest#1#2#3{%
+ \filemod@@cmp>{#1}{#2}{#3}{#2}{#3}%
+}
+\newcommand*%
+\filemodoldest{%
+ \filemod@opt\filemod@oldest@opt\filemod@oldest
+}
+\def\filemod@oldest@opt#1#2]{%
+ \filemod@oldest{#2}%
+}
+\def\filemod@oldest#1#2#3{%
+ \filemod@@cmp<{#1}{#2}{#3}{#2}{#3}%
+}
+\newcommand*\filemodNewest{}
+\def\filemodNewest#1#{%
+ \expandafter\expandafter
+ \expandafter\@filemodNewest
+ \csname
+ @%
+ \ifx\@nnil#1\@nnil
+ first%
+ \else
+ second%
+ \fi
+ oftwo%
+ \endcsname
+ {[\filemodoptdefault]}%
+ {#1}%
+}
+\newcommand*\filemodOldest{}
+\def\filemodOldest#1#{%
+ \expandafter\expandafter
+ \expandafter\@filemodOldest
+ \csname
+ @%
+ \ifx\@nnil#1\@nnil
+ first%
+ \else
+ second%
+ \fi
+ oftwo%
+ \endcsname
+ {[\filemodoptdefault]}%
+ {#1}%
+}
+\def\@filemodNewest[#1]#2{%
+ \@@filemodNewest{#1}#2\filemod@end
+}
+\def\@filemodOldest[#1]#2{%
+ \@@filemodOldest{#1}#2\filemod@end
+}
+\def\@@filemodNewest#1#2{%
+ \filemod@Newest{#2}{#1}%
+}
+\def\@@filemodOldest#1#2{%
+ \filemod@Oldest{#2}{#1}%
+}
+\def\filemod@Newest#1#2#3{%
+ \iffilemod@end{#3}%
+ {#1}%
+ {%
+ \expandafter\expandafter
+ \expandafter\expandafter
+ \expandafter\expandafter
+ \expandafter\filemod@Newest
+ \expandafter\expandafter
+ \expandafter\expandafter
+ \expandafter\expandafter
+ \expandafter{%
+ \expandafter\expandafter
+ \expandafter\@gobble
+ \expandafter\string\csname\filemod@@cmp>{#2}{#1}{#3}{#1}{#3}\endcsname}{#2}}%
+}
+\def\filemod@Oldest#1#2#3{%
+ \iffilemod@end{#3}%
+ {#1}%
+ {%
+ \expandafter\expandafter
+ \expandafter\expandafter
+ \expandafter\expandafter
+ \expandafter\filemod@Oldest
+ \expandafter\expandafter
+ \expandafter\expandafter
+ \expandafter\expandafter
+ \expandafter{%
+ \expandafter\expandafter
+ \expandafter\@gobble
+ \expandafter\string\csname\filemod@@cmp<{#2}{#1}{#3}{#1}{#3}\endcsname}{#2}}%
+}
+\def\iffilemod@end#1{%
+ \ifx\filemod@end#1%
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+}
+\def\filemod@end{\@gobble{filemod@end}}
+\newcommand*%
+\Filemodgetnum{\filemodparse\Filemod@getnum}
+\def\Filemod@getnum#1#2#3#4#5#6#7{%
+ \def\filemoddate{#1#2#3}%
+ \def\filemodtime{#4#5#6}%
+ \def\filemodtz{#7}%
+}
+\newcommand\Filemodcmp[1][1]{%
+ \def\filemod@next{\filemodcmpresult}%
+ \Filemod@cmp{#1}%
+}
+\newcommand\FilemodCmp[1][1]{%
+ \let\filemod@next\empty
+ \Filemod@cmp{#1}%
+}
+\def\Filemod@cmp#1#2#3{%
+ \Filemodgetnum{#2}%
+ \let\filemoddatea\filemoddate
+ \let\filemodtimea\filemodtime
+ \Filemodgetnum{#3}%
+ \ifcase0%
+ \ifnum\filemoddate>\filemoddatea\space1\else
+ \ifnum\filemoddate=\filemoddatea\space
+ \ifnum\filemodtime>\filemodtimea\space1\else
+ \ifnum\filemodtime=\filemodtimea\space2\fi
+ \fi
+ \fi
+ \fi
+ \relax
+ \def\filemodresultfile{#1}%
+ \ifnum#1>2\relax
+ \def\filemodcmpresult##1##2##3{##1}%
+ \else
+ \let\filemodcmpresult\@firstoftwo
+ \fi
+ \or
+ \def\filemodresultfile{#2}%
+ \ifnum#1>2\relax
+ \def\filemodcmpresult##1##2##3{##2}%
+ \else
+ \let\filemodcmpresult\@secondoftwo
+ \fi
+ \else
+ \ifcase#1\relax
+ \let\filemodresultfile\empty
+ \let\filemodcmpresult\@gobbletwo
+ \or
+ \def\filemodresultfile{#1}%
+ \let\filemodcmpresult\@firstoftwo
+ \or
+ \def\filemodresultfile{#2}%
+ \let\filemodcmpresult\@secondoftwo
+ \else
+ \let\filemodresultfile\empty
+ \let\filemodcmpresult\@thirdofthree
+ \fi
+ \fi
+ \filemod@next
+}
+\newcommand*\Filemodnewest[3][\filemodoptdefault]{\FilemodNewest[{#1}]{{#2}{#3}}}
+\newcommand*\Filemodoldest[3][\filemodoptdefault]{\FilemodOldest[{#1}]{{#2}{#3}}}
+\newcommand*\FilemodNewest[2][\filemodoptdefault]%
+{%
+ \def\filemode@tie{#1}%
+ \def\filemod@gl{>}%
+ \Filemod@est#2\filemod@end
+}
+\newcommand*\FilemodOldest[2][\filemodoptdefault]%
+{%
+ \def\filemode@tie{#1}%
+ \def\filemod@gl{<}%
+ \Filemod@est#2\filemod@end
+}
+\def\Filemod@est#1{%
+ \def\filemodresultfile{#1}%
+ \Filemodgetnum{#1}%
+ \let\filemodresultdate\filemoddate
+ \let\filemodresulttime\filemodtime
+ \Filemod@@est
+}
+\def\Filemod@@est#1{%
+ \iffilemod@end{#1}{}{%
+ \Filemodgetnum{#1}%
+ \ifcase0%
+ \ifnum\filemoddate\filemod@gl\filemodresultdate\space1\else
+ \ifnum\filemoddate=\filemodresultdate\space
+ \ifnum\filemodtime\filemod@gl\filemodresulttime\space1\else
+ \ifnum\filemodtime=\filemodresulttime\space
+ \ifnum\filemode@tie=1\else 1\fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \else
+ \def\filemodresultfile{#1}%
+ \let\filemodresultdate\filemoddate
+ \let\filemodresulttime\filemodtime
+ \fi
+ \Filemod@@est
+ }%
+}
+\def\filemod@gl{>}
+\newcommand*\Filemodtoday[1]%
+{{%
+ \def\thefilemod##1##2##3##4##5##6##7{\year##1 \month##2 \day##3 \today}%
+ \filemodprint{#1}%
+}}
+\newcommand*\FilemodToday[1]%
+{{%
+ \def\thefilemoddate##1##2##3{\year##1 \month##2 \day##3 \today}%
+ \filemodprint{#1}%
+}}
+\newcommand*
+\filemodprint{\filemodparse\thefilemod}
+\newcommand*
+\filemodprintdate{\filemodparse\the@filemoddate}
+\newcommand*
+\filemodprinttime{\filemodparse\the@filemodtime}
+\newcommand*\thefilemod[7]%
+{%
+ \thefilemoddate{#1}{#2}{#3}%
+ \filemodsep
+ \thefilemodtime{#4}{#5}{#6}{#7}%
+}
+\newcommand*\filemodsep{ }
+\newcommand*\thefilemoddate[3]%
+{#1/#2/#3}
+\newcommand*\thefilemodtime[4]%
+{%
+ #1:#2:#3~#4%
+}
+\def\the@filemoddate#1#2#3#4#5#6#7{%
+ \thefilemoddate{#1}{#2}{#3}%
+}
+\def\the@filemodtime#1#2#3{%
+ \thefilemodtime
+}
+\newcommand*\filemodZ{}
+\newcommand*\filemodz{}
+\begingroup
+\catcode`\D=12
+\expandafter\gdef\csname filemodZ\endcsname{Z}%
+\let\filemodz=Z\relax
+\endgroup
+\endinput
+%%
+%% End of file `filemod.sty'.
diff --git a/macros/latex/contrib/filemod/filemod.tex b/macros/latex/contrib/filemod/filemod.tex
new file mode 100644
index 0000000000..7a463cd410
--- /dev/null
+++ b/macros/latex/contrib/filemod/filemod.tex
@@ -0,0 +1,381 @@
+%%
+%% Copyright (C) 2011 by Martin Scharrer <martin@scharrer.me>
+%% ----------------------------------------------------------
+%% This work may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%% and version 1.3 or later is part of all distributions of LaTeX
+%% version 2005/12/01 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 filemod.dtx and filemod.ins
+%% and the derived files filemod.sty, filemod-expmin.sty,
+%% filemod.tex and filemod-expmin.tex.
+%%
+\input filemod-expmin
+\expandafter\edef\csname filemod@cat\endcsname{\noexpand\catcode`\noexpand\@=\the\catcode`\@\relax}
+\catcode`\@=11
+\iffilemod@direct
+\def\filemodparse#1#2{%
+ \expandafter\filemod@parse\pdffilemoddate{#2}\relax{#1}%
+}
+\else
+\def\filemodparse#1#2{%
+ \expandafter\expandafter
+ \expandafter\filemod@parse\pdf@filemoddate{#2}\relax{#1}%
+}
+\fi
+\def\filemod@parse#1\relax#2{%
+ \ifx\relax#1\relax
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+ {\filemodnotexists{#2}}%
+ {\filemod@parse@#1\empty{#2}\relax}%
+}
+\begingroup
+\catcode`\D=12
+\catcode`\Z=12
+\catcode`\:=12
+\gdef\filemod@parse@ D:#1#2#3#4#5#6#7#8#9\relax{%
+ \filemod@parse@@{{#1#2#3#4}{#5#6}{#7#8}}#9\relax
+}
+\gdef\filemodnotexists#1{%
+ #1{0000}{00}{00}{00}{00}{00}{Z}%
+}
+\endgroup
+\def\filemod@parse@@#1#2#3#4#5#6#7#8\empty#9\relax{%
+ #9#1{#2#3}{#4#5}{#6#7}{#8}%
+}
+\def
+\filemodnumdate{\filemodparse\filemod@numdate}
+\def\filemod@numdate#1#2#3#4#5#6#7{#1#2#3}
+\def
+\filemodnumtime{\filemodparse\filemod@numtime}
+\def\filemod@numtime#1#2#3#4#5#6#7{#4#5#6}
+\def\filemod@opt#1#2#3{%
+ \expandafter
+ \remove@to@nnil@exec
+ \ifx[#3\@nnil\remove@to@nnil
+ \expandafter#1%
+ \else\@nnil\empty
+ \expandafter#2%
+ \expandafter\filemodoptdefault
+ \fi
+ {#3}%
+}
+\def\remove@to@nnil@exec#1\@nnil#2{%
+ \ifx\@nnil#1\@nnil\else
+ \expandafter#2
+ \fi
+}
+\def
+\filemodcmp{%
+ \filemod@opt\filemod@cmp@opt\filemod@cmp
+}
+\def
+\filemodoptdefault{1}
+\def\filemod@cmp@opt#1#2]{%
+ \filemod@cmp{#2}%
+}
+\def\filemod@cmp{\filemod@@cmp>}
+\def\filemod@@cmp#1#2#3#4{%
+ \ifcase0%
+ \ifnum\filemodnumdate{#4}#1\filemodnumdate{#3} 1\else
+ \ifnum\filemodnumdate{#4}=\filemodnumdate{#3} %
+ \ifnum\filemodnumtime{#4}#1\filemodnumtime{#3} 1\else
+ \ifnum\filemodnumtime{#4}=\filemodnumtime{#3} 2\fi
+ \fi
+ \fi
+ \fi
+ \space
+ \csname @firstoft\ifnum#2>2 hree\else wo\fi\expandafter\endcsname
+ \or
+ \csname @secondoft\ifnum#2>2 hree\else wo\fi\expandafter\endcsname
+ \else
+ \csname @%
+ \ifcase#2%
+ gobbletwo%
+ \or
+ firstoftwo%
+ \or
+ secondoftwo%
+ \else
+ thirdofthree%
+ \fi
+ \expandafter
+ \endcsname
+ \fi
+}
+\long\def\@firstofthree#1#2#3{#1}
+\long\def\@secondofthree#1#2#3{#2}
+\long\def\@thirdofthree#1#2#3{#3}
+\long\def\@gobble#1{}
+\long\def\@gobbletwo#1#2{}
+\def\remove@to@nnil#1\@nnil{}
+\def
+\filemodnewest{%
+ \filemod@opt\filemod@newest@opt\filemod@newest
+}
+\def\filemod@newest@opt#1#2]{%
+ \filemod@newest{#2}%
+}
+\def\filemod@newest#1#2#3{%
+ \filemod@@cmp>{#1}{#2}{#3}{#2}{#3}%
+}
+\def
+\filemodoldest{%
+ \filemod@opt\filemod@oldest@opt\filemod@oldest
+}
+\def\filemod@oldest@opt#1#2]{%
+ \filemod@oldest{#2}%
+}
+\def\filemod@oldest#1#2#3{%
+ \filemod@@cmp<{#1}{#2}{#3}{#2}{#3}%
+}
+\def\filemodNewest#1#{%
+ \expandafter\expandafter
+ \expandafter\@filemodNewest
+ \csname
+ @%
+ \ifx\@nnil#1\@nnil
+ first%
+ \else
+ second%
+ \fi
+ oftwo%
+ \endcsname
+ {[\filemodoptdefault]}%
+ {#1}%
+}
+\def\filemodOldest#1#{%
+ \expandafter\expandafter
+ \expandafter\@filemodOldest
+ \csname
+ @%
+ \ifx\@nnil#1\@nnil
+ first%
+ \else
+ second%
+ \fi
+ oftwo%
+ \endcsname
+ {[\filemodoptdefault]}%
+ {#1}%
+}
+\def\@filemodNewest[#1]#2{%
+ \@@filemodNewest{#1}#2\filemod@end
+}
+\def\@filemodOldest[#1]#2{%
+ \@@filemodOldest{#1}#2\filemod@end
+}
+\def\@@filemodNewest#1#2{%
+ \filemod@Newest{#2}{#1}%
+}
+\def\@@filemodOldest#1#2{%
+ \filemod@Oldest{#2}{#1}%
+}
+\def\filemod@Newest#1#2#3{%
+ \iffilemod@end{#3}%
+ {#1}%
+ {%
+ \expandafter\expandafter
+ \expandafter\expandafter
+ \expandafter\expandafter
+ \expandafter\filemod@Newest
+ \expandafter\expandafter
+ \expandafter\expandafter
+ \expandafter\expandafter
+ \expandafter{%
+ \expandafter\expandafter
+ \expandafter\@gobble
+ \expandafter\string\csname\filemod@@cmp>{#2}{#1}{#3}{#1}{#3}\endcsname}{#2}}%
+}
+\def\filemod@Oldest#1#2#3{%
+ \iffilemod@end{#3}%
+ {#1}%
+ {%
+ \expandafter\expandafter
+ \expandafter\expandafter
+ \expandafter\expandafter
+ \expandafter\filemod@Oldest
+ \expandafter\expandafter
+ \expandafter\expandafter
+ \expandafter\expandafter
+ \expandafter{%
+ \expandafter\expandafter
+ \expandafter\@gobble
+ \expandafter\string\csname\filemod@@cmp<{#2}{#1}{#3}{#1}{#3}\endcsname}{#2}}%
+}
+\def\iffilemod@end#1{%
+ \ifx\filemod@end#1%
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+}
+\def\filemod@end{\@gobble{filemod@end}}
+\def
+\Filemodgetnum{\filemodparse\Filemod@getnum}
+\def\Filemod@getnum#1#2#3#4#5#6#7{%
+ \def\filemoddate{#1#2#3}%
+ \def\filemodtime{#4#5#6}%
+ \def\filemodtz{#7}%
+}
+\def\Filemod@cmp#1#2#3{%
+ \Filemodgetnum{#2}%
+ \let\filemoddatea\filemoddate
+ \let\filemodtimea\filemodtime
+ \Filemodgetnum{#3}%
+ \ifcase0%
+ \ifnum\filemoddate>\filemoddatea\space1\else
+ \ifnum\filemoddate=\filemoddatea\space
+ \ifnum\filemodtime>\filemodtimea\space1\else
+ \ifnum\filemodtime=\filemodtimea\space2\fi
+ \fi
+ \fi
+ \fi
+ \relax
+ \def\filemodresultfile{#1}%
+ \ifnum#1>2\relax
+ \def\filemodcmpresult##1##2##3{##1}%
+ \else
+ \let\filemodcmpresult\@firstoftwo
+ \fi
+ \or
+ \def\filemodresultfile{#2}%
+ \ifnum#1>2\relax
+ \def\filemodcmpresult##1##2##3{##2}%
+ \else
+ \let\filemodcmpresult\@secondoftwo
+ \fi
+ \else
+ \ifcase#1\relax
+ \let\filemodresultfile\empty
+ \let\filemodcmpresult\@gobbletwo
+ \or
+ \def\filemodresultfile{#1}%
+ \let\filemodcmpresult\@firstoftwo
+ \or
+ \def\filemodresultfile{#2}%
+ \let\filemodcmpresult\@secondoftwo
+ \else
+ \let\filemodresultfile\empty
+ \let\filemodcmpresult\@thirdofthree
+ \fi
+ \fi
+ \filemod@next
+}
+\def\filemod@chkopt#1{%
+ \def\filemod@optcmd{#1}%
+ \futurelet\filemod@tok\filemod@@chkopt
+}
+\def\filemod@@chkopt{%
+ \ifx[\filemod@tok
+ \expandafter\filemod@readopt
+ \else
+ \expandafter\filemod@optcmd
+ \expandafter\filemodoptdefault
+ \fi
+}
+\def\filemod@readopt[#1]{%
+ \filemod@optcmd{#1}%
+}
+\def\Filemodnewest{\filemod@chkopt\Filemod@newest}
+\def\Filemod@newest#1#2#3{\Filemod@Newest{#1}{{#2}{#3}}}
+\def\Filemodoldest{\filemod@chkopt\Filemod@oldest}
+\def\Filemod@oldest#1#2#3{\Filemod@Oldest{#1}{{#2}{#3}}}
+\def\FilemodNewest{\filemod@chkopt\Filemod@Newest}
+\def\Filemod@Newest#1#2%
+{%
+ \def\filemode@tie{#1}%
+ \def\filemod@gl{>}%
+ \Filemod@est#2\filemod@end
+}
+\def\FilemodOldest{\filemod@chkopt\Filemod@Oldest}
+\def\Filemod@Oldest#1#2%
+{%
+ \def\filemode@tie{#1}%
+ \def\filemod@gl{<}%
+ \Filemod@est#2\filemod@end
+}
+\def\Filemod@est#1{%
+ \def\filemodresultfile{#1}%
+ \Filemodgetnum{#1}%
+ \let\filemodresultdate\filemoddate
+ \let\filemodresulttime\filemodtime
+ \Filemod@@est
+}
+\def\Filemod@@est#1{%
+ \iffilemod@end{#1}{}{%
+ \Filemodgetnum{#1}%
+ \ifcase0%
+ \ifnum\filemoddate\filemod@gl\filemodresultdate\space1\else
+ \ifnum\filemoddate=\filemodresultdate\space
+ \ifnum\filemodtime\filemod@gl\filemodresulttime\space1\else
+ \ifnum\filemodtime=\filemodresulttime\space
+ \ifnum\filemode@tie=1\else 1\fi
+ \fi
+ \fi
+ \fi
+ \fi
+ \else
+ \def\filemodresultfile{#1}%
+ \let\filemodresultdate\filemoddate
+ \let\filemodresulttime\filemodtime
+ \fi
+ \Filemod@@est
+ }%
+}
+\def\filemod@gl{>}
+\def\Filemodtoday#1%
+{{%
+ \def\thefilemod##1##2##3##4##5##6##7{\year##1 \month##2 \day##3 \today}%
+ \filemodprint{#1}%
+}}
+\def\FilemodToday#1%
+{{%
+ \def\thefilemoddate##1##2##3{\year##1 \month##2 \day##3 \today}%
+ \filemodprint{#1}%
+}}
+\def
+\filemodprint{\filemodparse\thefilemod}
+\def
+\filemodprintdate{\filemodparse\the@filemoddate}
+\def
+\filemodprinttime{\filemodparse\the@filemodtime}
+\def\thefilemod#1#2#3#4#5#6#7%
+{%
+ \thefilemoddate{#1}{#2}{#3}%
+ \filemodsep
+ \thefilemodtime{#4}{#5}{#6}{#7}%
+}
+\let\filemodsep\space
+\def\thefilemoddate#1#2#3%
+{#1/#2/#3}
+\def\thefilemodtime#1#2#3#4%
+{%
+ #1:#2:#3~#4%
+}
+\def\the@filemoddate#1#2#3#4#5#6#7{%
+ \thefilemoddate{#1}{#2}{#3}%
+}
+\def\the@filemodtime#1#2#3{%
+ \thefilemodtime
+}
+\begingroup
+\catcode`\D=12
+\expandafter\gdef\csname filemodZ\endcsname{Z}%
+\let\filemodz=Z\relax
+\endgroup
+\filemod@cat
+\expandafter\let\csname filemod@cat\endcsname\relax
+\endinput
+%%
+%% End of file `filemod.tex'.