summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/fileinfo/readprov.sty
blob: d9bf84252c82716f6bffedb1446f18b00bf57dd5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
%% readprov.sty
%% --
%% get file infos without reading the entire file

\def \fileversion {0.5} \def \filedate {2012/11/22} 

%% copyright (C) 2008, 2010, 2011, 2012 Uwe Lueck, 
%% http://www.contact-ednotes.sty.de.vu 
%% -- author-maintained in the sense of LPPL below.
%%
%% This file can be redistributed and/or modified under 
%% the terms of the LaTeX Project Public License; either 
%% version 1.3c of the License, or any later version.
%% The latest version of this license is in
%%     http://www.latex-project.org/lppl.txt
%% We did our best to help you, but there is NO WARRANTY. 
%%
%% Please report bugs, problems, and suggestions via 
%% 
%%   http://www.contact-ednotes.sty.de.vu 
%%
% USAGE:
% 
% LOADING: The functionality of readprov.sty is activated by 
%     \usepackage{readprov}
% or 
%     \RequirePackage{readprov}
% (this one may precede \documentclass) in the document preamble. 
% 'readprov' does not have any package options.
% 
% INSERTING: Recall that \\
% %
% |\GetFileInfo{<filename>}| (including extension)\\
% %
% from LaTeX's doc.sty sets macro \filename to <filename> 
% (including extension) and furthermore sets macros
% \filedate, \fileversion, and \fileinfo 
% to the \emph{date}, \emph{version}, and further \emph{info}
% associated with <filename> earlier ``some way'' ...
% \ This means that file <filename> has been \input before
% and identified itself by \ProvidesFile, \ProvidesPackage, 
% or \ProvidesClass. 
% 
% 'readprov' simply copies \GetFileInfo from doc.sty 
% so the same functionality is provided independently of 
% other doc.sty features---without loading LaTeX's doc.sty.
%
% % new 2010/11/27:
% Unfortunately, \GetFileInfo is fragile, it is especially 
% unhelpful for referring to \emph{two} packages in the same 
% \thanks footnote. So we introduce (do compare 'zwgetfdate'!)\\
% |\UseDateOf{<filename>}|\quad |\UseVersionOf{<filename>}|\quad
% (with extension)\\
% These commands are robust (even expandable). Instead of 
% $$\GetFileInfo{<filename>}\fileversion{}\texttt{ as of }\filedate$$
% you can type 
% $$\UseFileVersionOf{<filename>}\texttt{ as of }\UseFileDateOf{<filename>}$$ 
%
% EXTRACTING: \GetFileInfo, \UseDateOf, and \UseVersionOf need the data 
% from \ProvidesPackage, \ProvidesClass, or \ProvidesFile.
% Instead of getting them by \usepackage, \documentclass, or \input,
% they can be obtained with the following commands.
% \\
% |\ReadFileInfos{<list-of-filenames>}| (with extensions)\\
% applies to all kinds of files---provided such a file contains 
% such a \Provide... command. 
% \\
% |\ReadPackageInfos{<list-of-filenames>}| (without extensions)\\
% searches .sty files from <list-of-filenames> for \ProvidesPackage. 
% 
% The two former commands accept lists with commas as separators 
% almost like with \usepackage (currently we must use "%" 
% to hide a line break in the script, 
% and there must be no spaces in the list).
% \\
% |\ReadClassInfo{<filename>}| (without extension)\\
% searches <filename>.cls for \ProvidesClass. 
% At present [TODO] it can be used once only, 
% and only for use with myfilist.sty.
% But you can use \ReadFileInfos for reporting on \emph{various} 
% classes, even in a document!
% \\
% |\ReadShInfos{<list-of-filenames>}| (with extensions)\\ 
% is a variant of \ReadFileInfos{<list-of-filenames>} that for each 
% <file> in <list-of-filenames> processes 
%     # \ProvidesFile{<file>}[<info>]
% in <file> (new with v0.5).
% 
% NOTE: (i)~So far, [TODO] the \Read... commands explained before 
% do not work after `\begin{document}'
% (with rare exceptions, \NeedTeXFormat is one 
% obstacle---may be 'zwgetfdate' really is better). 
% (ii)~Those \Read... commands execute \GetFileInfo 
% (with the final file from the list). So you may be lucky to get 
% the intended \filename, \filedate, \fileversion, and \fileinfo
% without using \GetFileInfo. The chance is the better the 
% later the \Read... command is used, best right before 
% `\begin{document}'. Even then it may *fail*---when the latter 
% command loads a package redefining \filedate etc. ...
%
% IMPLEMENTATION: 

\NeedsTeXFormat{LaTeX2e}[1994/12/01] %% \newcommand* etc. 
\ProvidesPackage{readprov}
                [\filedate\space v\fileversion \space 
                 file infos without loading (UL)] 
