Bug Tracker 
| ID | 104🔗 |
|---|---|
| Submitted by: | Nicola Talbot 🦜 |
| Date: | 2015-12-08 09:41:49 |
| Status | Closed (Fixed) |
| Category | mfirstuc |
| Version | 2.01 |
| Summary | \capitalisewords fails with commands in non-first word |
Sign in to subscribe to notifications about this report.
Description
\capitalisewords works okay when the first word contains a command, but not when subsequent words of the phrase contain commands or grouping.
Error message:
! You can't use `macro parameter character #' in math mode. <recently read> ##
MWE
Download (436B)
\documentclass{article}
\usepackage{mfirstuc}
\begin{document}
%\newcommand*{\test}{\textbf{s}ample phrase}% works
%\newcommand*{\test}{\textbf{s}ample p\textbf{h}rase}% doesn't work
%\newcommand*{\test}{\textbf{s}ample {p}hrase}% doesn't work
\newcommand*{\test}{\textbf{s}ample \textbf{p}hrase}% doesn't work
Tagged text: \test.
First letter uppercase: \xmakefirstuc{\test}.
Title Case: \xcapitalisewords{\test}.
\end{document}
Evaluation
The cause is due to the use of etoolbox's \ifinlist macro, which is only intended for unformatted strings. The same error message is caused by:
\documentclass{article}
\usepackage{etoolbox}
\begin{document}
\newcommand{\testlist}{}
\ifinlist{\textbf{f}oo}{\testlist}{TRUE}{FALSE}.
\end{document}
The remedy is for mfirstuc (or its author, me) to follow the recommendation of the etoolbox manual and use a loop instead of \ifinlist. This will be fixed in the next version of mfirstuc.
Temporary patch for pre v2.02:
\renewcommand*\mfu@checkword[1]{%
\def\mfu@checkword@arg{#1}%
\let\@mfu@domakefirstuc\makefirstuc
\forlistloop\mfu@checkword@do\@mfu@nocaplist
}
\newcommand*{\mfu@checkword@do}[1]{%
\ifdefstring{\mfu@checkword@arg}{#1}%
{%
\let\@mfu@domakefirstuc\@firstofone
\listbreak
}%
{}%
}
Update 2015-12-17: Fixed in version 2.02.
Comments
0 comments.
Add Comment
Page permalink: https://www.dickimaw-books.com/bugtracker.php?key=104
