diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/camel/camel.dtx |
Initial commit
Diffstat (limited to 'macros/latex/contrib/camel/camel.dtx')
-rw-r--r-- | macros/latex/contrib/camel/camel.dtx | 5872 |
1 files changed, 5872 insertions, 0 deletions
diff --git a/macros/latex/contrib/camel/camel.dtx b/macros/latex/contrib/camel/camel.dtx new file mode 100644 index 0000000000..a780437cb7 --- /dev/null +++ b/macros/latex/contrib/camel/camel.dtx @@ -0,0 +1,5872 @@ +% \iffalse +%<*driver> +\documentclass{ltxdoc} +\usepackage{camel} +\usepackage{array} +\pagenumbering{roman} + +\def\fileversion{1.0t} +\def\filedate{97/02/17} + +%\EnableCrossrefs +\DisableCrossrefs % Say \DisableCrossrefs if index is ready +\RecordChanges % Gather update information +\CodelineIndex % Index code by line number +%\OnlyDescription % comment out for implementation details +\begin{document} +\citationstyle{law} +\citationdata{camel} +\title{User's Guide to the {\sc Camel} Citator\thanks{% + This file is version number \fileversion{}. The + documentation was last revised on \filedate.}} +\author{Frank G. Bennett, Jr.\thanks{The text and source code + contained in this file are \copyright~1992--1995 by Frank G. + Bennett, Jr. This file can be freely distributed; the sole + condition of use is that acknowledgement to the author be + made in any published work produced using {\sc Camel}. The + author wishes to thank Pedro Aphalo, Steve Bellovin, George + Greenwade and Boris Pevzner and David Rhead for their helpful + comments on versions of \LexiTeX, the predecessor to {\sc + Camel}. In addition, David Rhead provided a mass of + information on bibliographic conventions, which was used in + shaping the options supported by this package. Gratitude is + also owed to Marcia Elliot and Yoshiko Makino, LL.B. + finalists in the Law Department of the School of Oriental and + African Studies in 1993 and 1994 respectively, who prepared + extended essays using early releases of \LexiTeX.}} + \maketitle + \DocInput{camel.dtx} +\end{document} +%</driver> +% \fi +% \CheckSum{3488} +% +%\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{\"} +% +% +% \def\bs{\char`\\} +% \begin{abstract} +% \noindent This is the core +% documentation for {\sc Camel}, a \LaTeX{} macro package +% that drastically simplifies the typesetting of +% citations and bibliographies in a wide variety of styles and formats. +% {\sc Camel} is similar in look and feel to standard \BibTeX{}, +% but introduces a number of long-desired enhancements. +% When the document is printed, +% {\sc Camel} allows the generation of +% subdivided bibliographies, +% separate bibliographies for each subdivision +% of a larger work, in-footnote cross-referenced +% citations, bibliographies indexed to the pages where +% citations to the relevant work occur, and much else. This is +% the only fully supported bibliography package for \LaTeX{} that +% provides full support for legal citations. +% The package also provides genuinely helpful error messages +% and an extremely simple syntax for adding details like page +% numbers and the like to citation tags. +% {\sc Camel} provides the logical engine and +% skeleton macros that make these things possible; +% a separate style package is required to actually typeset documents. +% For an example of a working style +% package, see {\tt law.dtx} in the {\tt camel} +% subdirectory on CTAN. +% \end{abstract} +% +% +% \tableofcontents +% \newpage +% +% +% +% \bigskip +% \forcefootnotes +% \hfill {``Now comes the fun part.''}\par +% \smallskip +% {\hfill ---Donald Knuth}\source{knuth}[176].% +% +% \bigskip +% +% \section*{Preface to release 1.0} +% Welcome to {\sc Camel}, a comprehensive bibliography +% manager developed as a prototype citation engine +% for the \LaTeX3 project. +% The {\sc Camel} engine offers a highly flexible +% yet straightforward syntax for entering citation +% keys into a \LaTeX{} document. The {\sc Camel} engine +% is designed to support a wide range of +% citation styles. Documents prepared +% for {\sc Camel} can be converted into virtually any +% supported bibliography or citation style, usually by editing only +% a few toggles at the top of the document.\footnote{This is +% potentially exciting (he said), but as of this writing only one +% module --- {\tt law.dtx}, the legal citation module used for +% beta-testing the {\sc Camel} engine --- exists. Some followers +% of {\sc Camel} development have expressed serious interest in +% developing other modules, but I cannot make any promises +% about when additional styles will appear. I've done my work, +% it is now up to the wider world.} +% +% Within the \LaTeX3 project, an extensive +% survey of bibliographic styles was carried out by +% David Rhead. Pedro Aphalo, Task Coordinator +% for bibliographic support on the \LaTeX3 Project, +% first proposed adopting +% a unified syntax for all bibliographic +% styles. {\sc Camel} itself +% is the brainchild of Frank Bennett, and is +% based upon his earlier work on the \LexiTeX{} style +% engine for legal materials. +% This package completely supercedes \LexiTeX{}, and that +% earlier style package will no longer be supported. +% The new package should be referred to as +% ``the {\sc Camel} citator''.\footnote{% +% Why {\sc Camel}? +% The first point to make, I suppose, is that the {\sc Camel} +% citator has absolutely \textit{nothing} to do with +% \texttt{Perl}. I had never heard of \texttt{Perl} when {\sc +% Camel} development began, and scarcely knew anything about it +% by the time most of {\sc Camel} had been finished. I didn't +% even realize I was in Larry Wall's space when I used the +% \texttt{Perl} camel logo for the {\sc Camel} home page! +% +% That aside, I can offer several reasons for the name, +% and users may take their pick. +% The style operates by gathering citation details +% that it carries with it through the desert of plain +% text, until the bibliography engine reaches its oasis +% at document's end. Alternatively, in his daily work +% the author uses +% the multi-lingual enchancement of Emacs, +% which is called ``Mule''. It's nice for one critter to +% have the company of another in the stable. A third +% arbitrary explanation is that the Japanese word for +% ``camel'' is {\em rakuda}. These syllables, with a +% different intonation, mean ``dead easy''. Since the +% design goal of {\sc Camel} is to make bibliography +% management as easy, as fool-proof and as robust +% as possible, this cross-lingual pun seems fitting.} +% +% The core {\sc Camel} package provides hooks for the development of +% style options that satisfy all bibliographic requirements +% that have come to the attention of the \LaTeX3 bibliography +% team. +% The foundation +% has been laid, but much work remains to +% be done in drafting {\sc Camel} modules to meet +% all known bibliographic requirements in all fields +% (and in all languages) for which \LaTeX{} is used. +% This work will involve the drafting or modification +% of {\tt .bst} files in the reverse polish notation +% used by \BibTeX{}, and of {\sc Camel} style +% modules written in \TeX{}. If you want to contribute to +% a project that will dramatically enhance the +% utility of \LaTeX{} as an author's productivity tool, +% get involved! The +% developers' email addresses are as follows: +% +% \begin{itemize} +% \item Frank +% Bennett: {\tt fb@soas.ac.uk}. +% \item Pedro Aphalo: {\tt aphalo@cc.joensuu.fi}. +% \item David Rhead: {\tt David\_Rhead@vme.ccc.nottingham.ac.uk}. +% \end{itemize} +% +% A programmer's reference +% guide for drafting {\sc Camel} styles is included in this +% manual. +% Don't delay---start coding today. +% +% \newpage +% \pagenumbering{arabic} +% +% \section{Introduction} +% This guide explains the use of the {\sc Camel} Citator. +% It covers all commands available in the style. This should be +% the only user manual that you need to prepare a document for +% use with any {\sc Camel} bibliography style. +% The package provides eight commands, listed in the table at the +% bottom of this page. The opening commands may be combined in a +% variety of ways, but a typical document heading might look like +% this: +% +% \begin{quote} +% \begin{verbatim} +% \documentclass{article} +% \usepackage{camel} +% \citationsubject{english}{Materials in English} +% \citationsubject{german}{Materials in German} +% \begin{document} +% \citationstyle{law} +% \citationdata{gorp,slush,fodder} +% \forcefootnotes +% \end{verbatim} +% \end{quote} +% +% You should be careful to decide on the subject classification, +% if any, +% that you wish to apply to your citations, before you begin +% your writing. With that in hand, you can begin entering +% "\source" commands into the document, adjusting the style +% parameters at print time. A detailed description of command +% usage follows. Throughout this guide, it is assumed that +% the +% reader has a general familiarity with \BibTeX{} +% and its use in preparing bibliographies with +% standard-issue \LaTeX{}. If you need to learn more about +% \BibTeX, a number of excellent sources of information are +% available.\source{latex-book}, +% \source{latex-companion}, \source{oren-user} and +% \source{oren-hackers} The treatment given to the +% programming language tends to be quite brief, but you should +% not be put off by this; the language is, in fact, quite simple +% to use, and the {\sc Camel} programming library makes things +% even easier. +% +% \begin{table}[b] +% {\small +% \setlength{\extrarowheight}{3pt} +% \begin{tabular}{|lll|} +% \hline +% \multicolumn{3}{|c|}{\large\bf {\sc Camel} commands}\\\hline\hline +% "\citationsubject["\meta{options}"]{"\meta{nickname}"}{"\meta{heading text}"}" & optional & preamble \\ +% "\citationstyle{"\meta{style package name}"}" & required & +% doc top\\\hline +% "\citationdata{"\meta{bib1,bib2\ldots}"}" & alternative & +% doc top\\ +% "\bibliographymanager{"\meta{product name}"}" & alternative & +% doc top\\\hline +% "\forcefootnotes" & optional & doc top\\ +% "\newinterword{"\meta{nickname}"}{"\meta{text}"}" & optional & +% doc top\\ +% "\printbibliography{"\meta{nickname}"}" & optional & anywhere\\ +% "\source["\meta{options}"]{"\meta{nickname}"}["\meta{page numbers}"]" +% & n/a & anywhere\\\hline +% \end{tabular} +% } +% \end{table} +% +% \subsection{Commands} +% \DescribeMacro{\citationstyle} +% The "\citationstyle" command is used to tell both +% \BibTeX{} and the {\sc Camel} engine how your citations +% should be formatted; its argument is the name of a {\sc Camel} +% module (contained in a {\tt .cst}, a {\tt .cit} and a {\tt +% .bst} file) such as `{\tt law}'. +% In this respect, it is similar to +% a ``document class'', but for citations instead of whole +% documents. +% This declaration may be make more than once.\footnote{This +% feature (support for multiple citation styles in a single +% document) will be added after the release of \BibTeX~1.0.} +% +% \DescribeMacro{\citationdata} +% This command is used to indicate the ".bib" files +% from which citation entries should be drawn. +% As in the "\bibliography" command of standard +% \LaTeX{}, the "\citationdata" command +% takes one option, which is a comma-separated list +% of bibliographies for use in the documents. Each +% refers to a {\tt .bib} file, each of which should +% be in the path of your local \BibTeX{}. +% +% \DescribeMacro{\bibliographymanager} +% While we hope that you find \BibTeX{} the most satisfactory +% means of formatting your citations, you might prefer to use +% some other software product +% for the separate task of +% managing a large citation database. +% {\sc Camel} has been designed so that it can be used +% with a number of such utilities. If you are using an +% external bibiliography manager, you should declare +% the name of the package at the top of the document +% using the "\bibliographymanager" command. Supported +% managers, and their corresponding nicknames for this +% command, are: +% +% \begin{itemize} +% \item Reference Manager ({\tt referencemanager}) +% \item Papyrus ({\tt papyrus}) +% \item ProCite ({\tt procite}) +% \item EndNote ({\tt endnote}) +% \end{itemize} +% +% The details on how +% to join external bibliography managers with +% {\sc Camel} are +% below at page \pageref{processing:documents}. +% +% If you use the "\bibliographymanager" command, +% you should not use the "\citationdata" command. +% This is not felt to be a serious limitation; if you use a +% bibliography manager, you might as well put +% {\em all\/} of your citations into it anyway, and use +% it as the sole source of citations in your +% documents. +% +% \DescribeMacro{\citationsubject} +% You may wish to produce a bibliography classified +% into subheadings by subject or by type of +% material. To do this, place a set of "\citationsubject" +% commands at the top of your document, or after a +% "\printbibliography" command. Each command takes +% two mandatory arguments and one optional argument. The first +% mandatory argument indicates the nickname that you +% will use in your document to attach a citation to +% the category. The second is the section heading +% that you wish to see displayed for that section +% of the bibliography. +% +% The optional argument may be used for two purposes. First, you +% may want to further divide your bibliography into +% sub-subheadings. You can specify a such a subcategory by +% putting a "2" as the optional argument to the +% "\citationsubject" command. Otherwise, a first-level header is used. +% Where the "\printbibliography" command is issued, +% the parts and sub-parts of the bibiliography will be produced in the +% order in which they were declared. +% +% For some types of citation, you may wish to produce +% a table that shows more detail about citations made. +% With {\sc +% Camel}, simply add an optional argument to +% the "\citationsubject" command applicable to your desired table +% which includes an {\tt o=} argument of three letters (giving +% the extension of the raw data output file), and an {\tt i=} +% argument of three letters (giving the extension of the {\tt +% makeindex}-processed input file). Optionally, you may also +% include arguments of {\tt p} or {\tt P}. +% With {\tt p}, the output +% file will be passed the page or section numbers given in +% pinpoint arguments to the "\source" command. +% With {\tt P}, index-style page references to the main text are turned +% on. +% With or without the {\tt P} or {\tt p},\footnote{The syntax of these options is the same as for +% options to the {\tt\bs source} command, discussed above.} the +% export file should be processed with {\tt makeindex} using +% {\sc Camel}'s own "camel.ist" file to produce the +% import file. +% This table-creation feature exists principally for typesetting +% tables of statutes. +% +% \DescribeMacro{\forcefootnotes} +% If you are preparing a document that is to be, or may +% be, prepared with citations in footnotes at the bottom +% of the page, you can save yourself some typing (and +% make it easier to produce the same document in other +% formats) by using the "\forcefootnotes" command at +% the top of the document. In some styles this command +% has no effect since, for example, +% a footnote containing only +% ``[2]'' would look rather peculiar. +% +% \DescribeMacro{\newinterword} +% In a string citation, you may want to use a connecting +% word that is not already in {\sc Camel}'s internal list. +% You can add a word to this list with the "\newinterword" +% command. This command takes two mandatory arguments. +% The first is the nickname you wish to give to the +% word and its associated punctuation. The second is +% the text to be inserted when you use the new +% connecting word between two "\source" commands. +% +% The connecting word may appear either at the beginning +% of a citation string (as the argument to a +% {\tt !=} option in the first "\source" command of a +% string), or in the middle, between +% two citations. Two special characters are used to +% control the appearance of the word in these two +% positions. A leading punctuation mark should be +% preceded by a {\tt\string_} character. This will +% suppress such a punctuation mark, and the space +% following it, if the connecting word is used +% as a prefix to an initial citation in a string. +% The {\tt\string^} character should precede the +% first word of the phrase associated with the +% connecting word, and that character should be +% capitalized. The first character of the phrase will +% then be forced to lower case if the connecting word +% is used between two "\source" commands. +% +% The following examples may be useful for guidance: +% +% \begin{itemize} +% \item "\newinterword{cf}{_; ^C.f.~}" +% +% \item "\newinterword{see-generally}{_. ^See generally\ }" +% \end{itemize} +% +% \DescribeMacro{\printbibliography} +% Place a "\printbibliography" command in your document +% wherever you would like the bibliography to appear. +% The "\printbibliography" command takes one optional argument, +% "labels". In the "keyval=" syntax, this may be set to either +% {\tt labels=false} or {\tt labels=true}. This toggles the +% appearance of bracketed numerical or shorthand labels in front +% of each bibliography item. +% +% If no "\citationsubject" commands are used at the top of +% the document, "\printbibliography{all}" will produce +% a full bibliography of all references made in the +% document up to that point. If "\citationsubject" has been +% used, then "\printbibliography{all}" will produce the +% same bibliography, but classified by subject, with the headers +% specified in the "\citationsubject" commands at the top of the +% document. +% +% You may also specify a subject to the "\printbibliography" +% command, instead of "all". This will produce a bibliography +% formatted as requested in the "\citationsubject" command. Note +% that, if the "i=" and "o=" options are used with +% "\citationsubject", "makeindex" must be used to generate the +% input file that will be expected for that subject. Note also +% that such external tables will be ignored by +% "\printbibliography{all}" where citation subjects are used. +% +% +% \DescribeMacro{\source} +% The most common command for {\sc Camel} users is the "\source" +% command, which replaces the "\cite" command of standard \LaTeX. +% It is used to identify the citation in the {\tt .bib} data +% files, and to provide a logical description of any +% `fine-tuning' of the citation form that the user might desire. +% Because it is frequently used, and must be accessible to +% authors with more interest in the content of what they are +% writing than the inner workings of \LaTeX, much +% effort has gone into making the command as simple to use as +% possible. +% +% \subsubsection*{Options} +% The valid options that may be placed inside the +% first set of square braces are shown below. +% +% \medskip +% \label{sourceoptions} +% \newcommand{\PreserveBackslash}[1]{\let\temp=\\#1\let\\=\temp} +% {\hyphenpenalty=200\setlength{\extrarowheight}{3pt} +% \noindent\begin{tabular} +% {|>{\tt }r@{ --- } +% >{\small}p{4.4in}|}\hline +% \multicolumn{2}{|c|}{\large\bf Single character options}\\ +% \hline\hline +% a & Supress printing of author's name in the document.\\ +% t & Suppress printing of the title in the document.\\ +% l & Force automatically generated abbreviations to +% lower case.\\ +% n & Suppress printing of the citation in the document +% (equivalent to {\tt \char`\\nocite} in standard +% \LaTeX{}).\\ +% f & Force the full form of the citation to be printed +% in the document.\\ +% h & Suppress automated footnote generation and the use of +% interwords for the current and following citations. This +% option should not be used in the middle of a string of +% citations linked with interwords.\\\hline +% \multicolumn{2}{l}{}\\\hline +% \multicolumn{2}{|c|}{\large\bf String options}\\ +% \hline\hline +% s= & Associate the citation with the specified subject. +% This option can be freely specified, but only has +% significance when a classified bibliography is +% being produced. When these subject tags are being +% used for that purpose, they must be declared at +% the top of the document, and a given source must +% be associated with the same subject throughout +% the document; specifying a different subject +% from that used in the first use of the citation will +% produce an error message from \LaTeX{}.\\ +% v= & Give a volume number for use in the citation. +% {\tt BOOK} entries in a \BibTeX{} database +% may be given a volume number. Such citations are +% assumed to be multi-volume works, and a volume +% number should be supplied when citing them; the volume +% number given in a {\tt BOOK} entry itself ignored, and an +% error message will be produced if an explicit volume +% number is not given using this option.\\ +% != & Precede the citation with the interword given in +% the argument.\\\hline +% \end{tabular}} +% +% \medskip +% These options may be entered in the option braces +% in any order, +% with the single requirement that +% a comma must separate all options.\footnote{Separating +% commas are required from version 1.0r, because this +% is the syntax of the \texttt{keyval} package.} +% +% The number of possible citation forms that can +% be generated using these command options is +% very large, and varies from one style to another. +% The best way of familiarizing yourself with them +% is to finish reading the next section of this guide, +% and then do a little experimentation with the +% various options. This will serve you much better +% than a verbose set of illustrations here, which would +% not stick in the memory, would be difficult to use +% as a reference, and could not +% in any case cover all of the possibilities. +% +% The following +% citations are all valid: +% +% \begin{itemize} +% \item "\source[ats=school]{ucla}" +% \item "\source[av=8,t]{harvard}" +% \item "\source[s=town,nat]{oxford}" +% \end{itemize} +% +% A string of citations applying to a particular statement +% may be entered as follows: +% +% \begin{itemize} +% \item "\source["\meta{options}"]{"\meta{nickname}"}["\meta{page numbers}"]"\\ +% \meta{interword}\\ +% "\source["\meta{options}"]{"\meta{nickname}"}["\meta{page numbers}"]" +% \end{itemize} +% +% \subsubsection*{Keys} +% The key given in the squiggly braces should correspond +% to the key that identifies the entry in the \BibTeX{} +% or other database that you are using. If you have +% a series of citations to make, and do not need to +% give separate options to any of them, you can enter +% them as a comma-delimited string, in the following +% manner: +% +% \begin{quote} +% "\source[s=stooges]{joe,curly,moe}" +% \end{quote} +% +% +% \subsubsection*{Pinpoints} +% +% For most citations, pinpoint references are simply typed +% between the second pair of square braces, using +% normal punctuation marks ({\tt\ ,\ \& -\ }). Spacing +% is irrelevant, so long as the punctuation marks +% are entered. A valid simple +% pinpoint citation might look as follows: +% +% \begin{quote} +% "\source{major}[2, 7, 9 & 23]" +% \end{quote} +% +% In some +% very special situations, {\sc Camel} needs more information +% to handle pinpoint references correctly. +% Suppose +% you are entering a citation for a statute, and you intend +% to produce a table showing where references to each cited +% section of the statute are made in the text. If your +% citation includes references to more than one section of +% the statute, {\sc Camel} will produce a table entry +% for each cited section automatically. But what if you +% are citing a {\em range\/} of sections? {\sc Camel} +% cannot know whether the range is continuous, or has +% gaps in it where provisions have been repealed. +% You therefore need to tell {\sc Camel} explicitly about +% each section number---but you don't want the numbers +% to be printed in the text. To feed citation numbers +% to the table, but suppress printing in the document, +% separate the numbers to ``hidden'' from the rest +% with a ``fence'' in the form of the "|" character. +% A typical citation of this +% kind might look like this: +% +% \begin{quote} +% "\source{SaleofGoodsAct}[19-25 | 20, 21, 22, 23, 24]" +% \end{quote} +% +% There are two other situations, also related only to +% the production of tables, where special markings may +% need to be included in the pinpointing string. These +% are (a) where you want material to appear only in +% the text, and (b) where you want material to appear +% only in the table. The first case may arise where +% you are citing subsections of a statute. In this +% situation, you can enclose in {\tt \string^} characters +% any text that you want to withhold from the table. +% A simple citation of this kind might look as +% follows: +% +% \begin{quote} +% "\source{VehicleCode}[23(A)^(3)(a)(i)^]" +% \end{quote} +% +% Where material should appear only in the table, +% enclose that pinpoint material in {\tt\string_} +% characters. This might be necessary where, for +% example, you are citing two subsections of the same +% statute. An example might look as follows: +% +% \begin{quote} +% "\source{LawofPropertyAct}[70(1)(f) & _70(1)_(g)]" +%\end{quote} +% +% Finally, there is one more feature that applies only to +% `parallel citations' to law cases. If a law case to which you are +% referring is reported in more than one location (see below), +% and you want to give a pinpoint to +% each location, you can do so by using the the {\tt =} sign +% between the pinpoint strings. For example: +% +% \begin{quote} +% "\source{bloggvkermit}[20-25 = 125-26 ]" +% \end{quote} +% +% If more parallel pinpoints are given than exist in the +% \BibTeX{} entry for the case nicknames {\tt bloggvkermit}, the +% extra pinpoints will be ignored. Similarly, if you give fewer +% pinpoints than there are parallels in the \BibTeX{} entry, the +% portions of the entry with no matching pinpoints will be +% omitted. No warnings are issued, although they could be +% if there is a demand for it. +% +% \subsection{\BibTeX{} features} +% +% A number of enhancements for processing \BibTeX{} +% entries have been incorporated into the {\sc Camel} \BibTeX{} +% programmer's library. These enhancements are drawn upon by the +% {\tt law.bst} style, and should also be used by subsequent {\sc +% Camel} style modules. These features are described briefly +% here. Please see the \BibTeX{} documentation for more +% information on the format of \BibTeX{} entries et cetera. +% +% \subsubsection*{Cases} +% +% A new entry type, {\tt @CASE}, has been added. This entry type +% should be used for reported law cases. Although citation forms +% vary widely between jurisdictions, {\sc Camel} bases the +% formatting of the citation on the information contained in the +% citation, rather than a tag indicating the jurisdiction. +% +% A result of this approach is that there are no `required' +% fields in the usual sense that \BibTeX{} will complain if +% something is missing. Instead, is a set of +% `core' fields for each of three different formatting styles. +% For someone familiar with legal resources, this is actually +% quite intuitively straightforward. +% +% For reported U.S. law cases, the core fields are {\tt title}, {\tt volume}, +% {\tt journal}, {\tt pages} and {\tt year}. In addition, you +% may wish to specify {\tt court}.\footnote{This is not yet +% implemented, but can be and should be.} Procedural histories may not +% be represented in the \BibTeX{} entry. +% +% For reported Commonwealth cases, use {\tt number} instead of +% {\tt volume}. The effect of this will be to place the year at +% the front of the citation in square braces, with the {\tt +% number} and {\tt journal} following it. Again, you may specify +% {\tt court} optionally. +% +% For cases reported in ephemeral media such as newspapers, leave +% out {\tt volume} and {\tt number}, and give the full date in +% the {\tt year} field instead (see below for the formatting of +% dates). The formatting of the citation will adjust +% accordingly.\footnote{I'm not sure whether this works with +% parallels yet. If it doesn't but you need it to, let me know +% and I'll fix it.} +% +% For cases reported in jurisdictions such as Japan that refer to +% cases by date rather than title, use {\tt casedate}, {\tt +% court}, {\tt journal}, {\tt volume}, {\tt pages} and {\tt +% year}. Optionally, you may also wish to include {\tt divno} +% and {\tt division}, to specify the exact identity of the +% deciding court. +% +% \subsubsection*{Statutes} +% +% Support for statutes is still in its infancy. You need, at +% minimum, to enter {\tt title}, {\tt year} and {\tt +% jurisdiction}. Supported jurisdictions are {\tt japan}, {\tt +% singapore} and {\tt england}. +% +% \subsubsection*{Dates} +% +% The entry of dates has been considerably simplified in {\sc +% Camel} \BibTeX{} entries. Always use the {\tt year} field (or, +% if appropriate, the {\tt casedate} field). Months may be +% entered as numbers or as a three-character string. The following date +% forms are all valid: +% +% \begin{quote} +% \begin{verbatim} +% year = {10 jun 1995}, +% year = {jun 10 1995}, +% year = {jun 1995}, +% year = {1995}, +% year = {10/06/95}, +% \end{verbatim} +% \end{quote} +% +% \subsubsection*{Parallel citations} +% +% For {\tt @CASE} entries, it is possible to enter multiple citations in a +% single \BibTeX{} entry using a short form of citation in a +% field called {\tt cites}, separating entries with a {\tt =} +% character.\footnote{It actually does work. \source{halsall-v-brizell}.} +% There are several valid syntaxes for +% this field, which closely follow the citation format used in +% the Blue Book for the relevant sources. They are: +% +% \begin{quote} +% \begin{verbatim} +% cites = {[1995] 1 All ER 25 = [1995] 2 WLR 125}, +% cites = {123 Cal.3d 237 (1995) = 124 S.W.2d 235 (1995)}, +% \end{verbatim} +% \end{quote} +% +% You can string together an arbitrary number of parallel citations in +% this way.\footnote{Cross-references are complex to format, but +% they work correctly. \source{halsall-v-brizell}. In a competition for +% speed and accuracy between typists equipped with \LaTeX/{\sc +% Camel} and with WordPerfect, who do you reckon would win?} +% Be sure to read the notes on pinpointing, above, +% for details on how to specify pinpoint references to parallel +% citations. +% +% \subsection{Processing documents} +% +% \subsubsection*{Ordinary processing} +% +% For a simple document containing no cross-references +% other than those produced by {\sc Camel}, +% printing requires one run of \LaTeX{}, one run of +% \BibTeX{}, and a second run of \LaTeX{}. Because +% {\sc Camel} absorbs all citation information +% at the start of the document (at the point of the "\citationdata" +% or "\bibliographymanager" commands), there is no need for +% the third \LaTeX{} run required in the standard +% \LaTeX{} setup. You may, however, need additional +% runs of \LaTeX{} to resolve other cross-references +% in the document, or to work out misspellings and other +% errors. +% +% \subsubsection*{Producing tables} +% \label{processing:documents} +% When the "o=" and "i=" options are used for +% one or more declared citation subjects, those subjects +% will be excluded from the bibliography. Instead, +% {\sc Camel} will write an external table file according +% to the specifications given in the "\citationsubject" +% command. Any such files +% must then be processed into properly formatted +% lists using {\tt makeindex} before they will appear +% in the printed document.\footnote{The documentation for +% {\tt makeindex} will explain how it should be set +% up for your system. On a UNIX or DOS installation, +% the basic requirements are that the {\tt makeindex} +% program be in your search path, and that the appropriate +% environment variable (usually {\tt indexstyle}) be +% set---this tells {\tt makeindex} where to find the style +% files that tell it exactly how to format the finished +% table lists.} On a UNIX or DOS system you would type the +% following for a table declared with the export +% extension ".atb" and the input extension ".art": +% \begin{quote} +% \small +% {\tt makeindex -s camel.ist -o} \meta{file name}".art" \meta{file name}".atb" +% \end{quote} +% If the subject associated with this table is "article", +% the table can then be placed in the document +% for the next \LaTeX{} run using the +% command: +% +% \begin{itemize} +% \item "\printcitationtable{article}". +% \end{itemize} +% +% When the option "p" is used with the +% "\citationsubject" command and the "i=" and "o=" options, +% the table will include any section or other numbers +% given as optional arguments to "\source" commands in the +% document. Because "makeindex" sorts alphabetically, +% not numerically, the section numbers may be out of +% their proper order in the "makeindex"-processed file. +% This must be corrected by hand. +% +%\newpage +% \section{Notes for Implementors} +% +% \subsection{Getting started} +% +% The purpose of this section is to provide style designers +% with all of the information required to write a new +% bibliography style from scratch, drawing on the powerful +% facilities available in \BibTeX{} and the {\sc Camel} +% style engine.\footnote{As of this writing, however, I've not received +% any feedback on the whether this documentation is any +% use. If you are attempting to draft a style and feel +% at sea, \textit{complain to me}! It's the only way +% we can make things easier for the others.} Before you start, +% you should have a +% sound knowledge of \BibTeX{} primitives, and of the +% programmer's function library contained in the +% file {\tt camel.dtx}. A bibliography style consists of a +% {\tt .bst} file, a ".cst" file and a ".cit" file. +% The ".bst" file should produce entries suitable +% for digestion by {\sc Camel} for all of the \BibTeX{} +% entry types supported by the style. +% +% The modules of the {\sc Camel} system work +% together in an integrated fashion to format citations. +% Raw citation details are kept in {\tt .bib} databases. The +% function of the {\em Camel} system is to massage those details +% into formatted citations, and include them in appropriate +% locations in typeset pages. When a document invoking the {\sc +% Camel} package encounters a "\citationstyle" command, the +% relevant ".cst" and ".cit" files are loaded. A corresponding "\bibstyle" +% entry is also written on the {\tt .aux} file. A +% "\citationdata" command causes a relevant "\bibdata" command to +% be written there as well. If a "\bibliographymanager" +% declaration is used instead, a "\bibdata" entry calling on the +% file "camel.bib" is written to {\tt .aux}. +% When a "\source" command is +% encountered during processing, code contained in +% {\tt camel.sty} writes a "\citation" entry for that citation on +% the {\tt .aux} file. In this way, an orthodox set of entries +% and files for use with \BibTeX{} is generated. +% +% If an external bibliography manager is used, the file +% "camel.bib" must be converted into a valid {\tt .bib} file, +% using whatever tools for finding and replacing key entries the +% database manager has to offer. +% +% \BibTeX{} must then be run on the document. This reads the +% entries on the {\tt .aux} file, opens the {\tt .bib} databases, +% reads them, and writes the result of its ruminations on a {\tt +% .bbl} file. At this point, the operation of {\sc Camel} +% diverges sharply from that of conventional \LaTeX{} +% bibliography tools. With {\sc Camel}, \BibTeX{} is used to +% generate "\lexibib" entries on the {\tt .bbl} file. Such +% entries parse the citation into logical typesetting units, but +% the typefaces used within the units, and the punctuation that +% appears between them, is not determined by \BibTeX. The tasks +% of punctuation and typeface selection are carried out on the +% second run of \LaTeX{} on the document, using the details +% specified in the {\tt .cit} file for the {\sc Camel} citation style +% being used. +% +% It is worth spending some time pondering this programming flow; +% there are good reasons for spreading the formatting work +% over +% a number of different modules in this way, and it is important +% to understand the design before embarking on the drafting of a style. +% +% \subsection{The {\tt .cst} file} +% +% The ".cst" +% file should contain, at least, the following +% macros: +% +% \begin{description} +% \item[{\tt\bs @law@print}:] This is the macro that +% actually prints the citations in the document and in +% the bibliography. Its structure is discussed below +% in the commented code listing of the default +% "\@law@print" command, which draws on most of the +% conditional handles provided by {\sc Camel}. +% \item[{\tt\bs @law@wordlist}:] This is a list macro consisting +% of paired interword nicknames and corresponding punctuation/text +% sets. Possible changes you may wish to make to this +% file are discussed in the commented code description of +% this macro. +% \end{description} +% Additional macros (including re-definitions of +% the macros contained in the {\sc Camel} engine) +% may be included in the ".cst" file. Be sure to +% document your work, however; {\sc Camel} is among the +% more complex packages written for use with \TeX{}, +% and documentation is essential if problems that arise +% are to be sorted out quickly and efficiently. +% +% Concerning the "\@law@wordlist" macro, it is best to examine +% the existing macro in "law.dtx", and read the +% user documentation on the "\newinterword" command. +% With this information, you should be able to make +% any changes you require in the behaviour of the list +% to suit your new style. You should not omit items from +% the list---this is important to maintain compatibility +% between styles. You may want to add to the list, +% and this is welcomed---drop a note to Frank Bennett +% on "fb@soas.ac.uk" to assure that your new addition is +% incorporated into the "law.dtx" list, which is used as +% a model, so others will +% include it in their styles too. +% +% Drafting the "\@law@print" macro may be difficult to +% approach at first. If you examine the example in the +% "law.dtx" file, you may be somewhat intimidated by the +% size and complexity of the macro listed there. But in +% fact for most styles this macro should be reasonably simple +% to write; the "law.dtx" example is complex because it +% automates a very complex set of style rules applying to +% legal materials. +% +% Essentially, what "\@law@print" does is print a citation +% in a particular form according to a set of conditions +% that can be recognized from toggles in effect when +% the macro is run by the {\sc Camel} engine. The toggles +% that may be drawn upon are described here. For further +% information, study the example in "law.dtx"---bearing in +% mind that your own macro will probably be simpler to +% draft. +% +% \subsection{Toggles and hooks for the {\tt .cit} file} +% \def\lawtrue{{\tt true}\ } +% +%\subsubsection{Citation history} +%{\def\PrintDescribeMacro#1{\strut\MacroFont\bs #1\ } +%\DescribeMacro{if@law@firstuseofcite} +% This is \lawtrue during the first expansion of a citation +% nickname in the text. +% +%\DescribeMacro{if@justabove} +% This is set to \lawtrue where (a) the author, title, source, page +% and citation trailer are identical in the last citation used +% in a footnote and in the current citation, (b) the last +% citation used in a footnote was the only citation in that +% footnote, and (c) a pinpoint was not used in the previous citation +% or, if there was such a pinpoint, a pinpoint is also used in +% the current citation. +% +%\DescribeMacro{if@l@quiteexact} +% This is set to \lawtrue where (a) "\@law@justabove" is set \lawtrue +% and (b) a pinpoint was used in both citations, and (c) the +% pinpoints match exactly. +% +%\subsubsection{Formatting toggles} +% +%\DescribeMacro{if@law@printcite} +% If this is \lawtrue the citation should print. Otherwise it +% should not. It should also trigger suppression of footnote forcing. +% +%\DescribeMacro{if@law@printauthor} +% If this is \lawtrue the name of the author prints. +% +%\DescribeMacro{if@law@printtitle} +% If this is \lawtrue the title of the work prints. +% +%\DescribeMacro{if@law@longcite} +% If this is \lawtrue the citation should be printed in its full +% form. This is set \lawtrue by the "f" option to the "\source" command. +% } +%\subsubsection{typefaces} +% +%\DescribeMacro{\@ltok@authormainface} +% This is the typeface set in the {\tt .cit} file for author +% names. It, and all other "\@ltok@" control strings are token +% registers that must be expanded using "\the". +% +%\DescribeMacro{\@ltok@authoroptionface} +% This is the typeface selected by enclosing text in the author +% portion of the citation within "\\" commands in the current +% citation's type (i.e.~as defined in its "\newcitestyle" entry). +% +%\DescribeMacro{\@ltok@titlemainface} +% The typeface used for the title portion of the citation. +% +%\DescribeMacro{\@ltok@titleoptionface} +% The alternative "\\" typeface within the title argument to "\lexibib". +% +%\DescribeMacro{\@ltok@citefirstmainface} +% The typeface used for the source portion of the citation. +% +%\DescribeMacro{\@ltok@citefirstoptionface} +% The alternative for the source portion of the citation. +% +%\DescribeMacro{\@law@firstslash} +%\DescribeMacro{\@law@secondslash} +% These two commands should be defined as follows in your +% "\@law@print" command +% before citation elements are expanded. This could be done +% within {\sc Camel} itself, but this gives you a little more +% hands-on control in style design maybe. +% \begin{quote} +% "\def\@law@firstslash{\begingroup\def\\{\@law@secondslash}%"\\ +% "\the\ltokspecialface}%"\\ +% "\def\@law@secondslash{\endgroup\def\\{\@law@firstslash}}%"\\ +% "\def\\{\@law@firstslash}%" +% \end{quote} +% +%\subsubsection{Citation details} +% +%\DescribeMacro{\@ltok@whereitsat} +% This actually contains the text that is used to flag either a +% note or a page number (i.e.~"{\ note\ }" or "{\ page\ }"). +% This is used only where citation cross-referencing is required. +% +%\DescribeMacro{\@ltok@stylename} +% This stores the citation type used to declare the citation +% with "\lexibib". This is mainly used for internal purposes by +% {\sc Camel}, but if you're printing a style or proof sheet, or +% are just trying to debug a style, you +% may have a use for it. +% +%\DescribeMacro{\@ltok@nickname} +% This stores the nickname of the citation. +% +%\DescribeMacro{\@ltok@author} +% This stores the author portion of the citation. +% +%\DescribeMacro{\@ltok@name} +% This stores the title portion of the citation. +% +%\DescribeMacro{\@ltok@citefirst} +% This stores the source portion of the citation. +% +%\DescribeMacro{\@ltok@citepage} +% This stores the page number ({\em not\/} the pinpoint!) of the citation. +% +%\DescribeMacro{\@ltok@citelast} +% This stores the citation trailer. +% +%\DescribeMacro{\@ltok@pageorfootno} +% This stores either the page or the footnote number at which the +% citation first occurred. +% +%\subsubsection{Bridges} +% +%\DescribeMacro{\@ltok@atot} +% This contains the punctuation bridge, declared in the {\tt +% .cit} file for the current citation type, that is to be placed between the author and the +% title elements of the citation. +% +%\DescribeMacro{\@ltok@ttocone} +% This contains the bridge that is to be placed between the title +% and the source. +% +%\DescribeMacro{\@ltok@conetop} +% This contains the (singular) bridge that goes between the +% source and the page number. +% +%\DescribeMacro{\@ltok@conetopplural} +% This contains the alternative plural bridge that goes between +% the source and the page number. +% +%\DescribeMacro{\@ltok@ptop} +% This contains the bridge that goes between a page reference +% giving the location of an article, for example, and the +% pinpoint reference. +% +%\DescribeMacro{\@ltok@ptoctwo} +% This contains the bridge that goes between any page numbers and +% the citation trailer. +% +%\DescribeMacro{\@ltok@atbridge} +% This contains the bridge that goes between an abbreviated +% citation (i.e.~{\em Id.}\ or somesuch) and a pinpoint. +% +%\DescribeMacro{\@ltok@atbridgeplural} +% This contains the plural bridge for abbreviated citations. +% +%\subsubsection{Pinpoint printing} +% +%\DescribeMacro{\@law@barkill} +% The pinpoint information is contained in the token register +% "\@ltok@argtwo". To print the pinpoint, you should always use +% the following form, which will induce the correct behaviour of +% the string expansion engine within {\sc Camel}. +% +% \begin{quote} +% "\@law@barkill\the\@ltok@argtwo\relax" +% \end{quote} +% +% \subsection{The {\tt .cit} file} +% +% The ".cit" file should +% contain instances of the "\newcitestyle" command +% and associated arguments. This defines a {\sc Camel} +% style instance for each of the entry types supported +% by the style's ".bst" file. If you find it necessary to add +% a new entry type to the style defined in the {\tt .bst} +% file for your style, you must also define a {\sc Camel} +% style instance in the ".cit" file applying to +% this new entry type. +% +% \newpage +% The arguments to the "\newcitestyle" command +% have the functions described in the following footnoted +% illustration: +% +% \medskip +% {\small +% \newlength{\cardwidth} +% \setlength{\cardwidth}{\textwidth} +% \addtolength{\cardwidth}{-4\columnsep} +% \begin{tabular}{|c|} \hline +% \begin{minipage}{\cardwidth} +% \renewcommand{\thefootnote}{\alph{footnote}} +% {\tolerance=1500\raggedright +% "\newcitestyle{article"\footnotemark[1]"}%"\\ +% " {rsirsr"\footnotemark[2]"A"\footnotemark[3]"}%"\\ +% " {[a],\ "\footnotemark[4]"[t],\ "\footnotemark[4] +% "[c]\ "\footnotemark[4] +% "[p],\ "\footnotemark[4] +% "(pl),\ "\footnotemark[4] +% "[rp]\ "\footnotemark[4] +% "[e]:[id]\ at~"\footnotemark[4] +% "(pl)\ at~"\footnotemark[4] +% "[xrf]}%"\\ +% " {6}"\footnotemark[5]"%"\\ +% "{{#1}"\footnotemark[6]"{#2}"\footnotemark[6]% +% "{#3}"\footnotemark[6]"{#4}"\footnotemark[6]% +% "{#5}"\footnotemark[6]"{(#6)}"\footnotemark[6]"}%"}\\ +% \footnotetext[1]{This gives the name of the citation template to be generated.} +% \footnotetext[2]{The first part of this list of arguments consists always of exactly six +% letters: the first three pairs set the main and alternative typefaces for +% the author, title +% and first-cite-part portions of the citation. {\tt r}, {\tt s}, {\tt b} and +% {\tt i} select roman, small caps, boldface and italic type. +% These letter flags are not case sensitive. +% The alternative typefaces may then be specially selected in the text +% arguments to a citation using +% {\tt\string\\...\string\\}.} +% \footnotetext[3]{The last letter in this list sets the classification +% of citations declared with the resulting style macro. {\tt a}, {\tt b}, {\tt +% c} and {\tt s} will classify all citations generated by this +% citation template as being to articles, books, cases or statutes, +% respectively. This letter flag is not case sensitive.} +% \footnotetext[4]{These are the citation bridges that +% will be placed between the portions of the citation indicated. Two +% bridges, singular and plural, are given between {\tt [p]} +% (page) and +% {\tt [rp]} (reference page), and between {\tt [id]} ({\em id.} +% or {\em supra\/}) and {\tt [xrf]} (cross-reference).} +% \footnotetext[5]{This argument states how many arguments the finished citation +% template will accept. It must be a number between {\tt 1} and {\tt +% 6}.} +% \footnotetext[6]{Six pairs of matched braces must appear inside this +% argument. Any other than the first (which represents the citation +% nickname) may be left empty, but the bridges must of course take this +% into account. The number of arguments inserted here must correspond +% with the number stated on the line above.} +% \vspace{3pt} +% \end{minipage}\\ \hline +% \end{tabular}} +% +% \subsection{The {\tt .bst} file} +% \subsubsection{Entry types} +% Most of the work in drafting a new style is in writing entry +% type functions for inclusions in the {\tt .bst} file. This is, +% inevitably, an arduous task, because of the number of +% possibilities that must be covered. The task is made easier, +% however, by the {\tt .bst} file programming library contained in +% the file {\tt camel.dtx}. This library provides a set of +% functions for the manipulation of fields pushed onto the stack +% in the entry type functions themselves. This approach +% increases the transparency of your code, because you can see in +% the entry type function itself exactly what fields are being +% used, and what logical and formatting operations are being +% carried out on them. +% +% Using the library is highly recommended. If you find that +% you require functions that are not presently available in the +% library, you can make your solutions available to others by +% adhering to a few design guidelines, and passing the function +% on to {\tt fb@soas.ac.uk} for inclusion in the {\sc Camel} +% distribution. The guidelines are actually quite simple. No +% library function should directly manipulate a field, but should +% instead expect to find the field on the stack when it is +% invoked. No library function should make assumptions about the +% setting of variables; any parameters should also be passed to +% the stack before the library function is invoked. When +% finished, a library function should always leave a fixed number +% of items on the stack, in a fixed order. And a library +% function should not pass data to subsequent functions in the +% form of variables. Finally, a function +% should be documented concerning (a) the number of items it +% expects to find on the stack, and in what order, (b) the number +% of items it leaves on the stack, and in what order, and (c) the +% effect of any toggle strings that may be fed to the function. +% +% You may find it necessary, in drafting a function, to divide +% its operation into sub-functions. As between sub-functions, +% the ban on passing data through variables need not be followed, +% so long as the set of functions adheres to the rule. +% +% \subsubsection{About cross-referencing} +% About cross-referencing, Oren Patashnik wrote: +% \begin{quote} +% Now come the cross-referencing functions (these are invoked +% because one entry in the database file(s) cross-references +% another, by giving the other entry's database key in a +% "crossref" +% field). This feature allows one or more titled things that are +% part of a larger titled thing to cross-reference the larger +% thing. These styles allow for five posibilities: +% +% \begin{enumerate} +% \item an {\bf article} may cross-reference an {\bf article}; +% +% \item a cross-reference to a {\bf book} may be made in an +% entry for: +% +% \begin{enumerate} +% \item a {\bf book}; +% \item an {\bf inbook}; or +% \item an {\bf incollection}; and +% \end{enumerate} +% +% \item +% an {\bf inproceedings} may cross-reference a {\bf proceedings}. +% \end{enumerate} +% Each of +% these is explained in more detail later. +% \end{quote} +% +% This is the authoritative statement on the proper use of +% cross-referencing within a ".bib" file. The further comments I +% have to offer +% here are a non-authoritative gloss, but do accurately reflect +% the assumptions I made in writing the ".bst" code for the +% "law.dtx" file. +% +% \begin{description} +% \item[{\tt article}:] A cross-reference from one "article" +% entry to another may be used for special issues of a journal, +% such as those dedicated to a single topic. The referenced +% entry should include all details relevant to the issue as a +% whole, including "volume", "journal" and "booktitle" (this last +% for the name or topic description of a special issue), and +% "type" (this defaults to ``"Special issue"''). +% \item [{\tt book}:] This cross-reference is not recognized by +% the "law.dtx" style. It could logically be used for a series, +% but this is little trouble to type into the original "@book" +% entry itself, and a series is not something that should +% appear separately on the reference list. +%\item[{\tt inbook}:] This is used for cross-referencing a +% chapter or other subdivision within a work by a single author +% to that work. +%\item[{\tt incollection}:] This is used for cross-referencing a +% work by multiple authors. The typeface conventions used in the +% Blue Book style differ for "inbook" and "incollection" +% citations, as defined here, so this distinction should be +% honored in building a database. +%\item[{\tt inproceedings}:] This is used only cross-referencing +% articles appearing to a proceedings volume to that volume. +% \end{description} +% +% +%\StopEventually{\setcounter{IndexColumns}{2}\PrintIndex} +% +% \section{The Citation Engine: {\tt camel.sty}} +% +% \subsection{Initialization} +% \subsubsection{Hello!} +% To start things off on the right foot, we tell the world +% who we are. +% \begin{macrocode} +%<*lexitex> +\NeedsTeXFormat{LaTeX2e}[1994/12/01] \ProvidesPackage{camel} +[1997/02/17 v1.0t General bibliography engine (Frank Bennett)] +\@ifclassloaded{ltxdoc}{}{\RequirePackage{index}[1995/09/28]} +\RequirePackage{keyval}[1995/09/21] +\RequirePackage{overword} +% \end{macrocode} +% \subsubsection{Customizable text elements} +% \begin{macro}{\supra} +% The following definition specifies the string used to refer to +% a cite that occurs in a previous footnote, or in a preceding +% citation to the same source within the same footnote. It is +% not used in cross-referencing cases and statutes. The extra +% internal braces only serve to limit the scope of +% {\tt\string\em}. An italic space ("\/") is not added, since +% this might be followed by a period. +% \begin{macrocode} +\def\supra{, {\em supra}}% +% \end{macrocode} +% \end{macro} +% The {\tt\string\Id} macro defined here is used in referring to +% immediately preceding works, in the same or in a preceding +% footnote. If the context demands that {\em Id.} be lower case +% when it occurs, the user can switch it to lower case by entering +% {\tt\string\lowcase} immediately before an in-text citation +% declaration or citation nickname. The lower case macro thus +% invoked turns itself off after {\em id.} has printed, so no +% grouping is required. +% \begin{macrocode} +\def\Id{{\em\@law@lettercase Id.}}% +% \end{macrocode} +% These two tokens hold the text used to indicate the note or +% page number where a previous reference occurs. These are only +% used in short-form citations. +% \begin{macrocode} +\newtoks\@ltok@userconetop% +\newtoks\@ltok@userconetopplural% +\newtoks\@ltok@userptop% +\newtoks\@ltok@userptoctwo% +\newtoks\@ltok@useratbridge% +\newtoks\@ltok@useratbridgeplural% +\newtoks\@ltok@usercitefirst +\newtoks\@ltok@usercitepage +\newtoks\@ltok@usercitelast +\newtoks\@ltok@infoot \@ltok@infoot={\ note\ } +\newtoks\@ltok@onpage \@ltok@onpage={\ page\ } +% \end{macrocode} +% The following tokens are used in making proof sheets. +% Change the content of these to taste. +% \begin{macrocode} +\newtoks\@ltok@proofcitelast + \@ltok@proofcitelast{{Editor, publisher and stuff, 1994}} +\newtoks\@ltok@proofpage + \@ltok@proofpage{{12345}} +\newtoks\@ltok@proofciteone + \@ltok@proofciteone{{Source}} +\newtoks\@ltok@prooftitle + \@ltok@prooftitle{{Title of work}} +\newtoks\@ltok@proofauthor + \@ltok@proofauthor{{Author's name}} +% \end{macrocode} +% \subsubsection{User selectable switches} +% The Blue Book\source{bluebook}{} allows us to refer +% to statutes in a long form or a short form in subsequent +% references. The long form consists of the name of the Act (if +% any) plus its source details and the section number. The short +% form consists of the source details alone.\footnote{{\em See} +% \source{bluebook}[25].} +% I'm all in favour +% of saving ink; the default is for short form statute citations. +% You can have long form subsequent cites by setting +% "\statuteverboseon" at the top of your document. If you need +% some other form, let me know; statutes are complex, and rather +% than trying to do everything from the get-go, this really has +% to be demand led. +% \begin{macrocode} +\global\let\@law@delim\relax +\global\let\@law@pingroup\relax +\global\let\@law@pinstart\relax +\global\let\@law@pinend\relax +\newif\if@law@statuteverbose +\def\statuteverboseon{\@law@statuteverbosetrue} +\def\statuteverboseoff{\@law@statuteverbosefalse} +\statuteverboseoff +% \end{macrocode} +% \begin{macro}{\forcefootnotes} +% This fun little item is used to toggle the "\source" +% macros to create a footnote if none was typed literally +% into the text. Great finger-saver for shortie footnotes. +% Conceived on a whim, implementing this turned out to be +% non-trivial. I hope you find it useful! +% \begin{macrocode} +\newif\if@law@forcefootnotes +\def\forcefootnotes{\global\@law@forcefootnotestrue} +\def\noforcefootnotes{\global\@law@forcefootnotesfalse} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Shorthanding essentials} +% The following definitions are established as a means +% of cutting text using the "_", "^" and "|" characters. +% Although we make them active here, they are {\em not\/} +% read as active characters. {\sc Camel} should in no way +% interfere with styles that require these characters +% to be set active. The active characters created here +% are used only for ``internal purposes''. +% \begin{macrocode} +{ + \catcode`\_=13 + \catcode`\^=13 + \catcode`\|=13 + \gdef\@law@barkill{\def\@law@comma{, }% + \def\@law@ampersand{\ \& }% + \def\@law@dash{--}% + \def\@law@delim{}\def_##1_{}\def|##1\relax{}\def^{}}% + \gdef\@law@barnil{\def_{}\def^##1^{}\def|{}} + \gdef\@law@barinfull{\def^{}} + \gdef\@law@barinshort{\def^##1^{}} +} +% \end{macrocode} +% \begin{macrocode} +\def\bridges#1#2#3#4#5#6{% + \@ltok@userconetop{#1}% + \@ltok@userconetopplural{#2}% + \@ltok@userptop{#3}% + \@ltok@userptoctwo{#4}% + \@ltok@useratbridge{#5}% + \@ltok@useratbridgeplural{#6}% +} +% \end{macrocode} +% \subsubsection{Miscellaneous other macros} +% Sometimes it might be nice to avoid using {\tt--} for some +% reason, so a macro is defined here. Same thing for exclamation +% points. One possible use for the latter is to avoid errors +% when an exported table is sorted by {\tt makeindex}. +% \begin{macrocode} +\def\dash{--} +\def\exclaim{!}% +% \end{macrocode} +% The {\tt\string\Id} macro contains its own period. Therefore a +% period supplied by the user becomes redundant. This macro is +% redefined to gobble this extra period when necessary. +% \begin{macrocode} +\def\@law@gobble{} +\def\@law@argtwolist{} +% \end{macrocode} +% If you are into software history, you might +% have cause to refer to \LexiTeX, so +% its logo and the \LexiBib logo (also R.I.P.) are +% defined here. They are +% {\tt\string\protect}ed just like the \LaTeX\ logo. +% \begin{macrocode} +\def\p@LexiTeX{{\reset@font\rm\ \unskip\hbox{L% + \kern-.06em\hbox{\sc e}% + \kern-.05em\hbox{\sc x}% + \kern-.05em\lower.65ex\hbox{I}% + \kern-.18emT% + \kern-.1667em\lower.65ex\hbox{E}% + \kern-.125emX}}}% +\def\LexiTeX{\protect\p@LexiTeX}% +\def\p@LexiBib{{\reset@font\rm\ \unskip\hbox{L% + \kern-.06em\hbox{\sc e}% + \kern-.05em\hbox{\sc x}% + \kern-.05em\hbox{\sc i}% + \kern-.06em{\sc B}% + \kern-.05em\hbox{\sc i}% + \kern-.05em{\sc b}}}}% +\def\LexiBib{\protect\p@LexiBib}% +% \end{macrocode} +% \subsubsection{New environment} +% There is just one new environment in {\sc Camel}, and all it does +% is set the list-input toggle to true, so that input citations +% will feed into memory but not print. +% \begin{macrocode} +\newenvironment{lexilist}% +{\message{Loading citation data}\@law@listinputtingtrue}% + {\@law@listinputtingfalse} +% \end{macrocode} +% \subsubsection{Token registers} +% The following are used as temporary token registers in various +% places. +% \begin{macrocode} +\newtoks\@ltok@a +\newtoks\@ltok@b +\newtoks\@ltok@argtwo +\newtoks\@ltok@pagesstring +% \end{macrocode} +% The following token registers are used for temporary storage of +% typeface information. +% \begin{macrocode} +\newtoks\@ltok@authormainface +\newtoks\@ltok@authoroptionface +\newtoks\@ltok@titlemainface +\newtoks\@ltok@titleoptionface +\newtoks\@ltok@citefirstmainface +\newtoks\@ltok@citefirstoptionface +\newtoks\ltokspecialface +% \end{macrocode} +% One token register is needed to store the name of the current cite type +% (as declared using {\tt\string\newcitestyle} in the {\tt +% .cit} file). With this string in hand, all of the +% typeface and punctuation bridge information can be recovered +% for that type of citation. +% \begin{macrocode} +\newtoks\@ltok@citetype% +% \end{macrocode} +% Tokens to store info on whether a cite is in a footnote or in +% the main text, and the name of the cite style, in case we +% need it. +% \begin{macrocode} +\newtoks\@ltok@whereitsat +\newtoks\@ltok@stylename +% \end{macrocode} +% Ho-hum. Now we're going to need a bunch of token registers to +% stash the information for a cite. Token registers have to be +% used in processing, in order to provide expansion control. +% \begin{macrocode} +\newtoks\@ltok@nickname +\newtoks\@ltok@author +\newtoks\@ltok@name +\newtoks\@ltok@citefirst +\newtoks\@ltok@citepage +\newtoks\@ltok@citelast +\newtoks\@ltok@pageorfootno +\newtoks\@ltok@hereinafter +\newtoks\@ltok@bigsourcecite +\newtoks\@ltok@bigsourcepage +% \end{macrocode} +% We also need token registers for citation bridge information. +% \begin{macrocode} +\newtoks\@ltok@atot +\newtoks\@ltok@ttocone +\newtoks\@ltok@conetop +\newtoks\@ltok@conetopplural +\newtoks\@ltok@ptop +\newtoks\@ltok@ptoctwo +\newtoks\@ltok@atbridge +\newtoks\@ltok@atbridgeplural +% \end{macrocode} +% +% \begin{macrocode} +\newtoks\@ltok@plistmacro +% \end{macrocode} +% A counter is required to keep track of the number of cites in a +% footnote, and to store the number that occurred in the previous +% footnote. +% \begin{macrocode} +\newcounter{citesinfoot} +\newcounter{citeslastfoot} +\newcounter{law@paranormal} +\newcounter{law@parapin} +\newcounter{law@paracounter} +% \end{macrocode} +% \subsubsection{Peek-word-ahead macro} +% This macro will not work if it is placed after the +% string of "\newif"s below. I haven't a clue as to +% why. I'm leery of whether this will cause problems +% with other styles. If you have problems, contact +% me on "fb@soas.ac.uk". +% \subsubsection{If initializations} +% We need a toggle so we can turn the print routine on and off; +% this is necessary for list inputting, and for making phantom +% references to sources in order to handle weird citation forms. +% \begin{macrocode} +\newif\if@law@biblabels +\newif\if@law@usepages +\newif\if@law@table +\newif\if@law@usepinpoints +\newif\if@law@maketable +\newif\if@law@printcite +% \end{macrocode} +% The next one is used by the list-input environment. +% \begin{macrocode} +\newif\if@law@listinputting +\newif\if@law@bibentry +% \end{macrocode} +% We also need to know whether a citation is being used for +% the first time. In some styles, the first citation is treated +% specially. +% \begin{macrocode} +\newif\if@law@firstuseofcite +% \end{macrocode} +% The next if will be used to toggle the print routine between +% long and short citation forms. +% \begin{macrocode} +\newif\if@law@longcite +% \end{macrocode} +% This will tell us whether we are in a footnote or not. +% \begin{macrocode} +\newif\if@law@infoot +% \end{macrocode} +% The next "\if" will let us know if the same work was cited +% immediately before the current cite, and if so, whether +% we should pay any attention to a page reference, if given. +% These are adjusted by +% {\tt\string\law@justabovecheck}. +% \begin{macrocode} +\newif\if@justabove +\newif\if@l@quiteexact +% \end{macrocode} +% The next condition will control the way print output is done +% in short citation forms; it should set to false for articles +% and books, and to true for cases and statutes. +% \begin{macrocode} +\newif\if@nosupra +% \end{macrocode} +% The next is used to signal the presence of {\tt ++} +% as the argument linking a reference to a page/section number argument. +% This toggles plural bridges on, and +% tells the file output routine that, for statutes, each section number +% should be attached to a complete copy of the citation +% information. These copies are later reassembled in a set of +% table entries by {\tt makeindex}. +% \begin{macrocode} +\newif\if@law@printauthor% +\newif\if@law@printtitle% +\newif\if@law@requiresubjects% +\newif\if@law@subjectfound% +% \end{macrocode} +% \subsubsection{Macro initializations} +% The following is a grab-bag of small macros with +% simple functions. There is more to say about what +% other macros use them for than about they themselves, +% so I've put them in the front matter of the code. +% +% First is a little something to force a lowercase {\em id.} if +% necessary. The operation of {\tt\string\normcase} is +% obvious enough; it defines the case-switching macro +% to a no-op. \verb+\lowcase+ works by setting +% the case toggle to force a lowercase letter. The +% use of \verb+\aftergroup+ allows everything to be turned back +% on without losing the lowercase letter. This was +% designed by trial and error; there may be a better way. +% \begin{macrocode} +\def\normcase{\def\@law@lettercase{}} +\def\lowcase{\def\@law@lettercase##1{% + {\aftergroup\normcase\lowercase{##1}}}} +\normcase +% \end{macrocode} +% The following three definitions are used in preparing to +% print a citation using "\@law@print" and in printing +% pinpoint references, respectively. The first extracts +% a demand for plural bridges, if present. The second +% is a no-op. The third is the plural bridges flag itself. +% \begin{macrocode} +\def\@law@multicheck#1\@law@multiflag#2\query#3\end{#2}% +\def\@law@multiflag#1\query{}% +\def\@law@multiset{\global\@ltok@conetop\@ltok@conetopplural% + \global\@ltok@atbridge\@ltok@atbridgeplural} +% \end{macrocode} +% The "\newinterword" macro simple adds its arguments to the +% "\@law@wordlist" macro created by the {\sc Camel} style module +% (i.e.~the "*.cit" file). +% \begin{macrocode} +\def\newinterword{\begingroup\catcode`\_=13\catcode`\^=13% + \@law@newinterword} +\def\newinterword#1#2{\global\@ltok@a=\expandafter{\@law@wordlist}% + \global\@ltok@b={#1}\global\@ltok@c={#2}% + \xdef\@law@temp{\noexpand\\\noexpand{\the\@ltok@b\noexpand}% + \noexpand{\the\@ltok@c\noexpand}\the\@ltok@a}% + \global\let\@law@wordlist\@law@temp\endgroup} +% \end{macrocode} +% The {\sc Camel}{} nickname macros are now kept out of the name +% space by executing them via \verb+\csname\endcsname+, +% and adding a prefix that makes the macro inaccessible +% by direct reference within the document. This change +% was recommended by a user---sorry out there, I can't +% remember who! Note that any nickname can now contain +% numbers and other stuff, which is handy for cases, which +% should be organized according to deciding court and date. +% If in-text references are being "forced" into footnotes, +% the footnote toggles are set to true here; the footnote +% itself is created later, after any optional arguments have +% been gobbled. Note that footnote forcing will +% only take effect for "\source" citations, not for +% in-text declarations. We need a new counter for footnotes, +% so that we can keep track of footnote numbers while processing +% forced footnotes outside of the footnote environment. +% \begin{macrocode} +\newcount\c@law@footnote% +\def\volno{\message{(No volume for \the\@ltok@nickname)}}% +% \end{macrocode} +% +% \begin{macro}{\@law@getsubjectheader} +% This macro is used to grab the header appropriate to a given +% declared subject. The subjects, headers and other related +% information are kept in a single list macro for quick access. +% \begin{macrocode} +\def\@law@headersearchend{\camelrefname} +\def\@law@abandonheadersearch#1\@law@headersearchend{} +\def\@law@headersearch#1#2#3#4{% + \def\@law@temptwo{#1}% + \ifx\@law@temp\@law@temptwo% + \let\@law@headersearchend\relax% + \let\\=\@law@abandonheadersearch% + {}#3% + \fi} +\def\@law@getsubjectheader#1{% + {\def\@law@temp{#1}% + \let\\=\@law@headersearch\@law@subjectlist\@law@headersearchend}} +\let\@law@bibformatsearchend\relax +\def\@law@abandonbibformatsearch#1\@law@bibformatsearchend{} +\def\@law@bibformatsearch#1#2#3#4{% + \def\@law@temptwo{#1}% + \ifx\@law@temp\@law@temptwo% + \let\\=\@law@abandonbibformatsearch% + {}#4% + \fi} +\def\@law@getbibformat#1{% + {\def\@law@temp{#1}% + \let\\=\@law@bibformatsearch\@law@subjectlist\@law@bibformatsearchend}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@law@confirmsubject} +% This parser checks whether a given subject exists in +% the list of declared subjects. It takes no action, +% only issues a warning. +% \begin{macrocode} +\def\@law@subjectsearchend{% + \ifx\@law@citesubject\empty% + \@camel@error{No subject declared.^^J + After declaring a subject or subjects using + \string\citationsubject,^^J + you have neglected to give a subject (using the s= option)^^J + for one of your \string\source\space commands}\@ehc% + \else% + \@camel@error{Undeclared subject `\@law@citesubject'.^^J + An undeclared subject has been given as an argument to + a \string\source\space command.^^J You must first % + declare subjects using \string\citationsubject}\@ehc% + \fi} +\def\@law@abandonsubjectsearch#1\@law@subjectsearchend{} +\def\@law@subjectsearch#1#2#3#4{% + \def\@law@temptwo{#1}% + \ifx\@law@citesubject\@law@temptwo% + \let\@law@subjectsearchend\relax% + \let\\=\@law@abandonsubjectsearch% + \fi} +\def\@law@confirmsubject{% + {\let\\=\@law@subjectsearch\@law@subjectlist\@law@subjectsearchend}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@law@maybeaddcitesubject} +% This macro adds the nickname of the current citation to +% the list of nicknames under the current citation subject. +% It will only do this if the nickname does not already +% exist in the list. The effect is to keep the lists +% in citation order. Note that a citation may be +% listed under more than one citation subject. This may +% be useful, so it is not prevented. +% \begin{macrocode} +\def\@law@citesubjectcheckend{% + \expandafter\let\expandafter\@law@temptwo% + \csname @law@\@law@citesubject @citelist\endcsname% + \@ltok@a=\expandafter{\@law@temptwo}% + \expandafter\xdef% + \csname @law@\@law@citesubject @citelist\endcsname{% + \the\@ltok@a\noexpand\\% + \noexpand{\the\@ltok@nickname\noexpand}}} +\def\@law@abandoncitesubjectcheck#1\@law@citesubjectcheckend{} +\def\@law@citesubjectcheck#1{% + \def\@law@temptwo{#1}% + \ifx\@law@nickname\@law@temptwo% + \let\@law@citesubjectcheckend\relax% + \let\\=\@law@abandoncitesubjectcheck% + \fi} +\def\@law@maybeaddcitesubject{% + {\let\\=\@law@citesubjectcheck% + \csname @law@\@law@citesubject @citelist\endcsname% + \@law@citesubjectcheckend}} +% \end{macrocode} +% \end{macro} +% There are to be three sets of specialized parsing macros in LexiTeX, all +% three of which are used on the options to the "\source" +% command. One parser reads a +% list of options. The second reads a comma, {\tt\&}, and {\tt-} +% delimited list and writes the contents as a macro argument. The +% third reads the same comma, {\tt\&} and {\tt-} delimited list and +% prints it directly on the output after a slight amount of +% formatting work. +% \begin{macro}{\@law@plone} +% Does a comparison, executes the +% associated option if there is a match. +% \begin{macrocode} +%<+oldparse>\def\@law@plone#1#2{\def\@law@listitem{#1}% +%<+oldparse> \ifx\@law@optionitem\@law@listitem #2% +%<+oldparse> \let\\=\@law@finish\fi} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@law@end} +% The internal ending character is also common to all parsers. +% \begin{macrocode} +\def\@law@end{,} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@law@finish} +% If there is a match, we want to ignore the rest of the list. +% This is macro is defined and ``kept on the shelf'' until such +% time as we need to cut off the rest of the executable list +% macro below. +% \begin{macrocode} +%<+oldparse>\def\@law@finish#1\@law@nomatch{} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@law@sourceoptionlist} +% At the cost (in the short term) of abandoning helpful error +% messages, from version 1.0r, we use the "keyval" package +% by David Carlisle for all parsing except page numbers. +% \begin{macrocode} +\define@key{cameloptions}{a}[F]{\global\@law@printauthorfalse}% +\define@key{cameloptions}{t}[F]{\global\@law@printtitlefalse}% +\define@key{cameloptions}{n}[F]{\global\@law@printcitefalse}% +\define@key{cameloptions}{l}[F]{\message{\lowcase}}% +\define@key{cameloptions}{f}[T]{\global\@law@longcitetrue}% +\define@key{cameloptions}{b}[T]{\global\@law@bibentrytrue\global\@law@longcitetrue}% +\define@key{cameloptions}{Z}{}% +\define@key{cameloptions}{s}{\if@law@requiresubjects% + \gdef\@law@citesubject{#1}% + \fi}% +\define@key{cameloptions}{v}{\gdef\volno{#1}}% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@@parse} +% \begin{macro}{\@law@parse} +% Now comes the fun bit. Control is passed back and forth +% between "\@law@parse" and "\@@parse", with the behaviour of those +% functions altering depending on what is chewed up into them. +% Amazingly enough, it works. Whatta concept. +% \begin{macrocode} +\def\@@parse{\@law@parse} +\let\@law@parse\@law@parseplain +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\@law@alone} +% A copy of "\@law@plone". Serves same function. +% \begin{macrocode} +\def\@law@alone#1#2{\def\@law@allistitem{#1}% + \ifx\@law@alitem\@law@allistitem #2% + \let\\=\@law@alfinish\fi} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@law@alnomatch} +% We don't care what goes into this field, so there is no error +% message from the parser. +% \begin{macrocode} +\def\@law@alfinish#1\@law@alnomatch{\@law@alnomatch} +\def\@law@alnomatch{% + \global\@ltok@a=\expandafter{\@law@alitem}% + \xdef\@law@temp{\the\@ltok@argtwo\the\@ltok@a}% + \global\@ltok@argtwo=\expandafter{\@law@temp}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@law@allist} +% The list of options is simple and expansible. The syntax of +% the last two +% lines is required if everything is to work as expected. +% The items in the help message should probably be +% drawn from here, to provide a hook for expansion +% if other styles want to tinker with the options to +% "\source". +% \begin{macrocode} +\gdef\@law@allist{% + \\{&}{\gdef\@law@alitem{\@law@delim% + \@law@multiflag\@law@multiset\query% + \@law@ampersand}}% + \\{=}{\gdef\@law@alitem{\@law@delim% + \@law@pinend% + \@law@pingroup% + \@law@pinstart}% + \addtocounter{law@parapin}{1}}% + \\{-}{\gdef\@law@alitem{\@law@delim + \@law@multiflag\@law@multiset\query% + \@law@dash}}% + \\{,}{\gdef\@law@alitem{}% + \let\@law@parse\@law@alparsesavecomma}% + \\{_}{\@law@get@ul}% + \\{^}{\@law@get@carat}% + \\{|}{\@law@get@bar}% + \@law@alnomatch} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@law@get@ul} +% \begin{macro}{\@law@getcarat} +% \begin{macro}{\@law@getbar} +% The purpose of the following is to place {\em active\/} +% versions of the special marking characters on the stack. +% Note that the characters need not be active when read; +% they are replaced with active versions of the characters +% by this routine. Active characters are sent to the stack +% rather than control strings because they do not swallow +% following space (possibly not important), and because +% this made the whole thing easier to follow in the +% debugging process. +% \begin{macrocode} +{\catcode`\_=13\catcode`\^=13\catcode`\|=13% + \gdef\@law@get@ul{\gdef\@law@alitem{_}}% + \gdef\@law@get@carat{\gdef\@law@alitem{^}}% + \gdef\@law@get@bar{\gdef\@law@alitem{\@law@delim|}}% +} +\gdef\@law@finishargtwo{% + \global\@ltok@a={\@law@pingroup\@law@pinstart}% + \xdef\@law@temp{\the\@ltok@a\the\@ltok@argtwo}% + \global\@ltok@argtwo=\expandafter{\@law@temp}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\@law@alparsesavecomma} +% \begin{macro}{\@law@alparseplain} +% These parsers are switched in as appropriate. The first +% checks to see if the end of the string for parsing has +% been reached. The second cycles a comparison. +% \begin{macrocode} +\gdef\@law@alparsesavecomma{\@ifnextchar,% + {\gdef\@law@alitem{\@law@delim\@law@pinend}\@law@alnomatch% + \expandafter\@law@finishargtwo% + \@gobble}% + {\gdef\@law@alitem{\@law@delim% + \@law@multiflag\@law@multiset\query% + \@law@comma}% + \@law@alnomatch% + \let\@law@parse=\@law@alparseplain\@@parse}} +\def\@law@alparseplain#1{% + \let\@law@nomatch=\@law@alnomatch% + \gdef\@law@alitem{#1}\let\\=\@law@alone\@law@allist\@@parse} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\@law@scanlist} +% This macro is defined and kept on the shelf as a +% definition of "\\" that checks through the list +% of paired aliases and associated text. If it finds +% a match, it gives the text one level of expansion, +% to fix the current definition of "_" and "^". +% This allows one entry to serve both between citations, +% and at the start of a citation string. In addition +% to these macros, a "\@law@wordlist" macro must be +% defined in the ".cst" file used with {\sc Camel}. +% \begin{macrocode} +\def\@law@scanlist#1#2{\long\def\@law@temp{#1}% + \@ltok@a={#2}% + \ifx\@law@temp\@overword\xdef\@SBSword{{\noexpand\em \the\@ltok@a}}% + \let\\=\@law@finish\fi} +% \end{macrocode} +% \end{macro} +% \begin{macrocode} +\def\@law@wlnomatch{\message{^^J^^J% + There is an unregistered inter-citation word (\@overword) on + line no \the\inputlineno. See the LexiTeX documentation + for more information. Please email fb@soas.ac.uk if + you want a word added to the inter-citation list.}} +% \end{macrocode} +% \begin{macro}{\@law@checkins} +% This macro works with the "\@ifoverword" macro; it checks +% the contents of the "\@overword" macro defined during +% the leap, to see if it corresponds to anything in a list +% of aliases. The alias list could be defined as a set +% of prefixed macros (to speed things up), or as a +% single list macro (to conserve string space). I have +% adopted the latter strategy. If anyone feels strongly +% that speed is more important, or that somehow the +% integrity of \TeX{} demands that macros be used, +% it's not much of a job to change things; be my +% guest. +% \begin{macrocode} +{\catcode`\_=\active% + \catcode`\^=\active% +\gdef\@law@checkins{% + \def^##1{\lowercase{##1}}\def_##1{{\em{##1}}}% + \let\@law@tempthree=\\% + \let\@law@nomatch=\@law@wlnomatch% + \let\\=\@law@scanlist\@law@wordlist% + \let\\=\@law@tempthree} +\gdef\@law@checkpre{% + \let\@law@tempthree=\\% + \let^\relax\let_\@gobble% + \let\@law@nomatch=\@law@wlnomatch% + \let\\=\@law@scanlist\@law@wordlist% + \let\\=\@law@tempthree} +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\source} +% The front end of the "\source" command is very much +% {\em \`a la} typical LaTeX optional command definition stuff. +% We just carry things a little further because there are +% two possible options to the "\source" command. +% \begin{macrocode} +\gdef\source{% + \if@law@requiresubjects% + \gdef\@law@citesubject{}% + \fi% + \@law@printcitetrue% + \@law@printauthortrue% + \@law@printtitletrue% + \setcounter{law@parapin}{0}% + \setcounter{law@paracounter}{0}% + \@ifnextchar[{\@lexicite}{\@lexicite[]}} +\def\@lexicite[#1]#2{\@ifnextcharcareful[{% + \addtocounter{law@parapin}{1}\@@lexicite{#1}{#2}}% + {\@@lexicitenobrace{#1}{#2}}} +% \end{macrocode} +% Once we've gathered up any optional arguments, it's time +% to use the "\@ifoverword" command. If we find a "\source" +% command after the next word, we stash the current cite, +% we check the word separating the two "\source" commands +% against an internal list, return the result to +% "\@SBSword", and push the raw citation details and +% the "@SBSword" bridge onto a temporary stack. +% Otherwise, we clear the "\@SBSword", push the +% current cite details, dump the stack, and +% put the word we found, together with any separating +% space, back on the output stream. +% \begin{macrocode} +\def\@ifnextcharcareful#1#2#3{% + \gdef\@prenextcharspace{}% + \let\reserved@e=#1\def\reserved@a{#2}\def\reserved@b{#3}\futurelet + \reserved@c\@ifnchcareful} +\def\@ifnchcareful{\ifx \reserved@c \@sptoken \let\reserved@d\@xifnchcareful + \else \ifx \reserved@c \reserved@e\let\reserved@d\reserved@a\else + \let\reserved@d\reserved@b\fi + \fi \reserved@d} +\def\:{\@xifnchcareful} +\expandafter\def\: {% + \gdef\@prenextcharspace{ }\futurelet\reserved@c\@ifnch} +\def\@@lexicite#1#2[#3]{% + \@ifoverword\source% + {\@law@checkins\@@@lexicite{#1}{#2}{#3}}% + {\gdef\@SBSword{}\@@@lexicite{#1}{#2}{#3}% + \@law@citedump{}% + \@preoverwordspace% + \expandafter\@law@gobble% + \@overword{} }% + {\gdef\@SBSword{}\@@@lexicite{#1}{#2}{#3}% + \@law@citedump{}% + \@preoverwordspace% + \expandafter\@law@gobble% + \@overword{} }} +\def\@@lexicitenobrace#1#2{% + \@ifoverword\source{\@law@checkins\@@@lexicite% + {#1}{#2}{}}% + {\gdef\@SBSword{}\@@@lexicite% + {#1}{#2}{}% + \@law@citedump{}% + \@prenextcharspace% + \expandafter\@law@gobble% + \@overword{} } + {\gdef\@SBSword{}\@@@lexicite% + {#1}{#2}{}% + \@law@citedump{}% + \@prenextcharspace% + \expandafter\@law@gobble% + \@overword{} }} +% \end{macrocode} +% To push citation details, we use a token assignment with +% "\expandafter", then an "\edef" of the register contents +% to get one level of expansion into a macro. +% \begin{macrocode} +\def\@law@citestack{}% +\gdef\@SBSword{}% +\def\@@@lexicite#1#2#3{% + \@ltok@a=\expandafter{\@law@citestack}% + \@ltok@b={\@realcite{#1}{#2}{#3}}% + \@ltok@c=\expandafter{\@SBSword}% + \edef\@law@citestack{\the\@ltok@a\the\@ltok@b\the\@ltok@c}} +% \end{macrocode} +% \begin{macro}{\footnote} +% We need a flag to tell us whether we are in a footnote. +% This allows us to prevent footnote forcing if we're +% {\em already} in a footnote. \LaTeX{} itself should +% probably take care of this, but for now we need to +% give it +% a helping hand by reinvoking the critical command with +% Apologies to the \LaTeX3 team and everything, but I +% really truly do need these hooks. +% +% Some thoughts on the tracking of previous citations. This +% is hardly transparent, and even I the author have trouble +% following it. Something for tidying up someday. +% Currentcite is set only at the top of a footnote. The idea +% apparently is that we need to remember the last cite in the +% last footnote always. Problems to watch here are (a) what +% happens for the very first footnote, and (b) what happens in +% the main text. There should probably be complete isolation of +% these context records for main text references and footnote +% references. +% \begin{macrocode} +\long\def\@footnotetext#1{\insert\footins{% + \@law@infoottrue% % Hooks for citation manager + \ifnum\the\c@citesinfoot=1\relax% % + \global\let\@law@lastcite\@law@currentcite% % + \else% % + \gdef\@law@lastcite{\@dummy}% % + \fi% % + \global\setcounter{citesinfoot}{0}% End of hooks + \reset@font\footnotesize + \interlinepenalty\interfootnotelinepenalty + \splittopskip\footnotesep + \splitmaxdepth \dp\strutbox \floatingpenalty \@MM + \hsize\columnwidth \@parboxrestore + \let\@tempa\protect + \def\protect{\noexpand\protect\noexpand}% + \edef\@currentlabel{\csname p@footnote\endcsname\@thefnmark}% + \let\protect\@tempa + \color@begingroup + \normalcolor + \@makefntext{% + \rule\z@\footnotesep\ignorespaces#1% + \@finalstrut\strutbox} + \color@endgroup}} +% \end{macrocode} +% \end{macro} +% We require a simple parser to allow multiple citation +% keys in the scope of a single "\source" command. We +% ignore any pinpoint given after the "\source" command; +% if you're using pinpoints, write individual "\source" +% commands into your text. This keeps things relatively +% clean and simple, for future linking to intelligent +% editors. The voiding of "\@ltok@argtwo" is going +% to be redundant if there are more than two keys +% in the scope, but what the heck, it's simple this way. +% Intervening punctuation is assumed to be the ``default'', +% which is signified by the ";" character. +% Note that any leading options will carry through to +% {\em all\/} of the citations in the key string! +% If you want to suppress the author, say, for only one +% citation, you'd better use a separate "\source" command +% for that citation, and link it to the string with +% an inter-word. +% \begin{macrocode} +\def\@law@clparseplain#1,{% + \@ifnextchar,% + {\def\@law@temp{\@law@onerealcite{#1}}% + \expandafter\@law@temp\@gobble}% + {\@law@onerealcite{#1}% + {\long\def\@overword{;}\@law@checkins% + \@SBSword\gdef\@SBSword{}}% + \@@parse}} +% \end{macrocode} +% +% When citations are dumped, we need to decide what sort +% of delimiters they receive. If footnote forcing is in +% effect, we need to protect against the possibility +% that we're already in a footnote. The "\@citedump" +% command should be redefined for styles that bracket +% citation strings in, say, square brackets. +% The following code, the "\@law@printcite" command and the +% contents of the "lexicite.tex" file are the +% only chunks of the style that need modification +% to generate different---perhaps radically different---styles. +% The strategy used here to force footnotes could equally +% well be used to place the citation string +% in a "\marginpar", +% in a floating box, on a facing page or what have you. +% So many possibilities, so little time \ldots +% \begin{macrocode} +\def\@law@citedump{% + \if@law@infoot% + \begingroup\@law@citestack\endgroup% + \else% + \if@law@forcefootnotes% + \footnote{\begingroup\@law@citestack\@law@gobble.\endgroup}% + \else% + \begingroup\@law@citestack\endgroup% + \fi% + \fi% +\def\@law@citestack{}} +% \end{macrocode} +% The actual cites +% should be expanded only after it has been determined that +% the end of a citation string has been reached. +% The expansion sequence for individual citations begins +% here. +% \begin{macrocode} +\def\@realcite#1#2#3{% + \ifcat$#1$\else% + \setkeys{cameloptions}{#1} + \fi% + \if@law@requiresubjects% + \@law@confirmsubject% + \fi% + \global\@ltok@argtwo{}% + \ifcat$#3$\else% + {\let\@law@parse=\@law@alparseplain\@law@parse #3,,}% + \fi% + {\let\@law@parse=\@law@clparseplain\@law@parse #2,,}% + } +% \end{macrocode} +% \end{macro} +% The "\@law@onerealcite" macro +% writes the citation key on the ".aux" file for +% onward use by \BibTeX{}, and initiates citation +% expansion. +% \begin{macrocode} +\def\@law@onerealcite#1{% + \@ifundefined{@lnick@#1}% + {\expandafter\def\csname @lnick@#1\endcsname{% + {\small\bf\tt <undefined: #1>} + \@latex@warning + {Citation `#1' on page \thepage \space undefined}}}% + {\relax}% + \if@filesw% + \immediate\write\@auxout{\string\citation{#1}}% + \@ifundefined{@law@managerouthook}% + \relax% + {\immediate\write\@bibout{\@law@managerouthook{#1}}}% + \fi% +\global\@law@firstuseofcitefalse% +\csname @lnick@#1\endcsname} +% \end{macrocode} +% \begin{macro}{\bibitem} +% The bibitem subcommands are redefined, since we don't +% need to export the nickname a second time when using {\sc Camel}. +% \begin{macrocode} +\def\@lbibitem[#1]{\item[\@biblabel{#1}\hfill]\ignorespaces} +\def\@bibitem{\item\ignorespaces} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\bibliographymanager} +% This macro provides support for external bibliography +% managers. If a known manager is declared, the key +% is written on an ephemeral file with the name "camel.bib". +% If the manager is then set up to replace +% keys with valid \BibTeX{} ".bib" entries, and is +% run over this file, the resulting file can be used as an +% input file for \BibTeX{}. Simple. Clean. \LaTeX. +% \begin{macrocode} +\def\@law@subjectlist{} +\def\citationstyle#1{% + \ifx\@law@subjectlist\empty% + \def\@law@citesubject{all} + \expandafter\gdef\csname @law@all@citelist\endcsname{}% + \def\@law@subjectlist{\\{all}{}{\camelrefname}{}}% + \fi% + \if@filesw% + \immediate\write\@auxout{\string\bibstyle{#1}}% + \fi% + \def\@law@savecat{\catcode`@}% + \makeatletter% + \input{#1.cst}% + \input{#1.cit}% + \catcode`\@=\@law@savecat% + \@ifundefined{@law@bblfile}% + {\relax}% + {\begin{lexilist} + \@input{\@law@bblfile} + \end{lexilist}}} +\def\citationdata#1{% + \def\bibliographymanager{\@camel@error{\string\bibliographymanager\space + following \string\citationdata.^^J + You can use only one of \string\citationdata\space and + \string\bibliographymanager\space^^J at the start of a document + or after a + \string\printthebibliography\space command}\@ehc}% + \if@filesw% + \immediate\write\@auxout{\string\bibdata{#1}}% + \fi% + \@ifundefined{@law@wordlist}% + {\gdef\@law@bblfile{\jobname.bbl}}% + {\begin{lexilist} + \@input {\jobname.bbl} + \end{lexilist}}} +\def\@camel@error#1#2{% + \GenericError{% + \space\space\space\@spaces\@spaces\@spaces + }{% + Camel Error: #1% + }{% + See the Camel manual for explanation.% + }{#2}% +} +{\catcode`\%=12 \gdef\@law@percent{%}} +\def\bibliographymanager#1{% + \def\citationdata{\@camel@error{\string\citationdata\space + following \string\bibliographymanager.^^J + You can use only one of \string\citationdata\space and + \string\bibliographymanager\space^^J at the start of a + document or after a + \string\printthebibliography\space command.}\@ehc}% + \if@filesw% + \immediate\write\@auxout{\string\bibdata{camel}}% + \fi% + \@ifundefined{@law@wordlist}% + {\gdef\@law@bibfile{\jobname.bbl}}% + {\begin{lexilist}% + \@input {\jobname.bbl} + \end{lexilist}}% + \newwrite\@bibout% + \immediate\openout\@bibout camel.bib% + \gdef\@law@temp{#1}% + \gdef\@law@temptwo{procite}% + \ifx\@law@temp\@law@temptwo% + \def\@law@managerouthook##1{(##1)}% + \fi% + \gdef\@law@temptwo{endnote}% + \ifx\@law@temp\@law@temptwo% + \def\@law@managerouthook##1{[##1]}% + \fi% + \gdef\@law@temptwo{papyrus}% + \ifx\@law@temp\@law@temptwo% + \def\@law@managerouthook##1{\@law@percent\@law@percent##1\@law@percent\@law@percent}% + \fi% + \gdef\@law@temptwo{referencemanager}% + \ifx\@law@temp\@law@temptwo% + \def\@law@managerouthook##1{\{##1\}}% + \fi% + \gdef\@law@temptwo{tib}% + \ifx\@law@temp\@law@temptwo% + \def\@law@managerouthook##1{[.##1.]}% + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\lexibib} +% This is used by \LexiBib{} to declare citations in a {\tt lexilist} +% environment. Use of a single macro permits +% {\tt\string\theholding} and its friends to work more simply. +% \begin{macrocode} +\def\lexibib#1{\csname new#1\endcsname}% +% \end{macrocode} +% \end{macro} +% +% We need to initialize the list macro used as a workspace +% by the list macro handlers. +% \begin{macrocode} +\def\@law@templistmacro{} +\def\@law@tempplistmacro{} +% \end{macrocode} +% These macros are used for \verb+\if+-branching in various +% formatting routines. +% \begin{macrocode} +\def\@law@case{case} +\def\@law@statute{statute} +\def\@law@article{article} +\def\@law@book{book} +% \end{macrocode} +% \subsection{Main macros} +% \subsubsection{Utility macros} +% This section contains larger macros that perform major +% tasks and smaller bits of code that are complex in their operation. +% \begin{macro}{\@law@unstashparas} +% When this is implemented, the above chain of "futurelet" macros +% will be linked to this "\@law@unstashparas" routine, which fetches +% any parallel items, and then (in "\@law@setup") performs the restash +% of the citation if necessary. +% \end{macro} +% \begin{macro}{\@law@clean} +% \begin{macro}{\@law@cleanup} +% This is a rough set of routines; if anyone has a +% suggestion on how to more elegantly clean +% most of \LaTeX's control sequences for export, +% I would be most grateful to hear from them. +% The effect of these routines is to convert +% control sequences +% that might be sent to the output files into +% harmless strings. This is necessary because +% the file cannot be written at the time \verb+\@law@cleanup+ +% is called; the page references would be incorrect. +% The definitions are local; bracketing the clean command and +% its arguments will leave the cleaned text in the macro, +% but restore command strings to operation when \LaTeX\ +% passes out of the current group. +% The "\ifcat" condition at the start (this method of token +% register checking was suggested by Bernd Raichle---who +% scolded me for bothering the \LaTeX3 list with this question!) +% is meant to catch empty +% strings fed to the routine in the fastest possible way. +% Without any checking, things can blow up. +% The use of "\@law@barnil" (somewhere in the middle) makes the vertical-bar +% character turn wimpish and disappear, which is what we want. +% Otherwise it prints weird stuff when it is fed back in through +% the external table. +% \begin{macrocode} +{\catcode`\_=13\catcode`\^=13\catcode`\|=13% +\gdef\@law@clean#1#2{% + \def\protect##1{\string##1\space}% + \ifcat$\the#1$% + \edef#2{}% + \else% + \def^{\string^}% + \def_{\string_}% + \@law@barnil% + \def\volno{\string\volno}% + \def\exclaim{\string\exclaim}% + \def\hbox{\string\hbox}% + \def\&{\string\&}\def\%{\string\%}% + \def\hskip{\string\hskip}% + \def\jintercharskip{\string\jintercharskip}% + \def\char{\string\char}% + \def~{\string~}\def\/{\string\/}% + \def\\{\string\\}\def\ {\string\ }\def\sc{\string\sc\space}% + \def\rm{\string\rm\space}\def\bf{\string\bf\space}% + \def\em{\string\em\space}% + \def\={\string\=}% + \def\`{\string\`}\def\'{\string\'}% + \def\^{\string\^}\def\"{\string\"}\def\~{\string\~}% + \def\.{\string\.}\def\u{\string\u}\def\v{\string\v}% + \def\H{\string\H\space}\def\t{\string\t\space}% + \def\c{\string\c\space}% + \def\d{\string\d\space}\def\b{\string\b\space}% + \def\oe{\string\oe\space}% + \def\ae{\string\ae\space}\def\aa{\string\aa\space}% + \def\o{\string\o\space}% + \def\l{\string\l\space}\def\ss{\string\ss\space}% + \def\OE{\string\OE\space}\def\AE{\string\AE\space}% + \def\AA{\string\AA\space}% + \def\O{\string\O\space}\def\L{\string\L\space}% + \def\dag{\string\dag\space}\def\ddag{\string\ddag\space}% + \def\S{\string\S\space}% + \def\P{\string\P\space}% + \def\TeX{\string\TeX\space}\def\LaTeX{\string\LaTeX\space}% + \def\LexiTeX{\string\LexiTeX\space}% + \def\BibTeX{\string\BibTeX\space}\def\-{\string\-}% +\xdef\@law@temp{\the#1}% +\xdef#2{\expandafter\expandafter\expandafter\@gobble% +\expandafter\string\csname\@law@temp\endcsname}% +\fi} +} +% \end{macrocode} +% This routine runs the cleaning routine on every +% token register that we want to send to the external +% files. The result is stored in a macro, since we +% need the registers for the next citation, and because it +% will be safe to fully expand the contents after cleaning. +% \begin{macrocode} +\def\@law@cleanup{% +\@law@clean\@ltok@authormainface\@law@authormainfacetemp% +\@law@clean\@ltok@authoroptionface\@law@authoroptionfacetemp% +\@law@clean\@ltok@author\@law@authortemp% +\@law@clean\@ltok@titlemainface\@law@titlemainfacetemp% +\@law@clean\@ltok@titleoptionface\@law@titleoptionfacetemp% +\@law@clean\@ltok@argtwo\@law@argtwotemp% +\@law@clean\@ltok@name\@law@nametemp% +\@law@clean\@ltok@citepage\@law@citepagetemp% +\@law@clean\@ltok@citefirstmainface\@law@citefirstmainfacetemp% +\@law@clean\@ltok@citefirstoptionface\@law@citefirstoptionfacetemp% +\@law@clean\@ltok@citefirst\@law@citefirsttemp% +\@law@clean\@ltok@conetop\@law@conetoptemp% +\@law@clean\@ltok@citelast\@law@citelasttemp% +\@law@clean\@ltok@ptop\@law@ptoptemp} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \subsubsection{Declaration of citation types} +% This section contains macros used in creating the citation +% declaration macros actually entered in the document by the user. +% \paragraph{{\tt @newcite} and its friends} +% The following macros are used to define the macro +% suites that relate to particular citation types. +% These are normally invoked by entries in the {\tt lexicite.tex} +% file, but the \verb+\newcitestyle+ macro is accessible +% within the document as well. +% The \verb+\newcitestyle+ macro expects the following arguments: +% \begin{enumerate} +% \item the nickname of the citation style to be created; +% \item a list of typeface and cite type options, in the +% syntax required by \verb+\@newciteoptions+; +% \item a list of cite bridges, in the syntax required +% by \verb+\@newcitebridges+; +% \item an integer giving the number of arguments the +% finished cite-generation macro will accept; and +% \item an argument consisting of a balanced list of six arguments +% indicating which of the six possible {\sc Camel}\ arguments +% will be used. +% \end{enumerate} +% The last two of these are fed to \verb+\newcommand+ as formatting +% arguments in the creation of citation style macros. +% In operation, the token register assignments +% performed by \verb+\@newcitebridges+ and\verb+\@law@parsefaces+ +% are memorized by freezing them in macros whose names are +% derived from the name of the citation style. The freezing +% operation is carried out by a list of token assignments +% within the storage macros. The macros are \verb+\xdef+ed, +% but the expansion of everything +% except the existing contents of the registers (inserted +% at one level of expansion using \verb+\the+) is prevented +% with \verb+\noexpand+s. The +% macro containing the faces is created inside \verb+\newcitestyle+ +% itself to save an argument position in the definition of +% \verb+\@law@parsefaces+; we've used up seven, and there are +% only two to go. This could be done with list +% macros as well, but this method probably runs a little +% faster because it does the job directly. The trade-off +% is that the \meta{cite type name}{\tt faces} macros +% contain a lot of non-informative text +% (the names of the token registers); but there are not +% many citation types, so it is probably worth the cost. +% in memory. +% +% Note that as of this release, citation declarations +% defined with \verb+\newcitestyle+ {\em always\/} begin +% with \verb+\new+. This will help simplify the integration +% of \BibTeX\ and {\sc Camel}. +% \begin{macrocode} +\def\newcitestyle#1#2#3{% +\@ifundefined{@law@citeload}% + {\def\@law@citeload{Loading citation classes: #1 ... }}% + {\message{\@law@citeload#1}\def\@law@citeload{...\space}}% + \@newcitebridges#1#3% + \expandafter\@law@parsefaces#2% + \expandafter\xdef\csname#1faces\endcsname{% + \noexpand\global\noexpand\@ltok@authormainface\noexpand{% + \the\@ltok@authormainface\noexpand}% + \noexpand\global\noexpand\@ltok@authoroptionface\noexpand{% + \the\@ltok@authoroptionface\noexpand}% + \noexpand\global\noexpand\@ltok@titlemainface\noexpand{% + \the\@ltok@titlemainface\noexpand}% + \noexpand\global\noexpand\@ltok@titleoptionface\noexpand{% + \the\@ltok@titleoptionface\noexpand}% + \noexpand\global\noexpand\@ltok@citefirstmainface\noexpand{% + \the\@ltok@citefirstmainface\noexpand}% + \noexpand\global\noexpand\@ltok@citefirstoptionface\noexpand{% + \the\@ltok@citefirstoptionface\noexpand}% + \noexpand\global\noexpand\@ltok@citetype\noexpand{% + \the\@ltok@citetype\noexpand}}% + \expandafter\gdef\csname new#1\endcsname##1##2##3##4##5##6##7% + {\@newcite{#1}{##1}{##2}{##3}{##4}{##5}{##6}{##7}}} +% \end{macrocode} +% The following are parsing routines that are called by \verb+\newcitestyle+. +% In \verb+\@law@parsefaces+, the seven arguments are the string of letters +% in the second argument of \verb+\newcitestyle+. +% This function has been drastically simplified over +% the first release. I should have done +% it this way in the first place and saved myself a lot of +% aggravation. The code should run a lot faster to boot. +% \begin{macrocode} +\def\@law@parsefaces#1#2#3#4#5#6#7{% + \@law@parseoneoption\@ltok@authormainface#1% + \@law@parseoneoption\@ltok@authoroptionface#2% + \@law@parseoneoption\@ltok@titlemainface#3% + \@law@parseoneoption\@ltok@titleoptionface#4% + \@law@parseoneoption\@ltok@citefirstmainface#5% + \@law@parseoneoption\@ltok@citefirstoptionface#6% + \@law@parselastoption\@ltok@citetype#7} +% +\def\@law@parseoneoption#1#2{% + \if#2s\global#1{\sc}\fi% + \if#2i\global#1{\em}\fi% + \if#2b\global#1{\bf}\fi% + \if#2r\global#1{\rm}\fi% + \if#2S\global#1{\sc}\fi% + \if#2I\global#1{\em}\fi% + \if#2B\global#1{\bf}\fi% + \if#2R\global#1{\rm}\fi} +% +\def\@law@parselastoption#1#2{% + \if#2a\global#1{article}\fi% + \if#2b\global#1{book}\fi% + \if#2c\global#1{case}\fi% + \if#2s\global#1{statute}\fi% + \if#2A\global#1{article}\fi% + \if#2B\global#1{book}\fi% + \if#2C\global#1{case}\fi% + \if#2S\global#1{statute}\fi} +% \end{macrocode} +% Bridges are stored literally, without parsing, so it's +% easy to stash them directly in a single macro that +% is fed the arguments. The assignments here are stored +% by the same method outlined in the description of +% \verb+\newcitestyle+, above. +% \begin{macrocode} +\newtoks\@ltok@c% +\newtoks\@ltok@d% +\newtoks\@ltok@e% +\newtoks\@ltok@f% +\newtoks\@ltok@g% +\newtoks\@ltok@h% +\newtoks\@ltok@i% +\newtoks\@ltok@j% +\def\@newcitebridges#1[a]#2[t]#3[c]#4[p]#5(pl)#6[rp]#7[e]:[id]#8(pl)#9[xrf]{% +\@ltok@c{#2}% +\@ltok@d{#3}% +\@ltok@e{#4}% +\@ltok@f{#5}% +\@ltok@g{#6}% +\@ltok@h{#7}% +\@ltok@i{#8}% +\@ltok@j{#9}% + \expandafter\xdef\csname#1bridges\endcsname{% + \noexpand\global\noexpand\@ltok@atot\noexpand{\the\@ltok@c\noexpand}% + \noexpand\global\noexpand\@ltok@ttocone\noexpand{\the\@ltok@d\noexpand}% + \noexpand\global\noexpand\@ltok@conetop\noexpand{\the\@ltok@e\noexpand}% + \noexpand\global\noexpand\@ltok@conetopplural\noexpand{\the\@ltok@g\noexpand}% + \noexpand\global\noexpand\@ltok@ptop\noexpand{\the\@ltok@f\noexpand}% + \noexpand\global\noexpand\@ltok@ptoctwo\noexpand{\the\@ltok@h\noexpand}% + \noexpand\global\noexpand\@ltok@atbridge\noexpand{\the\@ltok@i\noexpand}% + \global\@ltok@atbridgeplural\noexpand{\the\@ltok@j\noexpand}}}% +% \end{macrocode} +% \subsubsection{Declaration of citation nicknames} +% The following macros are called by the macros generated +% by the \verb+\newcitestyle+ macro and its arguments. +% Their effect is to create nickname macros which can then +% be called by the user with the \verb+\source+ +% command, with the nickname as +% a single argument in braces. +% This macro is called by +% \verb+\new+\meta{citation type name}. While this macro always takes +% seven arguments, some of these may be masked off +% from the user, if fewer than the full possible six +% arguments were called for in the final argument fed +% to \verb+\newcitestyle+ in creating the particular +% \verb+\new+\meta{citation type name} macro that is +% doing the calling. The arguments are there, the user just +% can't put anything into them.\\ +% The \verb+\@law@authortracing+ +% macro is actually just a temporary macro; I gave it a +% descriptive name because it was a struggle to keep my +% head around what it does as I was programming this. +% What happens is that a token assignment of the +% author's name followed by a trip to the cleaning routine +% is used to store a harmless string consisting of the +% entire contents of the author's name field in the +% \verb+\@law@authortracing+ macro. Then this {\em name\/} +% is defined as a macro, expanding to {\tt 1} or {\tt 2}, +% depending on whether it has been defined once already. +% The macro may look something +% like \verb+\Jayeff Huggins~Jr.+. Drastic, but effective. +% Try doing that with a WordPerfect macro \ldots +% \begin{macrocode} +\newif\if@law@specialbridges% +\def\@newcite#1#2#3#4#5#6#7#8{% +\message{=}% + {\@ltok@a={#4}\@law@clean\@ltok@a\@law@temp% +\expandafter\ifx\csname\@law@temp\endcsname\relax% +\expandafter\expandafter\expandafter\xdef\expandafter% + \csname\@law@temp\endcsname{1}% +\else% + \expandafter\expandafter\expandafter\xdef\expandafter% + \csname\@law@temp\endcsname{2}% +\fi}% +% \end{macrocode} +% The \verb+\@law@stasheverything+ macro creates the +% list macro that can be used to retrieve all citation +% details at a later point in the document. \verb+\@law@makecitenick+ +% creates the short macro that knows how to unstash the stored +% information. Note that this is where things end +% if we are inside the \verb+lexilist+ environment.\footnote{% +% The previous release used a {\tt\string\@law@stashinfo} macro +% that +% took nine arguments. The last two were just +% toggles, in effect, for the creation of a long- and a +% short-form nickname macro. Passing the information in +% this way required the definition of two separate invocation +% macros, one for full-form citing and one for short-form +% citing. +% This was messy. We now do all of this with +% true toggles that change the behaviour of a single +% set of routines. This means: +% \begin{itemize} +% \item We don't need two macros; and +% \item The stash routines can be included in {\tt\string\@newcite} +% itself---information needn't be passed through macro arguments +% at all, which helps speed things up. +% \end{itemize} +% We have to start by emptying the contents of the temporary +% list macro; a beta version didn't do this, and loading cites +% took an amazingly long time. I had problems with ``{\tt TeX capacity +% exceeded}'' messages, and {\tt\string\tracingmacros=2} showed that every +% cite was a stack containing the desired cite---and every preceding +% citation as well!} +% \begin{macrocode} +\def\@law@templistmacro{}% +\def\@law@tempplistmacro{}% +\setcounter{law@paranormal}{0} + \ifcat$\the\@ltok@useratbridgeplural$% + \@law@addargument{}\tocitelist% + \@law@addargument{}\tocitelist% + \@law@addargument{}\tocitelist% + \@law@addargument{}\tocitelist% + \@law@addargument{}\tocitelist% + \@law@addargument{}\tocitelist% + \else% + \@law@addtoken\@ltok@userconetop\tocitelist% + \@law@addtoken\@ltok@userconetopplural\tocitelist% + \@law@addtoken\@ltok@userptop\tocitelist% + \@law@addtoken\@ltok@userptoctwo\tocitelist% + \@law@addtoken\@ltok@useratbridge\tocitelist% + \@law@addtoken\@ltok@useratbridgeplural\tocitelist% + \fi% +\@law@addargument{#1}\tocitelist% +\@law@addtoken\@ltok@bigsourcepage\tocitelist% (not yet implemented) +\@law@addtoken\@ltok@bigsourcecite\tocitelist% (not yet implemented) +\@law@addtoken\@ltok@hereinafter\tocitelist% (not yet implemented) +% \end{macrocode} +% Two fields are made nil during stash; they will be filled +% when the macro is first unpacked. +% \begin{macrocode} + \@law@addargument{}\tocitelist% + \@law@addargument{}\tocitelist% +\@law@addtoken\@ltok@citetype\tocitelist% cite type +\@law@addargument{#8}\tocitelist% cite last part +\@law@addargument{#7}\tocitelist% cite page +\@law@addargument{#6}\tocitelist% cite first part +\@law@addargument{#5}\tocitelist% name of work +\@law@addargument{#4}\tocitelist% author +\expandafter\gdef\csname @law@#2@lab\endcsname{#3}% label +\@law@addargument{#2}\tocitelist% nickname +\def\@law@tempplistmacro{}% +\@law@paracheckone{#2}}% +% \end{macrocode} +% +% \begin{macro}{\@law@paracheckone} +% \begin{macro}{\@law@parachecktwo} +% \begin{macro}{\@law@getpara} +% The following three macros look ahead (after the initial +% arguments to a cite declaration have been digested but {\em +% before\/} the cite information has been stored to the list +% macro) for a {\tt =} sign, which signals parallel citation +% details. If a {\tt =} sign is found, a further check is made +% for a {\tt [}, which signals a set of special bridges for the +% upcoming parallel citation. Note the use of two {\tt =} signs +% in braces as the first argument to {\tt\string\@ifnextchar}. +% This is required because of the internal syntax of the +% {\tt\string\@ifnextchar} macro. +% \begin{macrocode} +\def\@law@paracheckone#1{% + \def\@law@temp{{#1}}% + \@ifnextchar{=}% + {\expandafter\expandafter\expandafter\@law@parachecktwo% + \expandafter\@law@temp\@gobble}% + {\@@newcite{#1}}}% +% \end{macrocode} +% +% \begin{macrocode} +\def\@law@parachecktwo#1{\@ifnextchar[% + {\@law@getpara{#1}}% + {\@law@getpara{#1}[{}{}{}{}{}]}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% The following add a single set of parallel citation details +% into a list macro used as a holding area for this purpose. +% \begin{macrocode} +\def\@law@getpara#1[#2#3#4#5#6]#7#8#9{% + \addtocounter{law@parapin}{1} + \def\@law@temp{{#1}}% + \@law@addpargument{{#2}{#3}{#4}{#5}{#6}{#7}{#8}{#9}}\tolist% + \@ifnextchar{=}% + {\expandafter\expandafter\expandafter% + \@law@parachecktwo\expandafter\@law@temp\@gobble}% + {\@@newcite{#1}}} +% \end{macrocode} +% +% \begin{macrocode} +\def\@@newcite#1{% +% \end{macrocode} +% A counter indicating how many parallel citations are stored for +% the current citation, and the +% list macro of parallel citation details built by the +% routines above is stored as a single item in the general list macro of +% citation details. +% \begin{macrocode} +\@law@addtoken\c@law@paranormal\tocitelist +\@ltok@a\expandafter{\@law@tempplistmacro}% +\@law@addtoken\@ltok@a\tocitelist% +\expandafter\global\expandafter\let\csname @ldata@#1\endcsname=\@law@templistmacro% +\@ltok@userconetop{}% +\@ltok@userconetopplural{}% +\@ltok@userptop{}% +\@ltok@userptoctwo{}% +\@ltok@useratbridge{}% +\@ltok@useratbridgeplural{}% +% \end{macrocode} +% Having stashed everything, we're ready to make the nickname +% macro itself, and print the long form of the cite. We set +% "\@law@temp" equal to the nickname macro, and expand after +% the condition so that arguments can be examined---otherwise +% the first thing the nickname sees will be the "\fi". +% \begin{macrocode} +\@law@makecitenick{#1}% +% \end{macrocode} +% +% \begin{macrocode} + \if@law@listinputting\def\@law@nick{}\else% + \def\@law@nick{\source[f]{#1}}\fi\@law@nick}% +% \end{macrocode} +% This macro adds one argument item "#1" to the end +% of list macro "\@law@templistmacro". This and the +% other list handlers are modelled on the examples in +% Knuth's \TeX book.\source{knuth}+{378}{} +% This and the other macros in this set do their work on +% one list macro, \verb+\@law@templistmacro+, in order +% to avoid the need for lots of \verb+\expandafter+s. +% \begin{macrocode} +\def\@law@addargument#1\tocitelist{% + \@law@leftappendargument#1\to\@law@templistmacro} +\long\def\@law@leftappendargument#1\to#2{\@ltok@a={\\{#1}}% + \@ltok@b=\expandafter{#2}% + \xdef#2{\the\@ltok@a\the\@ltok@b}} +% \end{macrocode} +% This macro adds the contents of one token register to +% the temporary list macro. +% \begin{macrocode} +\def\@law@addtoken#1\tocitelist{\@law@leftappendtoken#1\to\@law@templistmacro} +\long\def\@law@leftappendtoken#1\to#2{% + \xdef\@law@temp{\noexpand\\\noexpand{\the#1\noexpand}}% + \@ltok@a=\expandafter{\@law@temp}% + \@ltok@b=\expandafter{#2}% + \xdef#2{\the\@ltok@a\the\@ltok@b}} +% \end{macrocode} +% This macro cuts one token-register item \verb+#1+ from the +% end of list macro "\@law@templistmacro". The lopoff +% portion is almost straight out of the TeXbook, except +% that it stores the lopped element in a token register +% instead of a macro. +% \begin{macrocode} +\def\@law@cut#1\fromcitelist{\@law@lop\@law@templistmacro\to#1} +\def\@law@lop#1\to#2{\expandafter\@law@lopoff#1\@law@lopoff#1#2}% +\long\def\@law@lopoff\\#1#2\@law@lopoff#3#4{\global#4={#1}\gdef#3{#2}} +\def\@law@pincut#1\frompinlist{\@law@pinlop\@law@argtwolist\to#1} +\def\@law@pinlop#1\to#2{\expandafter\@law@pinlopoff#1\@law@pinlopoff#1#2}% +\long\def\@law@pinlopoff\@law@pingroup\@law@pinstart#1\@law@pinend#2\@law@pinlopoff#3#4{\global#4={#1}\gdef#3{#2}} +% \end{macrocode} +% +% \begin{macro}{\@law@addpargument} +% \begin{macro}{\@law@addptoken} +% \begin{macro}{\@law@pcut} +% The following nine macros are used to manipulate a list +% macro containing parallel citation details, and sets of +% token registers into which the list is extracted. +% \begin{macrocode} +\def\@law@fetchparas{% + \ifnum\the\c@law@paranormal>\the\c@law@paracounter\relax% + \@law@pcut\@law@tempplist\fromlist% + \expandafter\@law@extractparas\@law@tempplist% + \fi} +\def\@law@extractparas#1#2#3#4#5#6#7#8{% + \ifcat$\the\@ltok@useratbridge$% + \else% + \@ltok@userconetop={#1}% + \@ltok@userconetopplural={#2}% + \@ltok@userptop={#3}% + \@ltok@useratbridge={#4}% + \@ltok@useratbridgeplural={#5}% + \fi% + \global\@ltok@usercitefirst={#6}% + \global\@ltok@usercitepage={#7}% + \global\@ltok@usercitelast={#8}} +\def\@law@shiftparas{% + \ifnum\the\c@law@paranormal>\the\c@law@paracounter\relax% + \ifcat$\the\@ltok@useratbridge$% + \else% + \global\@ltok@conetop\@ltok@userconetop% + \global\@ltok@conetopplural\@ltok@userconetopplural% + \global\@ltok@ptop\@ltok@userptop% + \global\@ltok@ptoctwo\@ltok@userptoctwo% + \global\@ltok@atbridge\@ltok@useratbridge% + \global\@ltok@atbridgeplural\@ltok@useratbridgeplural% + \fi% + \global\@ltok@citefirst\@ltok@usercitefirst% + \global\@ltok@citepage\@ltok@usercitepage% + \global\@ltok@citelast\@ltok@usercitelast% + \fi} +\def\@law@addpargument#1\tolist{% + \addtocounter{law@paranormal}{1}% + \@law@rightappendpargument#1\to\@law@tempplistmacro} +\long\def\@law@rightappendpargument#1\to#2{\@ltok@a={\\{#1}}% + \@ltok@b=\expandafter{#2}% + \xdef#2{\the\@ltok@b\the\@ltok@a}} +% \end{macrocode} +% +% \begin{macrocode} +\def\@law@addptoken#1\tolist{\@law@leftappendptoken#1\to\@law@tempplistmacro} +\long\def\@law@leftappendptoken#1\to#2{% + \xdef\@law@temp{\noexpand\\\noexpand{\the#1\noexpand}}% + \@ltok@a=\expandafter{\@law@temp}% + \@ltok@b=\expandafter{#2}% + \xdef#2{\the\@ltok@a\the\@ltok@b}} +% \end{macrocode} +% +% \begin{macrocode} +\def\@law@pcut#1\fromlist{\@law@plop\@law@tempplistmacro\to#1} +\def\@law@plop#1\to#2{\expandafter\@law@plopoff#1\@law@plopoff#1#2}% +\long\def\@law@plopoff\\#1#2\@law@plopoff#3#4{\gdef#4{#1}\gdef#3{#2}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% This macro turns off the gobbling feature (it may be +% turned on during execution, if {\em Id.} is used), +% erases any pinpoint reference information that is +% hanging around, and if we are in a footnote, it +% increments the counter that was set to zero at the +% start of the footnote. It then +% unpacks all of the info for the cite +% whose nickname is given in \verb+#1+, and puts it into token registers for +% further processing. After it unpacks the list macro +% \verb+\@ldata@+\meta{nickname}, it unpacks the formatting +% details appropriate +% to the style in which it was declared. +% After the list is unpacked, +% {\em if\/} there is no record of a footnote or page number, +% then this is the first printing of the cite. The note/page +% and footnote/page number details need to be stored, and +% then everything has to be {\em repacked\/} +% for future reference under the appropriate list macro name. +% The list macro strategy allows on-the-fly editing of +% macros which adds greatly to the flexibility of +% the style.\\ +% Note the "parabeta" guard below. When we turn on support for +% parallel citations, we will need to do the restash work later, +% after checking for any attached items. +% \begin{macrocode} +\def\@law@unstasheverything#1{% +\gdef\@law@gobble{}% +\if@law@infoot% + \addtocounter{citesinfoot}{1}% +\fi% +\expandafter\let\expandafter\@law@templistmacro\csname @ldata@#1\endcsname% +\global\c@law@footnote\c@footnote% +\@law@cut\@ltok@plistmacro\fromcitelist% +\xdef\@law@tempplistmacro{\the\@ltok@plistmacro}% +\@law@cut\@ltok@a\fromcitelist% +\expandafter\c@law@paranormal\the\@ltok@a% +\@law@cut\@ltok@nickname\fromcitelist% +\@law@cut\@ltok@author\fromcitelist% +\@law@cut\@ltok@name\fromcitelist% +\@law@cut\@ltok@citefirst\fromcitelist% +\@law@cut\@ltok@citepage\fromcitelist% +\@law@cut\@ltok@citelast\fromcitelist% +\@law@cut\@ltok@citetype\fromcitelist% +\@law@cut\@ltok@whereitsat\fromcitelist% +\@law@cut\@ltok@pageorfootno\fromcitelist% +\@law@cut\@ltok@hereinafter\fromcitelist% +\@law@cut\@ltok@bigsourcecite\fromcitelist%(not yet implemented) +\@law@cut\@ltok@bigsourcepage\fromcitelist%(not yet implemented) +\@law@cut\@ltok@stylename\fromcitelist% +\csname \the\@ltok@stylename bridges\endcsname% +\csname \the\@ltok@stylename faces\endcsname% +% \end{macrocode} +% The following lines check one of the special bridge fields +% for content. If it is empty, we leave the bridges alone. +% Otherwise, we replace the default bridges with those selected +% by the user for this citation. +% \begin{macrocode} +\@law@cut\@ltok@a\fromcitelist% + \ifcat$\the\@ltok@a$% + \else% + \@ltok@atbridgeplural\@ltok@a% + \@law@cut\@ltok@atbridge\fromcitelist% + \@law@cut\@ltok@ptoctwo\fromcitelist% + \@law@cut\@ltok@ptop\fromcitelist% + \@law@cut\@ltok@conetopplural\fromcitelist% + \@law@cut\@ltok@conetop\fromcitelist% + \@law@specialbridgestrue% + \fi% +\ifcat$\the\@ltok@whereitsat$% + \if@law@requiresubjects% + \@ifundefined{@law@\@law@citesubject @citelist}% + {\expandafter\gdef\csname @law@\@law@citesubject @citelist\endcsname{}}% + {\relax}% + \fi% + \@law@maybeaddcitesubject + \global\@law@firstuseofcitetrue% +% \end{macrocode} +% \begin{macrocode} + \if@law@infoot% + \global\@ltok@whereitsat\@ltok@infoot% + \global\@ltok@pageorfootno=\expandafter{\the\c@law@footnote}% + \else% + \global\@ltok@whereitsat\@ltok@onpage% + \global\@ltok@pageorfootno=\expandafter{\the\c@page}% + \fi% +% \end{macrocode} +% \begin{macrocode} + \if@law@specialbridges% + \@law@addtoken\@ltok@conetop\tocitelist% + \@law@addtoken\@ltok@conetopplural\tocitelist% + \@law@addtoken\@ltok@ptop\tocitelist% + \@law@addtoken\@ltok@ptoctwo\tocitelist% + \@law@addtoken\@ltok@atbridge\tocitelist% + \@law@addtoken\@ltok@atbridgeplural\tocitelist% + \else% + \@law@addargument{}\tocitelist% + \@law@addargument{}\tocitelist% + \@law@addargument{}\tocitelist% + \@law@addargument{}\tocitelist% + \@law@addargument{}\tocitelist% + \@law@addargument{}\tocitelist% + \fi% +\@law@addtoken\@ltok@stylename\tocitelist% style name +\@law@addtoken\@ltok@bigsourcepage\tocitelist%(not yet implemented) +\@law@addtoken\@ltok@bigsourcecite\tocitelist%(not yet implemented) +\@law@addtoken\@ltok@hereinafter\tocitelist% (not yet implemented) +\@law@addtoken\@ltok@pageorfootno\tocitelist% (1)(b) stash the footnote bridge +\@law@addtoken\@ltok@whereitsat\tocitelist% (2)(b) footnote number +\@law@addtoken\@ltok@citetype\tocitelist% cite type +\@law@addtoken\@ltok@citelast\tocitelist% cite last part +\@law@addtoken\@ltok@citepage\tocitelist% cite page +\@law@addtoken\@ltok@citefirst\tocitelist% cite first part +\@law@addtoken\@ltok@name\tocitelist% name of work +\@law@addtoken\@ltok@author\tocitelist% author +\@law@addtoken\@ltok@nickname\tocitelist% nickname +\@law@addtoken\c@law@paranormal\tocitelist% parallels counter +\@law@addtoken\@ltok@plistmacro\tocitelist% parallels +\global\expandafter\let\csname @ldata@#1\endcsname\@law@templistmacro% +\fi% +} +% \end{macrocode} +% \subsubsection{Calling citation nicknames} +% The nickname macro defined by this routine +% (\verb+\@lnick@+\meta{nickname}), is immensely +% more compact than in the +% first release. \verb+\@law@argscheck+ eventually +% leads to \verb+\@law@setup+ after a series of +% checks for optional arguments. For the longest time I used +% a "\the" statement for the contents of "\@law@argscheck"; "\noexpand" works +% just as well and is much simpler to arrange. +% \begin{macrocode} +\def\@law@makecitenick#1{% + \expandafter\xdef\csname @lnick@#1\endcsname{% + \noexpand\@law@unstasheverything\noexpand{#1\noexpand}% + \noexpand\@law@setup}} +% \end{macrocode} +% \begin{macro}{\@law@newcitefirst} +% The following code will be used to kick off the existing "\@newcite" +% routine when hereinafter-style references come to be supported. +% \begin{macrocode} +%<*hereinafters> +\def\@law@newcitefirst{\@ifnextchar[]{\catcode`\[=?? +\catcode`\]=?? +\expandafter\@law@newcitesecond\@law@grabhereinafter} +{\@law@newcite}} +\def\@law@grabhereinafter#1{\@ltok@hereinafter={#1} +%</hereinafters> +% \end{macrocode} +% \end{macro} +% \subsubsection{Table writes and preliminary formatting} +% Once the printing information has been stashed, the +% \verb+\@lnick@+\meta{nickname} macro can be used +% to extract and print it. After extracting the +% information and storing it in token registers, +% this looks forward to gather any pinpointing argument +% that has been appended to the macro in the text. +% Once all the the necessary information has been +% collected, the \verb+\@law@setup+ macro tidies up +% the formatting of the cite and writes it to the +% export file, if the creation of tables for that +% type of citation has been toggled on. It then +% invokes the print routine. +% +% This macro assumes that all citation information stored +% for the cite has already been retrieved to appropriate token +% registers. The redefinition of the backslash character +% here allows it to be used to select the alternate +% typeface within a citation argument. The alternate +% typeface can be changed for all documents by editing +% the relevant {\tt .cst} file. Grouping braces enclosing +% all operations within \verb+\@law@setup+ mean than +% weird stuff turned on the sole purpose of exporting to +% tables and printing the citation will turn itself off +% when the print routine is finished. +% A routine (\verb+\@law@justabovecheck+) is run to +% figure out what the citation context is---how +% a cross-reference should be formatted---and +% once it's found out what it needs to know about +% the last citation, information on the current citation +% is tucked away for reference by this the context-checking +% routine next time around. +% A series of checks +% is performed so that superfluous bridges for which there +% is no corresponding argument can be erased. +% Then a file +% write is performed to the appropriate export file, if +% creation of that table has been toggled on. And finally +% the print routine is called. The \verb+\@law@gobble+ +% that follows the end of the group is used to eat +% a superfluous period if necessary. It is brought to +% life, if appropriate, by the print routine. +% Note the special catcode of the "|" character during +% this definition. +% \begin{macrocode} +{\catcode`\|=13% +\long\gdef\@law@setup{% +% \end{macrocode} +% The following operations restash the citation details if +% necessary; by this point we will have grabbed any parallel +% citation details that we needed. +% The backslash character is redefined as a self-resetting +% font-switching macro. +% \begin{macrocode} +{\def\@law@firstslash{\begingroup\def\\{\@law@secondslash}% + \the\ltokspecialface}% + \def\@law@secondslash{\endgroup\def\\{\@law@firstslash}}% + \def\\{\@law@firstslash}% +% \end{macrocode} +% This carries out the necessary checks on the context of the +% current citation. +% \begin{macrocode} +\@law@justabovecheck% +% \end{macrocode} +% Now that the \verb+\@law@justabovecheck+ macro has been run, +% it is time to set up for the next comparison. +% Take note that this source was cited, and of any specific page +% reference it contains, IF we are in a footnote +% \begin{macrocode} +\if@law@infoot% + \xdef\@law@currentcite{\the\@ltok@author\the\@ltok@name\the\@ltok@citefirst% + \the\@ltok@citepage\the\@ltok@citelast}% + \xdef\@law@lastpage{\the\@ltok@argtwo}% +\fi% + \begingroup% + \@law@tidybridges% + \ifx\@law@citesubject\empty% + \relax% + \else% + \if@law@bibentry% + \else% + \ifnum\the\c@law@paranormal=0\relax% + \csname write@one@\@law@citesubject @entry\endcsname% + \fi% + \fi% + \fi% + \endgroup% +\@law@print}}} +\def\@law@conetopsetup{% + \gdef\@law@temp{}% + \ifx\@law@argtwolist\@law@temp% + \else% + \@law@pincut\@ltok@argtwo\frompinlist% + \expandafter\@law@multicheck\the\@ltok@argtwo% + \@law@multiflag\query\end% + \fi} +\def\@law@tidybridges{% +% \end{macrocode} +% A number of further tidying-up operations are appropriate +% regardless of the form in which the citation will +% be printed. If certain elements are missing, their +% related bridges must be erased if the citation is not +% going to look awful. This is also where the author or title +% are suppressed in response to flags given to the "\source" command. +% \begin{macrocode} + \if@law@printauthor\else\global\@ltok@author{}\fi% + \if@law@printtitle\else\global\@ltok@name{}\fi% + \ifcat$\the\@ltok@author$% + \global\@ltok@atot{}% + \fi% + \ifcat$\the\@ltok@name$% + \global\@ltok@ttocone{}% + \fi% + \ifcat$\the\@ltok@citefirst$% + \global\@ltok@ttocone{}% + \fi% + \ifcat$\the\@ltok@citelast$% + \global\@ltok@ptoctwo{}% + \else% + \xdef\@law@temp{\the\@ltok@citelast}% + \gdef\@law@temptwo{()}% + \ifx\@law@temp\@law@temptwo% + \global\@ltok@citelast{}% + \global\@ltok@ptoctwo{}% + \fi% + \fi% + \ifcat$\the\@ltok@citepage$% + \global\@ltok@ptop{}% + \fi% + \ifcat$\the\@ltok@argtwo$% + \global\@ltok@ptop{}% + \ifcat$\the\@ltok@citepage$% + \global\@ltok@conetop{}% + \fi% + \fi% +% \end{macrocode} +% Now we run a series of checks to determine the class +% of citation we are dealing with, and if tables +% for that type of citation have been turned on, an export is performed; +% if a cite for export is to a statute, then the special routines +% for handling page references is brought into play. +% \begin{macrocode} + \ifcat$\the\@ltok@argtwo$% + \global\@ltok@ptop{}% + \global\@ltok@atbridge{}% + \ifcat$\the\@ltok@citepage$% + \global\@ltok@conetop{}% + \fi% +% \end{macrocode} +% And here the \verb+\@law@setup+ routine comes to an end; +% punt to the print routine, possibly followed by a gobble, +% if {\em Id.} is printed. +% \begin{macrocode} + \fi} +% \end{macrocode} +% \subsection{Output routines} +% Once the citation has been unpacked and the +% basic tidying up appropriate to all appearances +% of the citation has been carried out, it is time +% to ship its contents to the various output routines. +% \subsubsection{The print macro} +% This section contains the code for the print routine and +% its supporting macros. We begin with the supporting stuff. +% \begin{macro}{\@law@justabovecheck} +% Check if immediately preceding cite is the same as this one. +% This macro is called immediately before the citation is +% printed. There are lots of conditions, but the structure +% is just a straightforward nesting of \verb+\if+ statements, +% each of which sets a toggle or toggles appropriately. +% In the end, this macro tells us: +% \begin{itemize} +% \item Whether the immediately-preceding citation is to +% the same work; and if it is +% \item Whether the preceding cite had no pinpoint +% page reference; and if it had one +% \item Whether the pages referred to by the two cites +% are exactly identical. +% \end{itemize} +% Try {\em that\/} with +% WordPerfect! +% If {\sc Camel}\ isn't getting the decisions right, let me know. +% \begin{macrocode} +\def\@law@justabovecheck{% + \xdef\@law@temptwo{\the\@ltok@author\the\@ltok@name% + \the\@ltok@citefirst\the\@ltok@citepage% + \the\@ltok@citelast}% + \ifx\@law@lastcite\@law@temptwo% + \ifnum\the\c@citesinfoot=1\relax% + \@law@justabovecheckdetails% + \else% + \ifx\@law@currentcite\@law@temptwo% + \@law@justabovecheckdetails% + \else% + \@justabovefalse% + \fi% + \fi% + \else% + \ifnum\the\c@citesinfoot>1\relax% + \ifx\@law@currentcite\@law@temptwo% + \@law@justabovecheckdetails% + \else% + \@justabovefalse% + \fi% + \fi% + \fi} +\def\@law@justabovecheckdetails{% + \ifx\@law@lastpage\empty% + \@justabovetrue% + \@l@quiteexactfalse% + \else% + \ifcat$\the\@ltok@argtwo$% + \@justabovefalse% + \else% + \@justabovetrue% + \xdef\@law@temp{\the\@ltok@argtwo}% + \ifx\@law@temp\@law@lastpage% + \@l@quiteexacttrue% + \else% + \@l@quiteexactfalse% + \fi% + \fi% + \fi} +%</lexitex> +% \end{macrocode} +% \end{macro} +% \subsubsection{Proof sheet master document} +% The following short document will generate proof sheets +% for all of the primary styles on the system. With the standard +% distribution, this produces twelve pages of output. +% \subsection{Proof sheets} +% The following macros produce a proof sheet that shows all +% of the permutations of a citation that I can think of. +% This is useful for those who have to design new citation styles. +% This is a pretty straightforward exercise, except for the +% task of feeding a cite declaration exactly the right +% arguments; this requires re-definition of "\newcitestyle" +% and the re-parsing of the "lexicite.tex" file. +% +% If you find permutations that are not represented here, +% let me know and I'll add them. +% +% \subsection{Macros for data export} +% +% \begin{macro}{\citationsubject} +% This macro toggles on the requirement that every +% citation be assigned to a subject category, and +% adds a subject to the subject list, with all of the +% information needed to create a classified bibliography. +% This information consists of: +% \begin{enumerate} +% \item The nickname for the category, used as the argument +% to the "s=" option in each citation; +% \item The title for use in the bibliography. +% \end{enumerate} +% An optional argument of {\tt t} creates a table, and must be accompanied by +% {\tt o=} and {\tt i=} options giving the extensions of +% the input and output files, and by {\tt h=} and optionally +% may be accompanied by an option of {\tt p} to include +% poinpoints in the table. +% +% NOTE: Definition of "\@law@finish" below is just +% being chucked into as a patch. This code should all +% be gone over an reorganized sometime when there +% is time for it. +% \begin{macrocode} +%<*lexitex> +\def\@law@finish#1\@law@nomatch{} +\def\@law@slone#1#2{\def\@law@listitem{#1}% + \ifx\@law@optionitem\@law@listitem #2% + \let\\=\@law@finish\fi} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@law@end} +% The internal ending character is also common to all parsers. +% \begin{macrocode} +\def\@law@end{,} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@law@slnomatch} +% If when we execute the list of options we do not find a match, +% we want an error message to go to the terminal. This is the +% macro that gives the appropriate error message. +% \begin{macrocode} +\def\@law@slnomatch{\@camel@error{Citation Warning: Invalid + option `\@law@optionitem' + given to \string\citationsubject.^^J% + Valid options are:^^J + 2 (force a second-level header for a subject)^^J + p (to include pinpoints in an exported table)^^J + i=<extension> (use the three-letter extension in^^J + exporting a table)^^J + o=<volume> (use the three-letter extension in^^J + importing a table)^^J% +To avoid errors in formatting, use commas in the option string^^J% +only where they are logically necessary to the sense of the^^J% +string.}\@ehc} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\longestlabelfor} +% This macro set returns a box the exact width of the longest +% string given as a label to citations of a specified +% subject class. +% \begin{macrocode} +\newlength{\templen} +\newlength{\lawlengthone} +\newlength{\lawlengthtwo} +\def\@law@getlabel#1{\settowidth\lawlengthone{\csname @law@#1@lab\endcsname}% + \ifnum\lawlengthone>\lawlengthtwo% + \settowidth\lawlengthtwo{\csname @law@#1@lab\endcsname}% + \fi} +\def\longestlabelfor#1{% + \setlength\lawlengthone{0pt}% + \setlength\lawlengthtwo{0pt}% + \let\\=\@law@getlabel% + \csname @law@#1@citelist\endcsname} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@law@subjectoptionlist} +% The list of options is simple and expansible. The syntax of +% the last two +% lines is required if everything is to work as expected. +% The items in the help message should probably be +% drawn from here, to provide a hook for expansion +% if other styles want to tinker with the options to +% "\source". +% \begin{macrocode} +\def\@law@subjectoptionlist{% + \\{1}{\gdef\@law@level{1}}% + \\{2}{\gdef\@law@level{2}}% + \\{p}{\global\@law@usepinpointstrue}% + \\{P}{\gdef\@law@bibformat{\global\@law@usepagestrue}}% + \\{o}{\gdef\@law@parsemacro##1{\gdef\@law@outputext{##1}}% + \let\@law@parse\@law@slparsecomma}% + \\{i}{\gdef\@law@parsemacro##1{% + \ifcat$##1$\else% + \global\@law@maketabletrue% + \expandafter\gdef\csname\@law@temp inputext\endcsname{##1}% + \fi}% + \let\@law@parse\@law@slparsecomma}% + \\{=}{\let\@law@parse\@law@slparsebumequal}% + \\{,}{}% + \\{\end}{\let\@law@nomatch\relax\let\@law@parse\relax}% + \@law@nomatch} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\@law@parselastcheck} +% \begin{macro}{\@law@parsecomma} +% \begin{macro}{\@law@parselastcheck} +% \begin{macro}{\@law@parseplain} +% We switch between three possible forms for the "\@law@parse" macro, +% and we also need to have a special way of ending when the +% delimiter is found in the list. +% \begin{macrocode} +\def\@law@slparsecomma=#1,{% + \@law@parsemacro{#1}\let\@law@parse\@law@slparseplain% + \@@parse} +% \end{macrocode} +% \begin{macrocode} +\def\@law@slparsebumequal#1,{\let\@law@parse\@law@slparseplain\@@parse} +% \end{macrocode} +% \begin{macrocode} +\def\@law@slparseplain#1{% + \let\@law@nomatch=\@law@slnomatch% + \def\@law@optionitem{#1}\let\\=\@law@slone\@law@subjectoptionlist\@@parse} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macrocode} +\def\citationsubject{% + \@ifnextchar[{\@citationsubject}{\@citationsubject[1]}} +{\catcode`\|=13% +\gdef\@citationsubject[#1]#2#3{% + \global\let\@law@level\relax% + \global\@law@usepinpointsfalse% + \global\@law@maketablefalse% + \global\@law@requiresubjectstrue% + \gdef\@law@bibformat{}% + \def\@law@temp{#2}% + {\let\@law@parse=\@law@slparseplain\@law@parse #1,\end}% + \expandafter\gdef\csname write@one@#2@entry\endcsname{}% + \if@law@maketable% + \expandafter\def\csname the#2table\endcsname{% + \@restonecoltrue% + \if@twocolumn\@restonecolfalse\fi% + \section*{#3}% + \@mkboth% + {\uppercase{#3}}% + {\uppercase{#3}}% + \thispagestyle{plain}% + \parindent\z@\parskip\z@ plus.3\p@\relax% + \let\item\citationtableitem} + \expandafter\def\csname endthe#2table\endcsname{% + \if@restonecol\onecolumn% + \else\clearpage% + \fi}% + \def\itemspace{% + \par\vskip 10\p@ plus5\p@ minus3\p@\relax} + \newindex{#2}{\@law@outputext}{\csname#2inputext\endcsname}{#3}% + \if@law@usepinpoints% + \expandafter\gdef\csname write@one@#2@entry\endcsname{% + {\ifcat$\the\@ltok@argtwo$\@ltok@argtwo{\@law@delim}\fi% + \@ltok@pagesstring\@ltok@argtwo% + \def\@law@comma{\@law@exportapage}% + \def\@law@ampersand{\@law@exportapage}% + \def\@law@dash{\@law@exportapage}% + \def|{\@law@exportapage}% + \def\@law@exportapage####1\@law@delim{% + \@ltok@argtwo{####1}% + \def\@law@temp{\index[#2]}% + \edef\@law@temptwo{% + \noexpand{\string\bibitem % + \string\source[b,Z=\the\@ltok@nickname]% + \noexpand{\the\@ltok@nickname\noexpand}% + \ifcat$\the\@ltok@argtwo$\else>####1\fi\string|maybe\noexpand}}% + \expandafter\@law@temp\@law@temptwo} + \expandafter\@law@exportapage\the\@ltok@pagesstring}}% + \else% + \expandafter\gdef\csname write@one@#2@entry\endcsname{% + \def\@law@temp{\index[#2]}% + \edef\@law@temptwo{% + \noexpand{\string\bibitem % + \string\source[b,Z=\csname @law@\the\@ltok@nickname @lab\endcsname]% + \string{\the\@ltok@nickname\string}\string|maybe\noexpand}}% + \expandafter\@law@temp\@law@temptwo}% + \fi% + \fi% + \@ltok@a=\expandafter{\@law@subjectlist}% + \@ltok@c=\expandafter{\@law@bibformat}% + \if@law@usepinpoints% + \edef\@law@temp{\noexpand\\\noexpand{#2\noexpand}% + \noexpand{p\noexpand}% + \noexpand{#3\noexpand} + \noexpand{\the\@ltok@c\noexpand}}% + \@ltok@b=\expandafter{\@law@temp}% + \else% + \edef\@law@temp{\noexpand\\\noexpand{#2\noexpand} + \noexpand{\@law@level\noexpand} + \noexpand{#3\noexpand} + \noexpand{\the\@ltok@c\noexpand}}% + \@ltok@b=\expandafter{\@law@temp}% + \fi% + \edef\@law@subjectlist{\the\@ltok@a\the\@ltok@b}}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\printbibliography} +% To print bibliographies, we use a single command with two +% modes built into it. +% \changes{1.0n}{95/07/13}{Hacked in a toggle to turn off labels in +% printbibliography.} +% \changes{1.0q}{96/03/08}{Eliminated the stuff for showing holdings, +% fact patterns, and so forth.} +% \changes{1.0q}{96/03/08}{Eliminated \texttt{\bs cite} and \texttt{\bs +% lexicite} aliases of the \texttt{\bs source} command.} +% \changes{1.0r}{96/03/09}{Brace-enclosed the list-macro executions +% in printbibliography, to prevent clashes with kernel definition +% of double-backslash.} +% \changes{1.0t}{97/02/17}{Added missing termination +% macro @law@finish for use by parsing routines. Reported +% by Kevin Haddock, for which many thanks.} +% \begin{macrocode} +\def\printbibliography{\@ifnextchar[{\@printbibliography}{\@printbibliography[]}} +\def\@printbibliography[#1]#2{% + \global\@law@forcefootnotesfalse% + \gdef\@law@temp{#1}\gdef\@law@temptwo{labels=false}% + \let\camelrefname\refname% + \expandafter\ifx\csname#2inputext\endcsname\relax% + \global\@law@tablefalse% + \else% + \global\@law@tabletrue% + \fi% + \begingroup% + \def\refname{\@law@getsubjectheader{#2}}% + \@law@usepagesfalse% + \@law@getbibformat{#2} + \let\maybe\@gobble% + \let\camelfill\relax% + \let\camelarrow\relax% + \ifx\@law@temp\@law@temptwo% + \advance\@totalleftmargin -\labelsep% + \advance\linewidth \labelsep% + \def\@biblabel##1{}% + \fi% + \if@law@table% + \if@law@usepages% + \let\maybe\relax% + \let\camelfill\dotfill% + \let\camelarrow\rightarrow% + \fi% + \else% + \longestlabelfor{#2}% + \ifdim\lawlengthtwo=0pt% + \advance\@totalleftmargin -\labelsep% + \advance\linewidth \labelsep% + \def\@biblabel##1{}% + \fi% + \fi% + \if@law@requiresubjects% + \@law@dobibliography{#2}% + \else% + \gdef\@law@temp{#2}\gdef\@law@temptwo{all}% + \ifx\@law@temp\@law@temptwo% + \@law@dobibliography{#2}% + \else% + \message{^^J===================================================^^J% + Camel bibliography ^^J + Document type: without-subjects ^^J + Bibliography type: subject-specific (#2) ^^J + Action: impossible task, ignoring ...^^J% + ===================================================^^J} + \fi% + \fi% + \endgroup} +% \end{macrocode} +% \end{macro} +% \begin{macrocode} +\def\@law@dobibliography#1{% + \begin{thebibliography}{\if@law@biblabels\longestlabelfor{#1}\rule{\lawlengthtwo}{5pt}\fi} + \if@law@table% + \if@law@usepages% + \addtolength{\parsep}{-.5\parsep}% + \addtolength{\itemsep}{-.5\itemsep}% + \fi% + \fi% + \if@law@requiresubjects% + \@law@requiresubjectsfalse% + \if@law@table + \message{^^J===================================================^^J% + Camel bibliography ^^J + Document type: subject-classified cites ^^J + Bibliography type: subject-specific external (#1) ^^J + Action: generating^^J% + ===================================================^^J} + \@input{\jobname.\csname#1inputext\endcsname} + \else% + \gdef\@law@temp{#1}\gdef\@law@temptwo{all}% + \ifx\@law@temp\@law@temptwo% + \message{^^J===================================================^^J% + Camel bibliography ^^J + Document type: subject-classified cites ^^J + Bibliography type: all citations ^^J + Action: header only (not yet implemented)^^J% + ===================================================^^J} + \else% + \message{^^J===================================================^^J% + Camel bibliography ^^J + Document type: subject-classified cites ^^J + Bibliography type: subject-specific internal (#1) ^^J + Action: generating^^J% + ===================================================^^J} + {\let\\\@law@bibslash% + \csname @law@#1@citelist\endcsname} + \fi% + \fi% + \else% + \message{^^J===================================================^^J% + Camel bibliography ^^J + Document type: without-subjects ^^J + Bibliography type: all citations ^^J + Action: generating^^J% + ===================================================^^J} + {\let\\\@law@bibslash% + \csname @law@#1@citelist\endcsname}% + \fi% + \end{thebibliography}} +\def\@law@bibslash#1{\bibitem [\csname @law@#1@lab\endcsname] \source[b]{#1}. } +%</lexitex> +% \end{macrocode} +% +% \subsubsection{Citation style definitions} +% No styles are included here. See the separate style +% files in the {\sc Camel} archive for the matching +% ".bst", ".cst" and ".cit" files that make up each {\sc Camel} +% style variation. These may be distributed as ".doc" +% files, and should be available on CTAN under +% "/macros/latex/contrib/supported/camel". +% \subsection{Index styles} +% This code, and the table writing code, is provisional; +% this should be made more general. Less of a hack than the +% original \LexiTeX{} code, though! +% \begin{macrocode} +%<*camelindex> +actual '#' +quote '!' +level '>' +preamble +"\n" +postamble +"\n" +item_0 "\n" +item_x1 "\n \\subitem " +item_x2 "\n \\subsubitem " +delim_n "\$\\rightarrow\$" +delim_0 "\~\\camelfill" +delim_1 "\$\\camelarrow\$" +% The next lines will produce some warnings when +% running Makeindex as they try to cover two different +% versions of the program: +lethead_prefix "{\\bf\\hfil " +lethead_suffix "\\hfil}\\nopagebreak\n" +lethead_flag 1 +heading_prefix "{\\bf\\hfil " +heading_suffix "\\hfil}\\nopagebreak\n" +headings_flag 0 +\ifx\on@line\undefined + \def\on@line{ on input line \the\inputlineno} + \errhelp{Support for input line numbers has been added + to latex.tex <dec91>.^^J^^J% + Please update to a newer LaTeX release.} + \errmessage{Obsolete LaTeX release (older than Dec.91)} +\fi +%</camelindex> +% \end{macrocode} +% \section{A \BibTeX{} Library} +% Considerable modification of an existing ".bst" file +% may be required to make it give output that can be +% digested by {\sc Camel}. +% You may find that it is actually easier to draft +% you entry type functions from scratch, using +% the following library of \BibTeX{} +% functions. See the file "law.dtx" for an example of +% entry types based on this library, and for an example +% of how to tie the library and your own functions +% together through a driver file entry. +% \newcounter{speccount} +% \def\addline{ & \arabic{speccount}.\addtocounter{speccount}{1} &\let\item\subsequentitem} +% \def\startingitem{\setcounter{speccount}{1}\addline} +% \def\subsequentitem{\\\addline} +% \long\def\spec#1#2#3{% +% \noindent\begin{tabular}{|>{\bf}rc% +% >{\PreserveBackslash\raggedright\small}p{3.5in}|}\hline +% Expected: +% \let\item\startingitem #1\\ +% &&\\ +% Left: +% \let\item\startingitem #2\\ +% &&\\ +% Toggles: +% \let\item\startingitem #3\\ +% \hline +% \end{tabular}} +% Each function defined using the {\tt FUNCTION} operator +% is accompanied by a brief description of what it is +% intended to do, followed by a box in the following form: +% \spec{\item What the function expects to find on the stack, +% numbered from the top (most recently pushed) to the bottom +% item.} +% {\item What the function will leave on the stack, numbered in +% the +% same fashion.} +% {\item {\bf toggle name:} What the effect of any toggles is on the +% behaviour of the function.} +% +% Happy reading. +% \subsection{Hello!} +% As ever, we start by telling the world who we are. +% \begin{macrocode} +%<*bstheader> +FUNCTION { hello } +{ +%<jse>" ============================================" +%<jse>" for your Camel style and extract again." +%<jse>" with standard BibTeX, modify the .ins file" +%<jse>" Warning: localized for jBibTeX. For use " +" ============================================" +" bibliography package, version 1.0k or later" +" Use with LaTeX2e and the Camel prototype " +" --------------------------------------------" +" documentation last updated: 5 December 1994 " +" code last updated: 22 March 1995 " +" version: 1.0i " +" Camel style package. " +" This is the `law' style for BibTeX and the " +" ============================================" +stack$ +} +%</bstheader> +% \end{macrocode} +% \subsection{Variable initializations} +% \DescribeEnv{ENTRY} +% This command takes three braced arguments, which in order are: +% \begin{enumerate} +% \item A list of field names; +% \item A list of integer variables; and +% \item A list of string variables. +% \end{enumerate} +% The field names created here include some not found in the +% standard \BibTeX\ styles. The use of both the standard and +% these new +% items is fully documented elsewhere, so no commentary is +% given here. Suffice to say that each item in the list creates +% a field that +% subsequent code can work on. +% \begin{macrocode} +%<*bstlibrary> +ENTRY +% \end{macrocode} +% +% \DescribeEnv{field names} +% \mbox{} +% \begin{macrocode} +{ address +annote +author +booktitle +chapter +edition +editor +howpublished +institution +journal +key +month +note +number +organization +pages +publisher +school +series +title +type +volume +year +date +jurisdiction +court +division +divno +casedate +translator +booktranslator +cites +units +} +% \end{macrocode} +% +% \DescribeEnv{entry integers} +% None are defined. Note that any integers or strings defined +% with the +% ENTRY command are created for {\em each\/} entry in the +% citation list. +% \begin{macrocode} +{} +% \end{macrocode} +% +% \DescribeEnv{entry strings} +% There are no general string variables, either. Such variables +% might be defined for use in building key labels for use in +% sorting, or in an end-of-document bibliography style. +% \begin{macrocode} +{ label extra.label sort.label } +% \end{macrocode} +% +% \DescribeEnv{STRINGS} +% A few string macros are needed to hold things +% temporarily removed from the stack. +% \BibTeX\ only allows ten such string variables; the named +% variables in this list will slowly be reduced in number +% through redesign of the functions that require them. +% Meanwhile, let's hope we don't find a sudden need for +% more \ldots +% \begin{macrocode} +STRINGS { s t u v scrubdate + volume.var year.var number.var journal.var pages.var } +% \end{macrocode} +% +% \DescribeEnv{INTEGERS} +% The following list of integers is probably also larger than +% it needs to be. Again, optimization of stack usage will +% lead to the elimination of some of these variables. +% \begin{macrocode} +INTEGERS { itemcount date.specials charcount a b c + nameptr namesleft numnames a.logical } +% \end{macrocode} +% +% \DescribeEnv{FUNCTIONS} +% These functions provide strings used in the parsing of +% Japanese legal citations. If the language of such citations +% is not English, these strings may need to be edited. +% \begin{macrocode} +FUNCTION {dc..} {"District Court"} +FUNCTION {sc..} {"Supreme Court"} +% \end{macrocode} +% +% \subsection{Function definitions} +% \subsubsection{Logic and measurement} +% +% \DescribeEnv{not} +% \DescribeEnv{and} +% \DescribeEnv{or} +% These have been copied verbatim from Oren Patashnik's 1988 +% release. +% His commentary on these functions reads: +% {\em These three functions pop one or two (integer) arguments +% from the stack +% and push a single one, either "0" or "1". +% The {\tt 'skip\$} in the `"and"' and `"or"' functions are used +% because +% the corresponding {\tt if\$} would be idempotent.} +% +% \spec{\item The result of a logical test +% \item The result of a second logical test} +% {\item A single logical test result} +% {\item none} +% +% \begin{macrocode} + FUNCTION {not} + { { #0 } + { #1 } + if$ + } + FUNCTION {and} + { 'skip$ + { pop$ #0 } + if$ + } + FUNCTION {or} + { { pop$ #1 } + 'skip$ + if$ + } +% \end{macrocode} +% +% \DescribeEnv{times.ten} +% One of the date calculation routines requires +% string-to-integer conversion. \BibTeX\ primitives can only +% convert in this direction for single characters. Accordingly, +% we need to be able to raise by a power of ten. +% +% \spec{\item A single integer.} +% {\item A single integer.} +% {\item none} +% +% \begin{macrocode} +FUNCTION {times.ten} + { duplicate$ duplicate$ duplicate$ duplicate$ duplicate$ + duplicate$ duplicate$ duplicate$ duplicate$ + + + + + + + + + + + } +% \end{macrocode} +% +% \DescribeEnv{character.length} +% \BibTeX\ provides a built-in command for measuring the length +% of a string in ``text units''. Sometimes it's nice to know +% the length of a string in {\em characters\/}; +% this function provides +% that facility. +% \changes{1997/01/09}{v1.0s}{Added extraction options for +% JBibTeX support.} +% +% \spec{\item A string.} +% {\item An integer giving the number of characters in the +% string.} +% {\item none} +% +% \begin{macrocode} +FUNCTION {character.length} + { 'u := + #0 'charcount := + { u empty$ not } + { u +%<jse> duplicate$ +%<eng> #2 +%<jse> is.kanji.str$ {#3} {#2} if$ + global.max$ substring$ 'u := + charcount #1 + 'charcount := + }while$ + charcount + } +% \end{macrocode} +% +% \DescribeEnv{first.in.second} +% This function checks for a substring at the beginning or at the +% end of a given string. This facility is needed, for example, +% to provide an automated means of toggling the formatting of +% the court division string for Japanese cases. +% In the defintion below, {\tt t} is the substring length, and +% {\tt u} is the string length. +% +% \spec{\item A string toggle. +% \item A string (the string in which to look). +% \item A string (the substring to look for).} +% {\item A single integer ({\tt 0} or {\tt 1}), indicating +% whether +% the substring was found at the specified location in the +% string for search.} +% {\item {\bf end:} The function looks at the end of the +% given string. +% \item{\bf start:} The function looks at the start of the +% given string.} +% +% \begin{macrocode} +FUNCTION {first.in.second} + { 's := + duplicate$ empty$ + { pop$ pop$ #0 #0 } + { swap$ duplicate$ character.length 'a := + swap$ duplicate$ character.length 'b := + b a < + { pop$ pop$ #0 #0 } + { s "end" = + { b a - #1 + global.max$ substring$ = + { b a - #1 + #1 } + { #0 #0 + }if$ + } + { s "start" = + { #1 a substring$ = + { #1 #1 } + { #0 + }if$ + } + { s "reverse" = + { b a - #1 + 'b := + { b #0 > } + { duplicate$ + b a substring$ + 's := + swap$ duplicate$ s = + { pop$ pop$ b #0 'b := #1 } + { b #1 = + { pop$ pop$ #0 #0 'b := #0 } + { swap$ b #1 - 'b := + }if$ + }if$ + }while$ + } + { b a - #1 + 'b := #1 'c := + { c b < } + { duplicate$ + c a substring$ + 's := + swap$ duplicate$ s = + { pop$ pop$ c b 'c := #1 } + { b c - #1 = + { pop$ pop$ #0 b 'c := #0 } + { swap$ c #1 + 'c := + }if$ + }if$ + }while$ + }if$ + }if$ + }if$ + }if$ + }if$ + } +% \end{macrocode} +% +% \DescribeEnv{get.character.type} +% This function returns one of three strings, `"letter"', +% `"numeral"' or `"other"` to indicate the type of the +% character it finds on the stack. This was written for +% use in the "gather.chars" function, but may find other +% uses as well. +% \spec{\item Either {\tt *} or a single character to be scanned +% for. +% \item A single character to be examined by the function.} +% {\item Either {\tt letter}, {\tt numeral} or {\tt other}, the +% significance of which depends upon the toggle used.} +% {\item {\tt *} causes the character to be identified as a +% numeral, and letter or something else. +% \item Any character other than {\tt *} causes that character to +% be identified as {\tt other}, and any other characters to be +% identified as {\tt letter}.} +% \begin{macrocode} +FUNCTION { get.character.type } + { duplicate$ "*" = + { pop$ duplicate$ empty$ + { pop$ "other" } + { chr.to.int$ duplicate$ + duplicate$ #47 > swap$ #58 < and + { pop$ "numeral" } + { duplicate$ #64 > swap$ duplicate$ #91 < swap$ + duplicate$ #96 > swap$ #123 < and 'a.logical := + and a.logical or + { "letter" } + { "other" + }if$ + }if$ + }if$ + } + { = + { "other" } + { "letter" + }if$ + }if$ + } +% \end{macrocode} +% \DescribeEnv{type.last.char} +% This was written in order to handle situations where +% trailing punctuation varies depending upon whether the text +% being punctuated ends in a numeral or not. The power of the +% library is (finally, in July of 1995) starting to show through. +% \spec{\item A single string.} +% {\item A string, either {\tt numeral}, {\tt letter} or {\tt other}.} +% {\item None.} +% \begin{macrocode} +FUNCTION { type.last.char } + { duplicate$ character.length + #1 substring$ + "*" get.character.type + } +% \end{macrocode} +% \changes{1995/07/08}{1.0m}{New function {\tt type.last.char} +% added, to cope with titles ending in a numeral, hence +% exceptionally requiring a comma in the Blue Book style.} +% +% \subsubsection{Housekeeping} +% These functions are used to issue warning messages and avoid +% errors during processing. +% +% \DescribeEnv{empty.to.null} +% This is simply the "field.or.null" function from the standard +% styles, renamed so that I could more easily remember what it +% does. Invoked only by the output routines, it assures that +% empty field markers are replaced with the null string, to +% prevent smash-ups. +% +% \spec{\item The contents of a field, which may be an empty +% field marker.} +% {\item A string, possibly the null string.} +% {\item none} +% +% \begin{macrocode} + FUNCTION {empty.to.null} + { duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ + } +% \end{macrocode} +% +% \DescribeEnv{check} +% This check function isolates the production of warning +% messages from the output routines, to enhance transparency. +% Note that this will not convert an empty field marker to +% the null string; that is left to the output routines. +% +% \spec{\item A string for +% use in an error message. +% \item The contents of a field.} +% {\item The field contents.} +% {\item none} +% +% \begin{macrocode} +FUNCTION { check } +{ 't := + duplicate$ empty$ + { "empty " t * " in " * cite$ * warning$} + 'skip$ + if$ +} +% \end{macrocode} +% +% \DescribeEnv{either.or} +% This checks whether one of a two-item pair is empty. +% If at least one is empty, the other is returned to the +% stack. If both are non-empty, a warning is issued, and +% one item is arbitrarily selected. +% +% \spec{\item A string. +% \item A string.} +% {\item A single string.} +% {\item none} +% +% \begin{macrocode} +FUNCTION {either.or} + { duplicate$ empty$ + { pop$ duplicate$ empty$ + { pop$ "" } + 'skip$ + if$ + } + { swap$ duplicate$ empty$ + { pop$ } + { "both items in an either.or pair are non-empty in " cite$ * + warning$ + " I'm using only ONE of these items (the second passed by the function)." + warning$ + pop$ + }if$ + }if$ + } +% \end{macrocode} +% \DescribeEnv{either.or.nowarning} +% This does the same thing as "either.or", but does not issue a +% warning if both items exist. As with that function, the second +% item pushed is preferred. +% +% \spec{\item A string. +% \item A string.} +% {\item A single string.} +% {\item none} +% +% \begin{macrocode} +FUNCTION {either.or.nowarning} + { duplicate$ empty$ + { pop$ duplicate$ empty$ + { empty.to.null } + 'skip$ + if$ + } + { swap$ pop$ } + if$ + } +% \end{macrocode} +% +% \subsubsection{Output} +% In the interest of transparency, I have tried to make the +% output functions as simple to use and as flexible in their +% operation as possible. Every output routine expects to find +% three items on the stack, and the name of each routine +% describes how it will react to what it finds there. +% To keep things tidy, the empty field marker +% is replaced with the null string only by the output +% routines.\\ +% The names +% are sometimes coincidentally comical, but I hope informative +% as well. +% +% \DescribeEnv{must.must.must} +% The simplest +% output routine is the "must.must.must" routine; it +% simply catenates the three strings, replacing any +% empty field markers it finds with the null string. +% +% \spec{\item A string. +% \item A string. +% \item A string.} +% {\item none} +% {\item none} +% +% \begin{macrocode} +FUNCTION {must.must.must} + { empty.to.null 't := + empty.to.null swap$ empty.to.null swap$ t + * * + write$ + } +% \end{macrocode} +% +% \DescribeEnv{might.ifone.must} +% This output routine is heavily used for conditional +% output. If the deepmost of the three stack items is an empty +% field marker, the only the topmost item is written to the +% output file. If this is not the case, then the three items are +% written in order. +% +% \spec{\item A string. +% \item A string. +% \item A string.} +% {\item {\em none}} +% {\item none} +% +% \begin{macrocode} +FUNCTION {might.ifone.must} + { empty.to.null 't := + swap$ duplicate$ empty$ + { pop$ pop$ t } + { swap$ empty.to.null t * * } + if$ + write$ + } +% \end{macrocode} +% +% \DescribeEnv{iftwo.might.iftwo} +% This function is typically used to output a formatted item +% in enclosing braces, where the entire item and its braces +% should be suppressed if the item is empty. +% +% \spec{\item A string. +% \item A string. +% \item A string.} +% {\item none} +% {\item none} +% +% \begin{macrocode} +FUNCTION {iftwo.might.iftwo} + { 't := + duplicate$ empty$ + { pop$ pop$ } + { empty.to.null swap$ empty.to.null swap$ + t empty.to.null + * * write$ } + if$ + } +% \end{macrocode} +% +% \DescribeEnv{must.ifthree.might} +% This function is used to output a definitely-existing item +% followed by something that might not exist with intervening +% punctuation that ought to disappear if it's not needed. +% +% \spec{\item A string. +% \item A string. +% \item A string.} +% {\item none} +% {\item none} +% +% \begin{macrocode} +FUNCTION {must.ifthree.might} + { duplicate$ empty$ + { pop$ pop$ empty.to.null } + { 't := + swap$ empty.to.null + swap$ empty.to.null + t * * + }if$ + write$ + } +% \end{macrocode} +% +% \subsubsection{Parsing and conversion} +% +% \DescribeEnv{field.tag.no.combine} +% The "no" here stands for ``number''. +% This function is typically used to simplify the task of +% building a numbered label for something (e.g.\ a technical +% report). It provides facilities for handling blank +% entries, so that these error-handling routines do not +% need to be drafted from scratch for every such +% situation. +% +% \spec{\item A string toggle. +% \item An identifier (i.e.\ a report number). +% \item A text prefix for the identifier. +% \item A string label (i.e.\ ``Technical Report'' or somesuch).} +% {\item A single string.} +% {\item {\bf endlabel:} Combines the text items in the same order +% in +% which they are found. +% \item {frontlabel:} Places the label in front, followed by the +% identifier, followed by the first item pushed.} +% +% \begin{macrocode} +FUNCTION {field.tag.no.combine} + { "endlabel" = + { duplicate$ empty$ + { pop$ pop$ empty.to.null } + { empty.to.null 's := empty.to.null + swap$ empty.to.null swap$ s * * + }if$ + } + { duplicate$ empty$ + { pop$ pop$ empty.to.null } + { empty.to.null 's := empty.to.null + swap$ empty.to.null s swap$ * * + }if$ + }if$ + } +% \end{macrocode} +% +% \DescribeEnv{change.letter.case} +% This is a simple front-end to the {\tt change.case\$} built-in +% function, used to change characters in a string from upper to +% lower case. It slightly enhances the built-in function by +% providing an option that leaves the string alone. +% +% \spec{\item A single character---either +% an {\tt n}, a {\tt t}, an {\tt l}, or a {\tt u}. +% \item A string for conversion.} +% {\item One string, converted according to the option toggle +% pushed +% after the string.} +% {\item {\bf n:} yields the string unchanged. +% \item {\bf t:} yields +% all lower case letters except for the first. +% \item {l:} yields all lower case letters. +% \item {u:} yields all +% upper case letters.} +% +% \begin{macrocode} +FUNCTION {change.letter.case} + { 't := + duplicate$ empty$ + 'skip$ + { t chr.to.int$ "n" chr.to.int$ = + 'skip$ + { t change.case$ } + if$ + } + if$ + } +% \end{macrocode} +% +% \DescribeEnv{n.dashify} +% The "n.dashify" function makes each single "-" in a string a +% double "--". +% if it's not already.\footnote{This comment by Oren Patashnik.} +% +% \spec{\item A single string for conversion.} +% {\item A single converted string.} +% {\item none} +% +% \begin{macrocode} + FUNCTION {n.dashify} + { 't := + "" + { t empty$ not } + { t #1 #1 substring$ "-" = + { t #1 #2 substring$ "--" = not + { "--" * + t #2 global.max$ substring$ 't := + } + { { t #1 #1 substring$ "-" = } + { "-" * + t #2 global.max$ substring$ 't := + } + while$ + } + if$ + } + { t #1 #1 substring$ * + t #2 global.max$ substring$ 't := + } + if$ + } + while$ + } +% \end{macrocode} +% +% \DescribeEnv{gather.chars} +% The following function was designed for date parsing, but +% may find other uses as well. It finds the first letter or +% numeral in a given string, then proceeds to build a substring +% until it hits a different character type or the end of the +% string, +% at which point it +% stops parsing and terminates. +% +% \spec{\item A string for parsing.} +% {\item A string toggle showing the character type of the +% first homogenous substring in the string for parsing. +% \item A string of characters from the front of the given string +% which are letters or numbers only. +% \item The remainder of the string.} +% {\item none} +% +% \begin{macrocode} +FUNCTION { gather.chars } + { + "forward" = + { swap$ duplicate$ character.length 'a := + 't := + duplicate$ + { t #1 #1 substring$ swap$ get.character.type + "other" = + t empty$ not and } + { t #2 global.max$ substring$ 't := duplicate$ + }while$ + duplicate$ t #1 #1 substring$ swap$ get.character.type + t #1 #1 substring$ swap$ + "" swap$ duplicate$ 'u := + t #2 global.max$ substring$ 't := + { u = } + { * swap$ + u * 'u := + u #1 #1 substring$ swap$ + u #1 #1 substring$ + u #2 global.max$ substring$ 'u := + t #1 #1 substring$ swap$ get.character.type + t #1 #1 substring$ swap$ + duplicate$ u = + { t #2 global.max$ substring$ 't := } + { swap$ pop$ + }if$ + }while$ + swap$ pop$ t swap$ u + } + { swap$ duplicate$ character.length 'a := + 't := + duplicate$ + { t a #1 substring$ swap$ get.character.type + "other" = + t empty$ not and } + { a #1 - 'a := + t #1 a substring$ 't := + }while$ + duplicate$ t a #1 substring$ swap$ get.character.type + t a #1 substring$ swap$ + "" swap$ duplicate$ 'u := + a #1 - 'a := + t #1 a substring$ 't := + { u = } + { swap$ * swap$ + u * 'u := + u #1 #1 substring$ swap$ + u #1 #1 substring$ + u #2 global.max$ substring$ 'u := + t a #1 substring$ swap$ get.character.type + t a #1 substring$ swap$ + duplicate$ u = + { a #1 - 'a := t #1 a substring$ 't := } + { swap$ pop$ + }if$ + }while$ + swap$ pop$ t swap$ u + }if$ + } +% \end{macrocode} +% +% \DescribeEnv{tie.or.space.connect} +% We use this function from the standard styles. It +% adds a tie if the string it is applied to is three +% characters or less in length. +% +% \spec{\item A string +% \item A second string} +% {\item One string} +% {\item {none}} +% +% \begin{macrocode} + FUNCTION {tie.or.space.connect} + { duplicate$ text.length$ #3 < + { "~" } + { " " } + if$ + swap$ * * + } +% \end{macrocode} +% +% \DescribeEnv{format.pages} +% This function accepts one toggle option currently, +% but it is open to expansion. If the "short" toggle is +% fed to this function, it reads through the field until +% it hits a non-integer character. Otherwise, it "n.dashify"s +% the +% whole field. This needs robustification; the page number +% might be a roman numeral. Might it be simplest to just +% drop the scan when we hit a "-"? Deserves some thought. +% +% \spec{\item A toggle string. +% \item page number or possibly +% a range of pages.} +% {\item One string, constituting a finished page number, or {\tt +% empty\$}.} +% {\item {\bf short:} will return only the +% first number given in the string. +% \item {full:} +% will return the page number, n-dashified.} +% \changes{1994/12/05}{1.0e}{Altered {\tt format.pages} so +% that the {\tt short} scan stops at a {\tt-} character, +% rather than a non-integer. Simpler and more robust.} +% \begin{macrocode} +FUNCTION {format.pages} + { swap$ duplicate$ empty$ + { pop$ pop$ "" } + { swap$ duplicate$ "short" = + { pop$ + 's := + "" + s #1 #1 substring$ + { "-" = not } + { s #1 #1 substring$ * + s #2 global.max$ substring$ 's := + s #1 #1 substring$ + duplicate$ "" = + { pop$ "-" } + 'skip$ + if$ + } + while$ + } + { "full" = + { pages n.dashify } + { "invalid switch fed to the format.pages function" + warning$ + }if$ + }if$ + }if$ +} +% \end{macrocode} +% +% \paragraph{Names} +% The code for parsing and formatting names is extremely +% economical, +% thanks to the powerful built-in functions that \BibTeX\ +% supplies +% for this purpose. +% +% \DescribeEnv{format.names} +% This is based on Oren Patashnik's original function of the same +% name. His comment was as follows: +% \begin{quote} +% The format.names function formats the argument (which should +% be in +% \BibTeX name format) into ``{\tt First Von Last, Junior}'', +% separated by commas +% and with an "and" before the last (but ending with "et~al." if +% the last +% of multiple authors is "others"). This function's argument +% should always +% contain at least one name. +% The format.authors function returns the result of +% format.names(author) +% if the author is present, or else it returns the null string. +% \end{quote} +% +% This function is used to format any name field that is +% thrown at it. It is based on the 1988 release, but with +% modifications +% to permit toggling, since the Blue Book requires different +% author +% formats for different types of material. The toggling strategy +% should also make modification of this style a pretty simple +% matter. +% +% \spec{\item The contents of one name field +% \item string toggle +% (either {\tt firstinitial}, {\tt lastonly} or {\tt full})} +% {\item A single string, containing a formatted name or names, +% or {\tt empty\$}} +% {\item {\bf firstinitial:} Yields the form ``F.~Bennett, Jr.'' +% \item {lastonly:} +% Yields the form ``Bennett'' +% \item {\bf full:} yields ``Frank Bennett, Jr.''} +% +% \begin{macrocode} +FUNCTION {format.names} + { swap$ duplicate$ empty$ + { swap$ pop$ } + { 's := + 'u := + #1 'nameptr := + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { u "lastonly" = + { s nameptr "{vv~}{ll}" format.name$ 't := } + { u "firstinitial" = + { s nameptr "{f.~}{vv~}{ll}{, jj}" format.name$ 't := } + { u "full" = + { s nameptr "{ff~}{vv~}{ll}{, jj}" format.name$ 't :=} + { "style error; invalid or non-existent toggle" warning$ } + if$ + } + if$ + } + if$ + nameptr #1 > + { namesleft #1 > + { ", " * t * } + { numnames #2 > + { "," * } + 'skip$ + if$ + t "others" = + { " et~al." * } + { " and " * t * } + if$ + } + if$ + } + 't + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + } + if$ + } +% \end{macrocode} +% +% \paragraph{Dates} +% The style code for parsing and formatting dates is much more +% complex than that for names. This is due to the need to +% build the necessary tools out of \BibTeX\ primitives, since +% no built-in tools for this task are supplied. There are +% two date formatting routines below. The simpler of the two +% is "format.month.year". This is basically just the function +% supplied with the standard \BibTeX\ styles, under a new name. +% The \LexiBib\ version of "format.date" is underpinned by +% a whole set of new +% functions, and allows great flexibility in the syntax +% for entering dates. +% +% \subparagraph{Old format routine} +% +% \DescribeEnv{format.month.year} +% The "format.date" function is for the month and year, but we +% give a warning if +% there's an empty year but the month is there, and we return the +% empty string +% if they're both empty.\footnote{This comment by Oren +% Patashnik.} +% +% This is not changed over the "format.date" function in the +% original standard \BibTeX{} styles. It is retained, although +% the distributed \LexiBib\ styles won't be making use of it. +% +% \spec{\item none} +% {\item A single string.} +% {\item none} +% +% \begin{macrocode} + FUNCTION {format.month.year} + { year empty$ + { month empty$ + { "" } + { "there's a month but no year in " cite$ * warning$ + month + } + if$ + } + { month empty$ + 'year + { month " " * year * } + if$ + } + if$ + } +% \end{macrocode} +% +% \subparagraph{New date parsing routines} +% The "format.date" function depends upon a number of +% supporting functions. Some of these are of general utility, +% and are presented above. Those presented here are specific +% to this particular function. +% +% \DescribeEnv{fillout.a.year} +% This adds a leading "19" to a year entered in two-digit +% form. +% +% \spec{\item A single string.} +% {\item A single string.} +% {\item none} +% +% \begin{macrocode} +FUNCTION {fillout.a.year} + { duplicate$ character.length #2 = + { "19" swap$ * } + 'skip$ + if$ + } +% \end{macrocode} +% +% \DescribeEnv{parse.month} +% This function is a simple parser, used in converting +% database entries that have been identified as probable +% abbreviated month entries into numerical string form. +% +% \spec{\item A single string, which should consist of +% exactly three alphabetic characters.} +% {\item A single string of numbers.} +% {\item none} +% +% \begin{macrocode} +FUNCTION {parse.month} + { duplicate$ "jan" = + { pop$ "1" } + { duplicate$ "feb" = + { pop$ "2" } + { duplicate$ "mar" = + { pop$ "3" } + { duplicate$ "apr" = + { pop$ "4" } + { duplicate$ "may" = + { pop$ "5" } + { duplicate$ "jun" = + { pop$ "6" } + { duplicate$ "jul" = + { pop$ "7" } + { duplicate$ "aug" = + { pop$ "8" } + { duplicate$ "sep" = + { pop$ "9" } + { duplicate$ "oct" = + { pop$ "10" } + { duplicate$ "nov" = + { pop$ "11" } + { duplicate$ "dec" = + { pop$ "12" } + { "invalid month in " cite$ * warning$ + "passing text to Camel verbatim" warning$ + "t" 'scrubdate := + }if$ + }if$ + }if$ + }if$ + }if$ + }if$ + }if$ + }if$ + }if$ + }if$ + }if$ + }if$ + } +% \end{macrocode} +% +% +% +% \DescribeEnv{format.month.name} +% \changes{1994/08/09}{v1.0b}{Added {\tt swap\$} as appropriate +% to expose string on stack for {\tt empty\$} check.} +% This takes a numerical string and converts it to either an +% abbrviated or a spelled-out month name. +% +% \spec{\item A toggle string. +% \item A numerical string.} +% {\item A string.} +% {\item {long:} The month name placed on the stack will be +% spelled out. +% \item{short:} The month name will be abbreviated.} +% +% \begin{macrocode} +FUNCTION { format.month.name } + { swap$ duplicate$ empty$ + { pop$ pop$ "" } + { swap$ "long" = + { duplicate$ "1" = + { "January" } + { duplicate$ "2" = + { "February" } + { duplicate$ "3" = + { "March" } + { duplicate$ "4" = + { "April" } + { duplicate$ "5" = + { "May" } + { duplicate$ "6" = + { "June" } + { duplicate$ "7" = + { "July" } + { duplicate$ "8" = + { "August" } + { duplicate$ "9" = + { "September" } + { duplicate$ "10" = + { "October" } + { duplicate$ "11" = + { "November" } + { duplicate$ "12" = + { "December" } + { "invalid month in " cite$ * warning$ "" + "passing text to Camel verbatim" warning$ + "t" 'scrubdate := + }if$ + }if$ + }if$ + }if$ + }if$ + }if$ + }if$ + }if$ + }if$ + }if$ + }if$ + }if$ + } + { duplicate$ "1" = + { "Jan." } + { duplicate$ "2" = + { "Feb." } + { duplicate$ "3" = + { "Mar." } + { duplicate$ "4" = + { "Apr." } + { duplicate$ "5" = + { "May" } + { duplicate$ "6" = + { "Jun." } + { duplicate$ "7" = + { "Jul." } + { duplicate$ "8" = + { "Aug." } + { duplicate$ "9" = + { "Sept." } + { duplicate$ "10" = + { "Oct." } + { duplicate$ "11" = + { "Nov." } + { duplicate$ "12" = + { "Dec." } + { "" + }if$ + }if$ + }if$ + }if$ + }if$ + }if$ + }if$ + }if$ + }if$ + }if$ + }if$ + }if$ + }if$ +swap$ pop$ + }if$ + } +% \end{macrocode} +% +% \DescribeEnv{extract.date} +% This function takes a labelled stack of numeric items, +% and places its contents in a formatted string on +% the stack. It is a subroutine called by "format.date", and is +% not intended for use directly in entry type functions. +% +% The behaviour of this function is a little too complex +% to describe its input and output behaviour using our +% usual description box, so we revert to prose here. +% The expectation of what will appear on the +% stack depends on the contents of the integer +% variable "itemcount". For each date item counted, the +% function expects to find two items on the stack: a +% string possibly flagging the variable into which the +% item should be placed; and a numerical string. +% +% If "itemcount" is "0", we check to see whether the streamlined +% format for parallel citations has been used. If not, a warning +% of an empty date is issued. +% +% If "itemcount" is "1", the flag string is ignored, +% and the numerical item is assumed to be a year. +% +% If "itemcount" is "2", the flag strings are both +% ignored, and the numerical items are assumed to be +% a year and a month, in that order. +% +% If "itemcount" is "3", the first item is assumed to +% be a year. The assignment of the second two items +% depends first upon the contents of the integer +% variable "date.specials". If this is "0", then +% the flags are ignored, and the numerical items are +% assumed to be a day and a month, in that order. +% If "date.specials" is "1" (`true'), then the +% flag of the first item is checked to see whether it +% is ``"month"''. If so, the first item is assigned to +% the "themonth" variable, and the next to the "theday" +% variable. Otherwise the assignments are reversed. +% +% \begin{macrocode} +FUNCTION {extract.date} + { 'v := "" 's := "" 't := "" 'u := + itemcount #0 = + { cites empty$ + { "some date or other is COMPLETELY empty in " cite$ * + warning$ } + 'skip$ + if$ + } + { itemcount #1 = + { pop$ fillout.a.year 's := "" 'u := "" 't := } + { itemcount #2 = + { pop$ swap$ pop$ swap$ duplicate$ character.length #4 = + { swap$ "--" swap$ * * 's := "" 't := } + { swap$ fillout.a.year 's := 't := + }if$ + "" 'u := + } + { itemcount #3 = + { date.specials + { pop$ fillout.a.year 's := + "month" = + { 't := + pop$ 'u := } + { 'u := + pop$ 't := + }if$ + } + { pop$ fillout.a.year 's := + pop$ 'u := + pop$ 't := + }if$ + } + { "too many items for date in " cite$ * warning$ + }if$ + }if$ + }if$ + }if$ + v duplicate$ "month.dd.yy" = + { pop$ s ", " u "\ " t "long" format.month.name } + { duplicate$ "dd.month.yy" = + { pop$ s "\ " t "long" format.month.name "\ " u } + { duplicate$ "mo.dd.yy" = + { pop$ s ", " u "\ " t "short" format.month.name } + { duplicate$ "dd.mo.yy" = + { pop$ s "\ " t "short" format.month.name "\ " u } + { duplicate$ "dd.mm.yy" = + { pop$ s "/" t "/" u } + { duplicate$ "mm.dd.yy" = + { s "/" u "/" t } + { "yy" = + { "" "" "" "" s } + { "invalid date toggle in style file" warning$ + }if$ + }if$ + }if$ + }if$ + }if$ + }if$ + }if$ + "" 'v := + duplicate$ empty$ + { pop$ pop$ } + { swap$ * 'v := } + if$ + duplicate$ empty$ + { pop$ pop$ } + { swap$ * v swap$ * 'v := } + if$ + duplicate$ empty$ + { pop$ v } + { v swap$ * } + if$ + } +% \end{macrocode} +% +% \DescribeEnv{topup.date} +% This is used to perform an addition operation on a +% string of numerals. +% +% \spec{\item An integer to be added. +% \item A string consisting of numerals only.} +% {\item A string consisting of the sum of the integer and +% the numeric string.} +% {\item none} +% +% \begin{macrocode} +FUNCTION {topup.date} + { 'a := + duplicate$ character.length #2 = + { duplicate$ #1 #1 substring$ chr.to.int$ #48 - + times.ten swap$ #2 #1 substring$ chr.to.int$ #48 - + + + } + { duplicate$ character.length #1 = + { chr.to.int$ #48 - } + { pop$ #0 "I can't cope with more than two Japanese year digits in " + cite$ * warning$ + }if$ + }if$ + a + int.to.str$ + } +% \end{macrocode} +% +% \DescribeEnv{format.jdate} +% This rather specialized function converts a Japanese +% Imperial date written +% in a fixed syntax into the \LexiBib\ internal date stack, +% for onward handling by "extract.date". +% +% \spec{\item A string in the form: {\tt s57.9.27}, where +% the first letter indicates the Imperial reign of the year +% given, the first numeric item is the year, the second the +% month, and the third the day. Any non-alphabetic, non-numeric +% character may be used as a separator.} +% {\item {\tt itemcount} is set to {\tt 2} (one more is added +% by the {\tt format.date} function in which is function is +% nested). +% \item Six stack items are output---see {\tt extract.date} +% for details on stack syntax.} +% {\item none} +% +% \begin{macrocode} +FUNCTION {format.jdate} + { duplicate$ #2 global.max$ substring$ "*" "forward" gather.chars + pop$ 't := swap$ + #1 #1 substring$ duplicate$ "s" = + { pop$ t #1925 topup.date } + { duplicate$ "m" = + { pop$ t #1867 topup.date } + { duplicate$ "t" = + { pop$ t #1911 topup.date } + { "h" = + { t #1988 topup.date } + { "invalid Imperial calendar code in " cite$ * warning$ + }if$ + }if$ + }if$ + }if$ + swap$ + "*" "forward" gather.chars + pop$ swap$ + "*" "forward" gather.chars + pop$ swap$ pop$ 't := swap$ "default" swap$ t swap$ "default" + swap$ "default" + #2 'itemcount := + } +% \end{macrocode} +% +% \DescribeEnv{format.date} +% This function makes use of "gather.chars" and other supporting +% functions to build a stack of date items, which it then parses +% using "extract.date". The syntax for entering dates is +% described in the user guide. +% +% \spec{\item A single string in appropriate date syntax.} +% {\item none} +% {\item none} +% +% \begin{macrocode} +FUNCTION {format.date} + { 'v := + empty.to.null 's := + #0 'charcount := + #0 'itemcount := + #0 'date.specials := + { s empty$ not } + { s "*" "forward" gather.chars + duplicate$ "letter" = + { pop$ duplicate$ character.length #1 = itemcount not and + { pop$ pop$ s format.jdate "" 's := } + { duplicate$ character.length #3 = + { swap$ 's := + parse.month "month" #1 'date.specials := } + { swap$ 's := + pop$ "1" "invalid date in " cite$ * warning$ + "passing text to Camel verbatim" warning$ + "t" 'scrubdate := + "default" + }if$ + }if$ + } + { "numeral" = + { duplicate$ character.length #1 = + { swap$ 's := "default" } + { duplicate$ character.length #2 = + { swap$ 's := "default" } + { duplicate$ character.length #4 = + { swap$ 's := "default" } + { swap$ 's := pop$ "1" + "invalid numerical element in date for " cite$ * warning$ + "passing text to Camel verbatim" warning$ + "t" 'scrubdate := + "default" + }if$ + }if$ + }if$ + } + { swap$ 's := pop$ "1" + "failed to parse date in " cite$ * warning$ + "default" + }if$ + }if$ + itemcount #1 + 'itemcount := + }while$ + v extract.date + scrubdate "t" = + { pop$ year empty.to.null } + 'skip$ + if$ + } +% \end{macrocode} +% Anyways, here's that line noise. Extracts cite info to variables +% from a parseable string on the stack. Syntax is: +% +%\begin{tabular}{ccccccc} +% year & volume & / & number & journal name & pages & (year)\\ +% "^" & "^" &"^"& "^" & "^" & "^" & "^"\\ +% OPT & OPT &OPT& OPT & REQ & OPT & OPT\\ +%\end{tabular} +% +% You can give a volume without a number (i.e. the backslash +% and trailing number can be left out). +% \begin{macrocode} +FUNCTION {parse.one.cite} +{ duplicate$ "=" = not + { "=" "forward" gather.chars pop$ + duplicate$ "[" swap$ "forward" first.in.second + { swap$ duplicate$ "]" swap$ "forward" first.in.second + { "" 'volume.var := + 'b := swap$ 'a := a b < + { duplicate$ a #1 + b a #1 + - substring$ + 'year.var := + b #1 + global.max$ substring$ + " " "forward" gather.chars pop$ + duplicate$ "*" "forward" gather.chars + "numeral" = + { swap$ duplicate$ empty$ + { pop$ pop$ 'number.var := } + { pop$ pop$ swap$ * "" 'number.var := + }if$ + } + { pop$ pop$ " " swap$ * swap$ * "" 'number.var := + }if$ + } + { "Weird syntax error in " cite$ * warning$ + }if$ + } + { "Opening [ without closing ] in " cite$ * warning$ + }if$ + } + { pop$ duplicate$ ")" swap$ "reverse" first.in.second + { swap$ duplicate$ "(" swap$ "reverse" first.in.second + { 'a := swap$ 'b := a b < + { duplicate$ a #1 + b a #1 + - substring$ + 'year.var := + #1 a #1 - substring$ + " " "forward" gather.chars pop$ + duplicate$ "/" swap$ "forward" first.in.second + { pop$ "/" "forward" gather.chars pop$ + swap$ duplicate$ empty$ + { pop$ "" 'number.var := } + { #2 global.max$ substring$ + 'number.var := + }if$ + } + { pop$ "" 'number.var := + }if$ + duplicate$ empty$ + { pop$ "" 'volume.var := } + { duplicate$ "*" "forward" gather.chars + "numeral" = + { swap$ duplicate$ empty$ + { pop$ pop$ 'volume.var := } + { pop$ pop$ swap$ * "" 'volume.var := + }if$ + } + { pop$ pop$ " " swap$ * swap$ * "" 'volume.var := + }if$ + }if$ + } + { "Weird syntax error in " cite$ * warning$ + }if$ + } + { "Closing ) without opening ( in " cite$ * warning$ + }if$ + } + { pop$ "No recognizable date in string in " cite$ * warning$ + }if$ + }if$ + " " swap$ * " " "reverse" gather.chars pop$ + duplicate$ "*" "forward" gather.chars + "numeral" = + { swap$ duplicate$ empty$ + { pop$ pop$ 'pages.var := } + { pop$ pop$ swap$ * "" 'pages.var := + }if$ + } + { pop$ pop$ swap$ * "" 'pages.var := + }if$ + duplicate$ empty$ + { 'journal.var := } + { duplicate$ character.length #2 - + #3 swap$ substring$ 'journal.var := + }if$ + } + 'skip$ + if$ +} +%</bstlibrary> +% \end{macrocode} +% \begin{macrocode} +%<*bsttrailer> +FUNCTION {sortify} +{ purify$ + "l" change.case$ +} + +INTEGERS { len } + +FUNCTION {chop.word} +{ 's := + 'len := + s #1 len substring$ = + { s len #1 + global.max$ substring$ } + 's + if$ +} + +INTEGERS { et.al.char.used } + +FUNCTION {initialize.et.al.char.used} +{ #0 'et.al.char.used := +} + +EXECUTE {initialize.et.al.char.used} + +FUNCTION {format.lab.names} +{ 's := + s num.names$ 'numnames := + numnames #1 > + { numnames #4 > + { #3 'namesleft := } + { numnames 'namesleft := } + if$ + #1 'nameptr := + "" + { namesleft #0 > } + { nameptr numnames = + { s nameptr "{ff }{vv }{ll}{ jj}" format.name$ "others" = + { "{\etalchar{+}}" * + #1 'et.al.char.used := + } + { s nameptr "{v{}}{l{}}" format.name$ * } + if$ + } + { s nameptr "{v{}}{l{}}" format.name$ * } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ + numnames #4 > + { "{\etalchar{+}}" * + #1 'et.al.char.used := + } + 'skip$ + if$ + } + { s #1 "{v{}}{l{}}" format.name$ + duplicate$ text.length$ #2 < + { pop$ s #1 "{ll}" format.name$ #3 text.prefix$ } + 'skip$ + if$ + } + if$ +} + +FUNCTION {author.key.label} +{ author empty$ + { key empty$ + { cite$ #1 #3 substring$ } + { key #3 text.prefix$ } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {author.editor.key.label} +{ author empty$ + { editor empty$ + { key empty$ + { cite$ #1 #3 substring$ } + { key #3 text.prefix$ } + if$ + } + { editor format.lab.names } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {author.key.organization.label} +{ author empty$ + { key empty$ + { organization empty$ + { cite$ #1 #3 substring$ } + { "The " #4 organization chop.word #3 text.prefix$ } + if$ + } + { key #3 text.prefix$ } + if$ + } + { author format.lab.names } + if$ +} + +FUNCTION {editor.key.organization.label} +{ editor empty$ + { key empty$ + { organization empty$ + { cite$ #1 #3 substring$ } + { "The " #4 organization chop.word #3 text.prefix$ } + if$ + } + { key #3 text.prefix$ } + if$ + } + { editor format.lab.names } + if$ +} + +FUNCTION {calc.label} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.key.label + { type$ "proceedings" = + 'editor.key.organization.label + { type$ "manual" = + 'author.key.organization.label + 'author.key.label + if$ + } + if$ + } + if$ + duplicate$ + year "yy" format.date purify$ #-1 #2 substring$ + * + 'label := + year "yy" format.date purify$ #-1 #4 substring$ + * + sortify 'sort.label := +} + +FUNCTION {sort.format.names} +{ 's := + #1 'nameptr := + "" + s num.names$ 'numnames := + numnames 'namesleft := + { namesleft #0 > } + { nameptr #1 > + { " " * } + 'skip$ + if$ + s nameptr "{vv{ } }{ll{ }}{ ff{ }}{ jj{ }}" format.name$ 't := + nameptr numnames = t "others" = and + { "et al" * } + { t sortify * } + if$ + nameptr #1 + 'nameptr := + namesleft #1 - 'namesleft := + } + while$ +} + +FUNCTION {sort.format.title} +{ 't := + "A " #2 + "An " #3 + "The " #4 t chop.word + chop.word + chop.word + sortify + #1 global.max$ substring$ +} + +FUNCTION {author.sort} +{ author empty$ + { key empty$ + { "to sort, need author or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {case.sort} +{ title empty$ + { key empty$ + { "to sort, need title or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { title sort.format.title } + if$ +} + +FUNCTION {author.editor.sort} +{ author empty$ + { editor empty$ + { key empty$ + { "to sort, need author, editor, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { editor sort.format.names } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {author.organization.sort} +{ author empty$ + { organization empty$ + { key empty$ + { "to sort, need author, organization, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { author sort.format.names } + if$ +} + +FUNCTION {editor.organization.sort} +{ editor empty$ + { organization empty$ + { key empty$ + { "to sort, need editor, organization, or key in " cite$ * warning$ + "" + } + { key sortify } + if$ + } + { "The " #4 organization chop.word sortify } + if$ + } + { editor sort.format.names } + if$ +} + +FUNCTION {presort} +{ type$ "book" = + type$ "inbook" = + or + 'author.editor.sort + { type$ "proceedings" = + 'editor.organization.sort + { type$ "manual" = + 'author.organization.sort + { type$ "case" = + 'case.sort + { type$ "statute" = + 'case.sort + 'author.sort + if$ + } + if$ + } + if$ + } + if$ + } + if$ + " " + * + year "yy" format.date sortify + * + " " + * + title empty.to.null + sort.format.title + * + #1 entry.max$ substring$ + 'sort.key$ := +} + +ITERATE {presort} + +SORT + +FUNCTION {begin.bib} +{ et.al.char.used + { "\newcommand{\etalchar}[1]{$^{#1}$}" write$ newline$ } + 'skip$ + if$ + preamble$ empty$ + 'skip$ + { preamble$ write$ newline$ } + if$ +} + +EXECUTE {begin.bib} + +ITERATE {call.type$} +%</bsttrailer> +% \end{macrocode} +% \section{A {\tt .bib} file} +% \begin{macrocode} +%<*bib> +@string{asr..="Am.~Soc.\ Rev."} +@book{bluebook, + title = {A Uniform System of Citation}, + edition = {19th}, + year = 1989 +} +@book{knuth, + title = {The {\TeX} book}, + year = 1990, + author = {D.E. Knuth} +} +@book{leunen, + author = {M.-C. van Leunen}, + title = {A Handbook for Scholars}, + year = 1979 +} +@book{latex-book, + title = {\LaTeX: a document preparation system}, + year = 1994, + author = {Leslie Lamport} +} +@inbook{companion-bibs, + title = {Bibliography Generation}, + chapter = 13, + pages = {371}, + crossref = {latex-companion} +} +@book{latex-companion, + author = {M. Goosens and Frank Mittelbach and A. Samarin}, + title = {The \LaTeX\ Companion}, + booktitle = {The \LaTeX\ Companion}, + year = 1994 +} +@techreport{oren-user, + author = {Oren Patashnik}, + title = {\BibTeX ing}, + year = 1988, + type = {CTAN document} +} +@techreport{oren-hackers, + author = {Oren Patashnik}, + title = {Designing \BibTeX\ Styles}, + type = {CTAN document}, + year = 1988 +} +@book{maki-constitution, + author = {Maki, John McGilvrey}, + title = {Court and Constitution in Japan: Selected Supreme Court Decisions, + 1948-1960}, + publisher = {Washington University Press}, + year = 1964 +} +@booklet{sansom-constitution, + author = {Sansom, {Sir} George Bailey}, + title = {The First Japanese Constitution: A Lecture}, + note = {delivered before the + Asiatic Society of Japan}, + year = 1938 +} +@article{macauley, + author = {Stuart Macauley}, + title = {Non-Contractual Relations +in Business: A Preliminary Study}, + volume = {28}, + journal = asr.., + pages = {55}, + year = {1963} +} +@mastersthesis{homma-derivative, + title = {The Derivative Suit under Japanese Law as a Measure of + Corporate Governance}, + author = {Masahiro Homma}, + institution = {School of Oriental and African Studies}, + type = {LL.M. thesis}, + year = {1994} +} +@case{bradshaw-v-us, + title = {Bradshaw v United States}, + cites = {231 Ct.Cl. 144 (1982) = 683 F.2d 365 (1982)} +} +@incollection{haley-land-lease, + title = {Japan's New Land and House Lease Law}, + author = {John Owen Haley}, + crossref = {policy-failure}, + pages = 149, +} +@book{policy-failure, + title = {Land Issues in Japan: A Policy Failure?}, + booktitle = {Land Issues in Japan: A Policy Failure?}, + year = 1992 +} +@article{appleyard-heed, + author = {Bryan Appleyard}, + title = {Why Major should heed the press}, + pages = 21, + journal = {The Independent}, + year = {7 jul 1995}, + place = {London} +} +@statute{sga, + title = {Sale of Goods Act}, + year = {1979}, + jurisdiction = {england} +} +@case{heap, + title = {Heap v Motorists' Advisory Agency Ltd}, + year = 1923, + journal = {KB}, + number = 1, + pages = 577 +} +@case{halsall-v-brizell, + title = {Halsall v Brizell}, + cites = {[1957] Ch 169 = [1957] 1 All ER 371} +} +%</bib> +% \end{macrocode} +% \section{The Driver File} +% \begin{macrocode} +%<*installer> +\def\batchfile{camel.ins} +\input docstrip.tex +\preamble + +Copyright (C) 1992--95 Frank Bennett, Jr. +All rights reserved. + +This file is part of the Camel package. +\endpreamble + +\def\batchfile{camel.dst} % ignored in distribution +\input docstrip.tex % ignored in distribution + +\Ask\answer{% + ************************************************************** + ^^J* PLEASE NOTE + ^^J* + ^^J* Camel requires a large BibTeX, with a wizard-defined + ^^J* function space of over 6,000. The function space in + ^^J* standard BibTeX is only 3,000, so if your BibTeX has never + ^^J* been enlarged, it will probably need to be recompiled. + ^^J* + ^^J* If this seems terribly cryptic, just go ahead and give + ^^J* it a go. Feel free to write me on fb@soas.ac.uk if you + ^^J* have problems. + ^^J* + ^^J* In addition to camel.dtx, you will also need the keyval + ^^J* and overword packages, also available from CTAN. You + ^^J* should have an up-to-date copy of index.dtx as well. + ^^J* + ^^J* Also, to print the .dtx files in the Camel bundle, you + ^^J* should use the usual gind.ist file for making the indexes; + ^^J* camel.ist is used for special purposes outlined in the + ^^J* manual. + ^^J* + ^^J* Shall I unpack my things? + ^^J* + ^^J* If you want me to go ahead, answer `y' below, otherwise `n'. + ^^J* + ^^J**************************************************************} + +\keepsilent + +\preamble + +This file is part of the Camel package. +--------------------------------------- +This is a generated file. + +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. + +The above conditions do not apply to the demonstration +file test.tex. + +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 better package, please contact me on +`fb' at soas.ac.uk + +\endpreamble + + +{\ifx\answer\y + +\generate{\file{camel.sty} {\from{camel.dtx}{lexitex}} + \file{camel.ist} {\from{camel.dtx}{camelindex}} + \file{camel.bib} {\from{camel.dtx}{bib}} + \file{test.tex} {\from{camel.dtx}{testtex}}} + +\fi} + +\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 camel.sty} +\Msg{*} +\Msg{* You also need to move the following file into a directory} +\Msg{* searched by makeindex:} +\Msg{*} +\Msg{* \space\space camel.ist} +\Msg{*} +\Msg{* Note that Camel does not work by itself; style modules} +\Msg{* (such as law.dtx) are supplied separately. They can} +\Msg{* be found on CTAN in the Camel subdirectory.} +\Msg{*} +\Msg{***********************************************************} +} +%</installer> +% \end{macrocode} +% \begin{macrocode} +%<*testtex> +\documentclass{article} +\usepackage{camel} + +%<+testtex>%\citationsubject[o=sta,i=stb]{statutes}{Statutory Materials} +%<+testtex>%\citationsubject[o=sec,i=seb]{second}{Secondary Literature} +%<+testtex>%\citationsubject[o=cas,i=cab]{case}{Cases} + +\begin{document} +\citationstyle{law} +\citationdata{camel} + +\section*{{\sc Camel} tests and examples\footnotemark{}{} } +\footnotetext{Note that, in addition to admiring the examples in + this document, you can tinker with it to produce different + kinds of bibliographies. See the comments in the file for + suggestions.} + + +We currently have support for articles (including newspaper +articles), items in collections of +essays, books, sections of books, ephemeral booklets, masters theses, +Commonwealth, US and Japanese cases, and statutes from a few +jurisdictions. An example of each is given below, first without, +then with a pinpoint. This does not give a complete picture of +the `formatting tree', it''s just a sample. + +\begin{itemize} +\item Ordinary articles + \begin{itemize} + \item \source[s=second]{macauley} + \item \source[f,s=second]{macauley}[56] + \end{itemize} +\item Newspaper articles + \begin{itemize} + \item \source[s=second]{appleyard-heed} + \item \source[f,s=second]{appleyard-heed}[21] (A silly example, + since there's only one page to the piece!) + \end{itemize} +\item Articles in collections of essays + \begin{itemize} + \item \source[s=second]{haley-land-lease} + \item \source[f,s=second]{haley-land-lease}[152] + \end{itemize} +\item Books + \begin{itemize} + \item \source[f,s=second]{latex-companion} + \item \source[f,s=second]{latex-companion}[371] + \end{itemize} +\item Sections of books + \begin{itemize} + \item \source[f,s=second]{companion-bibs} + \item \source[f,s=second]{companion-bibs}[374-75] (The BibTeX{} + processing flow shown here is simplified for {\sc Camel} users) + \end{itemize} +\item Ephemeral booklets + \begin{itemize} + \item \source[f,s=second]{sansom-constitution} + \item \source[f,s=second]{sansom-constitution}[2] + \end{itemize} +\item Masters theses + \begin{itemize} + \item \source[f,s=second]{homma-derivative} + \item \source[f,s=second]{homma-derivative}[23] + \end{itemize} +\item Commonwealth law cases + \begin{itemize} + \item \source[f,s=case]{heap} + \item \source[f,s=case]{heap}[578]\footnote{Notice how the + pinpointed citation gives only as many parallel as are + specified in the pinpoint. Compare this with the next example.} + \end{itemize} +\item US law cases + \begin{itemize} + \item \source[f,s=case]{bradshaw-v-us} + \item \source[f,s=case]{bradshaw-v-us}[145=366] + \end{itemize} +\end{itemize} +Titles that end in a numeral are a special treat. {\sc Camel} +is not tricked by them. +\begin{itemize} + \item \source[s=statutes]{maki-constitution}[23] + \item \source[f,s=statutes]{maki-constitution} +\end{itemize} +Selective suppression of author, title, or the entire citation is +supported. +\begin{itemize} + \item \source[a,f,s=second]{homma-derivative} + \item \source[t,f,s=second]{homma-derivative} + \item \source[n,s=second]{homma-derivative} (invisible) +\end{itemize} + +%<+testtex>% If you uncomment the \citationsubject lines above, +%<+testtex>% you can comment out the `all' entry below, run +%<+testtex>% makeindex in the appropriate way over the output +%<+testtex>% files, uncomment the three special bibliography +%<+testtex>% declarations below, and print a whole different sort +%<+testtex>% of document. There are a few bugs in the way +%<+testtex>% bibliographies are set up. Sorting them out will +%<+testtex>% best be done once BibTeX 1.0 is available, since +%<+testtex>% integrating with the new BibTeX will affect the same +%<+testtex>% portions of the code. +\printbibliography[labels=false]{all} +%<+testtex>%\printbibliography{statutes} +%<+testtex>%\printbibliography{case} +%<+testtex>%\printbibliography{second} +\end{document} +%</testtex> +% \end{macrocode} +% \Finale \PrintChanges |