
Я хотел бы сделать заглавными первые буквы нескольких слов в главе и знаке главы. Хотя текст в самой главе заглавный, в знаке главы — нет.
Вот MWE моего текущего кода:
\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}
Как мне заставить fancyhdr
работать \ecapitalisewords
?
РЕДАКТИРОВАТЬ:
Я заметил, что \nouppercase
убивает\MakeUppercase
\def\nouppercase##1{{\let\uppercase\relax\let\MakeUppercase\relax
\expandafter\let\csname MakeUppercase \endcsname\relax##1}}%
который однако необходим для \ecapitalisewords
которого используется
\def\@gls@makefirstuc#1{\MFUapplytofirst\mfirstucMakeUppercase{#1}}
\newcommand*{\mfirstucMakeUppercase}{\MakeUppercase}
Я далее замечаю, что fancyhdr.sty
определяет \chaptermark
с помощью \MakeUppercase
.
По этой причине я попытался
\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}
Но успеха это не принесло, на этот раз метка главы ВСЕ ЗАГЛАВНЫЕ БУКВЫ, а это значит, что исправление, похоже, не сработало.
решение1
Причина, по которой ваше решение не работает, заключается в том, что \chaptermark
и \sectionmark
переопределяются при вызове \pagestyle{mainmatter}
. Это происходит потому, что каждый стиль страницы, созданный с помощью , \fancypagestyle
также вызывается \ps@fancy
при установке, и это устанавливает \chaptermark
и \sectionmark
для чего-то, что использует \MakeUppercase
.
Чтобы избавиться от этих \MakeUppercase
s, вы можете добавить строки (которые я скопировал из вашего вопроса)
\xpatchcmd{\chaptermark}{\MakeUppercase}{}{}{}%
\xpatchcmd{\sectionmark}{\MakeUppercase}{}{}{}%
в ваш документ, сразу после вызова \pagestyle{mainmatter}
.
Добавление этих строк во второй аргумент \fancypagestyle
не сработает, поскольку \ps@fancy
вызывается последним и отменит эти исправления. Однако вы можете исправить макрос \ps@mainmatter
, созданный \fancypagestyle{mainmatter}{…}
напрямую, чтобы включить эти строки. Вот как это будет/может быть:
\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}
Приложение:
Вы также можете переопределить, \ps@fancy
чтобы удалить все экземпляры \MakeUppercase
там, но вы просите наименее инвазивное решение, и это, вероятно, не оно. Для полноты, однако, вот способ сделать это:
\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}
(Я определяю только \exhaustivepatchcmd
потому, что ручной вызов \patchcmd
три раза кажется неправильным. Я удаляю, \def\MakeUppercase{\uppercase}
потому что этот экземпляр \MakeUppercase
не должен быть исправлен (и не имеет смысла).)
решение2
Возможным решением было бы следующее:
\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}
Это решение использует команду \mchapter
, но вы можете переопределить исходную команду \chapter, чтобы она выполнялась, даже если это помеченная команда и т. д. (См.здесь)