%\iffalse
% mfirstuc.dtx generated using makedtx version 1.2 (c) Nicola Talbot
% Command line args:
%   -macrocode ".*\.l2h"
%   -macrocode ".*\.tex"
%   -comment ".*\.l2h"
%   -comment ".*\.tex"
%   -codetitle "Main Package Code"
%   -doc "mfirstuc-codedoc.tex"
%   -author "Nicola Talbot"
%   -src "mfirstuc.sty\Z=>mfirstuc.sty"
%   -src "mfirstuc-english.sty\Z=>mfirstuc-english.sty"
%   -src "(mfirstuc-[0-9]+-[0-9]+-[0-9]+.sty)\Z=>\1"
%   -src "(sample.*\.tex)\Z=>\1"
%   -src "(.*\.l2h)\Z=>\1"
%   -setambles ".*\.l2h=>\nopreamble\nopostamble"
%   -setambles ".*\.tex=>\nopreamble\nopostamble"
%   mfirstuc
% Created on 2022/10/18 9:21
%\fi
%\iffalse
%<*package>
%% \CharacterTable
%%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%%   Digits        \0\1\2\3\4\5\6\7\8\9
%%   Exclamation   \!     Double quote  \"     Hash (number) \#
%%   Dollar        \$     Percent       \%     Ampersand     \&
%%   Acute accent  \'     Left paren    \(     Right paren   \)
%%   Asterisk      \*     Plus          \+     Comma         \,
%%   Minus         \-     Point         \.     Solidus       \/
%%   Colon         \:     Semicolon     \;     Less than     \<
%%   Equals        \=     Greater than  \>     Question mark \?
%%   Commercial at \@     Left bracket  \[     Backslash     \\
%%   Right bracket \]     Circumflex    \^     Underscore    \_
%%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%%   Right brace   \}     Tilde         \~}
%</package>
%\fi
% \iffalse
% Doc-Source file to use with LaTeX2e
% Copyright (C) 2022 Nicola Talbot, all rights reserved.
% \fi
% \iffalse
%<*driver>
\iffalse
mfirstuc-codedoc.tex is a stub file used by makedtx to create
mfirstuc.dtx
\fi

\documentclass{article}
\usepackage{doc}

\CheckSum{1753}

\RecordChanges
\PageIndex
\SetupDoc{reportchangedates}
\setcounter{IndexColumns}{2}

\usepackage[T1]{fontenc}
\usepackage{tcolorbox}

\definecolor{defbackground}{rgb}{1,1,0.75}

\newtcolorbox{definition}{halign=flush left,
 colframe=black,colback=defbackground,
 fontupper=\ttfamily,
 before upper={\frenchspacing\obeylines},
 after={\par\noindent\ignorespacesafterend}
}

\NewDocElement{Option}{option}

