장 표시의 단어 첫 글자를 대문자로 표시

장 표시의 단어 첫 글자를 대문자로 표시

챕터와 챕터 표시에 포함된 여러 단어의 첫 글자를 대문자로 표기하고 싶습니다. 장 자체의 텍스트는 대문자로 표시되지만 장 표시에서는 그렇지 않습니다.

내 현재 코드의 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}

그러나 성공하지 못한 경우, 챕터마크는 이번에는 ALL CAPITAL입니다. 즉, 패치가 제대로 작동하지 않는 것 같습니다.

답변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 명령이 별표 표시된 명령인 경우에도 해당 명령을 다시 정의할 수 있습니다. (참조여기)

관련 정보