Фон:
Я создаю компиляцию из нескольких статей формата IEEE. Эта компиляция будет иметь единое оглавление. Каждая статья включает заголовок и \maketitle
команду. Я хотел бы, чтобы TOC включал заголовок каждой статьи в качестве основного уровня, вместе со всеми разделами/подразделами и т. д.
\documentclass[journal]{IEEEtran}
\begin{document}
\onecolumn
\tableofcontents
\twocolumn
% Title and Author information Paper 1
\title{Title 1}
\author{Author 1}
% Make the title area
\maketitle
$ Paper Content
% Title and Author information Paper 2
\title{Title 2}
\author{Author 2}
% Make the title area
\maketitle
$ Paper Content
\end{document}
Необходимо сгенерировать оглавление, которое приблизительно выглядит следующим образом:
Заголовок 1
Я - Раздел 1
Подраздел 1 IA
Подраздел 2 IB
II - Раздел 2
Заголовок 2
Я - Раздел 1
Подраздел 1 IA
Подраздел 2 IB
II - Раздел 2
Вопрос:
Как изменить оглавление, включив в него заголовки?
Я открыт для других предложений. Я понимаю, что ieeetran или другие классы статей/журналов не используют команды \chapter
or \part
, но если бы был способ принудительно выполнить эту операцию, не меняя класс, мне было бы интересно и такое решение.
решение1
\maketitle
это команда, которая «отключает» себя прямо перед концом макроса (ну, \relax
тогда он ed). Таким образом, дальнейший вызов этого макроса ничего не даст. Используя команду patch, это \let\maketitle\relax
можно поймать и\addcontentsline
вместо этого ввести команду, которая затем выполнит запись ToC.
Я также ввел titlecounter
счетчик, который автоматически рефшагирует, так что\label
тоже должно работать. Формат записи ToC на данный момент довольно прост — меняйте по желанию.
У Мико было важное возражение: \clearpage
в начале команды должно быть право \maketitle
, которое отправит возможные поплавки из предыдущей статьи. Однако я ограничил это поведение 2-й и т. д \maketitle
.
\documentclass[journal]{IEEEtran}
\usepackage{etoolbox}%
\usepackage{xpatch}
\usepackage{blindtext}
\makeatletter
\newcounter{titlecounter}
\xpretocmd{\maketitle}{\ifnumgreater{\value{titlecounter}}{1}}{\clearpage}{}{} % Well, this is lazy at the end ;-)
\xpatchcmd{\maketitle}{\let\maketitle\relax\let\@maketitle\relax}{\refstepcounter{titlecounter}\addcontentsline{toc}{section}{\protect{\numberline{\thetitlecounter}{\@title~ \@author}}}}{\typeout{Patching was successful}}{\typeout{patching failed}}%
\makeatother
\begin{document}
\onecolumn
\tableofcontents
\twocolumn
% Title and Author information Paper 1
\title{Title 1}
\author{Author 1}
% Make the title area
\maketitle
\blindtext[10]
%$ Paper Content
% Title and Author information Paper 2
\title{Title 2}
\author{Author 2}
% Make the title area
\maketitle
\blindtext[20]
%$ Paper Content
\end{document}
Версия с отступом уровня
Используйте \setlength{\articlesectionindent}{10pt}
(или любое другое подходящее значение), чтобы получить отступ уровней относительно записи заголовка оглавления.
Сброс разделов и т.д. производится командой \@addtoreset{section}{titlecounter}
, т.е. каждый раз при titlecounter
нажатии сбрасываются разделы (а затем и подразделы и т.д.)
\documentclass[journal]{IEEEtran}
\usepackage{etoolbox}%
\usepackage{xpatch}
\usepackage{blindtext}
\usepackage{tocloft}%
\newlength{\articlesectionshift}%
\setlength{\articlesectionshift}{10pt}%
\addtolength{\cftsecindent}{\articlesectionshift}%
\makeatletter
\newcounter{titlecounter}
\xpretocmd{\maketitle}{\ifnumgreater{\value{titlecounter}}{1}}{\clearpage}{}{} % Well, this is lazy at the end ;-)
\xpatchcmd{\maketitle}{\let\maketitle\relax\let\@maketitle\relax}{\refstepcounter{titlecounter}\begingroup
\addtocontents{toc}{\begingroup\addtolength{\cftsecindent}{-\articlesectionshift}}%
\addcontentsline{toc}{section}{\protect{\numberline{\thetitlecounter}{\@title~ \@author}}}%
\addtocontents{toc}{\endgroup}}{\typeout{Patching was successful}}{\typeout{patching failed}}%
\@addtoreset{section}{titlecounter}
\makeatother
\begin{document}
\onecolumn
\tableofcontents
\twocolumn
% Title and Author information Paper 1
\title{Title 1}
\author{Author 1}
% Make the title area
\maketitle
\section{First}
\subsection{First subsection of 1st section}%
\subsection{2nd subsection of 1st section}%
\subsection{3rd subsection of 1st section}%
\subsection{4th subsection of 1st section}%
\blindtext[10]
\section{Two}
\subsection{First subsection of 2nd section}%
% Title and Author information Paper 2
\title{Title 2}
\author{Author 2}
% Make the title area
\maketitle
\section{First from second paper}
\subsection{First subsection of 2nd section of 2nd article}%
\blindtext[20]
%$ Paper Content
\end{document}
** Предупреждение ** Обе версии не будут работать в сочетании с hyperref
пакетом. Это какая-то проблема с \footnotemark
командой.