Как сохранить Приложение (как есть) в оглавлении, но сделать заголовок заглавным в отчете

Как сохранить Приложение (как есть) в оглавлении, но сделать заголовок заглавным в отчете

Я использую reportи мне нужно, чтобы заголовки глав были заглавными (включая Приложение), но не в Оглавлении. Например, вместо "Приложение А" должно быть написано "ПРИЛОЖЕНИЕ А" внутри статьи и "Приложение А" в Оглавлении. Кажется, я исправил обычные главы, но не могу понять, как исправить Приложение.

Я могу просто изменить \appendixnameна APPENDIX, но тогда в TOC он будет отображаться как полностью заглавный (чего я бы предпочел не делать). Изменение определения \appendixкласса отчета, похоже, имеет тот же эффект (я полагаю, потому что это по сути просто переопределение \@chapapp):

\renewcommand{\appendix}{\par
   \setcounter{chapter}{0}%
   \setcounter{section}{0}%
   \gdef\@chapapp{APPENDIX}% modified from \appendixname
   \gdef\thechapter{\@Alph\c@chapter}}

Мне удалось исправить проблему с обычной главой, оставив \chapternameвсе как есть и жестко закодировав CHAPTER вместо использования \@chapappследующего (который был частью исходного шаблона — я его не создавал, поэтому не совсем понимаю, что все это делает):

\def\@chapter[#1]#2{
    \ifnum \c@secnumdepth >\m@ne
        \refstepcounter{chapter}%
        \typeout{CHAPTER\space\thechapter.} % originally used \@chapapp
        \addcontentsline{toc}{chapter}%
        {\@chapapp\space {\thechapter}: {#1}}
    \else
         \addcontentsline{toc}{chapter}{#1}%                     
    \fi
    \chaptermark{#1}%
    \addtocontents{lof}{\protect\addvspace{10\p@}}%
    \addtocontents{lot}{\protect\addvspace{10\p@}}%
    \if@twocolumn
        \@topnewpage[\@makechapterhead{#2}]%
    \else
        \@makechapterhead{#2}%
        \@afterheading
    \fi
}

Честно говоря, я не понимаю, почему \uppercaseне работает следующее, но слово «Глава» пишется не с заглавной буквы\@chapapp (это также было в оригинальном шаблоне) ивсе ещепоявляется в файле стилей после вышеприведенного (названия глав имеютвсегдабыли написаны ЗАГЛАВНЫМИ БУКВАМИ, просто без префикса «Глава x:»).

\def\@makechapterhead#1{%
    \vspace*{-20\p@}%
    {\parindent \z@ \raggedright \normalfont
    \interlinepenalty\@M
    \ifnum \c@secnumdepth >\m@ne
        \centering  \large\bfseries 
        \uppercase{\@chapapp\space \thechapter: #1}
    \fi
    \vskip 20\p@
    }
}

решение1

Решение без жесткого кодирования или .clsпрямого редактирования файла:

Автор статьи был прав в своем предположении о \@makechapterhead:

\def\@makechapterhead#1{%
  \vspace*{50\p@}%
  {\parindent \z@ \raggedright \normalfont
    \ifnum \c@secnumdepth >\m@ne
        \huge\bfseries \@chapapp\space \thechapter
        \par\nobreak
        \vskip 20\p@
    \fi
    \interlinepenalty\@M
    \Huge \bfseries #1\par\nobreak
    \vskip 40\p@
  }}

Строка с \@chapappдействительно печатает Chapter(или Приложение), за которым следует номер главы.

Чтобы получить эту заглавную букву, необходимо использовать \MakeUppercase{\@chapapp}, а не \uppercase.

Вместо того, чтобы редактировать report.clsкод, лучше использовать \xpatchcmd, искать строку \huge\bfseries\@chapapp..и заменять ее соответствующим кодом с помощью \MakeUppercase.

Однако это следует делать только после \appendix, поэтому добавьте этот патч к \appendixusing \xapptocmd{\appendix}{...}(см. код, пожалуйста)

\documentclass{report}


\usepackage{xpatch}


\makeatletter

\xapptocmd{\appendix}{%
\xpatchcmd{\@makechapterhead}{%
  \huge\bfseries \@chapapp\space \thechapter
}{%
  \huge\bfseries \MakeUppercase{\@chapapp}\space \thechapter
}{\typeout{Patching \@makechapterhead succeeded}}{\typeout{Patching failed}}% Patching ends
}{\typeout{Appending succeeded}}{\typeout{Appending failed}}
\makeatother

\begin{document}

\chapter{First}

\appendix

\chapter{Appendix 1}

\end{document}

введите описание изображения здесь

Обратите внимание, что мой код не работает для \chapter*приложений типа -.

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