Изменить причудливое оглавление

Изменить причудливое оглавление

Я создаю необычный ToC на основе вопроса @plutonКак настроить оглавление с помощью TikZ?

Хотя этот код работает нормально, кажется, что он ведет себя неправильно при использовании приложения. Вместо добавления записи Appendix Aон добавляет Chapter A.

Кроме того, при добавлении ненумерованной главы я бы предпочел не иметь запись Chapter, а либо цветную рамку, либо вообще ничего.

Мой код

\documentclass[11pt,a4paper]{book}

\usepackage{tikz,pgf}
\usepackage{tocloft,titletoc,titlesec}
\definecolor{doc}{RGB}{0,60,110}
\definecolor{myblueii}{RGB}{63,200,244}
\usepackage{lipsum}

\contentsmargin{0cm}
\titlecontents{chapter}[0pc]
{\addvspace{30pt}%
\begin{tikzpicture}[remember picture, overlay]%
\draw[fill=myblueii,draw=myblueii, rounded corners] (-4,-.1) rectangle (-0.15,.5);%
\pgftext[left,x=-2.7cm,y=0.2cm]{\color{white}\Large \chaptertitlename\ \thecontentslabel};%
\end{tikzpicture}\color{myblueii}\large\bfseries}%
{}
{}
{\hspace*{6pt}\titlerule\hspace*{6pt}\large\bfseries \thecontentspage
\begin{tikzpicture}[remember picture, overlay]
\draw[fill=doc!25,draw=myblueii, rounded corners=0pt] (2pt,0) rectangle (6,0.1pt);
\end{tikzpicture}}%
\titlecontents{section}[2.4pc]
{\addvspace{1pt}}
{\contentslabel[\thecontentslabel]{2.4pc}}
{}
{\hfill\small \thecontentspage}
[]
\titlecontents{subsection}[4.8pc]
{\addvspace{1.0pt}}
{\contentslabel[\thecontentslabel]{2.4pc}}
{}
{\hfill\small\thecontentspage}
[]

\makeatletter
\renewcommand{\tableofcontents}{%
\chapter*{%
\vspace*{-20\p@}%
\begin{tikzpicture}[remember picture, overlay]%
\pgftext[right,x=15cm,y=0.2cm]{\color{myblueii}\Huge \contentsname};%
\draw[fill=myblueii,draw=myblueii, rounded corners=15pt] (13,-.75) rectangle (20,1);%
\clip (13,-.75) rectangle (20,1);
\pgftext[right,x=15cm,y=0.2cm]{\color{white}\Huge \contentsname};%
\end{tikzpicture}}%
\@starttoc{toc}}
\makeatother

\begin{document}
 \tableofcontents
 \chapter{First Chapter}
 \lipsum[1]
 \chapter{Second Chapter}
 \lipsum[1]
 \chapter{Third Chapter}
 \lipsum[1]
 \appendix
 \chapter{First Appendix Chapter}
 \lipsum[1]
 \chapter{Second Appendix Chapter}
 \lipsum[1]
 \chapter*{Chapter}
 \addcontentsline{toc}{chapter}{Chapter}
 \lipsum[1]
\end{document}

и мой вывод -

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

Есть ли способ выполнить эти два требования?

решение1

Я думаю, что это упущение или даже ошибка в способе формирования оглавления.

Внутри файла latex \appendixкоманда меняется \@chapappс \chapternameна \appendixnameи это используется для получения правильного заголовка в заголовках глав и приложений. К сожалению, эта информация НЕ передается в файл оглавления (toc). В настоящее время, например, в book.cls, запись для главы или приложения записывается в файл toc через:

