%% docutils.sty: macros for Docutils LaTeX output.
%%   
%%   Copyright © 2020 Günter Milde
%%   Released under the terms of the `2-Clause BSD license`, in short:
%%   
%%      Copying and distribution of this file, with or without modification,
%%      are permitted in any medium without royalty provided the copyright
%%      notice and this notice are preserved.
%%      This file is offered as-is, without any warranty.

% .. include:: README
%
% Implementation
% ==============
%
% ::

 \NeedsTeXFormat{LaTeX2e}
 \ProvidesPackage{docutils}
   [2020/08/28 v0.17 macros for Docutils LaTeX output]
 
% Helpers
% -------
%
% duclass::

 % class handling for environments (block-level elements)
 % \begin{DUclass}{spam} tries \DUCLASSspam and
 % \end{DUclass}{spam} tries \endDUCLASSspam
 \ifx\DUclass\undefined % poor man's "provideenvironment"
  \newenvironment{DUclass}[1]%
   {% "#1" does not work in end-part of environment.
    \def\DocutilsClassFunctionName{DUCLASS#1}
      \csname \DocutilsClassFunctionName \endcsname}%
   {\csname end\DocutilsClassFunctionName \endcsname}%
 \fi
 
% providelength::

 % Provide a length variable and set default, if it is new
 \providecommand*{\DUprovidelength}[2]{
   \ifthenelse{\isundefined{#1}}{\newlength{#1}\setlength{#1}{#2}}{}
 }
 
 
% Configuration defaults
% ----------------------
%
% See `Docutils LaTeX Writer`_ for details.
%
% abstract::

 \providecommand*{\DUCLASSabstract}{
   \renewcommand{\DUtitle}[1]{\centerline{\textbf{##1}}}
 }
 
% dedication::

 % special topic for dedications
 \providecommand*{\DUCLASSdedication}{%
   \renewenvironment{quote}{\begin{center}}{\end{center}}%
 }
 
% TODO: add \em to set dedication text in italics?
%
% docinfo::

 % width of docinfo table
 \DUprovidelength{\DUdocinfowidth}{0.9\linewidth}
 
% error::

 \providecommand*{\DUCLASSerror}{\color{red}}
 
% highlight_rules::

 % basic code highlight:
 \providecommand*\DUrolecomment[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}}
 \providecommand*\DUroledeleted[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}}
 \providecommand*\DUrolekeyword[1]{\textbf{#1}}
 \providecommand*\DUrolestring[1]{\textit{#1}}
 
% Elements
% --------
%
% Definitions for unknown or to-be-configured Docutils elements.
%
% admonition::

 % admonition environment (specially marked topic)
 \ifx\DUadmonition\undefined % poor man's "provideenvironment"
  \newbox{\DUadmonitionbox}
  \newenvironment{DUadmonition}%
   {\begin{center}
      \begin{lrbox}{\DUadmonitionbox}
        \begin{minipage}{0.9\linewidth}
   }%
   {    \end{minipage}
      \end{lrbox}
      \fbox{\usebox{\DUadmonitionbox}}
    \end{center}
   }
 \fi
 
% fieldlist::

 % field list environment (for separate configuration of `field lists`)
 \ifthenelse{\isundefined{\DUfieldlist}}{
   \newenvironment{DUfieldlist}%
     {\quote\description}
     {\enddescription\endquote}
 }{}
 
% footnotes::

 % numerical or symbol footnotes with hyperlinks and backlinks
 \providecommand*{\DUfootnotemark}[3]{%
   \raisebox{1em}{\hypertarget{#1}{}}%
   \hyperlink{#2}{\textsuperscript{#3}}%
 }
 \providecommand{\DUfootnotetext}[4]{%
   \begingroup%
   \renewcommand{\thefootnote}{%
     \protect\raisebox{1em}{\protect\hypertarget{#1}{}}%
     \protect\hyperlink{#2}{#3}}%
   \footnotetext{#4}%
   \endgroup%
 }
 
% inline::

 % custom inline roles: \DUrole{#1}{#2} tries \DUrole#1{#2}
 \providecommand*{\DUrole}[2]{%
   \ifcsname DUrole#1\endcsname%
     \csname DUrole#1\endcsname{#2}%
   \else%
     #2%
   \fi%
 }
 
% legend::

 % legend environment (in figures and formal tables)
 \ifthenelse{\isundefined{\DUlegend}}{
   \newenvironment{DUlegend}{\small}{}
 }{}
 
% lineblock::

 % line block environment
 \DUprovidelength{\DUlineblockindent}{2.5em}
 \ifthenelse{\isundefined{\DUlineblock}}{
   \newenvironment{DUlineblock}[1]{%
     \list{}{\setlength{\partopsep}{\parskip}
             \addtolength{\partopsep}{\baselineskip}
             \setlength{\topsep}{0pt}
             \setlength{\itemsep}{0.15\baselineskip}
             \setlength{\parsep}{0pt}
             \setlength{\leftmargin}{#1}}
     \raggedright
   }
   {\endlist}
 }{}
 
% optionlist::

 % list of command line options
 \providecommand*{\DUoptionlistlabel}[1]{\bfseries #1 \hfill}
 \DUprovidelength{\DUoptionlistindent}{3cm}
 \ifthenelse{\isundefined{\DUoptionlist}}{
   \newenvironment{DUoptionlist}{%
     \list{}{\setlength{\labelwidth}{\DUoptionlistindent}
             \setlength{\rightmargin}{1cm}
             \setlength{\leftmargin}{\rightmargin}
             \addtolength{\leftmargin}{\labelwidth}
             \addtolength{\leftmargin}{\labelsep}
             \renewcommand{\makelabel}{\DUoptionlistlabel}}
   }
   {\endlist}
 }{}
 
% rubric::

 % informal heading
 \providecommand*{\DUrubric}[1]{\subsubsection*{\emph{#1}}}
 
% sidebar::

 % text outside the main text flow
 \providecommand{\DUsidebar}[1]{%
   \begin{center}
     \colorbox[gray]{0.80}{\parbox{0.9\linewidth}{#1}}
   \end{center}
 }
 
% title::

 % title for topics, admonitions, unsupported section levels, and sidebar
 \providecommand*{\DUtitle}[1]{\subsubsection*{#1}}
 
% subtitle::

 % subtitle (for sidebar)
 \providecommand*{\DUsubtitle}[1]{\par\emph{#1}\smallskip}
 
% documentsubtitle::

 % subtitle (in document title)
 \providecommand*{\DUdocumentsubtitle}[1]{{\large #1}}
 
% titlereference::

 % titlereference standard role
 \providecommand*{\DUroletitlereference}[1]{\textsl{#1}}
 
% transition::

 % transition (break / fancybreak / anonymous section)
 \providecommand*{\DUtransition}{%
   \hspace*{\fill}\hrulefill\hspace*{\fill}
   \vskip 0.5\baselineskip
 }
