Coloque a primeira letra das palavras em maiúscula na marca do capítulo

Coloque a primeira letra das palavras em maiúscula na marca do capítulo

Gostaria de colocar em maiúscula a primeira letra de várias palavras do capítulo e a marca do capítulo. Embora o texto do capítulo em si esteja em maiúscula, na marca do capítulo não está.

Aqui está um MWE do meu código atual:

\documentclass{book}

\usepackage{mfirstuc,fancyhdr,lipsum}

\fancypagestyle{mainmatter}{%
    \fancyhf{}
    \fancyhead[LE]{\thepage}
    \fancyhead[RO]{\thepage}
    \fancyhead[RE]{\nouppercase{\leftmark}}
    \fancyhead[LO]{\nouppercase{\rightmark}}
}

\begin{document}
    \pagestyle{mainmatter}
    \chapter{\ecapitalisewords{some thing} with Text}
    \lipsum[1-5]
\end{document}

Como posso fancyhdrtrabalhar com \ecapitalisewords?

insira a descrição da imagem aqui

EDITAR:

notei que isso \nouppercasemata\MakeUppercase

\def\nouppercase##1{{\let\uppercase\relax\let\MakeUppercase\relax
      \expandafter\let\csname MakeUppercase \endcsname\relax##1}}%

que, no entanto, é necessário para \ecapitalisewordsquais usos

\def\@gls@makefirstuc#1{\MFUapplytofirst\mfirstucMakeUppercase{#1}}
\newcommand*{\mfirstucMakeUppercase}{\MakeUppercase}

Observo ainda que isso fancyhdr.sty define \chaptermarkcom \MakeUppercase.

Por esta razão, tentei

 \documentclass{book}

 \usepackage{mfirstuc,fancyhdr,lipsum}




 \fancypagestyle{mainmatter}{%
    \fancyhf{}
    \fancyhead[LE]{\thepage}
    \fancyhead[RO]{\thepage}
    \fancyhead[RE]{\leftmark}
    \fancyhead[LO]{\rightmark}
 }
% 


\let\orgMakeUppercase\MakeUppercase

\usepackage{xpatch}
\makeatletter
\xpatchcmd{\chaptermark}{\MakeUppercase}{}{}{}
\xpatchcmd{\sectionmark}{\MakeUppercase}{}{}{}
\xpatchcmd{\@gls@makefirstuc}{\mfirstucMakeUppercase}{\orgMakeUppercase}{}{}
\makeatother


\begin{document}
    \pagestyle{mainmatter}
    \chapter{\ecapitalisewords{some thing} with Text}
    \lipsum[1-5]
\end{document}

Mas sem sucesso, desta vez a marca do capítulo é TODA MAIÚSCULA, o que significa que o patch não pareceu funcionar.

Responder1

A razão pela qual sua solução não funciona é que \chaptermarkela \sectionmarké redefinida quando você liga \pagestyle{mainmatter}. Isso acontece porque todo estilo de página criado com \fancypagestyletambém chama \ps@fancyquando definido, e isso define ambos \chaptermarke \sectionmarkpara algo que usa \MakeUppercase.

Para se livrar desses \MakeUppercases, você pode adicionar as linhas (que copiei da sua pergunta)

\xpatchcmd{\chaptermark}{\MakeUppercase}{}{}{}%
\xpatchcmd{\sectionmark}{\MakeUppercase}{}{}{}%

ao seu documento, logo após ligar para \pagestyle{mainmatter}.

Adicionar essas linhas ao segundo argumento de \fancypagestylenão funcionará porque \ps@fancyé chamado por último e desfaria esses patches. No entanto, você pode corrigir a macro \ps@mainmattercriada \fancypagestyle{mainmatter}{…}diretamente para incluir essas linhas. Veja como isso seria/poderia acontecer:

\documentclass{book}
\usepackage{mfirstuc,fancyhdr,lipsum}

\fancypagestyle{mainmatter}{% %% <- defines \ps@mainmatter
    \fancyhf{}%
    \fancyhead[LE]{\thepage}%
    \fancyhead[RO]{\thepage}%
    \fancyhead[RE]{\leftmark}%
    \fancyhead[LO]{\rightmark}%
}

\usepackage{xpatch}
\makeatletter
  \appto\ps@mainmatter{% %% <- appends to \ps@mainmatter
    \xpatchcmd{\chaptermark}{\MakeUppercase}{}{}{}%
    \xpatchcmd{\sectionmark}{\MakeUppercase}{}{}{}%
  }
\makeatother

\begin{document}
    \pagestyle{mainmatter} %% <- calls \ps@mainmatter
    \chapter{\ecapitalisewords{some thing} with Text}
    \lipsum[1-5]
\end{document}

título do capítulo

cabeçalho


Termo aditivo:

Você também pode redefinir \ps@fancypara remover todas as instâncias \MakeUppercase, mas está pedindo a solução menos invasiva e provavelmente não seria essa. Para completar, porém, aqui está uma maneira de fazer isso:

\documentclass{book}
\usepackage{mfirstuc,fancyhdr,lipsum}

\fancypagestyle{mainmatter}{% %% <- defines \ps@mainmatter
    \fancyhf{}%
    \fancyhead[LE]{\thepage}%
    \fancyhead[RO]{\thepage}%
    \fancyhead[RE]{\leftmark}%
    \fancyhead[LO]{\rightmark}%
}

\usepackage{xpatch}
\newrobustcmd\exhaustivepatchcmd[3]{% %%<- patches as often as necessary
  \patchcmd{#1}{#2}{#3}{\exhaustivepatchcmd{#1}{#2}{#3}}{}%
}
\makeatletter
  \patchcmd{\ps@fancy}{\def\MakeUppercase{\uppercase}}{}{}{}
  \exhaustivepatchcmd{\ps@fancy}{\MakeUppercase}{\@firstofone}
\makeatother

\begin{document}
    \pagestyle{mainmatter}
    \chapter{\ecapitalisewords{some thing} with Text}
    \lipsum[1-5]
\end{document}

(Eu defino apenas \exhaustivepatchcmdporque chamar manualmente \patchcmdtrês vezes parece errado. Eu removo \def\MakeUppercase{\uppercase}porque essa instância de \MakeUppercasenão deve ser corrigida (e não serve para nada).)

Responder2

Uma possível solução seria esta:

\documentclass{book}

\usepackage{mfirstuc,fancyhdr,lipsum}

\fancypagestyle{mainmatter}{%
    \fancyhf{}
    \fancyhead[LE]{\thepage}
    \fancyhead[RO]{\thepage}
    \fancyhead[RE]{\leftmark}
    \fancyhead[LO]{\rightmark}
}
\newcounter{mychap}
\newcommand\mychapadd{\setcounter{mychap}{\value{chapter}}\stepcounter{mychap}}
\newcommand\mchapter[1]{\xdef\Arg{#1}\mychapadd\xdef\leftmark{Chapter~\themychap.\space\Arg}
\chapter{\Arg}}
\begin{document}
    \pagestyle{mainmatter}
    \mchapter{\ecapitalisewords{this is} a test}
    \lipsum[1-5]
\end{document}

Esta solução usa o comando, \mchaptermas você pode redefinir o comando \chapter original para fazê-lo mesmo que seja um comando com estrela, etc.aqui)

informação relacionada