
Я создаю необычный 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}
Редактировать - ненумерованные главы
Наконец, отвечая на ваш вопрос в комментариях, чтобы избавиться от пустого синего маркера для ненумерованных глав, замените окружение tikzpicture
insde в \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}
когда вам это нужно.