章节标记中单词首字母大写

章节标记中单词首字母大写

我想将章​​节和章节标记中的几个单词的首字母大写。虽然章节本身的文本是大写的,但章节标记中的文本不是大写的。

以下是我当前代码的 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,你可以添加行(我从你的问题中复制而来)

\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 命令来执行此操作,即使它是一个带星号的命令等。(请参阅这里

相关内容