
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 fancyhdr
trabalhar com \ecapitalisewords
?
EDITAR:
notei que isso \nouppercase
mata\MakeUppercase
\def\nouppercase##1{{\let\uppercase\relax\let\MakeUppercase\relax
\expandafter\let\csname MakeUppercase \endcsname\relax##1}}%
que, no entanto, é necessário para \ecapitalisewords
quais usos
\def\@gls@makefirstuc#1{\MFUapplytofirst\mfirstucMakeUppercase{#1}}
\newcommand*{\mfirstucMakeUppercase}{\MakeUppercase}
Observo ainda que isso fancyhdr.sty
define \chaptermark
com \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 \chaptermark
ela \sectionmark
é redefinida quando você liga \pagestyle{mainmatter}
. Isso acontece porque todo estilo de página criado com \fancypagestyle
também chama \ps@fancy
quando definido, e isso define ambos \chaptermark
e \sectionmark
para algo que usa \MakeUppercase
.
Para se livrar desses \MakeUppercase
s, 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 \fancypagestyle
não funcionará porque \ps@fancy
é chamado por último e desfaria esses patches. No entanto, você pode corrigir a macro \ps@mainmatter
criada \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}
Termo aditivo:
Você também pode redefinir \ps@fancy
para 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 \exhaustivepatchcmd
porque chamar manualmente \patchcmd
três vezes parece errado. Eu removo \def\MakeUppercase{\uppercase}
porque essa instância de \MakeUppercase
nã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, \mchapter
mas você pode redefinir o comando \chapter original para fazê-lo mesmo que seja um comando com estrela, etc.aqui)