summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/biblatex-contrib/biblatex-chicago/latex/cmsendnotes.sty
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/biblatex-contrib/biblatex-chicago/latex/cmsendnotes.sty')
-rw-r--r--macros/latex/contrib/biblatex-contrib/biblatex-chicago/latex/cmsendnotes.sty560
1 files changed, 560 insertions, 0 deletions
diff --git a/macros/latex/contrib/biblatex-contrib/biblatex-chicago/latex/cmsendnotes.sty b/macros/latex/contrib/biblatex-contrib/biblatex-chicago/latex/cmsendnotes.sty
new file mode 100644
index 0000000000..5f6d430831
--- /dev/null
+++ b/macros/latex/contrib/biblatex-contrib/biblatex-chicago/latex/cmsendnotes.sty
@@ -0,0 +1,560 @@
+% Copyright (c) 2003 John Lavagnino
+% 2003 Ulrich Dirr
+% 2020 David Fussner
+%
+% This package is currently maintained by David Fussner.
+%
+% This work may be copied, distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version. The latest
+% version of this license is in http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later. This software is provided as is,
+% without warranty of any kind, either expressed or implied,
+% including, but not limited to, the implied warranties of
+% merchantability and fitness for a particular purpose.
+
+% This package is ultimately based on John Lavagnino's "endnotes"
+% package, and also on Ulrich Dirr's code, from comp.text.tex, adding
+% hyperref support to Lavagnino's package. Dirr's code has never, to
+% my knowledge, been released as a separate package. My own
+% contribution is to allow users easily to split the endnotes by part,
+% chapter, section, or subsection when they are printed all at once at
+% the end of a document, which is the arrangement the Chicago Manual
+% envisages for books by a single author. This arrangement was
+% possible before by using the \addtoendnotes command in your
+% document, but this was tricky to automate, hence the following.
+
+% Please see biblatex-chicago.pdf for details of how to use this
+% package.
+
+\ProvidesPackage{cmsendnotes}[2020/04/20 v 3.14 biblatex auxiliary package]
+
+\RequirePackage{kvoptions}
+\RequirePackage{endnotes}
+\RequirePackage{etoolbox}
+\RequirePackage{nameref}
+
+\SetupKeyvalOptions{%
+ family=cms@end,
+ prefix=cms@end@}%
+
+\DeclareStringOption{split}[chapter]
+
+\DeclareStringOption{headername}% 2
+
+\DeclareStringOption{subheadername}% 3
+
+\DeclareStringOption{runningname}% 4
+
+% \DeclareStringOption{introname}[\prefacename] (#5) now provided by
+% biblatex-chicago's noterefintro option
+
+%%% For general hyperref functionality
+
+\DeclareBoolOption[true]{hyper}%
+
+%%% Dirr's \ifenotelinks, "for back-links in the endnote section"
+
+\DeclareBoolOption[true]{enotelinks}%
+
+%%% In case users want to roll their own using \addtoendnotes or
+%%% separate sectioning commands
+
+\DeclareBoolOption{noheader}%
+
+%%% Stops the printing of the subhead when using split endnotes
+
+\DeclareBoolOption{nosubheader}%
+
+%%% Provides flush-left block formatting for endnote text, instead of
+%%% usual first-line indent
+
+\DeclareBoolOption{blocknotes}%
+
+%%% For attempting more elegantly to hide the zeros in section numbers
+
+%% \DeclareBoolOption{hidezeros}% Moved to cbx.
+
+\ProcessKeyvalOptions*
+
+%%% Dirr's hyperendnotes.sty, with CMS extensions, starts here
+
+\providetoggle{cms@entheader}
+\newcounter{Hendnote}
+\newcounter{cms@enttotal}
+\newcounter{cms@entprinted}
+
+%%% Hyperendnotes redefines portions of the endnotes package, now
+%%% further redefined for CMS
+
+%% The absence of a Roman zero messes with .ent file creation and
+%% printing, so we reluctantly redefine \thepart here
+
+\renewcommand{\thepart}{%
+ \ifnumequal{\csuse{c@part}}{0}%
+ {\@arabic{\c@part}}%
+ {\@Roman{\c@part}}}
+
+\let\cms@entlist\@empty
+
+% This allows splitting by "part" to work, suboptimally, with babel's
+% French option
+
+\ifdef{\ifFBPartNameFull}{\FBPartNameFullfalse}{}%
+
+%% This creates as many .ent files as there are different relevant
+%% sections, the relevant section being that given by the "split"
+%% option. It uses biblatex commands to patch the relevant section
+%% commands when they appear in the document. In the absence of the
+%% "split" option, it reverts to standard endnotes package .ent file
+%% handling.
+
+\ifx\cms@end@split\@empty
+\def\@openenotes{%
+ \immediate\openout\@enotes=\jobname.ent\relax
+ \global\@enotesopentrue}%
+\else
+\AtEndPreamble{%
+ \ifdefstring{\cms@end@split}{section}%
+ {\blx@refpatch@sect{section}{\cms@closechap}{1}%
+ \ifundef\chapter
+ {}%
+ {\blx@refpatch@chapter\cms@closechap}}%
+ {\ifdefstring{\cms@end@split}{subsection}%
+ {\blx@refpatch@sect{subsection}{\cms@closechap}{1}%
+ \ifundef\chapter
+ {}%
+ {\blx@refpatch@chapter\cms@closechap}}%
+ {\ifboolexpr{%
+ test {\ifdefstring{\cms@end@split}{chapter}}%
+ or
+ test {\ifdefstring{\cms@end@split}{part}}%
+ }%
+ {\csuse{blx@refpatch@\cms@end@split}\cms@closechap}%
+ {}}}}%
+\def\@openenotes{%
+ \stepcounter{cms@enttotal}%
+ \listxadd\cms@entlist{\csuse{the\cms@end@split}}%
+ \immediate\openout\@enotes=\jobname\csuse{the\cms@end@split}.ent\relax
+ \global\@enotesopentrue}%
+\fi
+
+\def\cms@closechap{%
+ \immediate\closeout\@enotes
+ \global\@enotesopenfalse}
+
+\long\def\addtoendnotes#1{%
+ \if@enotesopen \else \@openenotes \fi
+ \begingroup
+ \newlinechar='40
+ \let\protect\string
+ \immediate\write\@enotes{#1}%
+ \endgroup}
+
+\let\savedhref\href
+\let\savedurl\url
+
+\def\endnotemark{%
+ \@ifnextchar[%]
+ \@xendnotemark{%
+ \stepcounter{endnote}%
+ \protected@xdef\@theenmark{\theendnote}%
+ \protected@xdef\@theenvalue{\number\c@endnote}%
+ \@endnotemark}}%
+
+\def\@xendnotemark[#1]{%
+ \begingroup\c@endnote#1\relax
+ \unrestored@protected@xdef\@theenmark{\theendnote}%
+ \unrestored@protected@xdef\@theenvalue{\number\c@endnote}%
+ \endgroup
+ \@endnotemark}%
+
+\def\endnotetext{%
+ \@ifnextchar[%]
+ \@xendnotenext{%
+ \protected@xdef\@theenmark{\theendnote}%
+ \protected@xdef\@theenvalue{\number\c@endnote}%
+ \@endnotetext}}%
+
+\def\@xendnotenext[#1]{%
+ \begingroup
+ \c@endnote=#1\relax
+ \unrestored@protected@xdef\@theenmark{\theendnote}%
+ \unrestored@protected@xdef\@theenvalue{\number\c@endnote}%
+ \endgroup
+ \@endnotetext}%
+
+\def\endnote{%
+ \@ifnextchar[%]
+ \@xendnote{%
+ \stepcounter{endnote}%
+ \protected@xdef\@theenmark{\theendnote}%
+ \protected@xdef\@theenvalue{\number\c@endnote}%
+ \@endnotemark\@endnotetext}}%
+
+\def\@xendnote[#1]{%
+ \begingroup
+ \c@endnote=#1\relax
+ \unrestored@protected@xdef\@theenmark{\theendnote}%
+ \unrestored@protected@xdef\@theenvalue{\number\c@endnote}%
+ \show\@theenvalue
+ \endgroup
+ \@endnotemark\@endnotetext}%
+
+%% This macro is part of the core of the endnotes and hyperendnotes
+%% code, with cmsendnotes booleans to control when the hyper
+%% extensions are used.
+
+\def\@endnotemark{%
+ \leavevmode
+ \ifhmode
+ \edef\@x@sf{\the\spacefactor}\nobreak
+ \fi
+ \ifcms@end@hyper
+ \ifcms@end@enotelinks
+ \expandafter\@firstofone
+ \else
+ \expandafter\@gobble
+ \fi
+ {%
+ \Hy@raisedlink{%
+ \hyper@@anchor{Hendnotepage.\@theenvalue}{\empty}%
+ }%
+ }%
+ \hyper@linkstart{link}{Hendnote.\@theenvalue}%
+ \makeenmark
+ \hyper@linkend
+ \else
+ \makeenmark
+ \fi
+ \ifhmode
+ \spacefactor\@x@sf
+ \fi
+ \relax}%
+
+\long\def\@endnotetext#1{%
+ \if@enotesopen
+ \else
+ \@openenotes
+ \fi
+ \immediate\write\@enotes{%
+ \@doanenote{\@theenmark}{\@theenvalue}%
+ }%
+ \begingroup
+ \def\next{#1}%
+ \newlinechar='40
+ \immediate\write\@enotes{\meaning\next}%
+ \endgroup
+ \immediate\write\@enotes{%
+ \@endanenote}}%
+
+%% This new command prints each .ent file separately, with
+%% configurable headings. With an optional argument, it prints only
+%% that particular .ent file, again with configurable heading. If
+%% the "split" option isn't set, it reverts to the standard endnotes
+%% package command \theendnotes. The starred version prints no
+%% headings at all, just the notes.
+
+\newrobustcmd*{\theendnotesbypart}{\@ifstar\@theendnotesbypart%
+ \@@theendnotesbypart}%
+
+\newcommand*{\@@theendnotesbypart}[1][]{%
+ \ifcsvoid{cms@end@split}%
+ {\theendnotes}%
+ {\ifblank{#1}%
+ {\def\do##1{%
+ \IfFileExists{\jobname##1.ent}%
+ {\theendnotesbypart@i[##1]%
+ \stepcounter{cms@entprinted}}%
+ {}}%
+ \dolistcsloop{cms@entlist}}%
+ {\toggletrue{cms@entheader}%
+ \theendnotesbypart@i[#1]%
+ \togglefalse{cms@entheader}}}}%
+
+\newcommand*{\@theendnotesbypart}[1][]{%
+ \cms@end@noheadertrue
+ \ifcsvoid{cms@end@split}%
+ {\theendnotes}%
+ {\ifblank{#1}%
+ {\def\do##1{%
+ \IfFileExists{\jobname##1.ent}%
+ {\theendnotesbypart@i[##1]%
+ \stepcounter{cms@entprinted}}%
+ {}}%
+ \dolistcsloop{cms@entlist}}%
+ {\toggletrue{cms@entheader}%
+ \cms@end@nosubheadertrue%
+ \theendnotesbypart@i[#1]%
+ \togglefalse{cms@entheader}%
+ \cms@end@nosubheaderfalse}}\cms@end@noheaderfalse}%
+
+\def\theendnotesbypart@i[#1]{%
+ \ifx\cms@end@headername\@empty
+ \def\cms@end@headername{\notesname}\fi
+ \theendnotesbypart@ii[#1]{\cms@end@headername}}%
+
+\def\cms@choose@subhead{%
+ \ifcsname \cms@end@split name\endcsname%
+ \csuse{\csuse{cms@end@split}name}%
+ \else
+ \cms@end@split%
+ \fi}
+
+\def\cms@localize@subhead{%
+ \ifcsname \cms@end@subheadername name\endcsname%
+ \csuse{\csuse{cms@end@subheadername}name}%
+ \else
+ \cms@end@subheadername%
+ \fi}
+
+\def\theendnotesbypart@ii[#1]#2{%
+ \ifx\cms@end@subheadername\@empty
+ \theendnotesbypart@iii[#1]#2{\cms@choose@subhead}%
+ \else
+ \theendnotesbypart@iii[#1]#2{\cms@localize@subhead}%
+ \fi}
+
+\def\theendnotesbypart@iii[#1]#2#3{%
+ \ifx\cms@end@runningname\@empty
+ \def\cms@end@runningname{Notes to}\fi
+ \theendnotesbypart@iv[#1]#2#3{\cms@end@runningname}}%
+
+\def\cms@localize@introname{%
+ \ifcsname \cms@note@introname name\endcsname%
+ \csuse{\csuse{cms@note@introname}name}%
+ \else
+ \cms@note@introname%
+ \fi}
+
+\def\theendnotesbypart@iv[#1]#2#3#4{%
+ \ifdefvoid{\cms@note@introname}%
+ {\theendnotesbypart@v[#1]#2#3#4[]}%
+ {\theendnotesbypart@v[#1]#2#3#4[\cms@localize@introname]}}%
+
+%%% [sec. no.]{gen. title}{sec. title}{#2 + prepos.}[intro. name]
+
+\def\theendnotesbypart@v[#1]#2#3#4[#5]{%
+ \immediate\closeout\@enotes
+ \global\@enotesopenfalse
+ \begingroup
+ \makeatletter
+ \edef\@tempa{`\string>}%
+ \ifnum\catcode\@tempa=12
+ \let\@ResetGT\relax
+ \else
+ \edef\@ResetGT{\noexpand\catcode\@tempa=\the\catcode\@tempa}%
+ \@makeother\>%
+ \fi
+ \def\@doanenote##1##2##3>{%
+ \def\@theenmark{##1}%
+ \def\@theenvalue{##2}%
+ \par
+ \enoteskip% Configurable vertical gap between endnotes
+ \begingroup
+ \def\href{\expandafter\savedhref}%
+ \def\url{\expandafter\savedurl}%
+ \@ResetGT
+ \edef\@currentlabel{\csname p@endnote\endcsname\@theenmark}%
+ \toggletrue{blx@footnote}\toggletrue{cms@endnote}%
+ \enoteformat
+ }%
+ \def\@endanenote{%
+ \par\endgroup
+ }%
+ % Redefine, how numbers are formatted in the endnotes-section:
+ \renewcommand*\@makeenmark{%
+ \hbox{\normalfont\@theenmark.~}%
+ }%
+ % header(s) of endnote section(s)
+ \def\enoteheader{\section*{\MakeCapital{#2}}}%
+ \def\enotesubheader{%
+ \subsection*{\MakeCapital{#3}\ \zero@sect{#1}}%
+ \@mkboth{\MakeUppercase{#4\ #3}\ \zero@sect{#1}}%
+ {\MakeUppercase{#4\ #3}\ \zero@sect{#1}}%
+ \mbox{}\par\vskip-\baselineskip}%
+ \def\enotepartheader{%
+ \subsection*{\MakeCapital{#3}\ \zero@sect{#1}}%
+ \@mkboth{\MakeUppercase{#4\ #3}\ \zero@sect{#1}}%
+ {\MakeUppercase{#4\ #3}\ \zero@sect{#1}}%
+ \mbox{}\par\vskip-\baselineskip}%
+ \def\intropartheader{%
+ \subsection*{\MakeCapital{#5},\ \zeri@intro{#1}}%
+ \@mkboth{\MakeUppercase{#4\ #5}\ \zeri@intro{#1}}%
+ {\MakeUppercase{#4\ #5}\ \zeri@intro{#1}}%
+ \mbox{}\par\vskip-\baselineskip}%
+ \def\introsubheader{%
+ \subsection*{\MakeCapital{#5}}%
+ \@mkboth{\MakeUppercase{#4\ #5}}%
+ {\MakeUppercase{#4\ #5}}%
+ \mbox{}\par\vskip-\baselineskip}%
+ % Tests for which header(s), if any, to print
+ \ifcms@end@noheader
+ \let\enoteheader\relax\fi
+ \ifcms@end@nosubheader
+ \ifcms@end@noheader
+ \else
+ \iftoggle{cms@entheader}%
+ {}%
+ {\ifnumgreater{\value{cms@entprinted}}{0}%
+ {}%
+ {\enoteheader\mbox{}\par\vskip-\baselineskip}}\fi%
+ \else
+ \ifboolexpr{%
+ test {\ifblank{#5}}%
+ or
+ not test {\IfBeginWith{#1}{0}}%
+ }%
+ {\iftoggle{cms@entheader}%
+ {\enotepartheader}%
+ {\ifnumgreater{\value{cms@entprinted}}{0}%
+ {\enotesubheader}%
+ {\enoteheader\enotesubheader}}}%
+ {\ifboolexpr{%
+ test {\IfBeginWith{#1}{0.}}%
+ or
+ test {\IfBeginWith{#1}{0,}}%
+ }%
+ {\IfInteger{#1}
+ {\iftoggle{cms@entheader}%
+ {\introsubheader}%
+ {\ifnumgreater{\value{cms@entprinted}}{0}%
+ {\introsubheader}%
+ {\enoteheader\introsubheader}}}%
+ {\StrGobbleLeft{\@xs@afterinteger}{1}[\temp@r]%
+ \IfEq{\temp@r}{0}%
+ {\iftoggle{cms@entheader}%
+ {\introsubheader}%
+ {\ifnumgreater{\value{cms@entprinted}}{0}%
+ {\introsubheader}%
+ {\enoteheader\introsubheader}}}%
+ {\iftoggle{cms@entheader}%
+ {\intropartheader}%
+ {\ifnumgreater{\value{cms@entprinted}}{0}%
+ {\intropartheader}%
+ {\enoteheader\intropartheader}}}}}%
+ {\iftoggle{cms@entheader}%
+ {\introsubheader}%
+ {\ifnumgreater{\value{cms@entprinted}}{0}%
+ {\introsubheader}%
+ {\enoteheader\introsubheader}}}}\fi%
+ % font-size of endnotes -- by default set to \small
+ \enotesize
+ \input{\jobname#1.ent}%\cms@input@ent%
+ \endgroup}%
+
+%% An inelegant kludge attempting to remove zeros from section numbers
+%% while retaining minimal descriptive accuracy
+
+%\newrobustcmd*{\cmspref}{\emph{pref}}% Moved to .cbx file
+
+\newrobustcmd*{\zero@sect}[1]{%
+ \IfBeginWith{#1}{0}%
+ {#1}%
+ {\iftoggle{cms@hidezeros}
+ {\StrSubstitute{#1}{.0.0}{.1\ (\cmspref)}[\temp@a]%
+ \StrSubstitute{\temp@a}{,0,0}{,1\ (\cmspref)}[\temp@a]%
+ \StrSubstitute{\temp@a}{.0.}{.\cmspref.}[\temp@a]%
+ \StrSubstitute{\temp@a}{,0,}{,\cmspref,}[\temp@a]%
+ \StrSubstitute{\temp@a}{.0}{.1\ (\cmspref)}[\temp@a]%
+ \StrSubstitute{\temp@a}{,0}{,1\ (\cmspref)}}%
+ {#1}}}%
+
+\newrobustcmd*{\zeri@intro}[1]{%
+ \cmsintrosection\ \StrGobbleLeft{#1}{2}}%
+
+\def\enoteheading{\section*{\notesname}
+ \@mkboth{\MakeUppercase{\notesname}}%
+ {\MakeUppercase{\notesname}}%
+ \mbox{}\par\vskip-\baselineskip}
+
+\def\theendnotes{%
+ \immediate\closeout\@enotes
+ \global\@enotesopenfalse
+ \begingroup
+ \makeatletter
+ \edef\@tempa{`\string>}%
+ \ifnum\catcode\@tempa=12
+ \let\@ResetGT\relax
+ \else
+ \edef\@ResetGT{\noexpand\catcode\@tempa=\the\catcode\@tempa}%
+ \@makeother\>%
+ \fi
+ \def\@doanenote##1##2##3>{%
+ \def\@theenmark{##1}%
+ \def\@theenvalue{##2}%
+ \par
+ \enoteskip% Configurable vertical gap between endnotes
+ \begingroup
+ \def\href{\expandafter\savedhref}%
+ \def\url{\expandafter\savedurl}%
+ \@ResetGT
+ \edef\@currentlabel{\csname p@endnote\endcsname\@theenmark}%
+ \enoteformat
+ }%
+ \def\@endanenote{%
+ \par\endgroup
+ }%
+ % Redefine, how numbers are formatted in the endnotes-section:
+ \renewcommand*\@makeenmark{%
+ \hbox{\normalfont\@theenmark.~}%
+ }%
+ % header of endnotes-section, defined by endnotes.sty, with CMS
+ % option not to print it at all
+ \ifcms@end@noheader
+ \else
+ \enoteheading
+ \fi
+ % font-size of endnotes
+ \enotesize
+ \input{\jobname.ent}%\cms@input@ent%
+ \endgroup}%
+
+%% The second core part of the hyperendnotes code, again with CMS
+%% booleans to control when the hyperref functionality is switched on
+
+\def\enoteformat{%
+ \ifcms@end@blocknotes
+ \rightskip\z@
+ \leftskip1.8em
+ \parindent\z@
+ \else
+ \rightskip\z@
+ \leftskip\z@
+ \parindent1.8em
+ \fi
+ \leavevmode\llap{%
+ \setcounter{Hendnote}{\@theenvalue}%
+ \addtocounter{Hendnote}{-1}%
+ \refstepcounter{Hendnote}%
+ \ifcms@end@hyper
+ \ifcms@end@enotelinks
+ \expandafter\@secondoftwo
+ \else
+ \expandafter\@firstoftwo
+ \fi
+ {\@firstofone}%
+ {\hyperlink{Hendnotepage.\@theenvalue}}%
+ {\makeenmark}%
+ \else
+ \makeenmark
+ \fi}}%
+
+%%% Here the hyperendnotes code stops redefining portions of
+%%% the endnotes package
+
+%%% This sets the CMS default, which is to turn on both the general
+%%% hyperref functionality and the back-links from the endnotes
+%%% section to the main text, assuming that the hyperref package is
+%%% loaded. If it isn't, we don't. Also, set defaults for two
+%%% formatting macros.
+
+\AtEndPreamble{%
+ \@ifpackageloaded{hyperref}%
+ {}{\cms@end@hyperfalse}}%
+
+\def\enotesize{\small}
+\let\enoteskip\relax
+
+\endinput