\addcontentsline{toc}{chapter}{\protect\numberline{\thechapter}#1}

Это означает, что записи глав и приложений в toc-файле выглядят совершенно одинаково, когда выполняется \tableofcontents, поэтому toc-файл не может различать главы и приложения (без некоторого взлома). Было бы лучше, если бы также были

\addcontentsline{toc}{appendix}{\protect\numberline{\thechapter}#1}

строки -- хотя вы не можете использовать \@chapappдля генерации этих строк, поскольку значение \@hapappзависит от языка... поэтому код не будет таким элегантным:(

Чтобы обойти эту проблему, одним из решений является замена использования \chaptertitlenameв коде Pluton, скажем, на , \tocchapternameа затем добавление следующего кода в начало вашего файла:

\let\tocchaptername\chaptertitlename
\let\originalAppendix\appendix
\renewcommand\appendix{\originalAppendix%
    \addtocontents{toc}{\let\string\tocchaptername\string\appendixname}%
 }

При этом приложения помечаются так, как хочет автор. (Использование \addtocontents— это хак, позволяющий записать несколько строк в toc-файл без использования \makeatletter\@writefile{toc}...\makeatother.)

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

На самом деле, изображение выше требует немного больше, чем я сказал до сих пор. Во-первых, поскольку "appendix" имеет на один символ больше, чем "chapter", интервал требует небольшой дополнительной настройки. (Чтобы центрировать chapter и appendix, эти числа нужно корректировать более тщательно:)

А если серьезно, то использование \chapter*для последнего "приложения" приводит к синей метке "приложение", что, вероятно, не то, что вам нужно. Было бы сложно исправить это должным образом (например, справиться со случаем, когда в документе есть чередующиеся команды \chapter{..}и \chapter*{...}). Предполагая, что OP хочет пустые метки с этого момента (как на изображении выше), вы можете просто добавить строку

\addtocontents{toc}{\let\string\tocchaptername\string\relax}

перед \chapter*{}командой. Если кто-то хотел чередовать использование отмеченных и неотмеченных глав/приложений, то ему нужно было ввести

\addtocontents{toc}{\let\string\tocchaptername\string\chaptertitlename}

чтобы дать toc-файлу знать, что происходит (используя очевидное изменение в приложении).

Вот код, который я использовал:

\documentclass[11pt,a4paper]{book}

\usepackage{tikz,pgf}
\usepackage{tocloft,titletoc,titlesec}
\definecolor{doc}{RGB}{0,60,110}
\definecolor{myblueii}{RGB}{63,200,244}
\usepackage{lipsum}

\let\tocchaptername\chaptertitlename
\let\originalAppendix\appendix
\renewcommand\appendix{\originalAppendix\addtocontents{toc}{\let\string\tocchaptername\string\appendixname}}

\contentsmargin{0cm}
\titlecontents{chapter}[0pc]
{\addvspace{30pt}%
\begin{tikzpicture}[remember picture, overlay]%
\draw[fill=myblueii,draw=myblueii, rounded corners] (-4,-.1) rectangle (0.10,.5);%
\pgftext[left,x=-2.7cm,y=0.2cm]{\color{white}\Large \tocchaptername\ \thecontentslabel};%
\end{tikzpicture}\color{myblueii}\large\bfseries\quad}%
{}
{}
{\hspace*{6pt}\titlerule\hspace*{6pt}\large\bfseries \thecontentspage
\begin{tikzpicture}[remember picture, overlay]
\draw[fill=doc!25,draw=myblueii, rounded corners=0pt] (2pt,0) rectangle (6,0.1pt);
\end{tikzpicture}}%
\titlecontents{section}[2.4pc]
{\addvspace{1pt}}
{\contentslabel[\thecontentslabel]{2.4pc}}
{}
{\hfill\small \thecontentspage}
[]
\titlecontents{subsection}[4.8pc]
{\addvspace{1.0pt}}
{\contentslabel[\thecontentslabel]{2.4pc}}
{}
{\hfill\small\thecontentspage}
[]

\makeatletter
\renewcommand{\tableofcontents}{%
\chapter*{%
\vspace*{-20\p@}%
\begin{tikzpicture}[remember picture, overlay]%
\pgftext[right,x=15cm,y=0.2cm]{\color{myblueii}\Huge \contentsname};%
\draw[fill=myblueii,draw=myblueii, rounded corners=15pt] (13,-.75) rectangle (20,1);%
\clip (13,-.75) rectangle (20,1);
\pgftext[right,x=15cm,y=0.2cm]{\color{white}\Huge \contentsname};%
\end{tikzpicture}}%
\@starttoc{toc}}
\makeatother

\begin{document}
 \tableofcontents
 \chapter{First Chapter}
 \lipsum[1]
 \chapter{Second Chapter}
 \lipsum[1]
 \chapter{Third Chapter}
 \lipsum[1]
 \appendix
 \chapter{First Appendix Chapter}
 \lipsum[1]
 \chapter{Second Appendix Chapter}
 \lipsum[1]
 \addtocontents{toc}{\let\string\tocchaptername\string\relax}
 \chapter*{Chapter}
 \addcontentsline{toc}{chapter}{Chapter}
 \lipsum[1]
\end{document}

Редактировать - ненумерованные главы

Наконец, отвечая на ваш вопрос в комментариях, чтобы избавиться от пустого синего маркера для ненумерованных глав, замените окружение tikzpictureinsde в \titlecontents{chapter}команде выше на следующий вариант (на самом деле, я заодно немного улучшил код):

\begin{tikzpicture}[remember picture, overlay]%
  \ifx\tocchaptername\relax\relax%
  \else%
    \draw(-0.15,0.15)node[anchor=east,align=center,fill=myblueii,text=white,rounded corners,
              rectangle, minimum width=8.5em]{\Large \tocchaptername\ \thecontentslabel};
  \fi%
\end{tikzpicture}\color{myblueii}\large\bfseries}%

При использовании этого метода вывод теперь выглядит так:

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

Если между пронумерованными главами/приложениями будет много ненумерованных, то вам, вероятно, захочется определить команду следующим образом:

\newcommand\unnumberedchapter[1]{%
   \addtocontents{toc}{\let\string\tocchaptername\string\relax}%
   \chapter*{#1}%
   \addtocontents{toc}{\let\string\tocchaptername\string\chaptertitlename}%
}

Затем вы можете просто печатать, \unnumberedchapter{Chapter title}когда вам это нужно.

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