背景:
我正在创建多篇 IEEE 格式文章的汇编。此汇编将有一个目录。每篇论文都包含一个标题和\maketitle
命令。我希望目录将每篇论文的标题作为主要级别,以及所有章节/小节等。
\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 部分
IA 第 1 款
IB 第 2 小节
第二部分
标题 2
我 - 第 1 部分
IA 第 1 款
IB 第 2 小节
第二部分
问题:
我如何修改目录以包含标题?
我愿意听取其他建议。我知道 ieeetran 或其他文章/期刊类别不使用\chapter
或\part
命令,但如果有一种方法可以在不更改类别的情况下强制执行此操作,我也会对这样的解决方案感兴趣。
答案1
\maketitle
是一个命令,它在宏结束之前“禁用”自身(好吧,它\relax
当时被 ed 了)。因此,进一步调用此宏将不会提供任何结果。通过使用 patch 命令,\let\maketitle\relax
可以捕获此情况并\addcontentsline
注入命令,然后执行 ToC 条目。
我进一步引入了一个titlecounter
计数器,它会自动进行 refstepped,因此它\label
也应该可以工作。目前 ToC 条目的格式非常简单 - 可以随意更改。
\clearpage
Mico 有一个重要的反对意见:命令开头应该有一个右键\maketitle
,它将从前一篇文章中输出可能的浮动。但是,我将这种行为限制在第二个等等\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
命令的一些问题。