% \iffalse meta-comment
% vim: textwidth=75
%<*internal>
\iffalse
%</internal>
%<*readme>
|
-------:| -----------------------------------------------------------------
  icite:| Make Indices locorum citatorum
 Author:| Robert Alessi
 E-mail:| alessi@robertalessi.net
License:| Released under the GNU General Public License v3 or later
    See:| http://www.gnu.org/licenses/


Short description:
Some text about the package: probably the same as the abstract.
%</readme>
%<*internal>
\fi
\def\nameofplainTeX{plain}
\ifx\fmtname\nameofplainTeX\else
  \expandafter\begingroup
\fi
%</internal>
%<*install>
\input docstrip.tex
\keepsilent
\askforoverwritefalse
\preamble

Copyright (C) 2019 by Robert Alessi <alessi@robertalessi.net>

Please send error reports and suggestions for improvements to Robert
Alessi <alessi@robertalessi.net>

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see
<http://www.gnu.org/licenses/>.

This work consists of the file icite.dtx and a Makefile.
Running "make" generates the derived files README, icite.pdf and icite.sty.
Running "make inst" installs the files in the user's TeX tree.
Running "make install" installs the files in the local TeX tree.

\endpreamble

\usedir{tex/latex/icite}
\generate{
  \file{\jobname.sty}{\from{\jobname.dtx}{package}}
}
%</install>
%<install>\endbatchfile
%<*internal>
\usedir{source/latex/icite}
\generate{
  \file{\jobname.ins}{\from{\jobname.dtx}{install}}
}
\nopreamble\nopostamble
\usedir{doc/latex/icite}
\generate{
  \file{README.txt}{\from{\jobname.dtx}{readme}}
}
\ifx\fmtname\nameofplainTeX
  \expandafter\endbatchfile
\else
  \expandafter\endgroup
\fi
%</internal>
% \fi
%
% \iffalse
%<*driver>
\ProvidesFile{icite.dtx}
%</driver>
%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%<package>\ProvidesPackage{icite}
%<*package>
    [2019/02/22 v1.00 Make Indices locorum citatorum]