% INSERTING: \\
% |\GetFileInfo{<filename>}| (with extension)\\ % \ %
% just was stolen from Standard LaTeX's doc.sty 
% (before I varied it).
% It is fragile.
\def\GetFileInfo#1{%
  \def\filename{#1}%
  \def\@tempb##1 ##2 ##3\relax##4\relax{%
    \def\filedate{##1}%
    \def\fileversion{##2}%
    \def\fileinfo{##3}}%
% Here was: 
%     \edef\@tempa{\csname ver@#1\endcsname}%
%     \expandafter\@tempb\@tempa\relax? ? \relax\relax}
% We can do it a little more elegantly with the internals %% ly 2012/03/16
% (that vary the original \GetFileInfo) 
% for our new \UseDateOf and \UseVersionOf:
    \read@file@info\@tempb{#1}} 
% (Will be overwritten without warning 
% when doc.sty is loaded afterwards.)
\newcommand*{\read@file@info}[2]{%          new 2010/11/27
  \expandafter \expandafter \expandafter
    #1\csname ver@#2\endcsname \relax? ? \relax\relax}
% |\UseDateOf{<filename>}| is robust (expandable):  %% O 2012/03/20
\newcommand*{\UseDateOf}{\read@file@info\read@file@date}
% The internal reading commands vary `\@tempb' 
% from the original \GetFileInfo:
\def\read@file@date   #1 #2\relax#3\relax{#1}
% |\UseVersionOf{<filename>}| is robust (expandable) as well:
\newcommand*{\UseVersionOf}{\read@file@info\read@file@version}
\def\read@file@version#1 #2 #3\relax#4\relax{#2}
% EXTRACTING: \\
% |\ReadPackageInfos{<list-of-filenames>}| without extensions:
\newcommand*{\ReadPackageInfos}{%
    \read@package@infos\RequirePackage{sty}}
% `\@pkgextension' and `\@clsextension' are bad 
% for using `\filename' in the document (`\@onlypreamble').
% \\
% |\ReadClassInfo{<filename>}| without extension (v0.5):
\newcommand*{\ReadClassInfo}{%
    \read@package@infos\LoadClass{cls}}
% Before v0.4, the modified ultimate expansion of \@pr@videpackage
% was fixed or ``static.'' Now \@pr@videpackage is modified 
% at each call of \ReadClassInfo or `\Read'\-`PackageInfos'
% in such a way that the \emph{current} meaning of 
% `\@pr@vide'\-`package' is used by the modified one---\emph{another}
% package ('filedate') may have modified 
% \@pr@videpackage before, and the latter's meaning may 
% change several times during a \TeX\ run:
\newcommand*{\read@package@infos}[3]{%
  %% #1 \Req.../Load..., #2 extension, #3 name list 
  \begingroup                           %% 2010/11/26
    \let\RP@@provpkg\@pr@videpackage
    \def\@pr@videpackage[##1]{\RP@@provpkg[{##1}]\endinput}%
    #1{#3}%
  \endgroup \GetFileInfo{#3.#2}%        %% 2010/11/26
}
  %% <- TODO more classes 2008/03/16
% |\ReadFileInfos{<list-of-filenames>}| with extensions:
\newcommand*{\ReadFileInfos}[1]{%
  \begingroup
% v0.4 treats \@providesfile by analogy to \@pr@videpackage above:
    \let\RP@@provfile\@providesfile
    \def\@providesfile##1[##2]{\RP@@provfile{##1}[{##2}]\endinput}%
    %% 2008/03/19:
    \def\ProvidesClass  ##1{\ProvidesFile{##1.\@clsextension}}%
    \def\ProvidesPackage##1{\ProvidesFile{##1.\@pkgextension}}%
    \@for\@tempa:=#1\do{%
      \edef\@tempa{\expandafter\read@no@spaces\@tempa\@nil}%
      \input{\@tempa}%
      \global\let\@gtempa\@tempa}   %% 2010/11/26
  \endgroup
  \GetFileInfo\@gtempa              %% 2010/11/26
}
\def\read@no@spaces#1#2\@nil{#1#2}  %% 2008/03/23
% |\ReadShInfos{<list-of-filenames>}| with extensions:
\newcommand*{\ReadShInfos}[1]{%                     %% 2012/11/22
    {\catcode`\#9  % ignore .sh comment characters
     \catcode`\!14 % ignore content of shebang line
     \ReadFileInfos{#1}}}
\endinput 

%% VERSION HISTORY
v0.1    2008/03/19  created file "readprov.sty"
        2008/03/23  smart file name separation, \ifx$ for \ifcat$
        2008/05/22  typo ist -> it
v0.2    2010/04/03  renamed "myfiles.sty"; 
                    broke long lines etc. for doc
v0.3    2010/11/25  split off from former "myfiles.sty", 
                    added \GetFileInfo
        2010/11/26  automatic \GetFileInfo
        2010/11/27  new/real documentation; more \newcommand*s; 
                    \GetFileInfo redefined, \Use...;
                    \docnewline -> \\; NOTE etc.
v0.3a   2012/03/16  doc.: grammar fix
v0.3b   2012/03/20  typo fix "Of" 
v0.4    2012/11/10  reimplementation for `filedate'
                    (\@pr@videpackage, \@providefile)
v0.5    2012/11/22  \ReadShInfos