
Ich möchte den Anfangsbuchstaben mehrerer Wörter im Kapitel und in der Kapitelmarkierung groß schreiben. Während der Text im Kapitel selbst groß geschrieben wird, ist dies in der Kapitelmarkierung nicht der Fall.
Hier ist ein MWE meines aktuellen Codes:
\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}
Wie kann ich fancyhdr
damit arbeiten \ecapitalisewords
?
BEARBEITEN:
Mir ist aufgefallen, dass \nouppercase
tötet\MakeUppercase
\def\nouppercase##1{{\let\uppercase\relax\let\MakeUppercase\relax
\expandafter\let\csname MakeUppercase \endcsname\relax##1}}%
\ecapitalisewords
was aber von welchen Anwendungen benötigt wird
\def\@gls@makefirstuc#1{\MFUapplytofirst\mfirstucMakeUppercase{#1}}
\newcommand*{\mfirstucMakeUppercase}{\MakeUppercase}
Mir fällt weiter auf, dass mit fancyhdr.sty
definiert ist .\chaptermark
\MakeUppercase
Aus diesem Grund habe ich versucht
\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}
Aber ohne Erfolg, die Kapitelmarke ist diesmal VOLLSTÄNDIG IN GROSSBUCHSTABEN geschrieben, was bedeutet, dass das Patchen von Anfang an nicht funktioniert zu haben scheint.
Antwort1
Der Grund, warum Ihre Lösung nicht funktioniert, ist, dass \chaptermark
und \sectionmark
neu definiert werden, wenn Sie aufrufen \pagestyle{mainmatter}
. Das liegt daran, dass jeder mit erstellte Seitenstil \fancypagestyle
auch aufruft \ps@fancy
, wenn festgelegt, und dies sowohl \chaptermark
als auch \sectionmark
auf etwas setzt, das verwendet \MakeUppercase
.
Um diese s loszuwerden \MakeUppercase
, könnten Sie die Zeilen hinzufügen (die ich aus Ihrer Frage kopiert habe)
\xpatchcmd{\chaptermark}{\MakeUppercase}{}{}{}%
\xpatchcmd{\sectionmark}{\MakeUppercase}{}{}{}%
zu Ihrem Dokument, direkt nach dem Aufruf \pagestyle{mainmatter}
.
Das Hinzufügen dieser Zeilen zum zweiten Argument von \fancypagestyle
funktioniert nicht, da \ps@fancy
zuletzt aufgerufen wird und diese Patches rückgängig gemacht werden würden. Sie könnten jedoch das \ps@mainmatter
von erstellte Makro \fancypagestyle{mainmatter}{…}
direkt patchen, um diese Zeilen einzuschließen. So würde/könnte das ablaufen:
\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}
Nachtrag:
Sie könnten auch neu definieren, \ps@fancy
um alle Instanzen von \MakeUppercase
dort zu entfernen, aber Sie suchen nach der am wenigsten invasiven Lösung, und das wäre wahrscheinlich nicht die richtige. Der Vollständigkeit halber ist hier jedoch eine Möglichkeit, dies zu tun:
\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}
(Ich definiere es nur , weil es sich falsch anfühlt, dreimal \exhaustivepatchcmd
manuell aufzurufen . Ich entferne es , weil diese Instanz nicht gepatcht werden sollte (und keinem Zweck dient).)\patchcmd
\def\MakeUppercase{\uppercase}
\MakeUppercase
Antwort2
Eine mögliche Lösung wäre diese:
\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}
Diese Lösung verwendet den Befehl \mchapter
, aber Sie können den ursprünglichen \chapter-Befehl auch dann neu definieren, wenn es sich um einen mit Sternchen markierten Befehl usw. handelt. (SieheHier)