summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/camel/law.dtx
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/camel/law.dtx
Initial commit
Diffstat (limited to 'macros/latex/contrib/camel/law.dtx')
-rw-r--r--macros/latex/contrib/camel/law.dtx1774
1 files changed, 1774 insertions, 0 deletions
diff --git a/macros/latex/contrib/camel/law.dtx b/macros/latex/contrib/camel/law.dtx
new file mode 100644
index 0000000000..b88eb650c3
--- /dev/null
+++ b/macros/latex/contrib/camel/law.dtx
@@ -0,0 +1,1774 @@
+% \iffalse
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{camel}
+\usepackage{array}
+
+\def\fileversion{0.1d}
+\def\filedate{1997/01/09}
+\def\docdate {1997/01/09}
+
+\EnableCrossrefs
+\RecordChanges % Gather update information
+\CodelineIndex % Index code by line number
+%\OnlyDescription % comment out for implementation details
+\let\lawhline=\hline
+\begin{document}
+\citationstyle{law}
+\citationdata{camel}
+\title{The {\sc Law} module for the {\sc Camel} Bibliography
+ Engine\thanks{%
+ This file has version number \fileversion{} dated
+ \filedate{}.
+ The documentation was last revised on \docdate.
+ The documentation and the code for {\sc Camel}
+ are \copyright{} 1992--95 Frank Bennett, Jr. Distribution
+ and use are freely welcomed, on the sole condition that
+ acknowledgement of the {\sc Camel} package, its {\sc Law}
+ module and of their author
+ be made in any published using these utilities.
+ }}
+\author{Frank G Bennett, Jr.\thanks{Lecturer in the Commercial
+ Laws of the Far East, School of
+ Oriental and African Studies, University of London.
+ Acknowledgements of the numerous people who have provided
+ comments and suggestions in the development of this module
+ and of the {\sc Camel} package itself are listed in the users'
+ guide to that software.}}
+\maketitle
+\DocInput{law.dtx}
+\end{document}
+%</driver>
+% \fi
+% \CheckSum{741}
+%
+%\iffalse
+%
+% Copyright (C) 1992-1995 by Frank Bennett. All rights reserved.
+%
+% IMPORTANT NOTICE:
+%
+% You are not allowed to change this file. You may however copy
+% this file to a file with a different name and then change the
+% copy if (a) you do not charge for the modified code, (b) you
+% acknowledge Camel and its author(s) in the new file, if it
+% is distributed to others, and (c) you attach these same
+% conditions to the new file.
+%
+% You are not allowed to distribute this file alone. You are not
+% allowed to take money for the distribution or use of this file
+% (or a changed version) except for a nominal charge for copying
+% etc.
+%
+% You are allowed to distribute this file under the condition that
+% it is distributed with all of its contents, intact.
+%
+% For error reports, or offers to help make Camel a more powerful,
+% friendlier, and altogether more thrilling package, please contact me on
+% fb@soas.ac.uk
+%
+%\fi
+%
+%
+% \DoNotIndex{\@,\@@par,\@beginparpenalty,\@empty}
+% \DoNotIndex{\@flushglue,\@gobble,\@input}
+% \DoNotIndex{\@makefnmark,\@makeother,\@maketitle}
+% \DoNotIndex{\@namedef,\@ne,\@spaces,\@tempa}
+% \DoNotIndex{\@tempb,\@tempswafalse,\@tempswatrue}
+% \DoNotIndex{\@thanks,\@thefnmark,\@topnum}
+% \DoNotIndex{\@@,\@elt,\@forloop,\@fortmp,\@gtempa,\@totalleftmargin}
+% \DoNotIndex{\",\/,\@ifundefined,\@nil,\@verbatim,\@vobeyspaces}
+% \DoNotIndex{\|,\~,\ ,\active,\advance,\aftergroup,\begingroup,\bgroup}
+% \DoNotIndex{\cal,\csname,\def,\documentstyle,\dospecials,\edef}
+% \DoNotIndex{\egroup}
+% \DoNotIndex{\else,\endcsname,\endgroup,\endinput,\endtrivlist}
+% \DoNotIndex{\expandafter,\fi,\fnsymbol,\futurelet,\gdef,\global}
+% \DoNotIndex{\hbox,\hss,\if,\if@inlabel,\if@tempswa,\if@twocolumn}
+% \DoNotIndex{\ifcase}
+% \DoNotIndex{\ifcat,\iffalse,\ifx,\ignorespaces,\index,\input,\item}
+% \DoNotIndex{\jobname,\kern,\leavevmode,\leftskip,\let,\llap,\lower}
+% \DoNotIndex{\m@ne,\next,\newpage,\nobreak,\noexpand,\nonfrenchspacing}
+% \DoNotIndex{\obeylines,\or,\protect,\raggedleft,\rightskip,\rm,\sc}
+% \DoNotIndex{\setbox,\setcounter,\small,\space,\string,\strut}
+% \DoNotIndex{\strutbox}
+% \DoNotIndex{\thefootnote,\thispagestyle,\topmargin,\trivlist,\tt}
+% \DoNotIndex{\twocolumn,\typeout,\vss,\vtop,\xdef,\z@}
+% \DoNotIndex{\,,\@bsphack,\@esphack,\@noligs,\@vobeyspaces,\@xverbatim}
+% \DoNotIndex{\`,\catcode,\end,\escapechar,\frenchspacing,\glossary}
+% \DoNotIndex{\hangindent,\hfil,\hfill,\hskip,\hspace,\ht,\it,\langle}
+% \DoNotIndex{\leaders,\long,\makelabel,\marginpar,\markboth,\mathcode}
+% \DoNotIndex{\mathsurround,\mbox,\newcount,\newdimen,\newskip}
+% \DoNotIndex{\nopagebreak}
+% \DoNotIndex{\parfillskip,\parindent,\parskip,\penalty,\raise,\rangle}
+% \DoNotIndex{\section,\setlength,\TeX,\topsep,\underline,\unskip,\verb}
+% \DoNotIndex{\vskip,\vspace,\widetilde,\\,\%,\@date,\@defpar}
+% \DoNotIndex{\[,\{,\},\]}
+% \DoNotIndex{\count@,\ifnum,\loop,\today,\uppercase,\uccode}
+% \DoNotIndex{\baselineskip,\begin,\tw@}
+% \DoNotIndex{\a,\b,\c,\d,\e,\f,\g,\h,\i,\j,\k,\l,\m,\n,\o,\p,\q}
+% \DoNotIndex{\r,\s,\t,\u,\v,\w,\x,\y,\z,\A,\B,\C,\D,\E,\F,\G,\H}
+% \DoNotIndex{\I,\J,\K,\L,\M,\N,\O,\P,\Q,\R,\S,\T,\U,\V,\W,\X,\Y,\Z}
+% \DoNotIndex{\1,\2,\3,\4,\5,\6,\7,\8,\9,\0}
+% \DoNotIndex{\!,\#,\$,\&,\',\(,\),\+,\.,\:,\;,\<,\=,\>,\?,\_}
+% \DoNotIndex{\discretionary,\immediate,\makeatletter,\makeatother}
+% \DoNotIndex{\meaning,\newenvironment,\par,\relax,\renewenvironment}
+% \DoNotIndex{\repeat,\scriptsize,\selectfont,\the,\undefined}
+% \DoNotIndex{\arabic,\do,\makeindex,\null,\number,\show,\write,\@ehc}
+% \DoNotIndex{\@author,\@ehc,\@ifstar,\@sanitize,\@title,\everypar}
+% \DoNotIndex{\if@minipage,\if@restonecol,\ifeof,\ifmmode}
+% \DoNotIndex{\lccode,\newtoks,\onecolumn,\openin,\p@,\SelfDocumenting}
+% \DoNotIndex{\settowidth,\@resetonecoltrue,\@resetonecolfalse,\bf}
+% \DoNotIndex{\clearpage,\closein,\lowercase,\@inlabelfalse}
+% \DoNotIndex{\selectfont,\mathcode,\newmathalphabet,\rmdefault}
+% \DoNotIndex{\bfdefault}
+% \setcounter{StandardModuleDepth}{1}
+% \MakeShortVerb{\"}
+%
+% \begin{abstract}
+% \noindent The {\tt Law} module for the {\sc Camel} bibliography
+% package and \BibTeX{} attempts to implement fully automated typesetting
+% of citations in the so-called Blue Book style used in
+% the publication of legal materials. This
+% demanding style requires context sensitive
+% in-footnote cross-referencing
+% between citations.
+% \end{abstract}
+%
+% \noindent An adage in office management is that you should
+% only touch incoming paper once; to respond to it, to file
+% it, to forward it, or to destroy it. A number of
+% commercial citation
+% database managers provide a facility for ``filing'' citations
+% in a flexible form, the idea being to extend this principle
+% to citations as well as paper. A hanging point for this
+% strategy as been in-text context-sensitive citation styles.
+% Database managers are at their best in exporting
+% entire bibliographies
+% and lists of authorities. Some packages are
+% capable of scanning a document for citation ``tags'',
+% which eliminates the need to separately select bibliography
+% items in the database. Some, too, can replace ``tags''
+% in the document with the formatted text of a citation.
+% But once the text is replaced, the format of citations
+% added in this way is fixed; conversion is a one-way process.
+%
+% A more serious problem is that, while the database manager
+% can easily identify the {\em tag}, it is far more difficult,
+% without logical markup, to identify its
+% {\em context\/}---whether it occurs in a footnote, how many
+% items were in the preceding footnote, how many articles
+% by the same author are cited in the document, and so forth.
+% As a result, citation formatting of cross-referenced styles
+% is still generally done by hand.
+%
+% One of the most demanding cross-referenced styles is that
+% laid down in {\sl A Uniform System of Citation}, or ``the Blue
+% Book'', for the citation of legal materials. This style
+% has survived the era of computerization largely because
+% most U.S. law journals using the style are edited by highly
+% competitive law students. Staff members contribute their
+% editorial time to their journal free of charge, because of
+% the value of listing law journal membership on their resume.
+% The Blue Book style minimizes the bulk of citation
+% text, while conveying sufficient information to the reader
+% for the location of cited material. It is also designed
+% to provide all information required for the location of
+% {\em primary\/} legal authority from the face of any citation
+% to it, without tracing down cross-references.
+%
+% A first attempt to address this problem was made in
+% the complementary \LexiTeX{}
+% and \LexiBib{} packages, for \LaTeX{} and \BibTeX{}
+% respectively. Lessons learned from developing these
+% packages suggested that a comprehensive formatting package
+% for legal citations could serve as the foundation for
+% a modular, highly generalized citation and bibliography
+% formatting system. The logical code from these packages
+% was excised and used in the drafting of the {\sc Camel}
+% bibliography engine. The typesetting code was then used
+% to assemble the {\sc Law} module for {\sc Camel}.
+%
+% The implications of such a system are particularly interesting
+% if it comes to be widely used in the publication of
+% law journals or, even better, in the publication of court
+% judgements. The efficiency with which
+% citations can be reported to citation services would be
+% increased, since \BibTeX-format database entries
+% are in a standard format that can
+% be processed electronically. These same lists could
+% be made available as text-searchable databases of authority.
+% Network discussions of legal issues could be accompanied by
+% growing lists of annotated authority, available for all to
+% use.
+%
+% To use this package, all you should need to do is unpack
+% the files by running {\tt law.ins} (thanks to Robin Fairbairns
+% for pushing me toward a standard-ish method of installation!),
+% copy the style files to their respective homes, and follow the
+% markup conventions described in the {\sc Camel} manual. The
+% same should apply to any other bibliography
+% modules produced for {\sc Camel} in the future, no matter what
+% sort of contortions they put your citation data through before
+% they end up on the page. If it has extensive documentation,
+% it's {\em not\/} a {\sc Camel} module!
+%
+% You are not under an obligation to enjoy this package. If you
+% have complaints, you can contact me on {\tt fb@soas.ac.uk}.
+%
+%\StopEventually{}
+% \section{The style code}
+% \subsubsection{Entry type specific functions}
+% The functions below should not be used as general utilities;
+% they are designed specifically for use with a particular entry
+% type. While they could be placed directly into the entry
+% functions to which they apply, defining them separately
+% helps improve the transparency of the code.
+%
+% \DescribeEnv{build.bridges}
+% I'm not actually sure whether this function belongs in {\tt
+% camel.dtx} or in {\tt law.dtx}. What it does is to insert (or
+% not insert) an appropriate "\bridges" declaration into the {\tt
+% .bbl} file for the current citation. It is governed by a
+% string existing on the stack when it is invoked, and leaves
+% nothing on the stack. Toggles are {\tt schedules}, {\tt sections} and {\tt
+% articles}. Season to taste.
+% \begin{macrocode}
+%<*bstfunctions>
+FUNCTION {build.bridges}
+ { duplicate$ empty$
+ { pop$ skip$ }
+ { duplicate$ "sections" =
+ { pop$ "\bridges{\ \S~}{}{\ \S\S~}{\ }{\ \S~}{\ \S\S~}"
+ "" "" must.must.must
+ }
+
+ { duplicate$ "articles" =
+ { pop$
+ "\bridges{\ art.~}{}{\ arts.~}{\ }{\ art.~}{\ arts.~}"
+ "" "" must.must.must
+ }
+ { "schedules" =
+ { "\bridges{\ sched.~}{}{\ scheds.~}{\ }{\ sched.~}{\ scheds.~}"
+ "" "" must.must.must
+ }
+ 'skip$
+ if$
+ }if$
+ }if$
+ }if$
+ }
+% \end{macrocode}
+% \DescribeEnv{get.a.kinda.sort.key}
+% It is early days for the sorting of bibliographies in {\sc
+% Camel}. This will give a rough key.
+% \begin{macrocode}
+FUNCTION { get.a.kinda.sort.key }
+{ author empty$
+ { title empty$
+ { "0000" }
+ { title "*" "forward" gather.chars pop$
+ duplicate$ "l" change.letter.case "the" =
+ { pop$ "*" "forward" gather.chars pop$ swap$ pop$ }
+ { duplicate$ "l" change.letter.case "a" =
+ { pop$ "*" "forward" gather.chars pop$ swap$ pop$ }
+ { swap$ pop$
+ }if$
+ }if$
+ }if$
+ }
+ { author #1 "{ll}" format.name$
+ }if$
+}
+% \end{macrocode}
+% \DescribeEnv{j.format.division}
+% This function assembles the various fields relevant to the
+% division of a Japanese court into a single string.
+% \begin{macrocode}
+FUNCTION {j.format.division}
+ { division empty$
+ 'skip$
+ { dc.. court "end" first.in.second
+ { pop$ " No.~" 's := "endlabel" 't := }
+ { pop$ sc.. court "start" first.in.second
+ { pop$ "No.\ " 's := "frontlabel" 't := }
+ { pop$ " " 's := "endlabel" 't :=
+ }if$
+ }if$
+ }if$
+ division s divno t field.tag.no.combine
+ }
+% \end{macrocode}
+%
+% \subsubsection{Entry type functions}
+% Now we define the type functions for all entry types that may
+% appear
+% in the {\tt*.bib} file---e.g., functions like `"article"' and
+% `"book"'. These
+% are the routines that actually generate the "*.bbl" file output
+% for
+% the entry. These must all precede the "READ" command. In
+% addition, the
+% style designer should have a function `"default.type"' for
+% unknown types.\footnote{This comment by Oren Patashnik.}
+%
+% \DescribeEnv{article}
+% This function performs the necessary operations for
+% exporting a valid \LexiTeX\ citation to an article.
+% For this and for all citation types defined in the
+% \LexiBib{} style, the goal is to provide reasonably
+% complete commentary, so that anyone wanting to
+% alter the behaviour of the style can set to work
+% with a fair degree of confidence about what needs to
+% be done to achieve a particular result.
+% \begin{macrocode}
+FUNCTION {article}
+% \end{macrocode}
+% The "article" entry is used for all kinds of material, so
+% it ends up as one of the most complex entries. Before we
+% do anything, we have to check whether the default {\sc Camel}
+% bridges are acceptable. There are two types of situations to watch out
+% for. First, if the volume and the number are both
+% non-empty, we need to add a special set of substitute bridges.
+% Alternatively, if both "volume" and "number" are empty,
+% but the date is more specific than just a year, we
+% assume we are dealing with a newspaper. In either case,
+% we use the same special set of bridges.
+% \begin{macrocode}
+{ volume empty$ not number empty$ not and
+ volume empty$ number empty$ year "mo.dd.yy" format.date
+ pop$ itemcount #1 = not and and or
+ { "\bridges{,\ p.~}{,\ }{,\ }{\ }{\ at~}{\ at~}"
+ "" "" must.must.must
+ newline$
+ }
+% \end{macrocode}
+% Second, the {\tt @article} entry type, like many entry types in
+% the Blue Book style normally places
+% white space between the title
+% and a pinpoint page number. If the title ends in a numeral
+% this will be confusing, so the Blue Book requires that we
+% separate the two with a comma in this case. The following
+% adjustment to bridging punctuation accomplishes this purpose.
+% \begin{macrocode}
+ { title type.last.char "numeral" =
+ { "\bridges{,\ }{,\ }{,\ }{\ }{\ at~}{\ at~}"
+ "" "" must.must.must
+ newline$
+ }
+ 'skip$
+ if$
+ }if$
+% \end{macrocode}
+% \changes{1995/07/08}{v0.1a}{Function {\tt type.last.char} and
+% {\tt\protect\string\protect\bridges} declaration used to handle titles ending
+% in a numeral correctly (by the insertion of a comma). Added to
+% the {\tt @article} and {@book} entries as a trial; will
+% propagate to other entry types once this change is trusted.}
+% Then we write the citation leader, to prepare for outputting the
+% actual content of the citation text.
+% \begin{macrocode}
+ "\lexibib{article}{" cite$ "}{" must.must.must
+ get.a.kinda.sort.key
+ "}{" "" must.must.must
+% \end{macrocode}
+% The author name is pushed to the stack, followed by a toggle
+% to trigger last-name-only formatting. Then the "format.names"
+% reduces this to a single, appropriately-formatted string,
+% possibly the null string. All that is left to do is push a
+% set a braces, a null string to make up three arguments to the
+% export routine, and write the lot on the output
+% file unconditionally, using "must.must.must".
+% \begin{macrocode}
+author "lastonly" format.names
+"}{"
+""
+must.must.must
+% \end{macrocode}
+% Next comes the title of the article. This is not specially
+% formatted; we simply push the title field, then a warning
+% string
+% followed by a check for whether it is empty or not, then
+% braces and a null string, and write again.
+% \begin{macrocode}
+title "title" check
+"}{"
+""
+must.must.must
+% \end{macrocode}
+% The next bit is actually rather thorny. There are three
+% possible cases. The first is where both a volume number
+% and an issue number exist. In this case, we use a
+% verbose form of reference. In the second, there is no
+% volume number, but possibly an issue number. This is
+% the proper form for Commonwealth legal materials,
+% and requires the year in brackets, followed by the
+% issue number to show the volume within the year.
+% Third, we may simply have a volume number by itself.
+% This calls for the citation form for most journals,
+% and U.S. case reporters.
+% \begin{macrocode}
+ volume empty$ not number empty$ not and
+ { journal "journal" check ", v.~" volume must.must.must
+ ", n.~" number "}{" must.must.must }
+ { volume empty$ not
+ { volume "\ " journal "journal" check empty.to.null
+ might.ifone.must
+ "}{" "" "" must.must.must}
+ { year "mo.dd.yy" format.date itemcount #1 =
+ { "[" swap$ "] " iftwo.might.iftwo
+ number "\ " journal "journal" check might.ifone.must
+ "}{" "" "" must.must.must}
+ { pop$ number empty$
+ { "\\" journal "journal" check "\\" must.must.must
+ "}{" "" "" must.must.must }
+ { number "\ " journal "journal" check might.ifone.must
+ "}{" "" "" must.must.must
+ }if$
+ }if$
+ }if$
+ }if$
+% \end{macrocode}
+% The Blue Book does not like page ranges
+% so we need to clean
+% out anything following a dash in the "pages" field. The
+% "short" option
+% toggles this behaviour on. We also check to see that the page
+% is not empty. This is followed by braces, a null string, and
+% output.
+% \begin{macrocode}
+pages "short" format.pages "pages" check
+"}{"
+""
+must.must.must
+% \end{macrocode}
+% We add the year next, but only if the "volume" field is
+% non-empty (if "volume" is empty, we'll have put the year
+% is as a bracketed volume number, Commonwealth-style.
+% We could use just the year (this is normal for Blue Book
+% style, but we'll add the month for good measure, if it's
+% been provided in the "year" field.
+% \begin{macrocode}
+volume empty$ not
+ { "(" "" "" must.must.must
+ publisher ":\ " "" might.ifone.must
+ "" year "mo.dd.yy" format.date ")" must.must.must }
+ { year "mo.dd.yy" format.date itemcount #1 =
+ 'pop$
+ { "" "" must.must.must
+ }if$
+ }if$
+% \end{macrocode}
+% Finally, we have to tangle with cross-references.
+% Yuck. (Not a complaint about \BibTeX, just a general
+% response to the design problems inherent in the task).
+% Formatting depends on whether there is a "crossref" entry.
+% Hear that, guys? If you don't use the "crossref" field,
+% we'll short-change you on formatting service.
+% \begin{macrocode}
+crossref empty$
+% \end{macrocode}
+% If there is no "crossref", we just push a brace and a couple
+% of nulls, and write. Done! Hurray!
+% \begin{macrocode}
+{ "}" "" "" must.must.must }
+% \end{macrocode}
+% But if there {\em was\/} a "crossref", we've got work to do.
+% Darn. The first thing we do is have a look at "booktitle".
+% This should be non-null in this situation; there's no sense
+% setting up a cross-reference to an individual volume of
+% a journal unless there's something special to be said
+% about it.
+% \begin{macrocode}
+{ booktitle empty$
+% \end{macrocode}
+% So if no "booktitle" is found, we whinge and format
+% as for a no-cross-reference entry.
+% \begin{macrocode}
+ { "no booktitle (name of special issue) for "
+ cite$ "/" crossref ". Why a crossref?" * * * * warning$
+ "}" "" "" must.must.must }
+% \end{macrocode}
+% If there {\em is\/} a "booktitle", though,
+% and if the "volume" field is non-empty (which
+% means that we just printed, or at least should
+% have printed, the year), we close the
+% parens following the year (which is opened by \LexiTeX),
+% and open another (which will be closed by \LexiTeX).
+% That's it for conditional punctuation; we follow
+% with "booktitle", which should be
+% the title or subject description of the special
+% issue of the journal.
+% \begin{macrocode}
+ { volume empty$ {""} {") ("} if$ booktitle "}" must.must.must}
+ if$
+}if$
+% \end{macrocode}
+% Add a fresh new line in the export file, and we're done! Whew!
+% \begin{macrocode}
+newline$
+}
+% \end{macrocode}
+%
+% \DescribeEnv{book}
+% This is the entry for books, which includes individual
+% volumes in a series, and multi-volume works with a single
+% title. Correct me if I'm wrong, but I think this latter
+% citation type is not supported by \BibTeX. \LexiBib{}
+% manages it by allowing the user to specify the volume
+% number in the text using the optional ":<number>:" argument to
+% the "\lexicite" tag.
+% \begin{macrocode}
+FUNCTION {book}
+% \end{macrocode}
+% This entry type normally places white space between the title
+% and a pinpoint page number. If the title ends in a numeral
+% this will be confusing, so the Blue Book requires that we
+% separate the two with a comma in this case. The following
+% adjustment to bridging punctuation accomplishes this purpose.
+% \begin{macrocode}
+{ title type.last.char "numeral" =
+ { "\bridges{,\ }{}{,\ }{\ }{\ at~}{\ at~}"
+ "" "" must.must.must
+ newline$
+ }
+ { units empty.to.null "paras" =
+ { "\bridges{,\ para.~}{}{,\ paras.~}{\ }{,\ para.~}{,\ paras.}"
+ "" "" must.must.must
+ newline$
+ }
+ 'skip$
+ if$
+ }if$
+% \end{macrocode}
+% Next, after the opener, we push the opening macro tag for a book
+% entry, the nickname of the citation, and a couple of
+% braces. This is all mandatory and can safely be given
+% unconditional export.
+% \begin{macrocode}
+ "\lexibib{book}{" cite$ "}{" must.must.must
+ get.a.kinda.sort.key "" "}{" must.must.must
+% \end{macrocode}
+% A non-empty "volume" field means we need a leading
+% volume number in the Blue Book style. If a volume
+% number (or anything else) is found in the "volume"
+% field of a book entry, we replace it with a
+% "volno" macro. This will expand in the document to
+% whatever the author has specified using the optional
+% ":<number>" argument to "\lexicite". For example,
+% volume 8 of "holdsworth" would be: "\lexicite:8:{holdsworth}".
+% \begin{macrocode}
+ volume empty$
+ { "" }
+ { "\volno\ " }
+ if$
+% \end{macrocode}
+% The author comes first. We push the contents of the
+% "author" field, then the toggle string ``"firstinitial"'',
+% and run the "format.names" function to produce the name
+% formatted properly for a book entry. Then we push
+% fa couple of braces
+% and force all three items ("\volno" or null, "author", and
+% braces) onto the output.
+% \begin{macrocode}
+ author
+ "firstinitial" format.names "}{" must.must.must
+% \end{macrocode}
+% The title may be a simple name for a single volume,
+% or it may be in title/subtitle format. Title/subtitle
+% can be written into the "title" entry directly as
+% ``\meta{title}: \meta{subtitle}''. We provide for
+% an alternative form here, just in case "booktitle"
+% is used for the main title --- conservation of
+% data. If there is no "booktitle", we push the title, then
+% check to be sure it's non-empty, then write it onto output.
+% If "booktitle" exists, we push it, then a colon, then
+% "title", followed by a conditional write on output that
+% will suppress the colon if "title" is empty.
+% Finally, we push the closing braces and an opening
+% parens (for the year info) and write that stuff on output.
+% \begin{macrocode}
+ booktitle empty$
+ { title "title" check "" "" must.must.must }
+ { booktitle ": " title must.ifthree.might
+ }if$
+ type empty.to.null "cmnd" =
+ type empty.to.null "command" =
+ type empty.to.null "command papers" =
+ or or
+ { ", " year "mo.dd.yy" format.date
+ ", " "Cmnd. "
+ * * *
+ series empty$
+ { "no.~" }
+ { "Ser.~" series ", No.~" * *
+ }if$
+ number "number" check
+ * *
+ "" "" must.must.must
+ }
+ 'skip$
+ if$
+ "}{}{}{" "(" "" must.must.must
+% \end{macrocode}
+% We're now in the final ``field'' of the \LexiTeX{} entry.
+% This is mainly for the year, but we also give the
+% name of the editor(s) or translator(s)
+% if present. If there is no
+% editor or translator, we'll put a series name here, to help identify
+% the source. We don't put both, because this would
+% confuse things (there can be book editors and
+% series editors too, and the Blue Book style is
+% too streamlined to distinguish the two elegantly).
+% So our first task is to see if there is an editor\ldots
+% \begin{macrocode}
+ editor empty$ translator empty$ and
+% \end{macrocode}
+% \ldots{} and if there is none, we put in a
+% series name if it exists.
+% The "series" \BibTeX{} field should be used for the
+% name of the series of which a volume forms a part,
+% but some folks might accidentally use "booktitle".
+% We'll be forgiving and accept it anyway.
+% \begin{macrocode}
+ { series empty$
+% \end{macrocode}
+% If both
+% "series" is empty, we've nothing to do.
+% \begin{macrocode}
+ 'skip$
+% \end{macrocode}
+%
+% If "series" exists, we push it, followed by
+% a bridge and a series item number,
+% and a toggle for the "field.tag.no.combine" function.
+% The "endlabel" toggle causes this function to put
+% the bridge and the number after the series name,
+% if a number exists, and push the lot back as a single
+% item on the stack. Otherwise it leaves just the series
+% name.
+%
+% And last, we put up a comma to close, and do a mandatory
+% export of the lot.
+% \begin{macrocode}
+ { series " No.~" number
+ "endlabel" field.tag.no.combine ", " "" must.must.must }
+ if$
+ }
+% \end{macrocode}
+% If either the editor or the translator fields were not empty,
+% we format the editor or translator name
+% instead, and put those details here.
+% \begin{macrocode}
+ { editor translator either.or "firstinitial" format.names
+% \end{macrocode}
+% We need to append the correct designator, either ``ed.''\ or
+% ``trans.''. The "either.or" function will use the second
+% item pushed if both are non-empty, so we take advantage of
+% this ``feature'' in making our choice of designators; the
+% "ed." or "eds." strings are only used if the "translator"
+% field is empty. And finally, we push a null string to
+% round out, and do a compulsory export.
+% \begin{macrocode}
+ translator empty$
+ { editor num.names$ #1 >
+ { " eds.\ " }
+ { " ed.\ " }
+ if$
+ }
+ { " trans.\ " }
+ if$
+ "" must.must.must
+ }if$
+% \end{macrocode}
+% We also need to indicate the edition, if any.
+% \begin{macrocode}
+ edition " ed.\ " "" might.ifone.must
+% \end{macrocode}
+% The year itself is easy. We push the year, do a check to issue
+% a warning if necessary, then run format.date over it,
+% which yields the year in "theyear", which can be pushed
+% back onto the stack. Then we fill out to six
+% \LexiTeX{} fields in
+% all, and do a compulsory export.
+% \begin{macrocode}
+ type empty.to.null "cmnd" =
+ type empty.to.null "command" =
+ type empty.to.null "command papers" =
+ or or
+ { "" }
+ { year "mo.dd.yy" format.date
+ }if$
+ ")}" "" must.must.must
+% \end{macrocode}
+% A new line for a new macro, and we're done! Rejoice!
+% On to the next function definition!
+% \begin{macrocode}
+ newline$
+}
+% \end{macrocode}
+%
+% \DescribeEnv{incollection}
+% This is for those nasty entries that are created when someone
+% publishes an article in a collection of essays edited by someone
+% else.
+% \begin{macrocode}
+FUNCTION{incollection}
+{ "\lexibib{incollection}{" cite$ "}{" must.must.must
+ get.a.kinda.sort.key "" "}{" must.must.must
+ author "lastonly" format.names "author" check
+ "}{" "" must.must.must
+ title "title" check
+ "}{" "" must.must.must
+ chapter empty$
+ { "\\in \\" }
+ { "\\" type empty$
+ { "chapter " chapter "chapter" check " of \\" * * * }
+ { type " " chapter "chapter" check " of \\" * * * *
+ }if$
+ }if$
+ booktitle "booktitle" check
+ "}{" must.must.must
+ pages "short" format.pages "pages" check
+ "}{" "(" must.must.must
+% We're now in the final ``field'' of the \LexiTeX{} entry.
+% The coding here is the same as for a "book" entry; the
+% reader is referred to that entry for the commentary
+% on the following code.
+% \begin{macrocode}
+ editor empty$ translator empty$ and
+ { series empty$
+ 'skip$
+ { series " No.~" number
+ "endlabel" field.tag.no.combine ", " "" must.must.must }
+ if$
+ }
+ { editor booktranslator either.or "firstinitial" format.names
+ booktranslator empty$
+ { editor num.names$ #1 >
+ { " eds.\ " }
+ { " ed.\ " }
+ if$
+ }
+ { " trans.\ " }
+ if$
+ "" must.must.must
+ }if$
+ edition " ed.\ " "" might.ifone.must
+ year "mo.dd.yy" format.date ")}" "" must.must.must
+ newline$
+}
+% \end{macrocode}
+% \DescribeEnv{inbook}
+% There is significant massaging of the use to which
+% "title" and "booktitle" is put here. If both occur,
+% but are different, the form is ``"title" in "booktitle"'',
+% or ``"title", chapter X of "booktitle"''.
+% If both occur, but are the same, the treatment depends
+% on whether "chapter" occurs. If it does not occur,
+% the style complains --- an "@inbook" entry should always
+% refer to a chapter or other specific unit if the
+% "title" and "booktitle" are the same. If it does occur,
+% then the chapter or other specifier is treated as a
+% volume number inserted as an option to "\source" using "v=",
+% the "title" being inserted as the title of the work.
+% \begin{macrocode}
+FUNCTION{inbook}
+{ "\lexibib{inbook}{" cite$ "}{" must.must.must
+ get.a.kinda.sort.key "" "}{" must.must.must
+ author "firstinitial" format.names "author" check
+ "}{" "" must.must.must
+ title booktitle =
+ { chapter empty$
+ { "no chapter or separate title for inbook entry " cite$ * warning$
+ }
+ { "{\rm " "Chapter" type either.or.nowarning
+ " " chapter " of} " * * * *
+ }if$
+ }
+ { ""
+ }if$
+ title "title" check
+ "}{" must.must.must
+ title booktitle =
+ { "" }
+ { chapter empty$
+ { "{\rm in} " }
+ { type empty$
+ { "{\rm Chapter " chapter " of} " * * }
+ { "{\rm " type " " chapter " of} " * * * *
+ }if$
+ }if$
+ }if$
+ booktitle "booktitle" check
+ "}{" must.must.must
+ pages "short" format.pages "pages" check
+ "}{" "(" must.must.must
+% We're now in the final ``field'' of the \LexiTeX{} entry.
+% The coding here is the same as for a "book" entry; the
+% reader is referred to that entry for the commentary
+% on the following code.
+% \begin{macrocode}
+ translator empty$
+ { series empty$
+ 'skip$
+ { series " No.~" number
+ "endlabel" field.tag.no.combine ", " "" must.must.must }
+ if$
+ }
+ { translator "firstinitial" format.names
+ " trans.\ "
+ "" must.must.must
+ }if$
+ edition " ed.\ " "" might.ifone.must
+ year "mo.dd.yy" format.date ")" "}" must.must.must
+ newline$
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+FUNCTION{booklet}
+{ "\lexibib{booklet}{" cite$ "}{" must.must.must
+ get.a.kinda.sort.key "" "}{" must.must.must
+ author "full" format.names "}{" "" must.must.must
+ "\\" title "\\}{}{}{(" must.must.must
+ howpublished ", " "" might.ifone.must
+ year "mo.dd.yy" format.date
+ ")}" "" must.must.must
+ newline$
+}
+% \end{macrocode}
+% \changes{1994/12/12}{1.0g}{Added the `techreport' function,
+% to support draft article sent to Pedro Aphalo for comments.}
+% \begin{macrocode}
+FUNCTION {techreport}
+{"\lexibib{techreport}{" cite$ "}{" must.must.must
+ get.a.kinda.sort.key "" "}{" must.must.must
+ institution author either.or.nowarning
+ "full" format.names "author & institution" check
+ "}{" title "title" check must.must.must
+ "}{}{}{" "(" "" must.must.must
+ author empty$
+ 'skip$
+ {institution "\ " "" might.ifone.must
+ }if$
+ type empty$
+ { "Technical report" }
+ { type
+ }if$
+ type empty.to.null "Cmnd" =
+ { "\ " }
+ { " No.~"
+ }if$
+ number "endlabel" field.tag.no.combine
+ ", " "" must.must.must
+ year "mo.dd.yy" format.date
+ "" ")}" must.must.must
+ newline$
+ }
+% \end{macrocode}
+% \begin{macrocode}
+FUNCTION {mastersthesis}
+{"\lexibib{mastersthesis}{" cite$ "}{" must.must.must
+ get.a.kinda.sort.key "}{" "" must.must.must
+ author
+ "full" format.names "author" check
+ "}{" title "title" check must.must.must
+ "}{}{}{("
+ type empty$
+ { "Master's Thesis" }
+ { type
+ }if$
+ ", " must.must.must
+ institution "institution" check ", " "" might.ifone.must
+ year "mo.dd.yy" format.date
+ ")" "}" must.must.must
+ newline$
+ }
+% \end{macrocode}
+%
+% \paragraph{Cases} Law cases are all entered using the
+% {\tt @CASE} entry type. The formatting of citations
+% varies from jurisdiction to jurisdiction, so the behaviour
+% of citations of this type is controlled via a "jurisdiction"
+% field. Supported jurisdictions are listed in the user
+% guide. Below, the functions for each jurisdiction are
+% defined first, followed by the "case" function itself.
+%
+% \begin{macrocode}
+FUNCTION {clear.cite.vars}
+ {
+"" 'volume.var :=
+"" 'number.var :=
+"" 'journal.var :=
+"" 'pages.var :=
+"" 'year.var :=
+ }
+FUNCTION {case}
+% \end{macrocode}
+% Like the "article" entry, the "case" entry must make some
+% pretty fine decisions about how to format material
+% fed to it. As a consequence, it is complex, but similar
+% to the "article" entry in many particulars.
+% \begin{macrocode}
+{ cites empty.to.null "=" *
+ journal empty$
+ { parse.one.cite }
+ { volume empty.to.null 'volume.var :=
+ number empty.to.null 'number.var :=
+ journal 'journal.var :=
+ pages empty.to.null 'pages.var :=
+ year empty.to.null 'year.var :=
+ }if$
+ volume.var empty$ not number.var empty$ not and
+ { "\bridges{,\ p.~}{,\ }{,\ }{\ }{\ at~}{\ at~}"
+ "" "" must.must.must
+ newline$ }
+ 'skip$
+ if$
+ "\lexibib{case}{" cite$ "}{" must.must.must
+ get.a.kinda.sort.key "" "}{}{" must.must.must
+ title empty$
+ { "Decision of the " court "court" check "" must.must.must
+ " (" j.format.division ")" iftwo.might.iftwo
+ ", " "" "" must.must.must
+ casedate "month.dd.yy" format.date "" "" must.must.must
+ "}{" "" "" must.must.must
+ }
+ { title "}{" "" must.must.must }
+ if$
+ volume.var empty$ not number.var empty$ not and
+ { journal.var "journal" check ", v.~" volume.var must.must.must
+ ", n.~" number.var "}{" must.must.must }
+ { volume.var empty$
+ { "[" year.var "mo.dd.yy" format.date "] " iftwo.might.iftwo
+ number.var "\ " journal.var "journal" check might.ifone.must
+ "}{" "" "" must.must.must }
+ { volume.var "\ " journal.var "journal" check empty.to.null
+ might.ifone.must
+ "}{" "" "" must.must.must
+ }if$
+ }if$
+pages.var "short" format.pages "pages" check
+"}{"
+"("
+must.must.must
+volume.var empty$
+ 'skip$
+ { year.var "mo.dd.yy" format.date "" "" must.must.must
+ }if$
+crossref empty$
+{ ")}" "" "" must.must.must }
+{ booktitle empty$
+ { "no booktitle (name of special issue) for "
+ cite$ "/" crossref * * * warning$
+ ")}" "" "" must.must.must }
+ { volume.var empty$ {""} {") ("} if$ booktitle "}" must.must.must}
+ if$
+}if$
+{ duplicate$ "=" = not }
+{ parse.one.cite
+ "={" "" "" must.must.must
+ volume.var empty$ not number.var empty$ not and
+ { journal.var "journal" check ", v.~" volume.var must.must.must
+ ", n.~" number.var "}{" must.must.must }
+ { volume.var empty$
+ { "[" year.var "mo.dd.yy" format.date "] " iftwo.might.iftwo
+ number.var "\ " journal.var "journal" check might.ifone.must
+ "}{" "" "" must.must.must }
+ { volume.var "\ " journal.var "journal" check empty.to.null
+ might.ifone.must
+ "}{" "" "" must.must.must
+ }if$
+ }if$
+pages.var "short" format.pages "pages" check
+"}{"
+""
+must.must.must
+volume.var empty$
+ 'skip$
+ { "(" year.var "mo.dd.yy" format.date ")" must.must.must
+ }if$
+crossref empty$
+{ "}" "" "" must.must.must }
+{ booktitle empty$
+ { "no booktitle (name of special issue) for "
+ cite$ "/" crossref * * * warning$
+ "}" "" "" must.must.must }
+ { volume.var empty$ {""} {") ("} if$ booktitle "}" must.must.must}
+ if$
+}if$
+}while$
+pop$
+clear.cite.vars
+newline$
+annote empty.to.null write$ newline$
+}
+% \end{macrocode}
+% The following item adds annotations; this may be eliminated by
+% stripping with "noannotes".
+% \begin{macrocode}
+%<*!noannotes>
+% annote empty.to.null write$ newline$
+%</!noannotes>
+% }
+% \end{macrocode}
+%
+% \DescribeEnv{j.statute}
+% This function applies to Japanese statutory materials.
+% \changes{1994/08/03}{v0.1c}{Added support for Japanese statutes.}
+% \begin{macrocode}
+FUNCTION {j.statute}
+ { "\lexibib{jstatute}{" cite$ "}{" must.must.must
+ get.a.kinda.sort.key "" "}{}{" must.must.must
+ title "title" check empty.to.null "}{}{}{" "" must.must.must
+ title empty$ {""} {"("} if$
+ "" "" must.must.must
+ number empty$
+ 'skip$
+ { type empty$
+ { "Law" }
+ { type
+ }if$
+ "\ no.~" *
+ number "number" check " of "
+ iftwo.might.iftwo
+ }
+ if$
+ year "yy" format.date
+ title empty$ {""} {")"} if$
+ "}" must.must.must
+ newline$
+ }
+% \end{macrocode}
+%
+% \DescribeEnv{s.statute}
+% This function formats a statute entry for Singapore.
+% \begin{macrocode}
+FUNCTION { s.statute }
+{ "\lexibib{statute}{" cite$ "}{" must.must.must
+ get.a.kinda.sort.key "" "}{}{" must.must.must
+ title "title" check ", No.~" number
+ "endlabel" field.tag.no.combine
+ number empty$
+ { "\ " * }
+ { "\ of " * }
+ if$
+ year "mo.dd.yy" format.date "}{}{}{}" must.must.must
+ newline$
+}
+% \end{macrocode}
+% \begin{macrocode}
+FUNCTION { e.statute }
+{ "\lexibib{statute}{" cite$ "}{" must.must.must
+ get.a.kinda.sort.key "" "}{}{" must.must.must
+ title "title" check "\ "
+ year "mo.dd.yy" format.date must.must.must
+ "}{}{}{}" "" "" must.must.must
+ newline$
+}
+% \end{macrocode}
+%
+% \DescribeEnv{statute}
+% This function selects the correct statute entry function.
+% \begin{macrocode}
+FUNCTION { statute }
+ { type build.bridges
+ jurisdiction empty.to.null duplicate$
+ "japan" =
+ { pop$ j.statute }
+ { duplicate$ "singapore" =
+ { pop$ s.statute }
+ { duplicate$ "england" =
+ { pop$ e.statute }
+ { pop$ "IMPORTANT: unknown jurisdiction for " cite$ * warning$
+ }if$
+ }if$
+ }if$
+ }
+% \end{macrocode}
+%
+% \DescribeEnv{unpublished}
+%
+% A hastily drafted function type for unpublished materials.
+%
+% \begin{macrocode}
+FUNCTION {unpublished}
+{ "\lexibib{book}{" cite$ "}{" must.must.must
+ get.a.kinda.sort.key "" "}{" must.must.must
+ author "firstinitial" format.names "}{" "" must.must.must
+ title "title" check "" "" must.must.must
+ "}{}{}{" "(" "" must.must.must
+ note
+ ")}" "" must.must.must
+ newline$
+}
+% \end{macrocode}
+%
+% \DescribeEnv{default.type}
+% We use the "book" type as our default type. When "manual" is
+% completed, we should probably use that type instead.
+% \begin{macrocode}
+FUNCTION {default.type} { book }
+%</bstfunctions>
+% \end{macrocode}
+%
+%
+% \subsection{Macro definitions}
+% We don't define any macros for abbreviating law journal
+% names. Instead, we will use Blue Book abbreviations
+% ``native'', with a special syntax (probably the full
+% form in syntax:
+% ``"\gobble{Accountant}{}"'' immediately after
+% the abbreviation) for resolving
+% ambiguous abbreviations. Meanwhile, trust me: use the
+% Blue Book abbreviations and take this upcoming facility
+% on faith. And besides, do you ever {\em need\/} to spell
+% out journal and reporter names?
+%
+% \subsection{Execution}
+% With all preliminaries out of the way, our first act is
+% to read in the entries from {\tt *.bib}..
+% \begin{macrocode}
+%<*bstfunctions>
+READ
+% \end{macrocode}
+% Then we say ``Hi'' to the user. It would be nice to make this
+% the first message, but the structure of \BibTeX{} style files
+% dictates that it will follow any warnings about missing
+% entries.
+% \begin{macrocode}
+EXECUTE {hello}
+%</bstfunctions>
+% \end{macrocode}
+% \section{Camel style code}
+% \begin{macrocode}
+%<*lawcitestyle>
+\ProvidesFile{law.cst}[1995/01/08]
+% \end{macrocode}
+% \subsection{Word list}
+% A list of inter-words and their corresponding expansions
+% must be provided.
+% \begin{macrocode}
+{\catcode`\_=13%
+ \catcode`\^=13%
+\gdef\@law@wordlist{%
+ \\{\item}{\item}%
+ \\{and}{_\ ^And }%
+ \\{but-see}{_\ ^But see }%
+ \\{,}{_; }%
+ \\{;}{_; }%
+ \\{:}{_; }%
+ \\{eg}{_; ^E.g.~}%
+ \\{accord}{_; ^Accord }%
+ \\{see}{_; ^See }%
+ \\{see-also}{_; ^See also }%
+ \\{cited-in}{ cited in }%
+ \\{citing}{ citing }%
+ \\{cf}{_; ^Cf.~}%
+ \\{compare}{_; ^Compare }%
+ \\{with}{ with }%
+ \\{contra}{_; ^Contra }%
+ \\{but-cf}{_\ ^But cf.~}%
+ \\{see-generally}{_. See generally }%
+ \\{affirmed}{_, ^aff'd }%
+ \\{reprinted-in}{_; ^Reprinted in }%
+ \@law@nomatch}
+}
+% \end{macrocode}
+%
+% \subsection{Print routines}
+% Every ".cst" file must define a "\@law@print" macro.
+% This is the macro that prints the citation, both in the
+% text of the document and in the bibliography.
+% The toggles set by the {\sc Camel} engine allow
+% a high degree of refinement in the formatting of
+% citations. For the styles currently used in
+% publishing with \LaTeX{}, relatively little of this
+% power is required. In-document citation styles
+% are much more demanding; if you digest the operation
+% the following "\@law@print" macro, which is suitable for
+% formatting legal citations, you will find the drafting
+% of author-date styles and the like quite straightforward
+% by comparison.
+% \begin{macrocode}
+\gdef\@law@print{%
+% \end{macrocode}
+% In this particular style, a long citation (for the
+% bibliography, for example) and a first in-text citation
+% are identical. These forms have separate toggles, so
+% we start by equating them.
+% \begin{macrocode}
+ \xdef\@law@argtwolist{\the\@ltok@argtwo}%
+ \if@law@firstuseofcite\@law@longcitetrue\fi%
+% \end{macrocode}
+% This toggles the printing on and off. This toggle is
+% set by the "n" option to the "\source" command.
+% \begin{macrocode}
+\if@law@printcite%
+ \begingroup%
+ \def\@law@firstslash{\begingroup\def\\{\@law@secondslash}%
+ \the\ltokspecialface}%
+ \def\@law@secondslash{\endgroup\def\\{\@law@firstslash}}%
+ \def\\{\@law@firstslash}%
+% \end{macrocode}
+% There are two halves to the macro; one for long cite forms,
+% the other for short. Long cite forms are in the first
+% half.
+% \begin{macrocode}
+\if@law@longcite%
+% \end{macrocode}
+% Long citations are pretty straightforward; we've gathered all
+% the information we needed; now we just need to plunk it
+% all down in order, pretty much.
+% First to print is the author field (the second argument to the
+% citation declaration command), followed by the
+% author-to-title punctuation bridge. The enclosing
+% braces limit the scope of the special active character
+% definitions of "^", "_" and "|".
+% \begin{macrocode}
+ \global\ltokspecialface=\@ltok@authoroptionface%
+ {\the\@ltok@authormainface%
+ \@law@barinfull\the\@ltok@author}\the\@ltok@atot%
+% \end{macrocode}
+% Next comes similar treatment for the title.
+% \begin{macrocode}
+ \global\ltokspecialface=\@ltok@titleoptionface%
+ {\the\@ltok@titlemainface%
+ \@law@barinfull\the\@ltok@name}\the\@ltok@ttocone%
+% \end{macrocode}
+% \begin{macrocode}
+ \@law@longrecurse%
+% \end{macrocode}
+% This else marks the boundary between long-form citations
+% (which we have seen are relatively simple to print)
+% and short-form citations (which are rather complex).
+% This "\else" matches the "\if@law@longcite" conditional.
+% \begin{macrocode}
+\else%
+% \end{macrocode}
+% The footnote number and the accompanying bridge
+% should not appear in a short-form citation if
+% the citation being printed first occurred in the
+% current footnote. Rather than suppressing printing,
+% we just set the relevant tokens to nil.
+% \begin{macrocode}
+ \ifnum\the\@ltok@pageorfootno=\the\c@law@footnote\relax%
+ \xdef\@law@temp{\the\@ltok@whereitsat}%
+ \xdef\@law@temptwo{\the\@ltok@infoot}%
+ \ifx\@law@temp\@law@temptwo%
+ \global\@ltok@whereitsat{}%
+ \global\@ltok@pageorfootno{}%
+ \fi%
+ \fi%
+% \end{macrocode}
+% Special forms of tidying-up may be appropriate to
+% each of the four classes of citation. An appropriate
+% cleaning macro is called here.
+% \begin{macrocode}
+\csname @law@\the\@ltok@citetype preformat\endcsname%
+% \end{macrocode}
+% If it has been found that the same citation has been
+% used immediately previous to this instance,
+% we use {\em Id.} If the "\@justabove" test showed
+% that {\em Id.} by itself is appropriate, we prepare
+% to eat any period immediately following the citation
+% macro. Otherwise, we tack on the pinpoint reference
+% and its accompanying bridge. A fail-safe conditional
+% reverts to the original plan if the pinpoint reference
+% is empty.
+% \begin{macrocode}
+ \if@justabove%
+ {\def\,{,}%
+ \Id%
+ \if@l@quiteexact%
+ \gdef\@law@gobble{\@ifnextchar.{\@gobble}{}}%
+ \else%
+ \ifcat$\the\@ltok@argtwo$%
+ \gdef\@law@gobble{\@ifnextchar.{\@gobble}{}}%
+ \else%
+
+ \the\@ltok@atbridge{\@law@barkill\the\@ltok@argtwo\relax}%
+ \@law@fetchparas%
+ \@law@shiftparas%
+ \@law@shortrecurse%
+ \fi%
+ \fi}%
+% \end{macrocode}
+% If {\em Id.} was not called for, we have to create
+% a proper short-form reference. This "\else" corresponds
+% with the "\@justabove" toggle, above.
+% \begin{macrocode}
+ \else%
+% \end{macrocode}
+% The author will be used in any case. Note that the author
+% and its following bridge may have been set to nil, above.
+% \begin{macrocode}
+ \global\ltokspecialface=\@ltok@authoroptionface%
+ {\the\@ltok@authormainface%
+% print whatever there if for the author
+ \@law@barinshort\the\@ltok@author}\the\@ltok@atot%
+% \end{macrocode}
+% The title information is also used, if it is present.
+% \begin{macrocode}
+ \global\ltokspecialface=\@ltok@titleoptionface%
+ {\the\@ltok@titlemainface%
+% \end{macrocode}
+% If we have specified a nickname for this cite for
+% `hereinafter' references, we use it instead of the
+% title of the work.
+%<*parabeta>
+[Some day this might be hooked up.]
+%</parabeta>
+% \begin{macrocode}
+ \@law@barinshort\the\@ltok@name}%
+% \end{macrocode}
+% At this point, we must make decisions concerning whether
+% to use the {\em supra\/} cross-referencing form. This
+% depends on the type of citation we are working on.
+% The "\@nosupra" condition is set to true if we are working
+% on a case or a statute, otherwise it is set to false.
+% \begin{macrocode}
+ \xdef\@law@temp{\the\@ltok@citetype}%
+ \ifx\@law@temp\@law@case%
+ \@nosupratrue%
+ \else%
+ \ifx\@law@temp\@law@statute%
+ \@nosupratrue%
+ \else%
+ \@nosuprafalse%
+ \fi%
+ \fi%
+% \end{macrocode}
+% Now we put the result of the above test to work.
+% First, the citation form for cases or statutes, which
+% do not permit the {\em supra\/} form.
+% \begin{macrocode}
+ \if@nosupra%
+% \end{macrocode}
+% \begin{macrocode}
+ \the\@ltok@ttocone%
+ \@law@shortprint%
+ \@law@shortrecurse%
+ \else%
+ \supra\the\@ltok@whereitsat\the\@ltok@pageorfootno%
+ \the\@ltok@atbridge%
+ {\def\,{,}%
+ {\@law@barkill\the\@ltok@argtwo\relax}}%
+ \fi%
+% \end{macrocode}
+% In order, these close "\if@justabove", "\if@law@longcite"
+% and "\if@law@printcite".
+% \begin{macrocode}
+ \xdef\@law@temp{\the\@ltok@citetype}%
+ \ifx\@law@temp\@law@statute%
+ \ifcat$\the\@ltok@citefirst$%
+ \the\@ltok@ptoctwo{\@law@barinshort\the\@ltok@citelast}%
+ \fi%
+ \fi%
+ \fi%
+\fi%
+\endgroup%
+\fi% <- end of if@law@printcite
+% \end{macrocode}
+% The "\@law@gobble" here will consume a period inserted
+% automatically after a forced footnote, if the printed
+% form turned out to be an {\em Id.}. See the concluding
+% code of "\@law@setup".
+% \changes{1994/07/26}{2.0c}{Moved {\tt\protect\string%
+% \protect\@law@forcingfalse} outside of a conditional
+% expression at the end of the print routine, to correct
+% the failure of the forcing mechanism to work more than once.}
+% \changes{1994/12/14}{2.0l}{Fairly drastic simplification
+% of the forcing mechanism, in the course of providing for
+% unified handling of citation strings. Code now much
+% easier to follow.}
+% \changes{1996/03/09}{0.1c}{Corrected a fatal bug in the
+% parallel pinpointing mechanmism. This required changes to both
+% Camel and the Law module; the list macro of pinpoints was
+% being parsed in both!}
+% \begin{macrocode}
+\global\@law@longcitefalse\gdef\volno{\message{(No volume %
+ for \the\@ltok@nickname)}}}%
+% \end{macrocode}
+% \begin{macro}{\@law@longrecurse}
+% This macro prints the tail end of long citations until
+% parallels are exhausted.
+% \begin{macrocode}
+\def\@law@longrecurse{%
+ \@law@longprint%
+ \ifnum\the\c@law@parapin>0\relax%
+ \loop%
+ \addtocounter{law@paracounter}{1}%
+ \ifnum\the\c@law@paracounter<\the\c@law@parapin\relax%
+ ; \@law@longprint%
+ \repeat%
+ \else%
+ \loop%
+ \addtocounter{law@paracounter}{1}%
+ \ifnum\the\c@law@paracounter>\the\c@law@paranormal\relax%
+ \else%
+ ; \@law@longprint%
+ \repeat%
+ \fi%
+% \end{macrocode}
+%
+% \textit{Finally, we print the last date item, which might
+% be blank if it's already been printed inside "\@law@longprint".}
+% \changes{1997/01/09}{v2.0m}{Fixed loss of citelast in parallel citations.}
+%
+% \begin{macrocode}
+ \@law@temp}
+\def\@law@shortrecurse{%
+ \ifnum\the\c@law@parapin>0\relax%
+ \loop%
+ \addtocounter{law@paracounter}{1}%
+ \ifnum\the\c@law@paracounter<\the\c@law@parapin\relax%
+ \@law@pincut\@ltok@argtwo\frompinlist%
+ ; \@law@shortprint%
+ \repeat%
+ \else%
+ \loop%
+ \addtocounter{law@paracounter}{1}%
+ \ifnum\the\c@law@paracounter>\the\c@law@paranormal\relax%
+ \else%
+ ; \@law@shortprint%
+ \repeat%
+ \fi}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@law@longprint}
+% \begin{macrocode}
+\def\@law@longprint{%
+ \begingroup%
+ \@law@fetchparas%
+ \@law@tidybridges%
+% \end{macrocode}
+% If for some reason either the pinpoint argument is nil,
+% or it {\em and\/} the location page token register is nil,
+% we set the accompanying bridges to nil.
+% \begin{macrocode}
+ \ifcat$\the\@ltok@argtwo$%
+ \global\@ltok@ptop{}%
+ \global\@ltok@atbridge{}%
+ \ifcat$\the\@ltok@citepage$%
+ \global\@ltok@conetop{}%
+ \fi%
+ \fi%
+% \end{macrocode}
+% \begin{macrocode}
+ \global\ltokspecialface=\@ltok@citefirstoptionface%
+ {\the\@ltok@citefirstmainface%
+ \@law@barinfull\the\@ltok@citefirst}%
+ \@law@conetopsetup%
+ \the\@ltok@conetop%
+% \end{macrocode}
+% Next comes the location page and its following
+% bridge. Both of these may be blank. No funny
+% business with the shorthand active characters is
+% required, since we assume this will not contain
+% any special text for which they will be required.
+% \begin{macrocode}
+ \the\@ltok@citepage\the\@ltok@ptop%
+% \end{macrocode}
+% A special use of "\," is defined before we expand
+% the optional argument stuff.
+% \begin{macrocode}
+ {\def\,{,}\@law@barkill%
+ \expandafter\the\@ltok@argtwo%
+ \relax}%
+% \end{macrocode}
+% \textit{And finally, we print the final portion of the citation.
+% We package the citation part together with its preceding bridge.
+% If it is printed, we blank it; this gives us a simple command that
+% we can put at the end of the recursive routine that invokes this
+% code, so that the tail end of a string cite will be printed if
+% necessary, and only once.}
+% \changes{1997/01/09}{v2.0m}{Modified current-and-last comparison
+% algorithm for the last portion of the cite in parallel citations.}
+%
+% \begin{macrocode}
+ \xdef\@law@temp{%
+ \the\@ltok@ptoctwo%
+ \noexpand\@law@barinfull%
+ \the\@ltok@citelast}%
+ \xdef\@law@temptwo{%
+ \the\@ltok@ptoctwo%
+ \noexpand\@law@barinfull%
+ \the\@ltok@usercitelast}%
+ \ifx\@law@temp\@law@temptwo%
+ \else%
+ {\@law@temp}%
+ \gdef\@law@temp{}%
+ \fi%
+ \@law@shiftparas%
+ \endgroup}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@law@shortprint}
+% \begin{macrocode}
+\def\@law@shortprint{%
+% If {\sc Camel} sees more than one pinpoint page or section,
+% the bridges preceding
+% the page references must be set to their plural form.
+% This change applies to both long and short form citations.
+% It has to be cloned in each, however, because the decision has
+% to be taken with respect to each cite in a string of parallels.
+% \begin{macrocode}
+ \begingroup%
+ \@law@fetchparas%
+ \@law@tidybridges%
+% \end{macrocode}
+% The actual recursive printing works.
+% \begin{macrocode}
+ \global\ltokspecialface=\@ltok@citefirstoptionface%
+ {\the\@ltok@citefirstmainface%
+ \@law@barinshort\the\@ltok@citefirst}%
+% \end{macrocode}
+% If the pinpoint reference is empty, we tack on the
+% location page after the appropriate bridge. Otherwise,
+% we do nothing for the present; any pinpoint reference
+% will be produced later on.
+% Note that the bridge
+% used here will only be in plural form if something was
+% given for use as a pinpoint reference.
+% NB: THIS IS A TEST!!!! ******** BRACKETS TO BE PULLED!!!!
+% \begin{macrocode}
+ \@law@conetopsetup%
+ \the\@ltok@conetop%
+ \ifcat$\the\@ltok@argtwo$%
+ \the\@ltok@citepage%
+ \else%
+ {\@law@barkill\the\@ltok@argtwo}%
+ \fi%
+ \@law@shiftparas%
+ \endgroup}%
+% \end{macrocode}
+% \end{macro}
+%
+% \paragraph{Print format subroutines}
+% \begin{macro}{\@law@casepreformat}
+% This is empty; no special preparations are necessary
+% for the printing of a case citation.
+% \begin{macrocode}
+\gdef\@law@casepreformat{}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@law@statutepreformat}
+% If short statutory references are in force,
+% the title and the following bridge are set to nil,
+% if some reference is provided in the first citation
+% part.
+% \begin{macrocode}
+\gdef\@law@statutepreformat{%
+\if@law@statuteverbose%
+\else%
+ \ifcat$\the\@ltok@citefirst$%
+ \else%
+ \global\@ltok@name{}%
+ \global\@ltok@ttocone{}%
+ \fi%
+\fi%
+}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@law@articlepreformat}
+% If a work by the identical author has been cited more than
+% once, we leave
+% everything intact (the print routine does the necessary
+% culling);
+% otherwise, we cut the title here. The use of
+% "\@law@authortracing"
+% is explained above.
+% \begin{macrocode}
+\gdef\@law@articlepreformat{%
+\ifcat$\the\@ltok@author$%
+\else%
+{\@law@clean\@ltok@author\@law@authortracing%
+\expandafter\expandafter\expandafter\if\expandafter%
+\csname\@law@authortracing\endcsname2%
+ \else%
+ \global\@ltok@atot{}\global\@ltok@name{}%
+\fi}\fi}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@law@bookpreformat}
+% This provides the same treatment given to articles.
+% \begin{macrocode}
+\gdef\@law@bookpreformat{%
+\ifcat$\the\@ltok@author$%
+\else%
+{\@law@clean\@ltok@author\@law@authortracing%
+\expandafter\expandafter\expandafter\if\expandafter%
+\csname\@law@authortracing\endcsname2%
+ \else%
+ \global\@ltok@atot{}\global\@ltok@name{}%
+ \fi}\fi}%
+%</lawcitestyle>
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Camel citation formats}
+% The style definitions are stored in a separate file,
+% to make it easier and less risky for users to play with
+% the styles to produce desired output. Table 3
+% provides a guide to the macro arguments and their functions.
+% \subsubsection{Books} The styles used for citing books and
+% book-like things follow.
+% \begin{macrocode}
+%<*lawcite>
+\ProvidesFile{law.cit}[1994/12/07]
+\newcitestyle{book}%
+ {srsrrrB}
+ {[a],\ [t][c]\ [p](pl)\ [rp]\ [e]:[id]\ at~(pl)\ at~[xrf]}
+%
+\newcitestyle{booklet}%
+ {riririB}
+ {[a],\ [t][c]\ [p](pl)\ [rp]\ [e]:[id]\ at~(pl)\ at~[xrf]}
+%
+\newcitestyle{techreport}%
+ {riririB}
+ {[a],\ [t][c]\ [p](pl)\ [rp]\ [e]:[id]\ at~(pl)\ at~[xrf]}
+%
+\newcitestyle{mastersthesis}%
+ {riririB}
+ {[a],\ [t][c]\ [p](pl)\ [rp]\ [e]:[id]\ at~(pl)\ at~[xrf]}
+% \end{macrocode}
+% \subsubsection{Articles} Styles used for articles
+% and similar shortish things follow. They're all
+% the same, but the clones help keep things clear when following
+% the action between \LaTeX\ and \BibTeX.
+% \begin{macrocode}
+\newcitestyle{article}%
+ {rsirsrA}
+ {[a],\ [t],\ [c]\ [p],\ (pl),\ [rp]\ [e]:[id]\ at~(pl)\
+at~[xrf]}
+\newcitestyle{incollection}%
+ {rsirsrA}
+ {[a],\ [t],\ [c]\ [p],\ (pl),\ [rp]\ [e]:[id]\ at~(pl)\
+at~[xrf]}
+\newcitestyle{inbook}%
+ {srirsrA}
+ {[a],\ [t],\ [c]\ [p],\ (pl),\ [rp]\ [e]:[id]\ at~(pl)\
+at~[xrf]}
+% \end{macrocode}
+% \subsubsection{Cases} There are several styles for cases; we pretty
+% much need a separate style for each jurisdiction.
+% \begin{macrocode}
+\newcitestyle{case}%
+ {rrirrsC}
+ {[a][t],\ [c]\ [p],\ (pl),\ [rp]\ [e]:[id]\ at~(pl)\ at~[xrf]}
+% \end{macrocode}
+% \subsubsection{Statutes} There are several of these. More may
+% need to be added on an {\em ad hoc\/} basis.
+% \begin{macrocode}
+\newcitestyle{statute}%
+ {rrrsrsS}
+ {[a][t],\ [c]\ \S~[p](pl)\ \S\S~[rp]\ [e]:[id]\ \S~(pl)\
+\S\S~[xrf]}
+%
+\newcitestyle{jstatute}%
+ {rrrsrsS}
+ {[a][t][c]\ \S~[p](pl)\ \S\S~[rp]\ [e]:[id]\ \S~(pl)\
+\S\S~[xrf]}
+%</lawcite>
+% \end{macrocode}
+%
+% \section{Extraction utilities}
+% \subsection{The Driver}
+% Here is a simple driver for extracting the files in the
+% package.
+% \changes{1997/01/09}{v2.0m}{Brought installation file up to
+% date for use with the new docstrip utility.}
+%
+% \begin{macrocode}
+%<*installer>
+\def\batchfile{law.ins}
+\input docstrip.tex
+\preamble
+
+Copyright (C) 1992--97 Frank Bennett, Jr.
+All rights reserved.
+
+This file is part of the Law module for the Camel package.
+\endpreamble
+
+\def\batchfile{camel.dst} % ignored in distribution
+\input docstrip.tex % ignored in distribution
+
+\keepsilent
+
+\preamble
+This file is part of the Law module of the Camel package.
+---------------------------------------------------------
+This is a generated file.
+IMPORTANT NOTICE:
+
+You are allowed to change this file, subject to the following
+conditions. Under any circumstances, new macro definitions
+should not be added to this file. You are welcome to modify
+the macro definitions contained in this file for your own
+use. If you pass a copy of the modified version to someone
+else, you should (a) let me know about the change on
+fb@soas.ac.uk, and (b) put a note of the changes and of your
+own contact details in the file. Furthermore, you must
+acknowledge Camel and its author(s) in the new file (if it
+is distributed to others), and you must attach these same
+conditions to the new file.
+
+You are not allowed to distribute this file alone. You are not
+allowed to take money for the distribution or use of this file
+(or a changed version) except for a nominal charge for copying
+etc.
+
+You are allowed to distribute this file under the condition that
+it is distributed with all of its contents, intact.
+
+For error reports, or offers to help make this a more powerful,
+friendlier, and better package, please contact me on
+`fb' at soas.ac.uk
+
+\endpreamble
+
+
+\generate{\file{law.cst} {\from{law.dtx}{lawcitestyle}}
+ \file{law.cit} {\from{law.dtx}{lawcite}}}
+
+
+\postamble
+\endpostamble
+
+%<installer>% Change eng to jse below for JBibTeX support
+
+\generate{\file{law.bst} {\from{camel.dtx}{bstheader,eng}
+ \from{law.dtx}{bstheader,eng}
+ \from{camel.dtx}{bstlibrary,eng}
+ \from{law.dtx}{bstfunctions,eng}
+ \from{camel.dtx}{bsttrailer,eng}}}
+
+\keepsilent
+
+
+\ifToplevel{
+\Msg{***********************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the following}
+\Msg{* file into a directory searched by TeX:}
+\Msg{*}
+\Msg{* \space\space law.cst}
+\Msg{* \space\space law.cit}
+\Msg{*}
+\Msg{* You should also move the following file into a directory}
+\Msg{* searched for style files by BibTeX:}
+\Msg{*}
+\Msg{* \space\space law.bst}
+\Msg{*}
+\Msg{* Other style modules can be found on CTAN in the `styles'}
+\Msg{* subdirectory below Camel itself.}
+\Msg{*}
+\Msg{***********************************************************}
+}
+%</installer>
+% \end{macrocode}
+% \Finale \PrintIndex \PrintChanges