%</package>
%<*driver>
\documentclass{ltxdoc}
\usepackage[letterpaper,margin=25mm,left=50mm,nohead]{geometry}
\usepackage{dox}
\usepackage{\jobname}
\usepackage{metalogox}
\usepackage{hyperxmp}
\usepackage{uri}
\usepackage[numbered]{hypdoc}
\hypersetup{unicode=true, colorlinks, allcolors=blue,
  linktocpage=true, pdfauthor={Robert Alessi}, pdftitle={The
    icite package}, pdfcontactemail={alessi@robertalessi.net},
  pdfcontacturl={http://www.robertalessi.net/icite},
  pdfcopyright={Copyright (C) 2019 Robert Alessi
    <alessi@robertalessi.net>. This document is licensed under the
    Creative Commons Attribution-ShareAlike 4.0 International
    License. To view a copy of this license, visit
    http://creativecommons.org/licenses/by-sa/4.0/ or send a letter to
    Creative Commons, PO Box 1866, Mountain View, CA 94042, USA.},
  pdflicenseurl={https://creativecommons.org/licenses/by-sa/4.0/legalcode},
  pdfmetalang={en-US}, pdftype={Text}, pdfkeywords={bibtex, biblatex,
    indexing}}
\usepackage[lot]{multitoc}
\usepackage{fontspec}
\setmainfont{Old Standard}[RawFeature={+ss05;+ss06}]
\usepackage{newunicodechar}
\newunicodechar{ǧ}{ǧ} % Old Standard does not include ǧ/Ǧ
\newunicodechar{Ǧ}{Ǧ} %
\usepackage{csquotes}
\usepackage{hologo,metalogox}
\usepackage{relsize}
\usepackage{units}
\usepackage{minted}
\usepackage[contents]{colordoc}
\newcommand{\package}[1]{\textsf{#1}\index{#1=#1 (package)}}
\usepackage{tikz}
\usepackage[breakable, skins, xparse, minted]{tcolorbox}
\tcbset{colback=white, boxrule=.15mm, colframe=red!50!white, left=6mm,
  breakable}
\usepackage{etoc}
\etocsettocdepth{paragraph}
\newcommand{\icitetableofcontents}{%
  \begingroup
  \etocsetstyle{section}{}{}
  {\etocsavedsectiontocline{%
      \numberline{\etocnumber}\etocname}{\etocpage}}{}
  \etocsetstyle{subsection}{}{}
  {\etocsavedsubsectiontocline{%
      \numberline{\etocnumber}\etocname}{\etocpage}}{}%
  \etocsetstyle{subsubsection}{}{}
  {\etocsavedsubsubsectiontocline{%
      \numberline{\etocnumber}\etocname}{\etocpage}}{}%
  \etocsetstyle{paragraph}{}{\leftskip2cm\rightskip 2.2em \parfillskip
    0pt plus 1fil\relax \nobreak}
  {\noindent\etocname{} \etocpage{} }{\par}%
  \etocmulticolstyle[2]{\section*{Contents}}
  \pdfbookmark[1]{Contents}{toc}
  \tableofcontents
  \endgroup}
\EnableCrossrefs
\CodelineIndex
\RecordChanges
%\OnlyDescription
\begin{document}
  \DocInput{\jobname.dtx}
 \PrintChanges
 \PrintIndex
\end{document}
%</driver>
% \fi
%
% \GetFileInfo{\jobname.dtx}
% \DoNotIndex{\newcommand,\newenvironment}
%
% \title{\tcbox[colframe=black, enhanced, tikznode, drop lifted
% shadow, colback=white, boxrule=.25mm]{%
% The \textsf{icite} package\\
% \emph{Indices locorum citatorum}\\
% \fileversion\ --- \filedate}}
%  
% \author{Robert Alessi \\
% \href{mailto:alessi@robertalessi.net?Subject=icite package}%
% {\texttt{alessi@robertalessi.net}}}
% 
% \date{}
%
% \maketitle
% \footnotesize
% \icitetableofcontents
% \normalsize
%
%\changes{v1.00}{2019/02/22}{First public release}
%
% \begin{abstract}
% ==== Put abstract text here. ====
% \end{abstract}
%
% \section{Usage}
%
% ==== Put descriptive text here. ====
%
% \DescribeMacro{\dummyMacro}
% This macro does nothing.\index{doing nothing|usage} It is merely an
% example.  If this were a real macro, you would put a paragraph here
% describing what the macro is supposed to do, what its mandatory and
% optional arguments are, and so forth.
% \DescribeEnv{dummyEnv}
% This environment does nothing.  It is merely an example.
% If this were a real environment, you would put a paragraph here
% describing what the environment is supposed to do, what its
% mandatory and optional arguments are, and so forth.
%\iffalse
%<*example>
%\fi
\begin{tcblisting}{minted options=linenos}
  \emph{tchic}
\end{tcblisting}
%\iffalse
%</example>
%\fi
%\iffalse
%<*example>
%\fi
\begin{tcblisting}{minted options=linenos, listing only}
\vroum[tchic]{tchic}
\end{tcblisting}
%\iffalse
%</example>
%\fi
%
%\StopEventually{}
%
% \section{Implementation}
%
% \iffalse
%<*package>
% \fi
% Declare the global options, and define them:
%    \begin{macrocode}
\RequirePackage{xkeyval}
\DeclareOptionX{citecmd}[cite]{\def\ic@dfltcit{#1}}
\newif\ifdefault@index
\newif\ifno@index
\DeclareOptionX{defaultindex}[loccit]{
  \edef\@tempa{#1}
  \edef\@none{none}
  \ifx\@tempa\@none
  \no@indextrue
  \else
  \default@indextrue
  \def\ic@dfltind{#1}
  \fi
}
\ExecuteOptionsX{citecmd}
\ProcessOptionsX\relax
%    \end{macrocode}
% The following packages are required by \package{icite}:
%    \begin{macrocode}
\RequirePackage{xparse}
\RequirePackage{datatool}
\RequirePackage{usebib}
%    \end{macrocode}
% Define fields to be used by \package{icite}:
%    \begin{macrocode}
\define@reuse@key{author}
\define@reuse@key{indexauthor}
\define@reuse@key{sortname}
\define@reuse@key{title}
\define@reuse@key{shorttitle}
\define@reuse@key{indextitle}
\define@reuse@key{indexsorttitle}
\define@reuse@key{entrysubtype}
%    \end{macrocode}
% This is the same as \cs{usebibentry} from \package{ebib}, but it
% does not return an error if the entry field is not found:
%    \begin{macrocode}
\def\get@bibentry#1#2{\@ifundefined{reuse@#1@#2}{}
  {\@nameuse{reuse@#1@#2}}}
%    \end{macrocode}
% Create a new database which \package{icite} will use to connect
% Bib\LaTeX\ \enquote*{subtypes} to indices.
%    \begin{macrocode}
\DTLnewdb{icite@indices}
%    \end{macrocode}
% \DescribeMacro{\IndexSubtypeAs} \cs{IndexSubtypeAs} take two mandatory
% arguments: 1. Any given keyword used to specify an
% \enquote*{entrysubtype} in the bibliographical database and 2. The
% index in which the authors matching that subtype must go. This
% command is to be found in the preamble only.
%    \begin{macrocode}
\NewDocumentCommand{\IndexSubtypeAs}{m m}{%
  \DTLnewrow{icite@indices}
  \DTLnewdbentry{icite@indices}{subtype}{#1}
  \DTLnewdbentry{icite@indices}{index}{#2}
}
\@onlypreamble\IndexSubtypeAs
\AtBeginDocument{
  \DTLifdbempty{icite@indices}{\IndexSubtypeAs{\relax}{\relax}}{}
}
%    \end{macrocode}
% \DescribeMacro{\icite} \cs{icite} both inserts a formatted citation
% and an entry in the \emph{index locorum citatorum}. It is to be used
% in place of any \hologo{BibTeX} or Bib\LaTeX\ citation command the
% syntax of which is
% \cs{command}\oarg{pre}\oarg{post}\marg{key}. \cs{icite} further
% accepts an optional argument should one wish to specify the
% citation command to be used, like so:\\
% \cs{icite}\oarg{pre}\oarg{post}\marg{key}\oarg{command}\\
% Only standard citation commands are accepted, with the exception of
% qualified citation lists or so-called \enquote*{multicite} commands.
%    \begin{macrocode}
\NewDocumentCommand{\icite}{o o m O{\ic@dfltcit}}{%
  \edef\@subtype{\get@bibentry{#3}{entrysubtype}}%
  \edef\@author{\get@bibentry{#3}{author}}%
  \edef\@indexauthor{\get@bibentry{#3}{indexauthor}}%
  \edef\@sortname{\get@bibentry{#3}{sortname}}%
  \edef\@indexsorttitle{\get@bibentry{#3}{indexsorttitle}}%
  \edef\@indextitle{\get@bibentry{#3}{indextitle}}%
  \edef\@shorttitle{\get@bibentry{#3}{shorttitle}}%
  \edef\@title{\get@bibentry{#3}{title}}%
  \ifx\@indexauthor\empty
      \def\@useauthor{\@author}%
    \else
      \def\@useauthor{\@indexauthor}%
    \fi
  \ifx\@sortname\empty
    \def\@sortedauthor{\@useauthor}%
  \else
    \def\@sortedauthor{{\@sortname}@\@useauthor}%
  \fi
  \ifx\@indextitle\empty
    \ifx\@shorttitle\empty
      \def\@usetitle{\@title}%
    \else
      \def\@usetitle{\@shorttitle}%
    \fi
  \else
    \def\@usetitle{\@indextitle}%
  \fi
  \ifx\@indexsorttitle\empty
    \def\@sortedtitle{{\@usetitle}@\emph{\@usetitle}}%
  \else
    \def\@sortedtitle{{\@indexsorttitle}@\emph{\@usetitle}}%
  \fi
  \IfNoValueTF{#1}%
  {\DTLforeach*{icite@indices}{\icite@subtype=subtype,\icite@index=index}{%
    \ifx\icite@subtype\@subtype%
    \index[\icite@index]{\@sortedauthor!\@sortedtitle}%
    \else%
    \ifno@index\else
    \ifdefault@index%
    \index[\ic@dfltind]{\@sortedauthor!\@sortedtitle}%
    \else%
    \index{\@sortedauthor!\@sortedtitle}%
    \fi\fi\fi}%
    \csname #4\endcsname{#3}%
  }
  {\IfNoValueTF{#2}%
    {\DTLforeach*{icite@indices}{\icite@subtype=subtype,\icite@index=index}{%
        \ifx\icite@subtype\@subtype%
        \index[\icite@index]{\@sortedauthor!\@sortedtitle!#1}%
        \else%
        \ifno@index\else
        \ifdefault@index%
        \index[\ic@dfltind]{\@sortedauthor!\@sortedtitle!#1}%
        \else%
        \index{\@sortedauthor!\@sortedtitle!#1}%
        \fi\fi\fi}%
      \csname #4\endcsname[{#1}]{#3}}
    {\DTLforeach*{icite@indices}{\icite@subtype=subtype,\icite@index=index}{%
        \ifx\icite@subtype\@subtype%
        \index[\icite@index]{\@sortedauthor!\@sortedtitle!#2}%
        \else%
        \ifno@index\else
        \ifdefault@index%
        \index[\ic@dfltind]{\@sortedauthor!\@sortedtitle!#2}%
        \else%
        \index{\@sortedauthor!\@sortedtitle!#2}%
        \fi\fi\fi}%
      \csname #4\endcsname[#1][{#2}]{#3}}%
  }%
}
%    \end{macrocode}
% \iffalse
%</package>
% \fi
%\Finale
\endinput