summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/xcite/xcite.dtx
blob: d341e4399d2b0a52007048346a767065c8a3fc62 (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
% \iffalse meta-comment
%
% Copyright 2011 Enrico Gregorio
%
% This file 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 2005/12/01 or later.
%
% This work has the LPPL maintenance status `maintained'.
% 
% The Current Maintainer of this work is Enrico Gregorio.
%
% This work consists of the files
%   xcite.dtx 
%   xcite.ins
% and the derived file xcite.sty.
% 
% \fi
% \iffalse
%
%<*driver>
\ProvidesFile{xcite.dtx}
%</driver>
%<package>\NeedsTeXFormat{LaTeX2e}
%<package>\ProvidesPackage{xcite}
%<*package>
    [2011/09/02 v1.0 eXternal Citations (EG)]
%</package>
%
%<*driver>
\documentclass{ltxdoc}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
\begin{document}
  \DocInput{xcite.dtx}
  \PrintChanges
\end{document}
%</driver>
% \fi
%
% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \CheckSum{82}
%
% \changes{v1.00}{2011/09/02}
%         {First version}
%
% \GetFileInfo{xcite.dtx}
%
% \title{The \textsf{xcite} package\thanks{This file
%         has version number \fileversion, last
%         revised \filedate.}}
% \author{Enrico Gregorio\thanks{%
%   This package derives from \textsf{xr} by David Carlisle}\\
%   {\small\texttt{Enrico dot Gregorio at univr dot it}}}
% \date{\filedate}
% \maketitle
%
% \section{Description}
% This package implements a system for eXternal Citations.
% If one document needs to refer to citations in another, say |aaa.tex|,
% then this package may be loaded in the main file, and the command\\[\topsep]
% |\externalcitedocument{aaa}|\\[\topsep]
% given in the preamble.
%
% Then you may use |\cite| to refer to anything which has been
% declared by |\bibitem| in either |aaa.tex| or the main document.
% You may declare any number of such external documents. Notice that
% |\bibitem| commands may not appear in |aaa.tex|, but rather in
% |aaa.bbl| if \textsc{Bib}\negthinspace\TeX{} or Biber are used to
% generate the bibliography, but this doesn't matter. The important
% thing is that |aaa.tex| is in final form with all citations resolved
% and that |aaa.aux| is readable.
%
% If any of the external documents, or the main document, use the same
% citation key then an error will occur as the label will be multiply
% defined. To overcome this problem |\externalcitedocument| has an
% optional argument. If you declare\\[\topsep]
% |\externalcitedocument[A-]{aaa}|\\[\topsep]
% then all references from |aaa| are prefixed by |A-|. So for
% instance, if |aaa.tex| had |\bibitem{xyz}|, then this could be
% referenced with |\cite{A-xyz}|. The prefix need not be |A-|, it can
% be any string chosen to ensure that all the keys imported from
% external files are unique. Note however that if your style declares
% certain active characters (|:| in French, |"| in German) then these
% characters can not usually be used in |\cite|, and similarly may
% not be used in the optional argument to |\externalcitedocument|.
%
% \section{Acknowledgment}
% This package is just a straightforward modification of David
% Carlisle's \textsf{xr} package (based on Jean-Pierre Drucbert's
% work). The changes consisted in renaming the main command and
% substituting |\newlabel| with |\bibcite|; the |XR| prefix to
% internal commands has been changed into |XC|.
%
% These modifications are possible because |\newlabel| and |\bibcite|
% are almost the same command in disguise.
%
% This package originated from a question in
% |TeX.StackExchange.com|.\footnote{\ttfamily
% http://tex.stackexchange.com/questions/27243/}
%
% \StopEventually{}
%
% \section{The macros}
%
%    \begin{macrocode}
%<*package>
%    \end{macrocode}
%
% Save the optional prefix. Start processing the first |aux| file.
%    \begin{macrocode}
\newcommand\externalcitedocument[2][]{{%
  \makeatletter
  \def\XC@prefix{#1}%
  \XC@next#2.aux\relax\\}}
%    \end{macrocode}
%
% Process the next |aux| file in the list and remove it from the head of
% the list of files to process.
%    \begin{macrocode}
\def\XC@next#1\relax#2\\{%
  \edef\XC@list{#2}%
  \XC@loop{#1}}
%    \end{macrocode}
%
% Check whether the list of |aux| files is empty.
%    \begin{macrocode}
\def\XC@aux{%
  \ifx\XC@list\@empty\else\expandafter\XC@explist\fi}
%    \end{macrocode}
%
% Expand the list of |aux| files, and call |\XC@next| to process the first
% one.
%    \begin{macrocode}
\def\XC@explist{\expandafter\XC@next\XC@list\\}
%    \end{macrocode}
%
% If the |aux| file exists, loop through line by line, looking for
% |\bibcite| and |\@input|. Otherwise process the next file in the
% list.
%    \begin{macrocode}
\def\XC@loop#1{\openin\@inputcheck#1\relax
  \ifeof\@inputcheck
    \PackageWarning{xc}{^^JNo file #1^^JLABELS NOT IMPORTED.^^J}%
    \expandafter\XC@aux
  \else
    \PackageInfo{xc}{IMPORTING LABELS FROM #1}%
    \expandafter\XC@read\fi}
%    \end{macrocode}
%
% Read the next line of the aux file.
%    \begin{macrocode}
\def\XC@read{%
  \read\@inputcheck to\XC@line
%    \end{macrocode}
% The |...| make sure that |\XC@test| always has sufficient arguments.
%    \begin{macrocode}
  \expandafter\XC@test\XC@line...\XC@}
%    \end{macrocode}
%
% Look at the first token of the line.
% If it is |\bibcite|, do the |\bibcite|. If it is |\@input|, add the
% filename to the list of files to process. Otherwise ignore.
% Go around the loop if not at end of file. Finally process the next
% file in the list.
%    \begin{macrocode}
\long\def\XC@test#1#2#3#4\XC@{%
  \ifx#1\bibcite
    \bibcite{\XC@prefix#2}{#3}%
  \else\ifx#1\@input
     \edef\XC@list{\XC@list#2\relax}%
  \fi\fi
  \ifeof\@inputcheck\expandafter\XC@aux
  \else\expandafter\XC@read\fi}
%    \end{macrocode}
%
%    \begin{macrocode}
%</package>
%    \end{macrocode}
%
% \Finale
%