
Me gustaría poner en mayúscula la primera letra de varias palabras del capítulo y la marca del capítulo. Si bien el texto del capítulo en sí está en mayúscula, en la marca del capítulo no lo está.
Aquí hay un MWE de mi código actual:
\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}
¿Cómo puedo hacer que fancyhdr
funcione \ecapitalisewords
?
EDITAR:
noté que \nouppercase
mata\MakeUppercase
\def\nouppercase##1{{\let\uppercase\relax\let\MakeUppercase\relax
\expandafter\let\csname MakeUppercase \endcsname\relax##1}}%
cuál sin embargo es necesario para \ecapitalisewords
qué usos
\def\@gls@makefirstuc#1{\MFUapplytofirst\mfirstucMakeUppercase{#1}}
\newcommand*{\mfirstucMakeUppercase}{\MakeUppercase}
Además, me doy cuenta de que fancyhdr.sty
se define \chaptermark
con \MakeUppercase
.
Por esta razón, intenté
\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}
Pero sin éxito, esta vez la marca del capítulo es TODO EN MAYÚSCULAS, lo que significa que el parche no pareció funcionar.
Respuesta1
La razón por la que su solución no funciona es esa \chaptermark
y \sectionmark
se redefinen cuando llama \pagestyle{mainmatter}
. Esto sucede porque cada estilo de página creado con \fancypagestyle
también llama \ps@fancy
cuando se establece, y esto establece ambos \chaptermark
y \sectionmark
en algo que usa \MakeUppercase
.
Para deshacerse de estos \MakeUppercase
mensajes de correo electrónico, puede agregar las líneas (que copié de su pregunta)
\xpatchcmd{\chaptermark}{\MakeUppercase}{}{}{}%
\xpatchcmd{\sectionmark}{\MakeUppercase}{}{}{}%
a su documento, justo después de llamar \pagestyle{mainmatter}
.
Agregar estas líneas al segundo argumento de \fancypagestyle
no funcionará porque \ps@fancy
se llama en último lugar y desharía estos parches. Sin embargo, puede parchear la macro \ps@mainmatter
creada \fancypagestyle{mainmatter}{…}
directamente para incluir estas líneas. Así es como eso sería/podría ser:
\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}
Apéndice:
También podría redefinir \ps@fancy
para eliminar todas las instancias \MakeUppercase
allí, pero está solicitando la solución menos invasiva, y probablemente esa no sería la solución. Sin embargo, para completar, aquí hay una manera de hacerlo:
\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}
(Solo lo defino \exhaustivepatchcmd
porque llamar manualmente \patchcmd
tres veces parece incorrecto. Elimino \def\MakeUppercase{\uppercase}
porque esa instancia de \MakeUppercase
no debería parchearse (y no sirve para nada).)
Respuesta2
Una posible solución sería 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 solución utiliza el comando \mchapter
, pero puede redefinir el comando \chapter original para hacerlo incluso si es un comando destacado, etc. (Veraquí)