\providecommand{\sty}[1]{\textsf{#1}}

\providecommand\marg[1]{%
  \texorpdfstring{\allowbreak{\ttfamily\char`\{}\meta{#1}{\ttfamily\char`\}}}
  {\{#1\}}}
\providecommand\oarg[1]{%
  \texorpdfstring{\allowbreak{\ttfamily[}\meta{#1}{\ttfamily]}}
  {[#1]}}

\begin{document}
\DocInput{mfirstuc.dtx}
\end{document}
%</driver>
%\fi
%
% \title{Documented Code For mfirstuc v2.08}
% \author{Nicola L.C. Talbot\\[10pt]
%Dickimaw Books\\
%\url{http://www.dickimaw-books.com/}}
%
% \date{2022-10-14}
% \maketitle
%
%\tableofcontents
%
%\section{Introduction}
%
%This is the documented code for the \sty{mfirstuc} package.
%See \texttt{mfirstuc-manual.pdf} for the main user guide.
%
%\StopEventually{\clearpage\PrintChanges \clearpage\PrintIndex}
%
%
%\section{Main Package Code}
%\iffalse
%    \begin{macrocode}
%<*mfirstuc.sty>
%    \end{macrocode}
%\fi
%\section{Mfirstuc Documented Code}
%\label{sec:code:mfirstuc}
%\changes{2.0}{2015/09/09}{package split from glossaries}
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
%    \end{macrocode}
% Rollback releases:
%    \begin{macrocode}
\DeclareRelease{v2.07}{2021-10-15}{mfirstuc-2021-10-15.sty}
\DeclareCurrentRelease{v2.08}{2022-10-14}
%    \end{macrocode}
% Declare package:
%    \begin{macrocode}
\ProvidesPackage{mfirstuc}[2022/10/14 v2.08 (NLCT)]
%    \end{macrocode}
% Requires \sty{etoolbox}:\changes{1.06}{2012/05/21}{now requires
% etoolbox}
%    \begin{macrocode}
\RequirePackage{etoolbox}
%    \end{macrocode}
%Version 2.07 has switched to LaTeX3 for the actual case-changing.
%The original \cs{makefirstuc} has been reimplemented to use LaTeX3
%code. There is also a new command \cs{MFUsentencecase} which just
%uses \cs{text\_titlecase\_first:n}. Note that \cs{MFUsentencecase} is
%internally used by \cs{glsmakefirstuc}, which in turn is used by
%\cs{makefirstuc} to perform the actual case-change.
%
%\begin{macro}{\glsmakefirstuc}
%\changes{1.05}{2011/04/02}{new}
% Provide a user command to make it easier to customise. This is
% used internally by \cs{makefirstuc}. (The original commands
% provided by \sty{mfirstuc} were part of the \sty{glossaries}
% package, hence the ``gls'' prefix.)
%    \begin{macrocode}
\newcommand*{\glsmakefirstuc}[1]{\MFUsentencecase{\unexpanded{#1}}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mfirstucMakeUppercase}
% This was originally provided to allow user to replace 
%\cs{MakeUppercase} with another case-changing command. 
% This is now only used with \cs{mfugrabfirstuc}.
%    \begin{macrocode}
\ExplSyntaxOn
\newcommand*{\mfirstucMakeUppercase}[1]{\text_uppercase:n{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{option}{expanded}
%\changes{2.08}{2022-10-14}{new}
%Allow argument to expand.
%This also resets the definition of \cs{mfirstucMakeUppercase}
%in case it was changed by grabfirst.
%    \begin{macrocode}
\DeclareOption{expanded}{%
 \renewcommand*{\glsmakefirstuc}[1]{\MFUsentencecase{#1}}%
 \renewcommand*{\mfirstucMakeUppercase}[1]{\text_uppercase:n{#1}}%
}
%    \end{macrocode}
%\end{option}
%
%\begin{option}{unexpanded}
%\changes{2.08}{2022-10-14}{new}
%Prevent argument of \cs{glsmakefirstuc} from expanding.
%This also resets the definition of \cs{mfirstucMakeUppercase}
%in case it was changed by grabfirst, but note that it doesn't use
%\cs{unexpanded}.
%    \begin{macrocode}
\DeclareOption{unexpanded}{%
 \renewcommand*{\glsmakefirstuc}[1]{\MFUsentencecase{\unexpanded{#1}}}%
 \renewcommand*{\mfirstucMakeUppercase}[1]{\text_uppercase:n{#1}}%
}
\ExplSyntaxOff
%    \end{macrocode}
%\end{option}
%
%\begin{macro}{\mfugrabfirstuc}
%\changes{2.08}{2022-10-14}{new}
%Used by the grabfirst option to emulate v2.07.
%    \begin{macrocode}
\newrobustcmd*{\mfugrabfirstuc}[1]{\@mfu@grabfirstuc#1\empty}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@mfu@grabfirstuc}
%\changes{2.08}{2022-10-14}{new}
%    \begin{macrocode}
\newcommand*{\@mfu@grabfirstuc}[2]{\mfirstucMakeUppercase{#1}#2}
%    \end{macrocode}
%\end{macro}
%
%\begin{option}{grabfirst}
%\changes{2.08}{2022-10-14}{new}
%Emulate v2.07 method.
%    \begin{macrocode}
\DeclareOption{grabfirst}{%
 \renewcommand*{\glsmakefirstuc}[1]{\mfugrabfirstuc{#1}}%
 \renewcommand*{\mfirstucMakeUppercase}[1]{\MakeUppercase{#1}}%
}
%    \end{macrocode}
%\end{option}
%
%Process options.
%    \begin{macrocode}
\ProcessOptions
%    \end{macrocode}
%
%There are differences between \cs{makefirstuc} and
%\cs{MFUsentencecase}, the principle ones being expansion occurs differently and
%\cs{makefirstuc} stops at exclusions whereas
%\cs{MFUsentencecase} skips them.
%    \begin{macrocode}
\ExplSyntaxOn
%    \end{macrocode}
%\begin{macro}{\MFUsentencecase}
%\changes{2.08}{2022-10-14}{new}
%New command provided that simply uses LaTeX3, which expands the
%content. This may be preferred over \cs{makefirstuc} depending on
%the content.
%    \begin{macrocode}
\newcommand{\MFUsentencecase}[1]{\text_titlecase_first:n{#1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MFUexcl}
%\changes{2.08}{2022-10-14}{new}
%Add a command to the exclusion list. This is used by
%\cs{text\_titlecase\_first:n}
%to skip commands that shouldn't have their argument changed (such
%as \cs{ref}). It's also used by \cs{makefirstuc}.
%    \begin{macrocode}
\newcommand{\MFUexcl}[1]{
  \tl_if_empty:nF { #1 }
  {
    \tl_if_in:NnF \l_text_case_exclude_arg_tl {#1}
     {
       \tl_put_right:Nn \l_text_case_exclude_arg_tl {#1}
     }
  }
}
%    \end{macrocode}
%\end{macro}
%Add \cs{ensuremath} as an exclusion otherwise \cs{makefirstuc}
%will try passing its argument to \cs{MFUsentencecase}, which will
%fail.
%    \begin{macrocode}
\MFUexcl{\ensuremath}
%    \end{macrocode}
%
%Test if the given command is in the exclusion list.
%    \begin{macrocode}
\cs_new:Npn \mfirstuc_if_excluded:NTF #1 #2 #3
 {
  \tl_if_in:NnTF \l_text_case_exclude_arg_tl {#1} {#2} {#3}
 }
%    \end{macrocode}
%Provide an implementation of \cs{makefirstuc} that matches
%older versions as much as possible.
%    \begin{macrocode}
\tl_new:N \l__mfirstuc_stack_tl
\tl_new:N \l__mfirstuc_head_tl
\tl_new:N \l__mfirstuc_next_tl
%    \end{macrocode}
%In addition to exclusions, also provide blockers. These are only
%supported by \cs{makefirstuc}. Exclusions and
%their argument are skipped, whereas blockers prevent case-change.
%For example, sentence-casing \verb|\label{ex}some text| should skip
%\verb|\label{ex}|, whereas \verb|\nameref{ex} some text| shouldn't
%have any case change applied.
%    \begin{macrocode}
\tl_new:N \l__mfirstuc_blocker_tl
%    \end{macrocode}
%
%\begin{macro}{\MFUblocker}
%\changes{2.08}{2022-10-14}{new}
%Add a command to the blocker list.
%    \begin{macrocode}
\newcommand{\MFUblocker}[1]{
 \tl_if_empty:nF { #1 }
  {
    \tl_if_in:NnF \l__mfirstuc_blocker_tl {#1}
    {
      \tl_put_right:Nn \l__mfirstuc_blocker_tl {#1}
    }
    \MFUexcl { #1 }
  }
}
%    \end{macrocode}
%\end{macro}
%Test if the given command is in the blocker list.
%    \begin{macrocode}
\cs_new:Npn \tl_if_mfirstuc_blocker:nTF #1 #2 #3
 {
   \tl_if_in:NnTF \l__mfirstuc_blocker_tl {#1} {#2} {#3}
 }
%    \end{macrocode}
%Is there a way to do this without \cs{expandafter}?
%    \begin{macrocode}
\cs_new:Npn \tl_if_mfirstuc_blocker:VTF #1 #2 #3
 {
   \expandafter \tl_if_mfirstuc_blocker:nTF \expandafter {#1} {#2} {#3}
 }
%    \end{macrocode}
%
%\begin{macro}{\makefirstuc}
%\begin{definition}
% \cs{makefirstuc}\marg{text}
%\end{definition}
%\changes{1.08}{2013-11-04}{made robust}
%\changes{2.08}{2022-10-14}{reimplement using \LaTeX3}
%    \begin{macrocode}
\newrobustcmd{\makefirstuc}[1]{%
  \tl_set:Nn \l__mfirstuc_stack_tl {#1}
  \tl_if_empty:NF \l__mfirstuc_stack_tl
  {
    \tl_if_single:NTF \l__mfirstuc_stack_tl 
    {
      \glsmakefirstuc{#1}
    }
    {
      \tl_if_head_is_group:nTF {#1}
      {
        \glsmakefirstuc{#1}
      }
      {
        \tl_if_head_eq_catcode:nNTF {#1} \relax
        {
          \tl_set:NV \l_tmpa_tl \l__mfirstuc_stack_tl
          \tl_set:Nx \l__mfirstuc_head_tl { \tl_head:V \l_tmpa_tl }
          \tl_set:Nx \l__mfirstuc_stack_tl { \tl_tail:N \l__mfirstuc_stack_tl }
          \tl_if_eq:NnTF \l__mfirstuc_head_tl { \protect }
          {
            \tl_set:NV \l_tmpa_tl \l__mfirstuc_stack_tl
            \tl_set:Nx \l__mfirstuc_head_tl { \tl_head:V \l_tmpa_tl }
            \tl_set:Nx \l__mfirstuc_stack_tl { \tl_tail:N \l__mfirstuc_stack_tl }
          }
          {} 
          \tl_if_mfirstuc_blocker:VTF \l__mfirstuc_head_tl 
          { #1 }
          { 
            \let \l_tmpa_tl \l__mfirstuc_stack_tl 
            \tl_set:Nx \l__mfirstuc_next_tl { \tl_head:N \l_tmpa_tl }
            \tl_if_single:NTF \l__mfirstuc_next_tl 
            {
              \glsmakefirstuc{#1}
            }
            {
              \tl_set:Nx \l__mfirstuc_stack_tl { \tl_tail:N \l__mfirstuc_stack_tl }
              \tl_clear:N \l_tmpa_tl
              \tl_put_right:Nn \l_tmpa_tl { \__mfirstuc_inner:nnn }
              \tl_put_right:NV \l_tmpa_tl \l__mfirstuc_head_tl 
              \tl_put_right:Nx  \l_tmpa_tl
              {
                { \expandonce \l__mfirstuc_next_tl }
                { \expandonce \l__mfirstuc_stack_tl }
              }
            \tl_use:N \l_tmpa_tl
            }
          }
        }
        {
          \glsmakefirstuc{#1}
        }
      }
    }
  }
}
%    \end{macrocode}
%\end{macro}
%
%    \begin{macrocode}
\cs_new_protected:Npn \__mfirstuc_inner:nnn #1 #2 #3
 {
%    \end{macrocode}
% Mappings trump exclusions.
%    \begin{macrocode}
   \mfirstuc_get_map:NN #1 \l_tmpb_tl
   \quark_if_no_value:NTF \l_tmpb_tl
   {
      \mfirstuc_if_excluded:NTF #1
      { #1{#2}\makefirstuc{#3} }
      { #1{\makefirstuc{#2}}#3 }
   }
   {
     \l_tmpb_tl {#2} #3
   }
 }
%    \end{macrocode}
%Mappings.
%    \begin{macrocode}
\prop_new:N \l__mfirstuc_mappings_prop
%    \end{macrocode}
%\begin{macro}{\MFUaddmap}
%\changes{2.08}{2022-10-14}{new}
%Adds a mapping from a control sequence to the appropriate sentence
%case version. No map is added if either argument is empty.
%    \begin{macrocode}
\newrobustcmd*{\MFUaddmap}[2]{%
  \tl_if_empty:nF { #1 }
  {
    \tl_if_empty:nF { #2 }
    {
      \prop_put:Nnn \l__mfirstuc_mappings_prop {#1} {#2}
    }
  }
  \MFUexcl { #1 }
  \MFUblocker { #2 }
}
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
\cs_new:Npn \mfirstuc_get_map:NN #1 #2
 {
   \prop_get:NnN \l__mfirstuc_mappings_prop {#1} #2
 }
%    \end{macrocode}
%\begin{macro}{\MFUsaveatend}
%\changes{2.08}{2022-10-14}{new}
%Save exclusions, blockers and mappings in the aux file, if required
%by some external tool, but delays action to the end of the document.
%    \begin{macrocode}
\newcommand{\MFUsaveatend}{
 \AtEndDocument { \@MFUsavetoaux }
%    \end{macrocode}
%Disable this command.
%    \begin{macrocode}
 \let\MFUsaveatend\relax
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\MFUsave}
%\changes{2.08}{2022-10-14}{new}
%As above but do now.
%    \begin{macrocode}
\newcommand{\MFUsave}{
 \@MFUsavetoaux 
%    \end{macrocode}
%Disable further attempts.
%    \begin{macrocode}
 \let\@MFUsavetoaux\relax
 \let\MFUsave\relax
 \let\MFUsaveatend\relax
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@MFUsavetoaux}
%\changes{2.08}{2022-10-14}{new}
%Save exclusions, blockers and mappings in the aux file, if required
%by some external tool.
%    \begin{macrocode}
\newcommand{\@MFUsavetoaux}{
 \protected@write\@auxout{}
   { \tl_to_str:n { \providecommand{\@mfu@excls}[1]{} } }
 \protected@write\@auxout{}
   { \tl_to_str:n { \providecommand{\@mfu@blockers}[1]{} } }
 \protected@write\@auxout{}
   { \tl_to_str:n { \providecommand{\@mfu@mappings}[1]{} } }
%    \end{macrocode}
%Save current values.
%    \begin{macrocode}
  \protected@write\@auxout{}
  {
    \string\@mfu@excls { \tl_to_str:V \l_text_case_exclude_arg_tl }
  }
  \protected@write\@auxout{}
  {
    \string\@mfu@blockers { \tl_to_str:V \l__mfirstuc_blocker_tl }
  }
  \protected@write\@auxout{}
  {
    \string\@mfu@mappings
    { \expandonce { \prop_to_keyval:N \l__mfirstuc_mappings_prop } }
  }
}
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
\ExplSyntaxOff
%    \end{macrocode}
%The remaining code hasn't been converted to LaTeX3 yet, but may in
%the future, so don't rely on internal commands.
%
%\begin{macro}{\emakefirstuc}
%\changes{1.10}{2015/05/03}{new}
% Fully expand argument before applying case-change.
%    \begin{macrocode}
\newrobustcmd*{\emakefirstuc}[1]{%
  \protected@edef\@MFU@caparg{#1}%
  \expandafter\makefirstuc\expandafter{\@MFU@caparg}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\xmakefirstuc}
%    \begin{macrocode}
\newcommand*{\xmakefirstuc}[1]{\expandafter\makefirstuc\expandafter{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\MFUskippunc}
%\changes{2.07}{2021-10-15}{new}
%    \begin{macrocode}
\newrobustcmd*{\MFUskippunc}[1]{#1}
\MFUexcl{\MFUskippunc}
%    \end{macrocode}
%\end{macro}
%
%Title case commands. Each word has the first letter converted to
%upper case using \cs{MFUcapwordfirstuc}. This uses \cs{makefirstuc}
%by default. It may be redefined to use \cs{MFUsentencecase} or
%\cs{text\_titlecase:n} as applicable.
%\begin{macro}{\MFUcapwordfirstuc}
%\changes{2.07}{2021-10-15}{new}
%    \begin{macrocode}
\newcommand*{\MFUcapwordfirstuc}[1]{%
  \makefirstuc{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\capitalisewords}
%\changes{1.06}{2012/05/21}{new}
% Capitalise each word in the argument. Words are considered to be
% separated by plain spaces (i.e.\ non-breakable spaces won't be
% considered a word break).
%\changes{1.08}{2013-11-04}{made robust}
%\changes{1.09}{2017-07-30}{added check for words that shouldn't be
%capitalised}
%    \begin{macrocode}
\newrobustcmd*{\capitalisewords}[1]{%
  \let\@mfu@checkword\@gobble
  \def\gls@add@space{}%
  \let\@mfu@domakefirstuc\@MFU@dofirst@capword
  \mfu@capitalisewords#1 \@nil\mfu@endcap
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@mfu@mid@capitalisewords}
%\changes{2.03}{2016-07-29}{new}
%\cs{@mfu@checkword} needs to be set before use.
%    \begin{macrocode}
\newcommand*{\@mfu@mid@capitalisewords}[1]{%
  \def\gls@add@space{}%
  \let\@mfu@domakefirstuc\@MFU@do@capword
  \mfu@capitalisewords#1 \@nil\mfu@endcap
}
%    \end{macrocode}
%\end{macro}
%
%    \begin{macrocode}
\def\mfu@capitalisewords#1 #2\mfu@endcap{%
  \def\mfu@cap@first{#1}%
  \def\mfu@cap@second{#2}%
  \gls@add@space
  \@mfu@checkword{#1}%
  \@mfu@domakefirstuc{#1}%
  \def\gls@add@space{ }%
  \ifx\mfu@cap@second\@nnil
    \let\next@mfu@cap\mfu@noop
  \else
    \let\next@mfu@cap\mfu@capitalisewords
    \let\@mfu@checkword\mfu@checkword
  \fi
  \next@mfu@cap#2\mfu@endcap
}
\def\mfu@noop#1\mfu@endcap{}
%    \end{macrocode}
%
%\begin{macro}{\ifMFUhyphen}
%\changes{2.03}{2016-07-29}{new}
%Split on hyphens.
%    \begin{macrocode}
\newif\ifMFUhyphen
\MFUhyphenfalse
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@MFU@do@capword}
%\changes{2.07}{2021-10-15}{new}
%    \begin{macrocode}
\newcommand*{\@MFU@do@capword}[1]{%
  \let\@MFU@cappingword\MFUcapword
  \@MFUwordbreak#1\MFUwordbreak{}\@nil\@endMFUwordbreak
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@MFU@dofirst@capword}
%\changes{2.07}{2021-10-15}{new}
%    \begin{macrocode}
\newcommand*{\@MFU@dofirst@capword}[1]{%
  \let\@MFU@cappingword\MFUcapword
  \@MFUfirstwordbreak#1\MFUwordbreak{}\@nil\@endMFUfirstwordbreak
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\MFUcapword}
%\changes{2.03}{2016-07-29}{new}
%    \begin{macrocode}
\newcommand*{\MFUcapword}[1]{%
  \ifMFUhyphen
   \MFUhyphencapword{#1}%
  \else
   \MFUcapwordfirstuc{#1}%
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\MFUwordbreak}
%\changes{2.07}{2021-10-15}{new}
%Markup a character (or command) that should be treated as a word
%break.
%    \begin{macrocode}
\newrobustcmd*{\MFUwordbreak}[1]{#1}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\MFUhyphencapword}
%\changes{2.07}{2021-10-15}{new}
%    \begin{macrocode}
\newcommand*{\MFUhyphencapword}[1]{%
  \@MFUcapword#1-\@nil\@endMFUcapword
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@MFUcapword}
%\changes{2.03}{2016-07-29}{new}
%    \begin{macrocode}
\def\@MFUcapword#1-#2\@endMFUcapword{%
  \MFUcapwordfirstuc{#1}%
  \def\@mfu@argii{#2}%
  \ifx\@mfu@argii\@nnil
  \else
    -\@MFUcapword#2\@endMFUcapword
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@MFUwordbreak}
%\changes{2.07}{2021-10-15}{new}
%    \begin{macrocode}
\def\@MFUwordbreak#1\MFUwordbreak#2#3\@endMFUwordbreak{%
  \def\@mfu@argiii{#3}%
  \ifx\@mfu@argiii\@nnil
    \@MFU@cappingword{#1}%
  \else
    \let\@MFU@cappingword\@MFU@wordbreakcapword
    \@MFU@cappingword{#1}%
    #2\@MFUwordbreak#3\@endMFUwordbreak
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@MFU@wordbreakcapword}
%\changes{2.07}{2021-10-15}{new}
%    \begin{macrocode}
\newcommand*{\@MFU@wordbreakcapword}[1]{%
  \mfu@checkword{#1}%
  \@mfu@domakefirstuc{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@MFUfirstwordbreak}
%\changes{2.07}{2021-10-15}{new}
%    \begin{macrocode}
\def\@MFUfirstwordbreak#1\MFUwordbreak#2#3\@endMFUfirstwordbreak{%
  \def\@mfu@argiii{#3}%
  \ifx\@mfu@argiii\@nnil
    \@MFU@cappingword{#1}%
  \else
    \let\@MFU@cappingword\@MFU@firstwordbreakcapword
    \@MFU@cappingword{#1}%
    #2\@MFUfirstwordbreak#3\@endMFUfirstwordbreak
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@MFU@firstwordbreakcapword}
%\changes{2.07}{2021-10-15}{new}
%    \begin{macrocode}
\newcommand*{\@MFU@firstwordbreakcapword}[1]{%
  \@mfu@domakefirstuc{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mfu@checkword}
% Check if word should be capitalised.
% This originally used \sty{etoolbox}'s \cs{ifinlist} command
% but this doesn't work if the word contains grouping.
%\changes{1.09}{2017-07-30}{new}
%\changes{2.02}{2015-12-17}{modified to use loop instead of \cs{ifinlist}}
%    \begin{macrocode}
\newcommand*\mfu@checkword[1]{%
  \def\mfu@checkword@arg{#1}%
  \let\@mfu@domakefirstuc\@MFU@do@capword
  \forlistloop\mfu@checkword@do\@mfu@nocaplist
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\mfu@checkword@do}
% Handler for loop used by \cs{mfu@checkword}
%\changes{2.02}{2015-12-17}{new}
%    \begin{macrocode}
\newcommand*{\mfu@checkword@do}[1]{%
  \def\mfu@checkword@argii{#1}%
  \ifdefequal\mfu@checkword@arg\mfu@checkword@argii
  {%
    \let\@mfu@domakefirstuc\@firstofone
    \listbreak
  }%
  {%
%    \end{macrocode}
%Need to check if \cs{@mfu@terminator} has been tacked onto the end.
%    \begin{macrocode}
    \def\mfu@checkword@argii{#1{\@mfu@terminator}}%
    \ifdefequal\mfu@checkword@arg\mfu@checkword@argii
    {%
      \let\@mfu@domakefirstuc\@firstofone
      \listbreak
    }%
    {}%
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@mfu@nocaplist}
% List of words that shouldn't be capitalised.
%\changes{1.09}{2017-07-30}{new}
%    \begin{macrocode}
\newcommand*{\@mfu@nocaplist}{}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\MFUnocap}
% Provide the user with a means to add a word to the list.
% (No expansion performed on the argument.)
%\changes{1.09}{2017-07-30}{new}
%    \begin{macrocode}
\newcommand*{\MFUnocap}[1]{\listadd{\@mfu@nocaplist}{#1}}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\gMFUnocap}
% Global version.
%\changes{1.09}{2017-07-30}{new}
%    \begin{macrocode}
\newcommand*{\gMFUnocap}[1]{\listgadd{\@mfu@nocaplist}{#1}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\MFUclear}
% Clear the list
%\changes{1.09}{2017-07-30}{new}
%    \begin{macrocode}
\newcommand*{\MFUclear}{\renewcommand*{\@mfu@nocaplist}{}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\xcapitalisewords}
%\changes{1.06}{2012/05/21}{new}
% Short-cut command:
%    \begin{macrocode}
\newcommand*{\xcapitalisewords}[1]{%
  \expandafter\capitalisewords\expandafter{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\ecapitalisewords}
%\changes{1.10}{2015/05/03}{new}
% Fully expand argument before applying \cs{capitalisewords}
%    \begin{macrocode}
\newrobustcmd*{\ecapitalisewords}[1]{%
  \protected@edef\@MFU@caparg{#1}%
  \expandafter\capitalisewords\expandafter{\@MFU@caparg}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@mfu@nil}
%    \begin{macrocode}
\newcommand\@mfu@nil{\unskip}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@mfu@nnil}
%    \begin{macrocode}
\newcommand*\@mfu@nnil{\@mfu@nil}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\capitalisefmtwords}
%\changes{2.03}{2016-07-29}{new}
%Like \cs{capitalisewords} but assumes that the phrase contains
%formatting text-block commands.
%    \begin{macrocode}
\newcommand*{\capitalisefmtwords}{%
  \@ifstar\@s@capitalisefmtwords\@ns@capitalisefmtwords
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@s@capitalisefmtwords}
%\changes{2.04}{2016-07-31}{new}
% Starred form.
%    \begin{macrocode}
\newcommand*{\@s@capitalisefmtwords}[1]{%
  \@@s@checkgrp@@capitalisefmtwords#1\@nil
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@s@checkgrp@capitalisefmtwords}
%\changes{2.04}{2016-07-31}{new}
%    \begin{macrocode}
\newcommand*{\@@s@checkgrp@@capitalisefmtwords}{%
  \@ifnextchar\bgroup{\@@s@nocs@capitalisefmtwords}{\@@s@capitalisefmtwords}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@s@nocs@capitalisefmtwords}
%\changes{2.04}{2016-07-31}{new}
%Argument starts with a group.
%    \begin{macrocode}
\def\@@s@nocs@capitalisefmtwords#1\@nil{%
  \capitalisewords{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@s@capitalisefmtwords}
%\changes{2.04}{2016-07-31}{new}
%    \begin{macrocode}
\newcommand*{\@@s@capitalisefmtwords}[1]{%
  \def\gls@argi{#1}%
  \ifx\gls@argi\@MFU@protect
%    \end{macrocode}
%Skip \cs{protect}
%    \begin{macrocode}
    \let\@mfu@capfmtwordsnext\@@s@capitalisefmtwords
  \else
    \ifx\gls@argi\@nnil
%    \end{macrocode}
%Nothing to do.
%    \begin{macrocode}
      \let\@mfu@capfmtwordsnext\relax
    \else
      \def\@gls@tmp{\ #1}%
      \@onelevel@sanitize\@gls@tmp
      \expandafter\@gls@checkcs\@gls@tmp\relax\relax
      \if@glscs
        \def\@mfu@capfmtwordsnext{\@@s@cs@capitalisefmtwords#1}%
      \else
        \def\@mfu@capfmtwordsnext{\@@s@nocs@capitalisefmtwords#1}%
      \fi
    \fi
  \fi
  \@mfu@capfmtwordsnext
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@s@cs@capitalisefmtwords}
%\changes{2.04}{2016-07-31}{new}
%    \begin{macrocode}
\newcommand*{\@@s@cs@capitalisefmtwords}[1]{%
  \@ifnextchar\bgroup
   {\@@s@cs@g@capitalisefmtwords#1}%
   {\@@s@cs@ng@capitalisefmtwords#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@s@cs@g@capitalisefmtwords}
%\changes{2.04}{2016-07-31}{new}
%    \begin{macrocode}
\def\@@s@cs@g@capitalisefmtwords#1#2#3\@nil{%
  #1{\capitalisewords{#2}}%
  \ifblank{#3}%
  {}%
  {%
    \def\gls@add@space{}%
    \let\@mfu@checkword\mfu@checkword
    \mfu@capitalisewords#3 \@nil\mfu@endcap
  }%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@s@cs@ng@capitalisefmtwords}
%\changes{2.04}{2016-07-31}{new}
%    \begin{macrocode}
\def\@@s@cs@ng@capitalisefmtwords#1#2\@nil{%
  \capitalisewords{#1#2}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@ns@capitalisefmtwords}
%\changes{2.04}{2016-07-31}{new}
% Unstarred form.
%    \begin{macrocode}
\newcommand*{\@ns@capitalisefmtwords}[1]{%
  \let\@mfu@checkword\@gobble
  \def\gls@add@space{}%
  \@capitalisefmtwords#1 \@mfu@nil{} \unskip
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@capitalisefmtwords}
%\changes{2.03}{2016-07-29}{new}
%Take care of group at the start of the word.
%    \begin{macrocode}
\newcommand*{\@capitalisefmtwords}{%
  \@ifnextchar\bgroup{\@capitalise@g@fmtwords}{\@capitalise@ng@fmtwords}%
}
\newcommand*{\@capitalise@g@fmtwords}[1]{%
  \@capitalise@ng@fmtwords{{#1}}%
}
\def\@mfu@ifnil#1#2\@mfu@end@nil#3#4{%
  \def\gls@argi{#1}%
  \ifx\gls@argi\@mfu@nnil
    #3%
  \else
    #4%
  \fi
}
\def\@capitalise@ng@fmtwords#1 {%
  \@mfu@ifnil#1\relax\relax\@mfu@end@nil
  {%
    \def\@mfu@capfmtwordsnext{#1}%
  }%
  {%
    \def\@mfu@capfmtwordsnext{%
       \@capitalise@fmtwords#1\@mfu@nil
       \def\gls@add@space{ }%
       \let\@mfu@checkword\mfu@checkword
       \@@cap@nofmtphrase}%
  }%
  \@mfu@capfmtwordsnext
}%
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@capitalise@fmtwords}
%\changes{2.03}{2016-07-29}{new}
%    \begin{macrocode}
\def\@capitalise@fmtwords#1{%
  \@mfu@ifnil#1\relax\relax\@mfu@end@nil
  {%
%    \end{macrocode}
%Do nothing.
%    \begin{macrocode}
    \def\@mfu@capfmtwordsnext{#1}%
  }%
  {%
    \def\gls@argi{#1}%
    \ifx\gls@argi\@MFU@protect
%    \end{macrocode}
%Skip \cs{protect}
%    \begin{macrocode}
      \def\@mfu@capfmtwordsnext{\@capitalise@fmtwords}%
    \else
      \def\@gls@tmp{\ #1}%
      \@onelevel@sanitize\@gls@tmp
      \expandafter\@gls@checkcs\@gls@tmp\relax\relax
      \if@glscs
       \def\@mfu@capfmtwordsnext{\@@capitalisefmtwords#1}%
      \else
       \ifx\gls@argi\@empty
         \def\@mfu@capfmtwordsnext{\@@capnofmtphrase{}}%
       \else
         \def\@mfu@capfmtwordsnext{\@@capnofmtphrase#1}%
       \fi
      \fi
    \fi
  }%
  \@mfu@capfmtwordsnext
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@capitalisefmtwords}
%\changes{2.03}{2016-07-29}{new}
%Check for a group following argument.
%    \begin{macrocode}
\def\@@capitalisefmtwords#1{%
  \@ifnextchar\bgroup{\@@capfmtsubphrase#1}{\@@capnofmtphrase#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@capnofmtphrase}
%\changes{2.03}{2016-07-29}{new}
%    \begin{macrocode}
\def\@@capnofmtphrase{%
  \@ifnextchar\bgroup{\@@cap@g@nofmtphrase}{\@@cap@ng@nofmtphrase}%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@@cap@ng@nofmtphrase}
%\changes{2.04}{2016-07-31}{new}
%    \begin{macrocode}
\def\@@cap@ng@nofmtphrase#1\@mfu@nil{%
  \gls@add@space
  \@mfu@mid@capitalisewords{#1}%
  \def\gls@add@space{ }%
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@@cap@g@nofmtphrase}
%\changes{2.04}{2016-07-31}{new}
%    \begin{macrocode}
\def\@@cap@g@nofmtphrase#1{%
  \@@cap@ng@nofmtphrase{{#1}}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@mfu@terminator}
%\changes{2.04}{2016-07-31}{new}
%    \begin{macrocode}
\newcommand*\@mfu@terminator{\hbox{}}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@capfmtsubphrase}
%\changes{2.03}{2016-07-29}{new}
%    \begin{macrocode}
\def\@@capfmtsubphrase#1#2#3{%
%    \end{macrocode}
%Protect any trailing space at the end of the second argument.
%    \begin{macrocode}
  #1{\@capitalisefmtwords#2{\@mfu@terminator} \@mfu@nil{} \unskip}%
  \def\gls@add@space{ }%
  \let\@mfu@checkword\mfu@checkword
  \@mfu@ifnil#1\relax\relax\@mfu@end@nil
  {\let\@mfu@fmtsubphrasenext\relax}%
  {\def\@mfu@fmtsubphrasenext{#3}}%
  \@mfu@fmtsubphrasenext
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@@cap@nofmtphrase}
%\changes{2.03}{2016-07-29}{new}
%    \begin{macrocode}
\def\@@cap@nofmtphrase#1 {%
  \@mfu@ifnil#1\relax\relax\@mfu@end@nil
  {%
    \def\@mfu@capnofmtwordsnext{#1 }%
  }%
  {%
    \def\@mfu@capnofmtwordsnext{%
      \@capitalisefmtwords#1 \@mfu@nil{} \unskip
      \def\gls@add@space{ }%
      \let\@mfu@checkword\mfu@checkword
      \@capitalisefmtwords
    }%
  }%
  \@mfu@capnofmtwordsnext
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\xcapitalisefmtwords}
%\changes{2.03}{2016-07-29}{new}
% Short-cut command:
%    \begin{macrocode}
\newcommand*{\xcapitalisefmtwords}{%
  \@ifstar\@s@xcapitalisefmtwords\@ns@xcapitalisefmtwords
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@s@xcapitalisefmtwords}
%\changes{2.04}{2016-07-31}{new}
% Starred version
%    \begin{macrocode}
\newcommand*{\@s@xcapitalisefmtwords}[1]{%
  \expandafter\@s@capitalisefmtwords\expandafter{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@ns@xcapitalisefmtwords}
%\changes{2.04}{2016-07-31}{new}
% Unstarred version
%    \begin{macrocode}
\newcommand*{\@ns@xcapitalisefmtwords}[1]{%
  \expandafter\@ns@capitalisefmtwords\expandafter{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\ecapitalisefmtwords}
%\changes{2.03}{2016-07-29}{new}
%    \begin{macrocode}
\newrobustcmd*{\ecapitalisefmtwords}{%
  \@ifstar\@s@ecapitalisefmtwords\@ns@ecapitalisefmtwords
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@s@ecapitalisefmtwords}
%\changes{2.04}{2016-07-31}{new}
%Starred version
%    \begin{macrocode}
\newcommand*{\@s@ecapitalisefmtwords}[1]{%
  \protected@edef\@MFU@caparg{#1}%
  \expandafter\@s@capitalisefmtwords\expandafter{\@MFU@caparg}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@ns@ecapitalisefmtwords}
%\changes{2.04}{2016-07-31}{new}
%Unstarred version
%    \begin{macrocode}
\newcommand*{\@ns@ecapitalisefmtwords}[1]{%
  \protected@edef\@MFU@caparg{#1}%
  \expandafter\@ns@capitalisefmtwords\expandafter{\@MFU@caparg}%
}
%    \end{macrocode}
%\end{macro}
%
%The remaining code is redundant and will be removed in future.
%
%\begin{macro}{\@org@makefirstuc}
% This is the original definition of \cs{makefirstuc}. It will be
% removed in later versions.
% Syntax:
%\begin{definition}
% \cs{makefirstuc}\marg{text}
%\end{definition}
%\changes{1.08}{2013-11-04}{made robust}
%\changes{2.08}{2022-10-14}{updated to use \cs{MFUsentencecase}}
%    \begin{macrocode}
\newif\if@glscs
\newtoks\@glsmfirst
\newtoks\@glsmrest
\newrobustcmd*{\@org@makefirstuc}[1]{%
%    \end{macrocode}
% Check if argument starts with \cs{protect} which needs to be
% skipped.
%\changes{2.01}{2015-12-08}{added check for \cs{protect}}
%    \begin{macrocode}
  \@MFU@p@makefirstuc#1\relax\relax\relax\@end@MFU@protected{#1}%
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@MFU@protect}
%\changes{2.03}{2016-07-29}{new}
%    \begin{macrocode}
\newcommand*{\@MFU@protect}{\protect}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@MFU@skippunc}
%\changes{2.07}{2021-10-15}{new}
%    \begin{macrocode}
\newcommand*{\@MFU@skippunc}{\MFUskippunc}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@MFU@p@makefirstuc}
% Internal command to do the required action.
%    \begin{macrocode}
\def\@MFU@p@makefirstuc#1#2#3\@end@MFU@protected#4{%
%    \end{macrocode}
%\changes{2.03}{2016-07-29}{changed test}
%Test if the first argument is \cs{protect}.
%    \begin{macrocode}
  \def\gls@argi{#1}%
  \ifx\gls@argi\@MFU@protect
   \@makefirstuc{#2#3}%
  \else
%    \end{macrocode}
% v2.07+ also check for \cs{MFUskippunc}
%\changes{2.07}{2021-10-15}{check for \cs{MFUskippunc}}
%    \begin{macrocode}
    \ifx\gls@argi\@MFU@skippunc
      #2\@makefirstuc{#3}%
    \else
      \@makefirstuc{#4}%
    \fi
  \fi
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@makefirstuc}
% Internal command to do the required action.
%    \begin{macrocode}
\newcommand*{\@makefirstuc}[1]{%
  \def\gls@argi{#1}%
  \ifx\gls@argi\@empty
%    \end{macrocode}
% If the argument is empty, do nothing.
%    \begin{macrocode}
  \else
%    \end{macrocode}
%\changes{1.03}{2008/12/22}{changed \cs{protected@edef} to \cs{def}}
%    \begin{macrocode}
    \def\@gls@tmp{\ #1}%
    \@onelevel@sanitize\@gls@tmp
    \expandafter\@gls@checkcs\@gls@tmp\relax\relax
    \if@glscs
%    \end{macrocode}
% Check if we have two sequential control sequences.
%\changes{2.0}{2015/09/09}{added check for two control sequences}
%    \begin{macrocode}
     \expandafter\def\expandafter\@gls@tmp\expandafter{\expandafter
       \ \@gobble #1}%
     \@onelevel@sanitize\@gls@tmp
     \expandafter\@gls@checkcs\@gls@tmp\relax\relax
     \if@glscs\@glscsfalse\else\@glscstrue\fi
    \fi
    \if@glscs
      \@gls@getbody #1{}\@nil
      \ifx\@gls@rest\@empty
        \glsmakefirstuc{#1}%
      \else
        \expandafter\@gls@split\@gls@rest\@nil
        \ifx\@gls@first\@empty
           \glsmakefirstuc{#1}%
        \else
%    \end{macrocode}
%\changes{2.06}{2017-11-14}{check for inner control sequence}
%Does \cs{@gls@first} start with a control sequence?
%    \begin{macrocode}
           \edef\@gls@tmp\expandafter{\noexpand\ \expandonce\@gls@first}%
           \@onelevel@sanitize\@gls@tmp
           \expandafter\@gls@checkcs\@gls@tmp\relax\relax
           \if@glscs
             \edef\@gls@domfirstuc{\expandonce\@gls@body
              {\noexpand\makefirstuc{\expandonce\@gls@first
               \expandonce\@gls@rest}%
              }%
             }%
           \else
             \expandafter\@glsmfirst\expandafter{\@gls@first}%
             \expandafter\@glsmrest\expandafter{\@gls@rest}%
%    \end{macrocode}
%\changes{2.06}{2017-11-14}{added braces to \cs{glsmakefirstuc} argument}
%    \begin{macrocode}
             \edef\@gls@domfirstuc{\noexpand\@gls@body
               {\noexpand\glsmakefirstuc{\the\@glsmfirst}}%
               \the\@glsmrest}%
           \fi
           \@gls@domfirstuc
        \fi
      \fi
    \else
      \glsmakefirstuc{#1}%
    \fi
  \fi
}
%    \end{macrocode}
%\end{macro}
%\begin{macro}{\@gls@split}
% Put first argument in \cs{@gls@first} and second argument in
% \cs{@gls@rest}:
%\changes{2.03}{2016-07-29}{added check for datatool-base UTF-8 support}
%    \begin{macrocode}
\ifdef\dtl@getfirst@UTFviii
{%
  \def\@gls@split#1#2\@nil{%
   \ifbool{@dtl@utf8}
    {%
      \expandafter\dtl@if@two@octets#1#2\relax\dtl@end@if@two@octets
      {%
        \dtl@getfirst@UTFviii#1#2\@nil\end@dtl@getfirst@UTFviii
        \let\@gls@first\dtl@first
        \let\@gls@rest\dtl@rest
      }%
      {%
        \def\@gls@first{#1}\def\@gls@rest{#2}%
      }%
    }%
    {%
%    \end{macrocode}
%\changes{2.04}{2016-07-31}{added missing false part}
%    \begin{macrocode}
      \def\@gls@first{#1}\def\@gls@rest{#2}%
    }%
  }
}%
{%
  \def\@gls@split#1#2\@nil{%
    \def\@gls@first{#1}\def\@gls@rest{#2}%
  }
}
%    \end{macrocode}
%\end{macro}
%    \begin{macrocode}
\def\@gls@checkcs#1 #2#3\relax{%
  \def\@gls@argi{#1}\def\@gls@argii{#2}%
  \ifx\@gls@argi\@gls@argii
    \@glscstrue
  \else
    \@glscsfalse
  \fi
}
%    \end{macrocode}
% Has \sty{datatool-base} v2.24 (or above) been loaded? If so and we
% have UTF-8 enabled, we can grab the first octet.
%\begin{macro}{\@mfu@applytofirst}
%\changes{2.03}{2016-07-29}{new}
%    \begin{macrocode}
\ifdef\dtl@getfirst@UTFviii
{%
  \def\@mfu@applytofirst#1#2\@mfu@end@applytofirst#3{%
    \expandafter\dtl@if@two@octets#1#2\relax\dtl@end@if@two@octets
    {%
       \dtl@getfirst@UTFviii#1#2\@nil\end@dtl@getfirst@UTFviii
       \expandafter#3\expandafter{\dtl@first}\dtl@rest
    }%
    {%
%    \end{macrocode}
%First argument needs to be grouped in case it consists of more than
%one token.
%\changes{2.05}{2017-11-10}{grouped first argument}
%    \begin{macrocode}
      #3{#1}#2%
    }%
  }%
}%
{%
%    \end{macrocode}
%First argument needs to be grouped in case it consists of more than
%one token.
%\changes{2.05}{2017-11-10}{grouped first argument}
%    \begin{macrocode}
  \def\@mfu@applytofirst#1#2\@mfu@end@applytofirst#3{%
      #3{#1}#2%
  }
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\MFUapplytofirst}
%\changes{2.03}{2016-07-29}{new}
%\changes{2.08}{2022-10-14}{deprecated}
%\begin{definition}
%\cs{MFUapplytofirst}\marg{cs}\marg{text}
%\end{definition}
% Apply \meta{cs} to first token of text, or first UTF-8 character
% if \sty{datatool-base} v2.24 above has been loaded with the utf8
% support enabled. Deprecated as from v2.08.
%    \begin{macrocode}
\ifdef\dtl@getfirst@UTFviii
{%
  \newcommand*{\MFUapplytofirst}[2]{%
    \ifbool{@dtl@utf8}
    {%
       \ifblank{#2}%
       {#1{#2}}%
       {%
         \ifblank{#1}%
         {#1#2}%
         {%
           \@mfu@applytofirst#2\@mfu@end@applytofirst#1\relax
         }%
       }%
    }%
    {%
      #1#2%
    }%
  }
}%
{%
  \newcommand*{\MFUapplytofirst}[2]{%
     #1#2%
  }
}
%    \end{macrocode}
%\end{macro}
%
%\begin{macro}{\@gls@makefirstuc}
%\changes{2.08}{2022-10-14}{updated to use \cs{MFUsentencecase}}
%Deprecated.
%    \begin{macrocode}
\def\@gls@makefirstuc#1{\MFUsentencecase{#1}}
%    \end{macrocode}
%\end{macro}
%
% Get the first grouped argument and store in \cs{@gls@body}.
%    \begin{macrocode}
\def\@gls@getbody#1#{\def\@gls@body{#1}\@gls@gobbletonil}
%    \end{macrocode}
% Scoup up everything to \cs{@nil} and store in \cs{@gls@rest}:
%    \begin{macrocode}
\def\@gls@gobbletonil#1\@nil{\def\@gls@rest{#1}}
%    \end{macrocode}
%
%\iffalse
%    \begin{macrocode}
%</mfirstuc.sty>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*mfirstuc-english.sty>
%    \end{macrocode}
%\fi
%\subsection{Mfirstuc-english Documented Code}
%\label{sec:code:mfirstuc-english}
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mfirstuc-english}[2022/10/14 v2.08 (NLCT)]
%    \end{macrocode}
% Load \sty{mfirstuc} if not already loaded:
%    \begin{macrocode}
\RequirePackage{mfirstuc}
%    \end{macrocode}
% Add no-cap words. This list isn't complete. I~don't intend adding
% disputed words. Additional words can be added to the document in
% a~similar manner.
%    \begin{macrocode}
\MFUnocap{a}
\MFUnocap{an}
\MFUnocap{and}
\MFUnocap{but}
\MFUnocap{for}
\MFUnocap{in}
\MFUnocap{of}
\MFUnocap{or}
\MFUnocap{no}
\MFUnocap{nor}
\MFUnocap{so}
\MFUnocap{some}
\MFUnocap{the}
\MFUnocap{with}
\MFUnocap{yet}
%    \end{macrocode}
%\iffalse
%    \begin{macrocode}
%</mfirstuc-english.sty>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*mfirstuc-2021-10-15.sty>
%    \end{macrocode}
%\fi
% \section{Rollback v2.07 (mfirstuc-2021-10-15.sty)}
% Version 2.07 preserved for rollback.
%    \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{mfirstuc}[2021/10/15 v2.07 (NLCT)]
\RequirePackage{etoolbox}
\newif\if@glscs
\newtoks\@glsmfirst
\newtoks\@glsmrest
\newrobustcmd*{\makefirstuc}[1]{%
  \@MFU@p@makefirstuc#1\relax\relax\relax\@end@MFU@protected{#1}%
}
\newcommand*{\@MFU@protect}{\protect}
\newcommand*{\@MFU@skippunc}{\MFUskippunc}
\newrobustcmd*{\MFUskippunc}[1]{#1}
\def\@MFU@p@makefirstuc#1#2#3\@end@MFU@protected#4{%
  \def\gls@argi{#1}%
  \ifx\gls@argi\@MFU@protect
   \@makefirstuc{#2#3}%
  \else
    \ifx\gls@argi\@MFU@skippunc
      #2\@makefirstuc{#3}%
    \else
      \@makefirstuc{#4}%
    \fi
  \fi
}
\newcommand*{\@makefirstuc}[1]{%
  \def\gls@argi{#1}%
  \ifx\gls@argi\@empty
  \else
    \def\@gls@tmp{\ #1}%
    \@onelevel@sanitize\@gls@tmp
    \expandafter\@gls@checkcs\@gls@tmp\relax\relax
    \if@glscs
     \expandafter\def\expandafter\@gls@tmp\expandafter{\expandafter
       \ \@gobble #1}%
     \@onelevel@sanitize\@gls@tmp
     \expandafter\@gls@checkcs\@gls@tmp\relax\relax
     \if@glscs\@glscsfalse\else\@glscstrue\fi
    \fi
    \if@glscs
      \@gls@getbody #1{}\@nil
      \ifx\@gls@rest\@empty
        \glsmakefirstuc{#1}%
      \else
        \expandafter\@gls@split\@gls@rest\@nil
        \ifx\@gls@first\@empty
           \glsmakefirstuc{#1}%
        \else
           \edef\@gls@tmp\expandafter{\noexpand\ \expandonce\@gls@first}%
           \@onelevel@sanitize\@gls@tmp
           \expandafter\@gls@checkcs\@gls@tmp\relax\relax
           \if@glscs
             \edef\@gls@domfirstuc{\expandonce\@gls@body
              {\noexpand\makefirstuc{\expandonce\@gls@first
               \expandonce\@gls@rest}%
              }%
             }%
           \else
             \expandafter\@glsmfirst\expandafter{\@gls@first}%
             \expandafter\@glsmrest\expandafter{\@gls@rest}%
             \edef\@gls@domfirstuc{\noexpand\@gls@body
               {\noexpand\glsmakefirstuc{\the\@glsmfirst}}%
               \the\@glsmrest}%
           \fi
           \@gls@domfirstuc
        \fi
      \fi
    \else
      \glsmakefirstuc{#1}%
    \fi
  \fi
}
\ifdef\dtl@getfirst@UTFviii
{%
  \def\@gls@split#1#2\@nil{%
   \ifbool{@dtl@utf8}
    {%
      \expandafter\dtl@if@two@octets#1#2\relax\dtl@end@if@two@octets
      {%
        \dtl@getfirst@UTFviii#1#2\@nil\end@dtl@getfirst@UTFviii
        \let\@gls@first\dtl@first
        \let\@gls@rest\dtl@rest
      }%
      {%
        \def\@gls@first{#1}\def\@gls@rest{#2}%
      }%
    }%
    {%
      \def\@gls@first{#1}\def\@gls@rest{#2}%
    }%
  }
}%
{%
  \def\@gls@split#1#2\@nil{%
    \def\@gls@first{#1}\def\@gls@rest{#2}%
  }
}
\def\@gls@checkcs#1 #2#3\relax{%
  \def\@gls@argi{#1}\def\@gls@argii{#2}%
  \ifx\@gls@argi\@gls@argii
    \@glscstrue
  \else
    \@glscsfalse
  \fi
}
\ifdef\dtl@getfirst@UTFviii
{%
  \def\@mfu@applytofirst#1#2\@mfu@end@applytofirst#3{%
    \expandafter\dtl@if@two@octets#1#2\relax\dtl@end@if@two@octets
    {%
       \dtl@getfirst@UTFviii#1#2\@nil\end@dtl@getfirst@UTFviii
       \expandafter#3\expandafter{\dtl@first}\dtl@rest
    }%
    {%
      #3{#1}#2%
    }%
  }%
}%
{%
  \def\@mfu@applytofirst#1#2\@mfu@end@applytofirst#3{#3{#1}#2}
}
\ifdef\dtl@getfirst@UTFviii
{%
  \newcommand*{\MFUapplytofirst}[2]{%
    \ifbool{@dtl@utf8}
    {%
       \ifblank{#2}%
       {#1{#2}}%
       {%
         \ifblank{#1}%
         {#1#2}%
         {%
           \@mfu@applytofirst#2\@mfu@end@applytofirst#1\relax
         }%
       }%
    }%
    {%
      #1#2%
    }%
  }
}%
{%
  \newcommand*{\MFUapplytofirst}[2]{#1#2}
}
\def\@gls@makefirstuc#1{\MFUapplytofirst\mfirstucMakeUppercase{#1}}
\newcommand*{\mfirstucMakeUppercase}{\MakeUppercase}
\newcommand*{\glsmakefirstuc}[1]{\@gls@makefirstuc{#1}}
\def\@gls@getbody#1#{\def\@gls@body{#1}\@gls@gobbletonil}
\def\@gls@gobbletonil#1\@nil{\def\@gls@rest{#1}}
\newcommand*{\xmakefirstuc}[1]{%
  \expandafter\makefirstuc\expandafter{#1}%
}
\newrobustcmd*{\emakefirstuc}[1]{%
  \protected@edef\@MFU@caparg{#1}%
  \expandafter\makefirstuc\expandafter{\@MFU@caparg}%
}
\newrobustcmd*{\capitalisewords}[1]{%
  \let\@mfu@checkword\@gobble
  \def\gls@add@space{}%
  \let\@mfu@domakefirstuc\@MFU@dofirst@capword
  \mfu@capitalisewords#1 \@nil\mfu@endcap
}
\newcommand*{\@mfu@mid@capitalisewords}[1]{%
  \def\gls@add@space{}%
  \let\@mfu@domakefirstuc\@MFU@do@capword
  \mfu@capitalisewords#1 \@nil\mfu@endcap
}
\def\mfu@capitalisewords#1 #2\mfu@endcap{%
  \def\mfu@cap@first{#1}%
  \def\mfu@cap@second{#2}%
  \gls@add@space
  \@mfu@checkword{#1}%
  \@mfu@domakefirstuc{#1}%
  \def\gls@add@space{ }%
  \ifx\mfu@cap@second\@nnil
    \let\next@mfu@cap\mfu@noop
  \else
    \let\next@mfu@cap\mfu@capitalisewords
    \let\@mfu@checkword\mfu@checkword
  \fi
  \next@mfu@cap#2\mfu@endcap
}
\def\mfu@noop#1\mfu@endcap{}
\newif\ifMFUhyphen
\MFUhyphenfalse
\newcommand*{\@MFU@do@capword}[1]{%
  \let\@MFU@cappingword\MFUcapword
  \@MFUwordbreak#1\MFUwordbreak{}\@nil\@endMFUwordbreak
}
\newcommand*{\@MFU@dofirst@capword}[1]{%
  \let\@MFU@cappingword\MFUcapword
  \@MFUfirstwordbreak#1\MFUwordbreak{}\@nil\@endMFUfirstwordbreak
}
\newcommand*{\MFUcapword}[1]{%
  \ifMFUhyphen
   \MFUhyphencapword{#1}%
  \else
   \MFUcapwordfirstuc{#1}%
  \fi
}
\newcommand*{\MFUcapwordfirstuc}[1]{%
  \makefirstuc{#1}%
}
\newrobustcmd*{\MFUwordbreak}[1]{#1}
\newcommand*{\MFUhyphencapword}[1]{%
  \@MFUcapword#1-\@nil\@endMFUcapword
}
\def\@MFUcapword#1-#2\@endMFUcapword{%
  \MFUcapwordfirstuc{#1}%
  \def\@mfu@argii{#2}%
  \ifx\@mfu@argii\@nnil
  \else
    -\@MFUcapword#2\@endMFUcapword
  \fi
}
\def\@MFUwordbreak#1\MFUwordbreak#2#3\@endMFUwordbreak{%
  \def\@mfu@argiii{#3}%
  \ifx\@mfu@argiii\@nnil
    \@MFU@cappingword{#1}%
  \else
    \let\@MFU@cappingword\@MFU@wordbreakcapword
    \@MFU@cappingword{#1}%
    #2\@MFUwordbreak#3\@endMFUwordbreak
  \fi
}
\newcommand*{\@MFU@wordbreakcapword}[1]{%
  \mfu@checkword{#1}%
  \@mfu@domakefirstuc{#1}%
}
\def\@MFUfirstwordbreak#1\MFUwordbreak#2#3\@endMFUfirstwordbreak{%
  \def\@mfu@argiii{#3}%
  \ifx\@mfu@argiii\@nnil
    \@MFU@cappingword{#1}%
  \else
    \let\@MFU@cappingword\@MFU@firstwordbreakcapword
    \@MFU@cappingword{#1}%
    #2\@MFUfirstwordbreak#3\@endMFUfirstwordbreak
  \fi
}
\newcommand*{\@MFU@firstwordbreakcapword}[1]{%
  \@mfu@domakefirstuc{#1}%
}
\newcommand*\mfu@checkword[1]{%
  \def\mfu@checkword@arg{#1}%
  \let\@mfu@domakefirstuc\@MFU@do@capword
  \forlistloop\mfu@checkword@do\@mfu@nocaplist
}
\newcommand*{\mfu@checkword@do}[1]{%
  \def\mfu@checkword@argii{#1}%
  \ifdefequal\mfu@checkword@arg\mfu@checkword@argii
  {%
    \let\@mfu@domakefirstuc\@firstofone
    \listbreak
  }%
  {%
    \def\mfu@checkword@argii{#1{\@mfu@terminator}}%
    \ifdefequal\mfu@checkword@arg\mfu@checkword@argii
    {%
      \let\@mfu@domakefirstuc\@firstofone
      \listbreak
    }%
    {}%
  }%
}
\newcommand*{\@mfu@nocaplist}{}
\newcommand*{\MFUnocap}[1]{\listadd{\@mfu@nocaplist}{#1}}
\newcommand*{\gMFUnocap}[1]{\listgadd{\@mfu@nocaplist}{#1}}
\newcommand*{\MFUclear}{\renewcommand*{\@mfu@nocaplist}{}}
\newcommand*{\xcapitalisewords}[1]{%
  \expandafter\capitalisewords\expandafter{#1}%
}
\newrobustcmd*{\ecapitalisewords}[1]{%
  \protected@edef\@MFU@caparg{#1}%
  \expandafter\capitalisewords\expandafter{\@MFU@caparg}%
}
\newcommand\@mfu@nil{\unskip}
\newcommand*\@mfu@nnil{\@mfu@nil}
\newcommand*{\capitalisefmtwords}{%
  \@ifstar\@s@capitalisefmtwords\@ns@capitalisefmtwords
}
\newcommand*{\@s@capitalisefmtwords}[1]{%
  \@@s@checkgrp@@capitalisefmtwords#1\@nil
}
\newcommand*{\@@s@checkgrp@@capitalisefmtwords}{%
  \@ifnextchar\bgroup{\@@s@nocs@capitalisefmtwords}{\@@s@capitalisefmtwords}%
}
\def\@@s@nocs@capitalisefmtwords#1\@nil{%
  \capitalisewords{#1}%
}
\newcommand*{\@@s@capitalisefmtwords}[1]{%
  \def\gls@argi{#1}%
  \ifx\gls@argi\@MFU@protect
    \let\@mfu@capfmtwordsnext\@@s@capitalisefmtwords
  \else
    \ifx\gls@argi\@nnil
      \let\@mfu@capfmtwordsnext\relax
    \else
      \def\@gls@tmp{\ #1}%
      \@onelevel@sanitize\@gls@tmp
      \expandafter\@gls@checkcs\@gls@tmp\relax\relax
      \if@glscs
        \def\@mfu@capfmtwordsnext{\@@s@cs@capitalisefmtwords#1}%
      \else
        \def\@mfu@capfmtwordsnext{\@@s@nocs@capitalisefmtwords#1}%
      \fi
    \fi
  \fi
  \@mfu@capfmtwordsnext
}
\newcommand*{\@@s@cs@capitalisefmtwords}[1]{%
  \@ifnextchar\bgroup
   {\@@s@cs@g@capitalisefmtwords#1}%
   {\@@s@cs@ng@capitalisefmtwords#1}%
}
\def\@@s@cs@g@capitalisefmtwords#1#2#3\@nil{%
  #1{\capitalisewords{#2}}%
  \ifblank{#3}%
  {}%
  {%
    \def\gls@add@space{}%
    \let\@mfu@checkword\mfu@checkword
    \mfu@capitalisewords#3 \@nil\mfu@endcap
  }%
}
\def\@@s@cs@ng@capitalisefmtwords#1#2\@nil{%
  \capitalisewords{#1#2}%
}
\newcommand*{\@ns@capitalisefmtwords}[1]{%
  \let\@mfu@checkword\@gobble
  \def\gls@add@space{}%
  \@capitalisefmtwords#1 \@mfu@nil{} \unskip
}
\newcommand*{\@capitalisefmtwords}{%
  \@ifnextchar\bgroup{\@capitalise@g@fmtwords}{\@capitalise@ng@fmtwords}%
}
\newcommand*{\@capitalise@g@fmtwords}[1]{%
  \@capitalise@ng@fmtwords{{#1}}%
}
\def\@mfu@ifnil#1#2\@mfu@end@nil#3#4{%
  \def\gls@argi{#1}%
  \ifx\gls@argi\@mfu@nnil
    #3%
  \else
    #4%
  \fi
}
\def\@capitalise@ng@fmtwords#1 {%
  \@mfu@ifnil#1\relax\relax\@mfu@end@nil
  {%
    \def\@mfu@capfmtwordsnext{#1}%
  }%
  {%
    \def\@mfu@capfmtwordsnext{%
       \@capitalise@fmtwords#1\@mfu@nil
       \def\gls@add@space{ }%
       \let\@mfu@checkword\mfu@checkword
       \@@cap@nofmtphrase}%
  }%
  \@mfu@capfmtwordsnext
}%
\def\@capitalise@fmtwords#1{%
  \@mfu@ifnil#1\relax\relax\@mfu@end@nil
  {%
    \def\@mfu@capfmtwordsnext{#1}%
  }%
  {%
    \def\gls@argi{#1}%
    \ifx\gls@argi\@MFU@protect
      \def\@mfu@capfmtwordsnext{\@capitalise@fmtwords}%
    \else
      \def\@gls@tmp{\ #1}%
      \@onelevel@sanitize\@gls@tmp
      \expandafter\@gls@checkcs\@gls@tmp\relax\relax
      \if@glscs
       \def\@mfu@capfmtwordsnext{\@@capitalisefmtwords#1}%
      \else
       \ifx\gls@argi\@empty
         \def\@mfu@capfmtwordsnext{\@@capnofmtphrase{}}%
       \else
         \def\@mfu@capfmtwordsnext{\@@capnofmtphrase#1}%
       \fi
      \fi
    \fi
  }%
  \@mfu@capfmtwordsnext
}
\def\@@capitalisefmtwords#1{%
  \@ifnextchar\bgroup{\@@capfmtsubphrase#1}{\@@capnofmtphrase#1}%
}
\def\@@capnofmtphrase{%
  \@ifnextchar\bgroup{\@@cap@g@nofmtphrase}{\@@cap@ng@nofmtphrase}%
}
\def\@@cap@ng@nofmtphrase#1\@mfu@nil{%
  \gls@add@space
  \@mfu@mid@capitalisewords{#1}%
  \def\gls@add@space{ }%
}
\def\@@cap@g@nofmtphrase#1{%
  \@@cap@ng@nofmtphrase{{#1}}%
}
\newcommand*\@mfu@terminator{\hbox{}}
\def\@@capfmtsubphrase#1#2#3{%
  #1{\@capitalisefmtwords#2{\@mfu@terminator} \@mfu@nil{} \unskip}%
  \def\gls@add@space{ }%
  \let\@mfu@checkword\mfu@checkword
  \@mfu@ifnil#1\relax\relax\@mfu@end@nil
  {\let\@mfu@fmtsubphrasenext\relax}%
  {\def\@mfu@fmtsubphrasenext{#3}}%
  \@mfu@fmtsubphrasenext
}
\def\@@cap@nofmtphrase#1 {%
  \@mfu@ifnil#1\relax\relax\@mfu@end@nil
  {%
    \def\@mfu@capnofmtwordsnext{#1 }%
  }%
  {%
    \def\@mfu@capnofmtwordsnext{%
      \@capitalisefmtwords#1 \@mfu@nil{} \unskip
      \def\gls@add@space{ }%
      \let\@mfu@checkword\mfu@checkword
      \@capitalisefmtwords
    }%
  }%
  \@mfu@capnofmtwordsnext
}
\newcommand*{\xcapitalisefmtwords}{%
  \@ifstar\@s@xcapitalisefmtwords\@ns@xcapitalisefmtwords
}
\newcommand*{\@s@xcapitalisefmtwords}[1]{%
  \expandafter\@s@capitalisefmtwords\expandafter{#1}%
}
\newcommand*{\@ns@xcapitalisefmtwords}[1]{%
  \expandafter\@ns@capitalisefmtwords\expandafter{#1}%
}
\newrobustcmd*{\ecapitalisefmtwords}{%
  \@ifstar\@s@ecapitalisefmtwords\@ns@ecapitalisefmtwords
}
\newcommand*{\@s@ecapitalisefmtwords}[1]{%
  \protected@edef\@MFU@caparg{#1}%
  \expandafter\@s@capitalisefmtwords\expandafter{\@MFU@caparg}%
}
\newcommand*{\@ns@ecapitalisefmtwords}[1]{%
  \protected@edef\@MFU@caparg{#1}%
  \expandafter\@ns@capitalisefmtwords\expandafter{\@MFU@caparg}%
}
%    \end{macrocode}
%\iffalse
%    \begin{macrocode}
%</mfirstuc-2021-10-15.sty>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*sample-mfirstuc.tex>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
 % This file is public domain
 % If you want to use arara, you need the following directive:
 % arara: pdflatex: { synctex: on }
 % arara: pdflatex: { synctex: on }
\documentclass{article}

\usepackage[a4paper]{geometry}
\usepackage{color}
\usepackage{mfirstuc-english}% also loads mfirstuc.sty
\usepackage[hidelinks]{hyperref}

\title{Sample Document Illustrating the mfirstuc Package}
\author{Nicola Talbot}

\begin{document}
\maketitle

\tableofcontents

\section{Sentence Case (First Letter Upper Case)}
\label{sec:sentencecase}

\verb|\MFUsentencecase{abc}.|
\MFUsentencecase{abc}.

\verb|\MFUsentencecase{{\em abc}}.|
\MFUsentencecase{{\em abc}}.

\verb|\MFUsentencecase{\emph{abc}}.|
\MFUsentencecase{\emph{abc}}.

\verb|\MFUsentencecase{\ae bc}.|
\MFUsentencecase{\ae bc}.

\verb|\MFUsentencecase{{\ae}bc}.|
\MFUsentencecase{{\ae}bc}.

\verb|\newcommand{\abc}{abc}\MFUsentencecase{\abc}.|
\newcommand{\abc}{abc}%
\MFUsentencecase{\abc}.

\verb|\MFUsentencecase{\ref{sec:sentencecase}bc}.|
\MFUsentencecase{\ref{sec:sentencecase}bc}.

\verb|\makefirstuc| doesn't expand its argument and skips exclusions.

\verb|\makefirstuc{abc}.|
\makefirstuc{abc}.

\verb|\makefirstuc{{\em abc}}.|
\makefirstuc{{\em abc}}.

\verb|\makefirstuc{\emph{abc}}.|
\makefirstuc{\emph{abc}}.

\verb|\makefirstuc{\ref{sec:sentencecase}bc}.|
\makefirstuc{\ref{sec:sentencecase}bc}.

\newcommand{\strong}[1]{\textcolor{red}{#1}}
\verb|\makefirstuc{\strong{abc}d}|
\makefirstuc{\strong{abc}d}

\verb|\makefirstuc{\protect\strong{abc}d}|
\makefirstuc{\protect\strong{abc}d}

Exclusions vs blockers:

\verb|\MFUsentencecase{\NoCaseChange{abc} xyz}|
\MFUsentencecase{\NoCaseChange{abc} xyz}

\verb|\makefirstuc{\NoCaseChange{abc} xyz}|
\makefirstuc{\NoCaseChange{abc} xyz}

\begingroup
\verb|\MFUblocker{\NoCaseChange}\makefirstuc{\NoCaseChange{abc} xyz}|
\MFUblocker{\NoCaseChange}\makefirstuc{\NoCaseChange{abc} xyz}

\endgroup

\section{Title Case (No Formatting Commands)}

\bgroup
%Clearing ``nocap'' words.
%\verb|\MFUclear|
%\MFUclear
%(localised by group)

\verb|\capitalisewords{the wind in the willows}|
\capitalisewords{the wind in the willows}

\verb|\capitalisewords{a small book of rhyme.}|
\capitalisewords{a small book of rhyme.}

\medskip

\verb|\space| isn't considered a word boundary for
\verb|\capitalisewords| as shown below:

\begin{verbatim}
\capitalisewords{a small\space book of rhyme.}
\end{verbatim}
\capitalisewords{a small\space book of rhyme.}

\medskip
No expansion is performed on the argument of
\verb|\capitalisewords|:

\verb|\newcommand{\mytitle}{a small book of rhyme.}|
\newcommand{\mytitle}{a small book of rhyme.}

\verb|\capitalisewords{\mytitle}|
\capitalisewords{\mytitle}

\verb|\xcapitalisewords{\mytitle}|
\xcapitalisewords{\mytitle}

\egroup

Formatting for the entire phrase must go outside
\verb|\capitalisewords| (unlike \verb|\makefirstuc|). Compare:

\begin{verbatim}
\capitalisewords{\textbf{a small book of rhyme.}}
\end{verbatim}
\capitalisewords{\textbf{a small book of rhyme.}}

\begin{verbatim}
\textbf{\capitalisewords{a small book of rhyme.}}
\end{verbatim}
\textbf{\capitalisewords{a small book of rhyme.}}

\medskip

Use \verb|\capitalisefmtwords| instead. The starred form
is limited to one text-block command at the start of the argument.

\begin{verbatim}
\capitalisefmtwords*{\emph{a small book of rhyme}}
\end{verbatim}
\capitalisefmtwords*{\emph{a small book of rhyme}}

Additional text-block commands can cause unexpected results.

\begin{verbatim}
\capitalisefmtwords*{\emph{a small} book \textbf{of rhyme}}
\end{verbatim}
\capitalisefmtwords*{\emph{a small} book \textbf{of rhyme}}


\section{Title Case (Contains Text-Block Formatting Commands)}

The unstarred form of \verb|\capitalisefmtwords| is still a bit 
experimental and is only designed
for phrases that contain text-block commands with a single
argument, which should be a word or sub-phrase.

\verb|\capitalisefmtwords{\textbf{a small book of rhyme}}.|
\capitalisefmtwords{\textbf{a small book of rhyme}}.

\verb|\capitalisefmtwords{\textbf{a small book} of rhyme}.|
\capitalisefmtwords{\textbf{a small book} of rhyme}.

\verb|\capitalisefmtwords{a \textbf{small book} of rhyme}.|
\capitalisefmtwords{a \textbf{small book} of rhyme}.

\verb|\capitalisefmtwords{\textbf{a} small book of rhyme}.|
\capitalisefmtwords{\textbf{a} small book of rhyme}.

\verb|\capitalisefmtwords{a small book \textbf{of rhyme}}.|
\capitalisefmtwords{a small book \textbf{of rhyme}}.

\medskip

Be careful of trailing spaces at the end a group. They can confuse
things.

\verb|\capitalisefmtwords{\textbf{a small }book of rhyme}.|
\capitalisefmtwords{\textbf{a small }book of rhyme}.

\verb|\capitalisefmtwords{\textbf{a small book }of rhyme}.|
\capitalisefmtwords{\textbf{a small book }of rhyme}.

\verb|\capitalisefmtwords{\textbf{a small book of }rhyme}.|
\capitalisefmtwords{\textbf{a small book of }rhyme}.

\medskip

Use semantic commands for things like quotations:

\begin{verbatim}
\newcommand*{\qt}[1]{``#1''}
\capitalisefmtwords{\qt{a small book of rhyme.}}
\end{verbatim}
\newcommand*{\qt}[1]{``#1''}
\capitalisefmtwords{\qt{a small book of rhyme.}}

\smallskip

(But make them robust if you intend using commands like
\verb|\ecapitalisefmtwords|.)
Similarly for other types of punctuation:
\begin{verbatim}
\newcommand*{\esq}[1]{'?#1?}
\capitalisefmtwords{\esq{D\'onde est\'a libro}}
\end{verbatim}
\newcommand*{\esq}[1]{?`#1?}
\capitalisefmtwords{\esq{D\'onde est\'a libro}}

\medskip

Anything more complicated than a simple one-argument text-block
command requires the starred version.

\begin{verbatim}
\newcommand*{\swap}[2]{{#2}{#1}}
\capitalisefmtwords*{\textbf{an \swap{un}{usually} small book of} rhyme}.
\end{verbatim}
\newcommand*{\swap}[2]{{#2}{#1}}
\capitalisefmtwords*{\textbf{an \swap{un}{usually} small book of} rhyme}.

\medskip

Nested text-block commands:

\begin{verbatim}
\capitalisefmtwords{\textbf{a \emph{small book} of} rhyme}.
\end{verbatim}
\capitalisefmtwords{\textbf{a \emph{small book} of} rhyme}.

\begin{verbatim}
\capitalisefmtwords{\textbf{a \emph{small book}} of rhyme}.
\end{verbatim}
\capitalisefmtwords{\textbf{a \emph{small book}} of rhyme}.

\begin{verbatim}
\capitalisefmtwords{\textbf{\emph{a small} book of} rhyme}.
\end{verbatim}
\capitalisefmtwords{\textbf{\emph{a small} book of} rhyme}.

\medskip

An empty brace at the start of a word will suppress the
case-changing.

\begin{verbatim}
\capitalisefmtwords{\textbf{a small {}book of} rhyme}.
\end{verbatim}
\capitalisefmtwords{\textbf{a small {}book of} rhyme}.

\medskip

Suppress case-changing for problematic commands by inserting
an empty group in front:

\begin{verbatim}
\capitalisefmtwords{{}\textcolor{red}{a} small book of 
{}\textcolor{red}{rhyme}}.
\end{verbatim}
\capitalisefmtwords{{}\textcolor{red}{a} small book of 
{}\textcolor{red}{rhyme}}.

\medskip

If possible provide semantic command instead.

\begin{verbatim}
\newcommand*{\alert}[1]{\textcolor{red}{#1}}
\capitalisefmtwords{\alert{a} small book of \alert{rhyme}}.
\end{verbatim}
\newcommand*{\alert}[1]{\textcolor{red}{#1}}
\capitalisefmtwords{\alert{a} small book of \alert{rhyme}}.

\medskip

No formatting commands in the following example:

\verb|\capitalisefmtwords{a small book of rhyme}.|
\capitalisefmtwords{a small book of rhyme}.

\medskip

Avoid scoped declarations. The next example doesn't work.

\begin{verbatim}
\capitalisefmtwords{{\bfseries a \emph{small book} of} rhyme.}
\end{verbatim}
\capitalisefmtwords{{\bfseries a \emph{small book} of} rhyme.}

\medskip

If a command isn't followed by a grouped argument, the
case-change is applied to the command (on the assumption
that it's a character command, such as \verb|\ae|). This can
have an odd effect if case-changing has no meaning for that command.
As illustrated next:

\verb|\capitalisefmtwords{\relax a book of rhyme.}|
\capitalisefmtwords{\relax a book of rhyme.}

\section{Compound Words}

Use \verb|\MFUhyphentrue| to title case each part of
a compound word.

Default:
\begin{verbatim}
\capitalisewords{a fast-paced book of rhyme}.
\capitalisefmtwords{a \textbf{fast-paced} book of rhyme}.
\end{verbatim}
\capitalisewords{a fast-paced book of rhyme}.
\capitalisefmtwords{a \textbf{fast-paced} book of rhyme}.

Compare with
\begin{verbatim}
\MFUhyphentrue
\capitalisewords{a fast-paced book of rhyme}.
\capitalisefmtwords{a \textbf{fast-paced} book of rhyme}.
\end{verbatim}
\MFUhyphentrue
\capitalisewords{a fast-paced book of rhyme}.
\capitalisefmtwords{a \textbf{fast-paced} book of rhyme}.

\end{document}
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</sample-mfirstuc.tex>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%<*mfirstuc.l2h>
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
# File        : mfirstuc.l2h
# Author      : Nicola L. C. Talbot
# Version     : 2.08 (2022-10-14)
# Description : LaTeX2HTML (limited!) implementation of mfirstuc package

# This is a LaTeX2HTML style implementing the mfirstuc package, and
# was distributed as part of the glossaries package, but is now
# distributed as part of the mfirstuc package. There's no guarantee
# that it still works with new versions of LaTeX2HTML.
#
# v2.08:
#  - The version number has been updated
#  - file extension changed from .perl to .l2h to more easily identify it as a
#    LaTeX2HTML file rather than a standalone Perl script.
#  - Added MFUsentencecase but it's identical to makefirstuc
#
# Copyright 2007-2022 Nicola L.C. Talbot
# This work may be distributed and/or modified under the
# conditions of the LaTeX Project Public License, either version 1.3
# of this license of (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 work has the LPPL maintenance status `maintained'.
#
# The Current Maintainer of this work is Nicola Talbot.

use warnings;

package main;

sub do_cmd_makefirstuc{
   local($_) = @_;

   local($id,$text);

   $text = &missing_braces unless
      s/$next_pair_pr_rx/$id=$1;$text=$2;''/eo;

   &translate_commands("\\glsmakefirstuc $text") . $_;
}

sub do_cmd_MFUsentencecase{
   local($_) = @_;

   local($id,$text);

   $text = &missing_braces unless
      s/$next_pair_pr_rx/$id=$1;$text=$2;''/eo;

   &translate_commands("\\glsmakefirstuc $text") . $_;
}

sub do_cmd_xmakefirstuc{
   local($_) = @_;

   local($id,$text);
  
   $text = &missing_braces unless
      s/$next_pair_pr_rx/$id=$1;$text=$2;''/eo;

   unless ($id)
   {
      $id = ++$global{'max_id'};
   }
   
   &translate_commands("\\expandafter \\makefirstuc $OP$id$CP$text$OP$id$CP")
   . $_;
}

sub do_cmd_glsmakefirstuc{
   local($_) = @_;

   local($id,$text);

   $text = &get_next_object unless
      s/$next_pair_pr_rx/$id=$1;$text=$2;''/eo;

   &do_real_makefirstuc($text).$_;
}

sub do_real_makefirstuc{
   local($text) = @_;

   if ($text=~/^((?:\s*<[^>]+>\s*)+)(.*)/)
   {
      $text = $1 . ucfirst($2);
   }
   else
   {
      $text = ucfirst($text);
   }

   $text;
}

sub do_cmd_capitalisewords{
   local($_) = @_;

   local($id,$text);

   $text = &missing_braces unless
      s/$next_pair_pr_rx/$id=$1;$text=$2;''/eo;

   local($newtext) = '';

   foreach my $word (split ' ', $text)
   {
      $id = ++$global{'max_id'};

      $word = &translate_commands("\\makefirstuc $OP$id$CP$word$OP$id$CP");

      if ($newtext)
      {
         $newtext .= ' ' . $word;
      }
      else
      {
         $newtext = $word;
      }
   }

   $newtext.$_;
}

sub get_next_object{
    local($next, $revert, $thisline);
    local($this_cmd) = $cmd;
    $this_cmd =~ s/^\\// unless ($cmd eq "\\");
    if (/^[\s%]*([^\n]*)\n/ ) {
        $thisline = &revert_to_raw_tex($1)
    } else {
        $thisline = &revert_to_raw_tex($_);
    }
    s/^\s*//;
    if ($_ =~ s/$next_token_rx//) { $next = $& };
    $next =~ s/$comment_mark(\d+\n?)?//g;
    if ($next =~ /^\\(\W|\d|[a-zA-z]*\b)/) {
        $revert = $next = "\\".$1;
    } elsif ($next =~ /\W/) {
        $revert = &revert_to_raw_tex($next);
    } else { $revert = $next };
    $next;
}

1;
%    \end{macrocode}
%\fi
%\iffalse
%    \begin{macrocode}
%</mfirstuc.l2h>
%    \end{macrocode}
%\fi
%\Finale
\endinput
