% Author        : C. Pierquet
% licence       : Released under the LaTeX Project Public License v1.3c or later, see http://www.latex-project.org/lppl.txt

\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{nodepthtext}[2026/09/07 0.1.1 Raise small texts for "no depth" letters]

%====HISTORIQUE
% v 0.1.1  Smash version of macros + lua version 'improved'
% v 0.1.0  Initial version

%====BASE
\RequirePackage{ifthen}
\RequirePackage{xstring} %legacy
\RequirePackage{calc}
\RequirePackage{graphicx}

%====DIMs & Useful
\newlength\depthletter
\newlength\totalheightletter
\newlength\depthsampleletter
\newlength\heightsampleletter
\newcount\cptraiseletter
\def\sampleslettersnodepth{azertuiosdhklmwxcvbnAZERTYUIOPSDFGHJKLMWXCVBN}
\def\sampleslettersminus{azeruosmwxcvn}
\def\sampleslettersmajus{AZERTUIOSDHKLMWXCVBN}

%====NO DEPTH MACROS
\NewDocumentCommand\raiseletter{ O{0.8} m m }{%
  \settodepth{\depthletter}{\hbox{#3}}%
  \ifdim\depthletter>#2%
    \raisebox{\dimexpr#1\depthletter-#2\relax}{\resizebox{\width}{#1\height}{#3}}%
  \else%
    {#3}%
  \fi%
}

\NewDocumentCommand\nodepth{ O{0.8} m }{%
  \settodepth{\depthsampleletter}{\hbox{\sampleslettersnodepth}}%
  \StrLen{#2}[\tmplenword]%
  \cptraiseletter0%
  \loop\ifnum\cptraiseletter<\tmplenword%
    \advance\cptraiseletter by 1%
    \raiseletter[#1]{\depthsampleletter}{\StrChar{#2}{\the\cptraiseletter}}%
  \repeat%
}

%====L3 NODEPTH/SMASH MACROS
\ExplSyntaxOn
\NewDocumentCommand\nodepthlua{ O{0.8} m }{%
  \settodepth{\depthsampleletter}{\hbox{\sampleslettersnodepth}}%
  \settoheight{\heightsampleletter}{\hbox{\sampleslettersnodepth}}%
  \str_map_inline:nn { #2 } { \raiseletter[#1]{\depthsampleletter}{##1} }%
}

\NewDocumentCommand\raisesmashletter{ s O{} m }{%
  % = * -> minuscule
  % = longueurs de reference, calculees a partir de la chaine #2
  \ifthenelse{\equal{#2}{}}%vide = mode auto
    {%
      \IfBooleanTF{#1}%étoilée = minuscule
        {%
          \settodepth{\depthsampleletter}{\hbox{\sampleslettersminus}}%
          \settoheight{\heightsampleletter}{\hbox{\sampleslettersminus}}%
        }%
        {%
          \settodepth{\depthsampleletter}{\hbox{\sampleslettersmajus}}%
          \settoheight{\heightsampleletter}{\hbox{\sampleslettersmajus}}%
        }%
    }%
    {%
      \settodepth{\depthsampleletter}{\hbox{#2}}%
      \settoheight{\heightsampleletter}{\hbox{#2}}%
    }%
  % = longueurs du caractere a traiter
  \settodepth{\depthletter}{\hbox{#3}}%
  \settototalheight{\totalheightletter}{\hbox{#3}}%
  \ifdim\depthletter>\depthsampleletter\relax%
    \ifdim\totalheightletter>\heightsampleletter\relax%
      % 2b/ depth excedentaire ET hauteur totale hors reference :
      %     on resize a la reference, puis on remonte de la DEPTH APRES resize (-> nouvelle depth = 0)
      \raisebox{\dimexpr\depthletter*\heightsampleletter/\totalheightletter\relax}%
        {\resizebox*{\width}{\heightsampleletter}{#3}}%
    \else%
      % 2a/ depth excedentaire mais pas de debordement : simple remontee de la depth
      \raisebox{\depthletter}{#3}%
    \fi%
  \else%
    \ifdim\totalheightletter>\heightsampleletter\relax%
      % 3b/ depth deja correcte mais hauteur totale hors reference (ex. lettre haute sans jambage) : resize seul
      \resizebox*{\width}{\heightsampleletter}{#3}%
    \else%
      % 3a/ rien a faire
      {#3}%
    \fi%
  \fi%
}

\NewDocumentCommand\raisesmashtext{ O{} m }{%
  \str_map_inline:nn { #2 } {
    \str_if_eq:eeTF { \tl_upper_case:n {##1} } { ##1 }
      { \raisesmashletter[#1]{##1} }%
      { \raisesmashletter*[#1]{##1} }%
    }%
}
\ExplSyntaxOff

\endinput