%\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 \~} % %\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} % %\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} % % \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} % % \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} % % \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} % % \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} % % \end{macrocode} %\fi %\Finale \endinput