summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/lexitex/lexibib.doc
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/lexitex/lexibib.doc
Initial commit
Diffstat (limited to 'macros/latex/contrib/lexitex/lexibib.doc')
-rw-r--r--macros/latex/contrib/lexitex/lexibib.doc2441
1 files changed, 2441 insertions, 0 deletions
diff --git a/macros/latex/contrib/lexitex/lexibib.doc b/macros/latex/contrib/lexitex/lexibib.doc
new file mode 100644
index 0000000000..39fa157e2a
--- /dev/null
+++ b/macros/latex/contrib/lexitex/lexibib.doc
@@ -0,0 +1,2441 @@
+% \def\fileversion{ver.~1.0g}
+% \def\filedate{1994/12/12}
+% \def\docdate {1994/12/07}
+% \CheckSum{92}
+%
+%\iffalse
+%
+% Copyright (C) 1992-1994 by Frank Bennett. All rights reserved.
+%
+% This file contains the entire LexiBib package. The complementary
+% LaTeX2e style package LexiTeX is contained in the separate file
+% lexitex.doc.
+%
+%
+% To get started with unpacking, run this file through DOCSTRIP
+% giving `driver' as the extraction option, with the extension
+% `ins'. Then run the resulting lexibib.ins file through LaTeX,
+% which will strip the files. Run lexibib.man through LaTeX
+% to print the documented file. I have tried to make the commented
+% code as informative as possible; comments are welcome on the
+% commentary as well as the code itself.
+%
+% 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 LexiBib 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 LexiTeX a more powerful,
+% friendlier, and better package, please contact me on
+% fbennett@clus1.ulcc.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{\"}
+
+% \title{\LexiBib\\a style file to link\\\BibTeX\ databases with
+% the \\\LexiTeX\ style engine.\thanks{%
+% This file has version number \fileversion{} dated
+% \filedate{}.
+% The documentation was last revised on \docdate.
+% The documentation and the code for \LexiBib{} and \LexiTeX{}
+% are \copyright{} 1992--94 Frank Bennett, Jr. Distribution
+% and use are freely welcomed, on the sole condition that
+% acknowledgement of the \LexiTeX{} package and of its author
+% be made in any published using these utilities.
+% }}
+% \author{Frank G. Bennett, Jr.}
+% \maketitle
+%
+% \begin{abstract}
+% \LexiBib\ is a style for use with \BibTeX\ which permits
+% legal and other citations to be stored in \BibTeX\ databases,
+% and incorporated in documents in a manner similar to
+% the normal operation of
+% \BibTeX. Citations exported using \LexiBib\ are written in
+% the syntax required for digestion by \LexiTeX, a citation
+% engine that produces in-footnote, cross-referenced citations
+% from nickname references to a single citation source list.
+% \LexiTeX\ is currently a \LaTeX\ 2.09 style, which will be
+% upgraded to \LaTeX2e form in due course.
+% \end{abstract}
+%
+% \tableofcontents
+% \lexiforcefoots
+% \section*{Preface to Version 1.0b}
+%
+% This {\tt doc} package contains a \BibTeX\ style named
+% {\tt lexibib.bst}. This style file can be used to
+% export citations from a \BibTeX{} database in a form
+% that can be used by the \LexiTeX\ citation engine.
+% This permits a user to store citation details and
+% annotations in a separate database, and incorporate
+% those citations into a document using simple nickname
+% tags. When the document is printed, the nickname tags
+% will automagically be converted into properly formatted,
+% Blue Book-conformant citations.\\
+% The {\tt lexibib.bst} style file contains only a modest
+% amount of code from the original 1988 release of {\tt
+% btxbst.doc}
+% by Oren Patashnik. While the original style is very
+% efficient in its operation, its output, formatting and
+% logical function are intertwined in a way that makes
+% modification of the style rather difficult. At some cost
+% in speed, in {\tt lexibib.bst} I have tried to provide
+% a set of modular functions that can be more easily modified
+% to suit specialized formatting requirements.\\
+% Please note that this is a {\sf beta} release. Full support
+% for databases prepared according the general conventions laid
+% down by Oren Patashnik is not yet provided,
+% so please don't rely on this style in the way you would rely
+% on the standard styles (yet). Your comments will help to
+% speed the development of \LexiBib\ into a reliable clone
+% of the standard styles.
+%
+% \newpage
+% \pagenumbering{arabic}
+% \section{User Guide}
+% \subsection{Introduction}
+%
+% An adage in office management is that you should
+% only touch incoming paper once; to respond to it, to file
+% it, to forward it, or to destroy it. A number of
+% commercial citation
+% database managers provide a facility for ``filing'' citations
+% in a flexible form, the idea being to extend this principle
+% to citations as well as paper. A hanging point for this
+% strategy as been in-text context-sensitive citation styles.
+% Database managers are at their best in exporting
+% entire bibliographies
+% and lists of authorities. Some packages are
+% capable of scanning a document for citation ``tags'',
+% which eliminates the need to separately select bibliography
+% items in the database. Some, too, can replace ``tags''
+% in the document with the formatted text of a citation.
+% But once the text is replaced, the format of citations
+% added in this way is fixed; conversion is a one-way process.
+%
+% A more serious problem is that, while the database manager
+% can easily identify the {\em tag}, it cannot identify its
+% {\em context\/}---whether it occurs in a footnote, how many
+% items were in the preceding footnote, how many articles
+% by the same author are cited in the document, and so forth.
+% As a result, citation formatting of cross-referenced styles
+% is still done by hand.
+%
+% One of the most demanding cross-referenced styles is that
+% laid down in {\sl A Uniform System of Citation}, or ``the Blue
+% Book'', for the citation of legal materials. This style
+% has survived the era of computerization largely because
+% most U.S. law journals using the style are edited by highly
+% competitive law students. Staff members contribute their
+% editorial time to their journal free of charge, because of
+% the value of listing law journal membership on their resume.
+% The Blue Book style minimizes the bulk of citation
+% text, while conveying sufficient information to the reader
+% for the location of cited material. It is also designed
+% to provide all information required for the location of
+% {\em primary\/} legal authority from the face of any citation
+% to it, without tracing down cross-references.
+%
+% \LexiTeX{} and \LexiBib{} constitute the first attempt
+% to allow documents requiring {\em cross-referenced},
+% {\em in-text\/} citations in the demanding Blue Book style
+% to draw all citation details
+% from a separately maintained bibliography, with all
+% citation formatting taking place automatically at print time.
+% \LexiTeX{} is a style for use with the \LaTeX{} typesetting
+% system.
+%
+% The implications of such a system are particularly interesting
+% if it comes to be widely used, say, in the publication of
+% law journals. The efficiency with which
+% citations can be reported to citation services would be
+% increased, since \LexiBib{}-format database entries
+% are in a standard format that can
+% be processed electronically. These same lists could
+% be made available as text-searchable databases of authority.
+% Network discussions of legal issues could be accompanied by
+% growing lists of annotated authority, available for all to
+% use.
+%
+% Even for personal use, the combination of \LexiTeX{} and
+% \LexiBib{}
+
+% Details on the use of \LexiTeX\ are contained in a separate
+% manual. The purpose of this guide is to explain the
+% preparation
+% and processing of \BibTeX\ databases for use with \LexiBib{}
+% and
+% \LexiTeX. If you have any queries, please feel free to contact
+% me on {\tt fbennett@clus1.ulcc.ac.uk}.
+%
+% \subsection{Preparing bibliography files}
+%
+% \subsection{Processing files using \LexiBib}
+% \subsection{\LexiBib\ entry types}
+% \subsection{\LexiBib\ entry fields}
+%\StopEventually{}
+% \section{The style code}
+% \subsection{To prospective style hackers}
+% The \BibTeX\ style language differs from \TeX\ both in style
+% and in syntax. Whereas \TeX\ tears through a document from
+% start to finish, clearing memory as it feeds out pages and
+% terminating at the end of the input file, \BibTeX\ reads its
+% own {\tt *.bst} file in a linear fashion, but the
+% commands used in that file to not treat treat the {\em
+% database\/} input file as a linear input stream.\\
+% At startup, \BibTeX\ latches onto the
+% {\tt *.aux} file at which it has been pointed, and scans it for
+% certain strings, which are hardwired into \BibTeX's own code.
+% These strings tell the program (a) which citation databases it
+% must open, and (b) what citation nicknames it must search those
+% databases for. A series of initializing operations are then
+% performed, which define variables and functions much as one
+% defines \TeX\ macros in advance of their use. Finally,
+% the matching items from the database can be read for use by
+% \BibTeX, and the defined functions can be invoked on each item.
+% The entire list may be read several times if necessary. In the
+% end, special functions which write formatted entries on an
+% output file are invoked after which, having reached the end of
+% the {\tt *.bst} file, the program terminates.
+%
+% The {\tt *.bst} style code below has been divided into logical
+% sections which, I hope, will illustrate the logical phases of
+% \BibTeX's progress.
+%
+% \subsection{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.
+%
+% An {\bf article} entry type may cross reference another
+% {\bf article}
+% (this
+% is intended for when an entire journal is devoted to a single
+% topic--- but since there is no {\bf journal} entry type, the
+% journal,
+% too, should be classified as an {\bf article} but without the
+% author
+% and title fields). This will result in two warning messages for
+% the journal's entry if it's included in the reference list, but
+% such is life. The other cross-referencing functions are
+% similar,
+% so no "comment version" will be given for them. We use just the
+% last names of editors for a cross reference: either "editor",
+% or
+% "editor1 and editor2", or "editor1 et~al." depending on whether
+% there are one, or two, or more than two editors.
+% \end{quote}
+% \def\option#1{\item\def\lawtemp{#1}\def\lawtemptwo{none}
+% \ifx\lawtemp\lawtemptwo
+% {\em none}
+% \else{\small`{\bf#1}':}\fi}
+% \newenvironment{Ventry}[1]%
+% {\begin{list}{}{\renewcommand{\makelabel}[1]{\textsf{##1:}\hfil}%
+% \settowidth{\labelwidth}{\textsf{#1:}}%
+% \setlength{\leftmargin}{\labelwidth}
+% \addtolength{\leftmargin}{1\labelsep}}}%
+% {\end{list}}
+% \changes{1.0f}{1994/12/08}{Rewrote the `spec' macro used in the
+% documentation, which was not happy with either compatibility
+% mode or 2e.}
+% \changes{1.0f}{1994/12/08}{\LaTeX 2e version released!}
+% \def\spec#1#2#3{\begin{Ventry}{Expected}
+% \item[Expected] \begin{enumerate}
+% #1
+% \end{enumerate}
+% \item[Left] \begin{enumerate}
+% #2
+% \end{enumerate}
+% \item[Toggles] \begin{enumerate}
+% #3
+% \end{enumerate}
+% \end{Ventry}}
+% 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.}
+% {\option{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}
+%<*newbst>
+FUNCTION { hello }
+{ " ========================================="
+" package, version 2.0g or later"
+" Use with LateX2e and the LexiTeX style"
+" -----------------------------------------"
+" documentation last updated: 5 December 1994"
+" code last updated: 12 December 1994"
+" style version: 1.0g"
+" This is the LexiBib style for BibTeX"
+" ========================================="
+stack$
+}
+% \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}
+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
+}
+% \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}
+{}
+% \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 theyear themonth theday }
+% \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
+ 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}
+% {\option{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.}
+% {\option{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.
+%
+% \spec{\item A string.}
+% {\item An integer giving the number of characters in the
+% string.}
+% {\option{none}}
+%
+% \begin{macrocode}
+FUNCTION {character.length}
+ { 'u :=
+ #0 'charcount :=
+ { u empty$ not }
+ { u #2 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.}
+% {\option{end} The function looks at the end of the
+% given string.
+% \option{start} The function looks at the start of the
+% given string.}
+%
+% \begin{macrocode}
+FUNCTION {first.in.second}
+ { 's :=
+ duplicate$ empty$
+ { pop$ pop$ #0 }
+ { swap$ duplicate$ character.length 'a :=
+ swap$ duplicate$ character.length 'b :=
+ b a <
+ { pop$ pop$ #0 }
+ { s "end" =
+ { b a - #1 + global.max$ substring$ =
+ { #1 }
+ { #0
+ }if$
+ }
+ { #1 a substring$ =
+ { #1 }
+ { #0
+ }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.
+% \begin{macrocode}
+FUNCTION { get.character.type }
+ { duplicate$ empty$
+ { pop$ "other" }
+ { duplicate$ chr.to.int$
+ duplicate$ #47 > swap$ #58 < and
+ { pop$ "numeral" }
+ { chr.to.int$
+ duplicate$ #64 > swap$ duplicate$ #91 < swap$
+ duplicate$ #96 > swap$ #123 < and 'a.logical :=
+ and a.logical or
+ { "letter" }
+ { "other"
+ }if$
+ }if$
+ }if$
+ }
+% \end{macrocode}
+%
+% \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.}
+% {\option{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.}
+% {\option{none}}
+%
+% \begin{macrocode}
+FUNCTION { check }
+{ 't :=
+ duplicate$ empty$
+ { "empty " t * " in " * cite$ * warning$}
+ 'skip$
+ if$
+}
+% \end{macrocode}
+%
+% \DescribeEnv{either.or}
+% \changes{1.0c}{94/08/10}{Added the {\tt either.or}
+% housekeeping function, for use in {\tt j.cases}.}
+% 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.}
+% {\option{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}
+%
+% \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}
+% {\option{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}}
+% {\option{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}
+% {\option{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{ifthree.ifthree.might}
+% This outputs a pair of prefixes if the suffix to which they are
+% to be attached exists. Otherwise it outputs a null string.
+%
+% \spec{\item A string.
+% \item A string.
+% \item A string.}
+% {\item none}
+% {\option{none}}
+%
+% \begin{macrocode}
+FUNCTION {must.ifthree.might}
+ { 't :=
+ duplicate$ empty$
+ { pop$ write$ }
+ { swap$ empty.to.null
+ swap$ empty.to.null
+ t * * write$ }
+ if$
+ }
+% \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.}
+% {\option{endlabel} Combines the text items in the same order
+% in
+% which they are found.
+% \option{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.}
+% {\option{n} yields the string unchanged.
+% \option{t} yields
+% all lower case letters except for the first.
+% \option{l} yields all lower case letters.
+% \option{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.}
+% {\option{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.}
+% {\option{none}}
+%
+% \begin{macrocode}
+FUNCTION { gather.chars }
+ { 't :=
+ { t empty$ not
+ t #1 #1 substring$ get.character.type
+ "other" = and }
+ { t #2 global.max$ substring$ 't :=
+ }while$
+ t #1 #1 substring$ duplicate$ get.character.type
+ "" swap$ duplicate$ 'u :=
+ t #2 global.max$ substring$ 't :=
+ { u = }
+ { * t #1 #1 substring$ duplicate$ get.character.type
+ duplicate$ u =
+ { t #2 global.max$ substring$ 't := }
+ { swap$ pop$
+ }if$
+ }while$
+ t swap$ u
+ }
+% \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\$}.}
+% {\option{short} will return only the
+% first number given in the string.
+% \option{full}
+% will return the page number, n-dashified.}
+% \changes{1.0e}{94/12/05}{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\$}}
+% {\option{firstinitial} Yields the form ``F.~Bennett, Jr.''
+% \option{lastonly}
+% Yields the form ``Bennett''
+% \option{full} yields ``Frank Bennett, Jr.''}
+%
+% \begin{macrocode}
+FUNCTION {format.names}
+ { 'u :=
+ duplicate$ empty$
+ 'skip$
+ { 's :=
+ #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.}
+% {\option{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.}
+% {\option{none}}
+%
+% \begin{macrocode}
+FUNCTION {fillout.a.year}
+ { duplicate$ character.length #2 =
+ { pop$ "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.}
+% {\option{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$
+ }if$
+ }if$
+ }if$
+ }if$
+ }if$
+ }if$
+ }if$
+ }if$
+ }if$
+ }if$
+ }if$
+ }if$
+ }
+% \end{macrocode}
+%
+%
+% \DescribeEnv{extract.date}
+% This function takes a labelled stack of numeric items,
+% and places its contents into the appropriate variables
+% representing elements of a date. It will probably
+% tolerate further enhancement, and should probably
+% deliver its result to the stack, rather than into
+% variables.
+%
+% 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 stack is always left empty, and there are no
+% toggles that affect the overall behaviour of the
+% function. 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", 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}
+ { "" 'theyear := "" 'themonth := "" 'theday :=
+ itemcount #0 =
+ { "some date or other is COMPLETELY empty in " cite$ * warning$ }
+ { itemcount #1 =
+ { pop$ fillout.a.year 'theyear := "" 'theday := "" 'themonth := }
+ { itemcount #2 =
+ { pop$ fillout.a.year 'theyear :=
+ pop$ 'themonth :=
+ "" 'theday :=
+ }
+ { itemcount #3 =
+ { date.specials
+ { pop$ fillout.a.year 'theyear :=
+ "month" =
+ { 'themonth :=
+ pop$ 'theday := }
+ { 'theday :=
+ pop$ 'themonth :=
+ }if$
+ }
+ { pop$ fillout.a.year 'theyear :=
+ pop$ 'theday :=
+ pop$ 'themonth :=
+ }if$
+ }
+ { "too many items for date in " cite$ * warning$
+ }if$
+ }if$
+ }if$
+ }if$
+ }
+% \end{macrocode}
+%
+% \DescribeEnv{format.month.name}
+% \changes{\LexiBib{} 1.0b}{94/08/09}{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.}
+% {\option{long} The month name placed on the stack will be
+% spelled out.
+% \option{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$ ""
+ }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{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.}
+% {\option{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.}
+% {\option{none}}
+%
+% \begin{macrocode}
+FUNCTION {format.jdate}
+ { duplicate$ #2 global.max$ substring$ 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 }
+ { duplicate$ "h" =
+ { t #1988 topup.date }
+ { "invalid Imperial calendar code in " cite$ * warning$
+ }if$
+ }if$
+ }if$
+ }if$
+ swap$
+ gather.chars
+ pop$ swap$
+ 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}
+% {\option{none}}
+%
+% \begin{macrocode}
+FUNCTION {format.date}
+ { empty.to.null 's :=
+ #0 'charcount :=
+ #0 'itemcount :=
+ #0 'date.specials :=
+ { s empty$ not }
+ { s 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$
+ "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$
+ "default"
+ }if$
+ }if$
+ }if$
+ }
+ { swap$ 's := pop$ "1"
+ "failed to parse date in " cite$ * warning$
+ "default"
+ }if$
+ }if$
+ itemcount #1 + 'itemcount :=
+ }while$
+ extract.date
+ }
+% \end{macrocode}
+%
+% \subsubsection{Entry type specific functions}
+% The functions below should not be used as general utilities;
+% they are designed specifically for use with a particular entry
+% type. While they could be placed directly into the entry
+% functions to which they apply, defining them separately
+% helps improve the transparency of the code.
+%
+% \DescribeEnv{j.format.division}
+% This function assembles the various fields relevant to the
+% division of a Japanese court into a single string.
+%
+% \spec{\item none}
+% {\item A single string}
+% {\option{none}}
+%
+% \begin{macrocode}
+FUNCTION {j.format.division}
+ { division empty$
+ { "" }
+ { dc.. court "end" first.in.second
+ { " no.~" 's := "endlabel" 't := }
+ { sc.. court "start" first.in.second
+ { "No.\ " 's := "frontlabel" 't := }
+ { " " 's := "endlabel" 't :=
+ }if$
+ }if$
+ }if$
+ division s divno t field.tag.no.combine
+ }
+% \end{macrocode}
+%
+% \DescribeEnv{format.thesis.type}
+% The function "format.thesis.type" returns either the
+% (case-changed) type field,
+% if it is defined, or else the default string already on the
+% stack
+% (like ``Master's thesis'' or ``PhD thesis'').\footnote{This
+% comment by Oren Patashnik.}
+%
+% \spec{\item One string, representing the default label for a
+% thesis}
+% {\item One string, to stand as the label for a thesis}
+% {\option{none}}
+% \begin{macrocode}
+%<*oldbdoc>
+FUNCTION {format.thesis.type}
+{ type empty$
+'skip$
+{ pop$
+type "t" change.case$
+}
+if$
+}
+%</oldbdoc>
+% \end{macrocode}
+%
+% \DescribeEnv{format.tr.number}
+% The function "format.tr.number" makes a string starting with
+% ``Technical Report''
+% (or type, if that field is defined), followed by the number if
+% there is one;
+% it returns the starting part (with a case change) even if there
+% is no number.
+% This is used at the beginning of a sentence.\footnote{This
+% comment by Oren Patashnik.}
+%
+% \spec{\item none}
+% {\item One string, the label for a technical report}
+% {\option{none}}
+%
+% \begin{macrocode}
+%<*oldbdoc>
+FUNCTION {format.tr.number}
+{ type empty$
+{ "Technical Report" }
+'type
+if$
+number empty$
+{ "t" change.case$ }
+{ number tie.or.space.connect }
+if$
+}
+%</oldbdoc>
+% \end{macrocode}
+%
+% \subsubsection{Entry type functions}
+% Now we define the type functions for all entry types that may
+% appear
+% in the {\tt*.bib} file---e.g., functions like `"article"' and
+% `"book"'. These
+% are the routines that actually generate the "*.bbl" file output
+% for
+% the entry. These must all precede the "READ" command. In
+% addition, the
+% style designer should have a function `"default.type"' for
+% unknown types.\footnote{This comment by Oren Patashnik.}
+%
+% \DescribeEnv{article}
+% This function performs the necessary operations for
+% exporting a valid \LexiTeX\ citation to an article.
+% For this and for all citation types defined in the
+% \LexiBib{} style, the goal is to provide reasonably
+% complete commentary, so that anyone wanting to
+% alter the behaviour of the style can set to work
+% with a fair degree of confidence about what needs to
+% be done to achieve a particular result.
+% \begin{macrocode}
+FUNCTION { article }
+% \end{macrocode}
+% The "article" entry is used for all kinds of material, so
+% it ends up as one of the most complex entries. Before we
+% do anything, we have to check whether the default \LexiTeX{}
+% bridges are acceptable. If the volume and the number are both
+% non-empty, we need to add a special set of substitute bridges.
+% \begin{macrocode}
+{ volume empty$ number empty$ and not
+ { "\bridges{,\ p.~}{,\ }{,\ }{\ at~}{\ at~}"
+ "" "" must.must.must
+ newline$ }
+ 'skip$
+ if$
+% \end{macrocode}
+% Then we write the citation leader, to prepare for outputting the
+% actual content of the citation text.
+% \begin{macrocode}
+ "\lexibib{article}{" cite$ "}{" must.must.must
+% \end{macrocode}
+% The author name is pushed to the stack, followed by a toggle
+% to trigger last-name-only formatting. Then the "format.names"
+% reduces this to a single, appropriately-formatted string,
+% possibly the null string. All that is left to do is push a
+% set a braces, a null string to make up three arguments to the
+% export routine, and write the lot on the output
+% file unconditionally, using "must.must.must".
+% \begin{macrocode}
+author "lastonly" format.names
+"}{"
+""
+must.must.must
+% \end{macrocode}
+% Next comes the title of the article. This is not specially
+% formatted; we simply push the title field, then a warning
+% string
+% followed by a check for whether it is empty or not, then
+% braces and a null string, and write again.
+% \begin{macrocode}
+title "title" check
+"}{"
+""
+must.must.must
+% \end{macrocode}
+% The next bit is actually rather thorny. Our first
+% formatting decision is based on whether or not there
+% is a "volume" for this source. If not, we adopt a
+% Commonwealth-style citation scheme, using the bracketed
+% year for the volume. This will be coupled with suppression
+% of the year in the final LexiTeX ``field''.
+% \begin{macrocode}
+volume empty$
+ { "[" year format.date theyear "] " must.must.must
+ number "\ " journal "journal" check might.ifone.must
+ }
+% \end{macrocode}
+% If there {{\em is\/} a volume, we make different formatting
+% decisions, depending on
+% whether an issue number exists for this source.
+% \begin{macrocode}
+ { number empty$
+% \end{macrocode}
+% If there is no number, we do as follows. We
+% push the volume, providing
+% a warning if it it is empty, then
+% a separating space, then the name of the journal, writing
+% all three on the output, or just the journal name if the
+% volume number is empty. This is a nice illustration of
+% the utility of the "might.ifone.must" export routine.
+% The braces are pushed and written separately.
+% \begin{macrocode}
+ { volume "volume" check
+ "\ "
+ journal "journal" check
+ might.ifone.must }
+% \end{macrocode}
+% If the "number" field was non-empty, then we do as follows.
+% The journal name goes up first, and is checked. Then the
+% bridge for the volume number, and the volume number itself
+% go up, both being checked. The "must.ifthree.might" export
+% routine will drop the bridge and number, if the volume number
+% was empty, although this will probably leave us with an incomplete
+% (but nice-looking) citation anyway. The we push a bridge to
+% the number, the issue number, and a null string,
+% and force all three on the
+% output (no need for conditions in this last action, since we
+% know already that "number" is non-empty.
+% \begin{macrocode}
+ { journal "journal" check
+ ", \\vol.~"
+ volume "volume" check
+ must.ifthree.might
+ ", no.~" number "\\" must.must.must
+ }if$
+ }if$
+% \end{macrocode}
+% Finally, we complete the second \LexiTeX{} argument
+% and start the next. The emply strings just take up space
+% of course.
+% \begin{macrocode}
+ "}{" "" "" must.must.must
+% \end{macrocode}
+% The Blue Book does not like page ranges
+% so we need to clean
+% out anything following a dash in the "pages" field. The
+% "short" option
+% toggles this behaviour on. We also check to see that the page
+% is not empty. This is followed by braces, a null string, and
+% output.
+% \begin{macrocode}
+pages "short" format.pages "pages" check
+"}{"
+""
+must.must.must
+% \end{macrocode}
+% We add the year next, but only if the "volume" field is
+% non-empty (if "volume" is empty, we'll have put the year
+% is as a bracketed volume number, Commonwealth-style.
+% We could use just the year (this is normal for Blue Book
+% style, but we'll add the month for good measure, if it's
+% been provided in the "year" field.
+% \begin{macrocode}
+volume empty$
+ 'skip$
+ { year format.date themonth "short" format.month.name
+ "\ " theyear might.ifone.must
+ }if$
+% \end{macrocode}
+% Finally, we have to tangle with cross-references.
+% Yuck. (Not a complaint about \BibTeX, just a general
+% response to the design problems inherent in the task).
+% Formatting depends on whether there is a "crossref" entry.
+% Hear that, guys? If you don't use the "crossref" field,
+% we'll short-change you on formatting service.
+% \begin{macrocode}
+crossref empty$
+% \end{macrocode}
+% If there is no "crossref", we just push a brace and a couple
+% of nulls, and write. Done! Hurray!
+% \begin{macrocode}
+{ "}" "" "" must.must.must }
+% \end{macrocode}
+% But if there {\em was\/} a "crossref", we've go work to do.
+% Darn. The first thing we do is have a look at "booktitle".
+% This should be non-null in this situation; there's no sense
+% setting up a cross-reference to an individual volume of
+% a journal unless there's something special to be said
+% about it.
+% \begin{macrocode}
+{ booktitle empty$
+% \end{macrocode}
+% So if no "booktitle" is found, we whinge and format
+% as for a no-cross-reference entry.
+% \begin{macrocode}
+ { "no booktitle (name of special issue) for "
+ cite$ "/" crossref * * * warning$
+ "}" "" "" must.must.must }
+% \end{macrocode}
+% If there {\em is\/} a "booktitle", though,
+% and if the "volume" field is non-empty (which
+% means that we just printed, or at least should
+% have printed, the year), we close the
+% parens following the year (which is opened by \LexiTeX),
+% and open another (which will be closed by \LexiTeX).
+% That's it for conditional punctuation; we follow
+% with "booktitle", which should be
+% the title or subject description of the special
+% issue of the journal.
+% \begin{macrocode}
+ { volume empty$ {""} {") ("} if$ booktitle "}" must.must.must}
+ if$
+}if$
+% \end{macrocode}
+% Add a fresh new line in the export file, and we're done! Whew!
+% \begin{macrocode}
+newline$
+}
+% \end{macrocode}
+%
+% \DescribeEnv{book}
+% This is the entry for books, which includes individual
+% volumes in a series, and multi-volume works with a single
+% title. Correct me if I'm wrong, but I think this latter
+% citation type is not supported by \BibTeX. \LexiBib{}
+% manages it by allowing the user to specify the volume
+% number in the text using the optional ":<number>:" argument to
+% the "\lexicite" tag.
+% \begin{macrocode}
+FUNCTION {book}
+% \end{macrocode}
+% After the opener, we push the opening macro tag for a book
+% entry, the nickname of the citation, and a couple of
+% braces. This is all mandatory and can safely be given
+% unconditional export.
+% \begin{macrocode}
+{ "\lexibib{book}{" cite$ "}{" must.must.must
+% \end{macrocode}
+% A non-empty "volume" field means we need a leading
+% volume number in the Blue Book style. If a volume
+% number (or anything else) is found in the "volume"
+% field of a book entry, we replace it with a
+% "volno" macro. This will expand in the document to
+% whatever the author has specified using the optional
+% ":<number>" argument to "\lexicite". For example,
+% volume 8 of "holdsworth" would be: "\lexicite:8:{holdsworth}".
+% \begin{macrocode}
+ volume empty$
+ { "" }
+ { "\volno " }
+ if$
+% \end{macrocode}
+% The author comes first. We push the contents of the
+% "author" field, then the toggle string ``"firstinitial"'',
+% and run the "format.names" function to produce the name
+% formatted properly for a book entry. Then we push
+% fa couple of braces
+% and force all three items ("\volno" or null, author, and
+% braces) onto the output.
+% \begin{macrocode}
+ author
+ "firstinitial" format.names "}{" must.must.must
+% \end{macrocode}
+% The title is very straightforward. We push the title, then
+% check to be sure it's non-empty, then a couple of braces
+% go up, filled out with a null string, and force all three
+% onto the output.
+% \begin{macrocode}
+ title "title" check "}{" "" must.must.must
+% \end{macrocode}
+% We're now in the final ``field'' of the \LexiTeX{} entry.
+% This is mainly for the year, but we also give the
+% name of the editor(s) or translator(s)
+% if present. If there is no
+% editor or translator, we'll put a series name here, to help identify
+% the source. We don't put both, because this would
+% confuse things (there can be book editors and
+% series editors too, and the Blue Book style is
+% too streamlined to distinguish the two elegantly).
+% So our first task is to see if there is an editor\ldots
+% \begin{macrocode}
+ editor empty$ translator empty$ and
+% \end{macrocode}
+% \ldots{} and if there is none, we put in a
+% series name if it exists.
+% The "series" \BibTeX{} field should be used for the
+% name of the series of which a volume forms a part,
+% but some folks might accidentally use "booktitle".
+% We'll be forgiving and accept it anyway.
+% \begin{macrocode}
+ { series empty$ booktitle empty$ and
+% \end{macrocode}
+% If both
+% "series" and "booktitle" are empty, we've nothing to do.
+% \begin{macrocode}
+ 'skip$
+% \end{macrocode}
+% If at least one is non-empty, we push both,
+% and cull them to just one using the "either.or" function.
+% If only one is non-empty, this function leaves that one;
+% if both are non-empty, the "either.or" function whinges
+% and chooses one arbitrarily.
+%
+% Next, we push a bridge and a series item number,
+% and a toggle for the "field.tag.no.combine" function.
+% The "endlabel" toggle causes this function to put
+% the bridge and the number after the series name,
+% if a number exists, and push the lot back as a single
+% item on the stack. Otherwise it leaves just the series
+% name.
+%
+% And last, we put up a comma to close, and do a mandatory
+% export of the lot.
+% \begin{macrocode}
+ { series booktitle either.or " No.~" number
+ "endlabel" field.tag.no.combine ", " "" must.must.must }
+ if$
+ }
+% \end{macrocode}
+% If either the editor or the translator fields were not empty,
+% we format the editor or translator name
+% instead, and put those details here.
+% \begin{macrocode}
+ { editor translator either.or "firstinitial" format.names
+% \end{macrocode}
+% We need to append the correct designator, either ``ed.''\ or
+% ``trans.''. The "either.or" function will use the second
+% item pushed if both are non-empty, so we take advantage of
+% this ``feature'' in making our choice of designators; the
+% "ed." or "eds." strings are only used if the "translator"
+% field is empty. And finally, we push a null string to
+% round out, and do a compulsory export.
+% \begin{macrocode}
+ translator empty$
+ { editor num.names$ #1 >
+ { " eds.\ " }
+ { " ed.\ " }
+ if$
+ }
+ { " trans.\ " }
+ if$
+ "" must.must.must
+ }if$
+% \end{macrocode}
+% We also need to indicate the edition, if any.
+% \begin{macrocode}
+ edition " ed.\ " "" might.ifone.must
+% \end{macrocode}
+% The year itself is easy. We push the year, do a check to issue
+% a warning if necessary, then run format.date over it,
+% which yields the year in "theyear", which can be pushed
+% back onto the stack. Then we fill out to six
+% \LexiTeX{} fields in
+% all, and do a compulsory export.
+% \begin{macrocode}
+ year "year" check format.date theyear "}{}{}" "" must.must.must
+% \end{macrocode}
+% A new line for a new macro, and we're done! Rejoice!
+% On to the next function definition!
+% \begin{macrocode}
+ newline$
+}
+% \end{macrocode}
+%
+% \DescribeEnv{incollection}
+% This is for those nasty entries that are created when someone
+% publishes an article in a collection of essays edited by someone
+% else.
+% \begin{macrocode}
+FUNCTION{incollection}
+{ "\lexibib{article}{" cite$ "}{" must.must.must
+ author "lastonly" format.names "author" check
+ "}{" "" must.must.must
+ title "title" check
+ "}{" "" must.must.must
+ chapter empty$
+ { "" }
+ { "\\" chapter " of \\" * * }
+ if$
+ booktitle "booktitle" check
+ "}{" must.must.must
+ pages "short" format.pages "pages" check
+ "}{" "" must.must.must
+% We're now in the final ``field'' of the \LexiTeX{} entry.
+% The coding here is the same as for a "book" entry; the
+% reader is referred to that entry for the commentary
+% on the following code.
+% \begin{macrocode}
+ editor empty$ translator empty$ and
+ { series empty$ booktitle empty$ and
+ 'skip$
+ { series booktitle either.or " No.~" number
+ "endlabel" field.tag.no.combine ", " "" must.must.must }
+ if$
+ }
+ { editor booktranslator either.or "firstinitial" format.names
+ booktranslator empty$
+ { editor num.names$ #1 >
+ { " eds.\ " }
+ { " ed.\ " }
+ if$
+ }
+ { " trans.\ " }
+ if$
+ "" must.must.must
+ }if$
+ edition " ed.\ " "" might.ifone.must
+ year "year" check format.date theyear "}" "" must.must.must
+ newline$
+}
+% \end{macrocode}
+%
+% \begin{macrocode}
+FUNCTION{booklet}
+{ "\lexibib{man}{" cite$ "}{" must.must.must
+ author "}{" "" must.must.must
+ "\\" title "\\}{" must.must.must
+ howpublished ", " "" might.ifone.must
+ year "year" check format.date theyear
+ "}{}{}" "" must.must.must
+ newline$
+}
+% \end{macrocode}
+% \changes{1.0g}{1994/12/12}{Added the `techreport' function,
+% to support draft article sent to Pedro Aphalo for comments.}
+% \begin{macrocode}
+FUNCTION {techreport}
+{"\lexibib{man}{" cite$ "}{" must.must.must
+ author "full" format.names "author" check
+ "}{" title "title" check must.must.must
+ "}{"
+ type empty$
+ { "Technical report" }
+ { type
+ }if$
+ " no.~" number "endlabel" field.tag.no.combine
+ ", " must.must.must
+ year format.date
+ themonth empty$
+ { "" }
+ { themonth "short" format.month.name "\ " * }
+ if$
+ theyear
+ "}{}{}{}" must.must.must
+ newline$
+ }
+% \end{macrocode}
+%
+% \paragraph{Cases} Law cases are all entered using the
+% {\tt\string@CASE} entry type. The formatting of citations
+% varies from jurisdiction to jurisdiction, so the behaviour
+% of citations of this type is controlled via a "jurisdiction"
+% field. Supported jurisdictions are listed in the user
+% guide. Below, the functions for each jurisdiction are
+% defined first, followed by the "case" function itself.
+%
+% \DescribeEnv{j.case}
+% This function applies to cases from Japan.
+% \begin{macrocode}
+FUNCTION { j.case }
+{ "\lexibib{jcase}{" cite$ "}{" must.must.must
+ "Decision of the " court "court" check "" must.must.must
+ " (" j.format.division ")" iftwo.might.iftwo
+ ", " "" "" must.must.must
+ casedate format.date themonth "short" format.month.name "\ "
+ theday must.must.must
+ ", " theyear "}{" must.must.must
+ volume empty$ not number empty$ not and
+ { journal "journal" check ", no.~" number must.must.must
+ ", vol.~" volume "" must.must.must }
+ { volume number either.or "\ " journal "journal" check
+ might.ifone.must
+ "}{" pages "}{" must.must.must
+ }if$
+ year "year" check empty.to.null format.date
+ themonth "short" format.month.name " " "" might.ifone.must
+ theday ", " "" might.ifone.must
+ theyear "}" "{}" must.must.must
+ newline$
+}
+% \end{macrocode}
+%
+% \DescribeEnv{e.case}
+% This function applies to English cases.
+% \begin{macrocode}
+FUNCTION { e.case }
+{ "\lexibib{ecase}{" cite$ "}{" must.must.must
+ title "title" check "}{" "" must.must.must
+ year "year" check format.date "[" theyear "] " must.must.must
+ journal "}{" "" must.must.must
+ pages "short" format.pages "}" "{}{}{}" must.must.must
+ newline$
+}
+% \end{macrocode}
+%
+% \DescribeEnv{p.case}
+% This function applies to Pakistani cases.
+% \begin{macrocode}
+FUNCTION {p.case}
+{e.case}
+% \end{macrocode}
+%
+% \DescribeEnv{us.case}
+% This function applies to U.S. cases.
+% \begin{macrocode}
+FUNCTION { us.case }
+{"\lexibib{case}{" cite$ "}{" must.must.must
+ title "title" check "}{" "" must.must.must
+ volume "\ " journal must.must.must
+ "}{" pages "}{" must.must.must
+ court "court" check "\ " year format.date theyear
+ might.ifone.must
+ "}{}{}" "" "" must.must.must
+ newline$
+}
+% \end{macrocode}
+
+% \DescribeEnv{case}
+% This function simply reads the contents of the "jurisdiction"
+% field, and invokes the appropriate case function.
+% \begin{macrocode}
+FUNCTION { case }
+ { jurisdiction empty.to.null duplicate$ "jurisdiction (sine qua non!)" check
+ "japan" =
+ { pop$ j.case }
+ { duplicate$ "england" =
+ { pop$ e.case }
+ { duplicate$ "pakistan" =
+ { pop$ p.case }
+ { duplicate$ "singapore" =
+ { pop$ e.case }
+ { pop$ us.case
+ }if$
+ }if$
+ }if$
+ }if$
+% \end{macrocode}
+% The following item adds annotations; this may be eliminated by
+% stripping with "noannotes".
+% \begin{macrocode}
+%<*!noannotes>
+annote empty.to.null write$ newline$
+%</!noannotes>
+ }
+% \end{macrocode}
+%
+% \DescribeEnv{j.statute}
+% This function applies to Japanese statutory materials.
+% \changes{\LexiBib 1.0c}{94/08/03}{Added support for Japanese statutes.}
+% \begin{macrocode}
+FUNCTION {j.statute}
+ { "\lexibib{jstatute}{" cite$ "}{" must.must.must
+ title "title" check "}{" "" must.must.must
+ "Law no.~" number "number" check " of "
+ iftwo.might.iftwo
+ year format.date theyear "}{}{}{}" "" must.must.must
+ newline$
+ }
+% \end{macrocode}
+%
+% \DescribeEnv{s.statute}
+% This function formats a statute entry for Singapore.
+% \begin{macrocode}
+FUNCTION { s.statute }
+{ "\lexibib{statute}{" cite$ "}{" must.must.must
+ title "title" check ", No.~" number
+ "got it" warning$ "endlabel" field.tag.no.combine
+ number empty$
+ { "\ " * }
+ { "\ of " * }
+ if$
+ year format.date theyear "}{" must.must.must
+ "}{}{}{}{}" "" "" must.must.must
+ newline$
+}
+% \end{macrocode}
+%
+% \DescribeEnv{statute}
+% This function selects the correct statute entry function.
+% \begin{macrocode}
+FUNCTION { statute }
+ { jurisdiction empty.to.null duplicate$
+ "japan" =
+ { pop$ j.statute }
+ { duplicate$ "singapore" =
+ { pop$ s.statute }
+ { pop$ "IMPORTANT: unknown jurisdiction for " cite$ * warning$
+ }if$
+ }if$
+ }
+% \end{macrocode}
+%
+% \DescribeEnv{default.type}
+% We use the "book" type as our default type. When "manual" is
+% completed, we should probably use that type instead.
+% \begin{macrocode}
+FUNCTION {default.type} { book }
+%</newbst>
+% \end{macrocode}
+%
+%
+% \subsection{Macro definitions}
+% We don't define any macros for abbreviating law journal
+% names. Instead, we will use Blue Book abbreviations
+% ``native'', with a special syntax (probably the full
+% form in syntax:
+% ``"\gobble{Accountant}{}"'' immediately after
+% the abbreviation) for resolving
+% ambiguous abbreviations. Meanwhile, trust me: use the
+% Blue Book abbreviations and take this upcoming facility
+% on faith. And besides, do you ever {\em need\/} to spell
+% out journal and reporter names?
+%
+% \subsection{Execution}
+% With all preliminaries out of the way, our first act is
+% to read in the entries from {\tt *.bib}..
+% \begin{macrocode}
+%<*newbst>
+READ
+% \end{macrocode}
+% Then we say ``Hi'' to the user. It would be nice to make this
+% the first message, but the structure of \BibTeX{} style files
+% dictates that it will follow any warnings about missing
+% entries.
+% \begin{macrocode}
+EXECUTE {hello}
+% \end{macrocode}
+%
+% \DescribeEnv{begin.bib}
+% \DescribeEnv{end.bib}
+% We need a couple of functions to write the starting and
+% finishing strings on to output file.
+% \begin{macrocode}
+FUNCTION {begin.bib}
+ { "\begin{lexilist}" write$ newline$
+ }
+FUNCTION {end.bib}
+ { "\end{lexilist}" write$ newline$
+ }
+% \end{macrocode}
+% Now we put it all together by running the entry-type
+% function on each entry selected from the database in turn,
+% bracketed by the starting and ending output functions
+% just defined.
+% \begin{macrocode}
+EXECUTE {begin.bib}
+ITERATE {call.type$}
+EXECUTE {end.bib}
+%</newbst>
+% \end{macrocode}
+% And, er, that's it!
+%
+% \section{Extraction utilities}
+% \subsection{The Driver}
+% Here is a simple driver for extracting the files in the
+% package.
+% \begin{macrocode}
+%<*driver>
+\def\batchfile{lexibib.ins}
+\input docstrip
+\preamble
+%
+\endpreamble
+\generateFile{lexibib.man}{t}{\from{lexibib.doc}{manual}}
+\generateFile{lexitest.tex}{t}{\from{lexibib.doc}{testdoc}}
+\postamble
+\endpostamble
+\generateFile{lexitest.bib}{t}{\from{lexibib.doc}{testbib}}
+\generateFile{lexibib.bst}{t}{\from{lexibib.doc}{newbst}}
+%</driver>
+% \end{macrocode}
+% \subsection{The Manual}
+% This is a simple driver that generates the documentation.
+% \begin{macrocode}
+%<*manual>
+\let\lawhline=\hline
+\documentclass{ltxdoc}
+\usepackage{lexitexm}
+% \makebooktable
+\EnableCrossrefs
+\RecordChanges % Gather update information
+\CodelineIndex % Index code by line number
+%\OnlyDescription % comment out for implementation details
+\begin{document}
+\DocInput{lexibib.doc}
+\end{document}
+%</manual>
+% \end{macrocode}
+% \begin{macrocode}
+%<*testbib>
+@STRING{tdc..="Tokyo District Court"}
+@STRING{minjibu..="Civil Division"}
+@STRING{ksh..="Kin'y{\=u} sh{\=o}ji hanrei"}
+@PREAMBLE{ "\newcommand{\kk}{K.K. } "
+ # "\newcommand{\v}{v.~} " }
+@book{tanaka-tekisuto,
+ author = {Akira Tanaka and others},
+ title = {Tekisutobukku Tegata, Kogitte H{\=o}},
+ year = {1987},
+ publisher = {Y{\=u}hikaku Bukkusu},
+ subject = {commtrans}
+}
+@case{tdc.s57.9.27,
+ journal = ksh..,
+ volume = {663},
+ annote = {
+ \holding{
+ \item The Business Suspension Sanction of the Notes
+Clearing Center falls
+ within the terms of the explicit exemption of Notes and
+Cheque Clearing
+ Centers from the terms of Anti-Monopoly Act section 8, as
+a practice
+ necessary to the specialized function of such Centers.
+ }},
+ court = tdc..,
+ division = minjibu..,
+ divno = {30},
+ casedate = {s57.9.27},
+ page = {35},
+ jurisdiction = {j},
+ subject = {commtrans: aml attack on clearing system}
+}
+@book{horitsu-jiten,
+ title = {H\=oritsu jiten},
+ year = {s11.3.10},
+ editor = {? Suehiro and ? Tanaka},
+ publisher = {Iwanami sh\=oten},
+ volume = {1},
+ subject = {general}
+}
+%</testbib>
+% \end{macrocode}
+% \begin{macrocode}
+%<*testdoc>
+\documentclass{article}
+\usepackage{lexitex}
+\begin{document}
+\bibliography{lexitest}
+\bibliographystyle{lexibib}
+Waffle burble.\footnote{\lexicite{tanaka-tekisuto}.}
+More waffle and burble.\footnote{\lexicite:2:{horitsu-jiten}.}
+\lexicite{tdc.s57.9.27}:
+\theholding
+\end{document}
+%</testdoc>
+% \end{macrocode}
+% \changes{no ver}{84/12/16}{ (HWT) Original `plain'
+% version, by Howard Trickey.}
+% \changes{no ver}{84/12/23}{ (LL) Some comments made
+% by Leslie Lamport.}
+% \changes{no ver}{85/2/16}{ (OP) Changes based on
+% LL's comments, Oren Patashnik.}
+% \changes{no ver}{85/2/17}{ (HWT) Template file and
+% other standard styles made.}
+% \changes{0.98b}{85/3/28}{ (OP) First
+% release, for BibTeX 0.98f.}
+% \changes{0.98c}{85/5/9}{ (OP) for BibTeX
+% 0.98i:
+% fixed Theoretical Computer Science macro name;
+% fixed the format.vol.num.pages function.}
+% \changes{0.99a}{88/1/24}{ (OP) for BibTeX
+% 0.99a, main changes:
+% assignment operator (:=) arguments reversed;
+% the preamble$ function outputs the database
+% PREAMBLE;
+% entry.max$ and global.max$ (built-in) variables
+% replace
+% entry.string.max and global.string.max functions;
+% alphabetizing by year then title, not just title;
+% many unnecessary ties removed; \it ==> \em;
+% the `alpha' style uses a superscripted `+'
+% instead of a
+% `*' for unnamed names in constructing the label;
+% the `abbrv' style now uses "Mar." and "Sept.";
+% the functions calc.label and presort now look at
+% just
+% the fields they're supposed to;
+% BOOKLET, MASTERSTHESIS, TECHREPORT use nonbook
+% titles;
+% INBOOK and INCOLLECTION take an optional type
+% (e.g.
+% type = "Section"), overriding the default
+% "chapter";
+% BOOK, INBOOK, INCOLLECTION, and PROCEEDINGS now
+% allow
+% either volume or number, not just volume;
+% INCOLLECTION now allows an edition and series
+% field;
+% PROCEEDINGS and INPROCEEDINGS now use the address
+% field
+% to tell where a conference was held;
+% INPROCEEDINGS and PROCEEDINGS now allow either
+% volume
+% or number, and also a series field;
+% MASTERSTHESIS and PHDTHESIS accept types other
+% than
+% "Master's thesis" and "PhD thesis";
+% UNPUBLISHED now outputs, in one block, note then
+% date;
+% MANUAL now prints out the organization in
+% the first block if the author field is empty;
+% MISC can't be empty---it requires some optional
+% field.}
+% \changes{0.99b}{88/3/23}{ (OP) For BibTeX
+% 0.99c---changed the three
+% erroneous occurrences of `{\tt cite }'
+% to `{\tt cite\$ }';
+% this
+% change didn't affect the four standard styles,
+% so the
+% 0.99a versions of those styles are still
+% current.}
+%
+% \changes{\LexiBib{} 1.0}{94/6/12}{ (FB) Copied into
+% {\tt btxbst.doc} to {\tt lexibib.doc} and commenced editing.}
+% \changes {\LexiBib{} 1.0a}{94/7/25}{(FB) First successful
+% trial of \LexiBib.}
+% \changes{\LexiBib{} 1.0b}{94/8/9}{(FB) Completed first
+% operational version, with date parsing, for use with
+% articles, books and Japanese case materials.}
+% \Finale \PrintIndex \PrintChanges
+
+
+