Делать заглавной первую букву слов в обозначении главы

Делать заглавной первую букву слов в обозначении главы

Я хотел бы сделать заглавными первые буквы нескольких слов в главе и знаке главы. Хотя текст в самой главе заглавный, в знаке главы — нет.

Вот 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.

Чтобы избавиться от этих \MakeUppercases, вы можете добавить строки (которые я скопировал из вашего вопроса)

\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, чтобы она выполнялась, даже если это помеченная команда и т. д. (См.здесь)

Связанный контент