%% This is file `novel-DropCap.sty', part of `novel' document class.
%% Copyright (C) 2017-2024 Robert Allgeyer.
%%
%% It is based on `lettrine.sty', part of `lettrine' package,
%% Copyright (C) 1999-2015 Daniel Flipo. LPPL 1.3c.
%%
%% This program can be distributed and/or modified under the terms
%% of the LaTeX Project Public License, version 1.3c.
%% License URL:  https://www.latex-project.org/lppl/lppl-1-3c/
%%
\ProvidesFile{novel-DropCap.sty}%
[2024/04/26 v2.2 (Drop Caps)]
\NeedsTeXFormat{LaTeX2e}[1999/12/01]
%
%

%
\newcounter{NDCDefaultLines}
\setcounter{NDCDefaultLines}{3}
\newcounter{NDCDefaultDepth}
\newdimen\NDCDefaultVoffset
\newdimen\NDCDefaultHoffset
\newcommand*{\NDCDefaultScale}{1}
\newcommand*{\NDCDefaultBloat}{1}
\newdimen\NDCDefaultGap
\gsetlength{\NDCDefaultGap}{0.25em} % approx. width of normal space
\newsavebox{\NDC@dropcapbox}
\newsavebox{\NDC@normalXbox}
\newcounter{NDC@lines}
\newcounter{NDC@depth}
\newdimen\NDC@antewidth
\newdimen\NDC@Pindent
\newdimen\NDC@Gap % equivalent to lettrine findent
\newdimen\NDC@Nindent % not a user setting
\newdimen\NDC@voffset
\newdimen\NDC@hoffset
\newdimen\NDC@first
\newdimen\NDC@next
\newdimen\NDC@height
\newcommand*{\NDC@ante}{}
\newcommand*{\NDC@bloat}{}
\newcommand*{\NDC@scale}{}
\def\@getNDCheight{% offsets do not affect height:
  \@tempdima=\baselineskip
  \setlength{\NDC@height}{\value{NDC@lines}\@tempdima}% local
  \addtolength{\NDC@height}{-\@tempdima}%
  \sbox{\NDC@normalXbox}{X}% Normal capital X, rather than something else.
  \addtolength{\NDC@height}{\ht\NDC@normalXbox}%
  \setlength{\NDC@height}{\NDC@scale\NDC@height}% local
} %
\newcommand*{\NDC@char}{%
  \@getNDCheight%
  % Measures drop cap capital X, rather than something else:
  \sbox{\@tempboxa}{%
     \NDC@charstyle\fontsize{\NDC@height}{\NDC@height}\selectfont X%
  }%
  \@tempcntb=\ht\@tempboxa%
  \@tempcnta=\NDC@height%
  \multiply\@tempcnta by 100%
  \divide\@tempcntb by 100%
  \divide\@tempcnta by \@tempcntb%
  \advance\@tempcnta by -9999%
  \ifnum\@tempcnta>0%
    \def\@tempa{1.\the\@tempcnta}%
  \else%
    \def\@tempa{1}%
  \fi%
  \NDC@charstyle\fontsize{\@tempa\NDC@height}{\@tempa\NDC@height}\selectfont
} %
\define@key{NDC}{lines}{\setcounter{NDC@lines}{#1}}
\define@key{NDC}{depth}{\setcounter{NDC@depth}{#1}}
\define@key{NDC}{hoffset}{\setlength{\NDC@hoffset}{#1}}
\define@key{NDC}{voffset}{\setlength{\NDC@voffset}{#1}}
\define@key{NDC}{ante}{\renewcommand*{\NDC@ante}{#1}} % Like `lettrine' ante,
\define@key{NDC}{ante*}{\renewcommand*{\NDC@ante}{% Like `lettrine' ante, but
  \setlength\NDC@antewidth{\widthof{#1}}% auto-hangs the ante in left margin.
  \addtolength\NDC@antewidth{0.2em}% provides breathing room
  \stake\hspace{-\NDC@antewidth}#1\hspace{0.2em}}% restores alignment
}
\define@key{NDC}{gap}{\setlength{\NDC@Gap}{#1}}
\define@key{NDC}{bloat}{\renewcommand*{\NDC@bloat}{#1}}
\define@key{NDC}{scale}{\renewcommand*{\NDC@scale}{#1}}
\newdimen\NDCboxwidth
\newdimen\NDCboxheight
\newdimen\NDCboxdepth
%
\DeclareDocumentCommand \NDC@boxcap { m }{%
  \begingroup%
  % The model letter has no upper diacritical.
  \def\@NDCmodel{}%
  \IfSubStr{ÀÁÂÃÄÅĀĂ}{#1}{\def\@NDCmodel{A}}{}%
  \IfSubStr{ĆĈĊČ}{#1}{\def\@NDCmodel{C}}{}%
  \IfSubStr{Ď}{#1}{\def\@NDCmodel{D}}{}%
  \IfSubStr{ÈÉÊËĒĔĖĚ}{#1}{\def\@NDCmodel{E}}{}%
  \IfSubStr{ĜĞĠ}{#1}{\def\@NDCmodel{G}}{}%
  \IfSubStr{Ĥ}{#1}{\def\@NDCmodel{H}}{}%
  \IfSubStr{ÌÍÎÏĨĪĬİ}{#1}{\def\@NDCmodel{I}}{}%
  \IfSubStr{Ĵ}{#1}{\def\@NDCmodel{J}}{}%
  \IfSubStr{Ĺ}{#1}{\def\@NDCmodel{L}}{}%
  \IfSubStr{ÑŃŇ}{#1}{\def\@NDCmodel{N}}{}%
  \IfSubStr{ÒÓÔÕÖŌŎŐ}{#1}{\def\@NDCmodel{O}}{}%
  \IfSubStr{ŔŘ}{#1}{\def\@NDCmodel{R}}{}%
  \IfSubStr{ŚŜŠ}{#1}{\def\@NDCmodel{S}}{}%
  \IfSubStr{Ť}{#1}{\def\@NDCmodel{T}}{}%
  \IfSubStr{ÙÚÛÜŨŪŬŮŰ}{#1}{\def\@NDCmodel{U}}{}%
  \IfSubStr{Ŵ}{#1}{\def\@NDCmodel{W}}{}%
  \IfSubStr{ÝŶŸ}{#1}{\def\@NDCmodel{Y}}{}%
  \IfSubStr{ŹŻŽ}{#1}{\def\@NDCmodel{Z}}{}%
  \IfSubStr{DŽ}{#1}{\def\@NDCmodel{DZ}}{}% diglyph
  \setlength\fboxsep{0.16\@SetFontSize}%
  \setlength\fboxrule{0.02\@SetFontSize}%
  \ifthenelse{\equal{\@NDCmodel}{}}{%
    \framebox{\phantom{|}#1\phantom{|}}%
  }{%
    \framebox{\phantom{|\@NDCmodel}\llap{\smash{#1}}\phantom{|}}%
  }%
  \endgroup%
}% end boxcap
%
\DeclareDocumentCommand \dropcap { s O{} m } {%
  \@tempTFfalse%
  \IfSubStr{#3}{png}{\@tempTFtrue}{}%
  \IfSubStr{#3}{PNG}{\@tempTFtrue}{}%
  \IfSubStr{#3}{jpg}{\@tempTFtrue}{}%
  \IfSubStr{#3}{JPG}{\@tempTFtrue}{}%
  \IfSubStr{#3}{jpeg}{\@tempTFtrue}{}%
  \IfSubStr{#3}{JPEG}{\@tempTFtrue}{}%
  \setcounter{NDC@lines}{\value{NDCDefaultLines}}%
  \setcounter{NDC@depth}{\value{NDCDefaultDepth}}%
  \setlength{\NDC@hoffset}{\NDCDefaultHoffset}%
  \renewcommand*{\NDC@bloat}{\NDCDefaultBloat}%
  \renewcommand*{\NDC@scale}{\NDCDefaultScale}%
  \setlength{\NDC@voffset}{\NDCDefaultVoffset}%
  \renewcommand*{\NDC@ante}{}%
  \setlength{\NDC@Gap}{\NDCDefaultGap}%
  \setlength{\NDC@Nindent}{0pt}%
  \setkeys{NDC}{#2}%
  \if@tempTF%
    \def\@dropthisthing{\InlineImage[0em,b]{#3}}%
  \else%
    \IfBooleanTF{#1}%
      {\def\@dropthisthing{\NDC@boxcap{#3}}}%
      {\def\@dropthisthing{#3}}%
  \fi%
  \ifnum\value{NDC@lines}=1%
    \par\noindent%
    \NDC@ante%
    \@dropthisthing%
  \else%
    \sbox{\NDC@normalXbox}{X}% Normal capital X.
    \sbox{\NDC@dropcapbox}{\scalebox{\NDC@bloat}[1]{\NDC@char\@dropthisthing}}%
    \@tempdima=\baselineskip%
    \setlength{\NDC@first}{-\value{NDC@lines}\@tempdima}%
    \addtolength{\NDC@first}{\@tempdima}%
    \sbox{\@tempboxa}{X}%
    \addtolength{\NDC@first}{-\ht\@tempboxa}%
    \addtolength{\NDC@first}{\NDC@voffset}%
    \addtolength{\NDC@first}{\ht\NDC@dropcapbox}%
    \addtolength{\NDC@voffset}{-\value{NDC@lines}\@tempdima}%
    \addtolength{\NDC@voffset}{\@tempdima}%
    \par%
    \setlength{\NDC@Pindent}{\wd\NDC@dropcapbox}%
    \addtolength{\NDC@Pindent}{\NDC@hoffset}%
    \settowidth{\NDC@first}{\NDC@ante}%
    \addtolength{\NDC@Pindent}{\NDC@first}%
    \addtolength{\NDC@Pindent}{\NDC@Gap}%
    \setlength{\NDC@first}{\linewidth}%
    \addtolength{\NDC@first}{-\NDC@Pindent}%
    \addtolength{\NDC@Nindent}{\NDC@Pindent}%
    \setlength{\NDC@next}{\linewidth}%
    \addtolength{\NDC@next}{-\NDC@Nindent}%
    \addtolength{\NDC@Pindent}{\rightmargin}%
    \addtolength{\NDC@Nindent}{\rightmargin}%
    \setlength{\NDCboxwidth}{\wd\NDC@dropcapbox}%
    \setlength{\NDCboxheight}{\ht\NDC@dropcapbox}%
    \setlength{\NDCboxdepth}{\dp\NDC@dropcapbox}%
    \addtocounter{NDC@lines}{1}%
    \addtocounter{NDC@lines}{\value{NDC@depth}}%
    \def\NDC@parshape{\c@NDC@lines \the\NDC@Pindent \the\NDC@first}%
    \@tempcnta=\tw@%
    \@whilenum \@tempcnta<\c@NDC@lines\do{%
       \edef\NDC@parshape{\NDC@parshape \the\NDC@Nindent \the\NDC@next}%
       \advance\@tempcnta\@ne}%
    \edef\NDC@parshape{\NDC@parshape \rightmargin \the\linewidth}%
    \noindent%
    \parshape=\NDC@parshape\relax%
    \smash{%
      \llap{%
        \mbox{\NDC@ante}%
        \raisebox{\NDC@voffset}{\usebox{\NDC@dropcapbox}}%
        \hskip\the\NDC@Gap%
      }%
    }%
  \fi%
}% end @NDCdropcap
%%


%% In case the user prefers `lettrine':
\gdef\@ActivateDropCaps{% called by `novel.cls' \AtBeginDocument
  \@ifpackageloaded{lettrine}{%
    \global\LettrineOnGridtrue % Necessary.
    \gsetlength\DiscardVskip{10\nbs} % effectively infinite
  }{ % For test purposes only:
   \providecommand\lettrine[3][]{##2##3} % echoes its mandatory arguments
  }%
}% end \@ActivateDropCaps



%%
\endinput
%%
%% End of file `novel-DropCap.sty'.

