为了使文档(这里是我的博士论文)的结构直接从目录中变得易于理解,我想在目录中的每个元素中插入一些关键词或关键短语。我在一本教科书中看到了这种设备,我认为这对较长的文档来说是一个有益的小改进。
我对所需布局的第一次描述缺乏精确性,我希望这次描述更加清楚。
用户友好性要求:我正在寻找一种解决方案,能够以以下方式处理属于某个部分、章节等的关键词或关键短语:
a)将关键词/短语按行排列
b) 用连字符分隔
c) 在实际零件、章节等下方标明一行。
d) 没有页码的关键词/短语
e)根据关键词/短语的数量,可以超过一行
它看起来应该是这样的:
内容
1节................................1
关键词 1 - 关键短语 2 - 关键词 3
1.1 小节..................................5
关键词 1 - 关键短语 2 - 关键词 3 -
关键词 4 - 关键短语 5 - 关键词 6
对作者友好性的要求:为了方便文档作者,希望有一个命令能够适应给定的章节、部分等,而无需在命令中进行任何规范,以防止作者每次在将其从一个章节复制到另一个部分、小节等时调整命令。
在 .tex 文件中它应该看起来像这样:
\begin{document}
\section{section}
bla bla \command{keyword1} few lines or pages of bla bla \command{keyword2} ....
\subsection{subsection}
bla bla \command{keyword1} few lines or pages of bla bla \command{key phrase2} ....
\end{document}
有人知道该怎么做吗?
PS:要将目录中的关键字转换为 hyperref-keywords,请看这里:目录中的关键词超链接化. 它与 egregs 解决方案配合使用。
答案1
\documentclass[a4paper]{article}
\usepackage{etoolbox}
\makeatletter
\newif\ifsection
\newif\ifsubsection
\newtoks\keywordstoks
\preto\section{\flushkeywords\sectiontrue\subsectionfalse}
\preto\subsection{\flushkeywords\sectionfalse\subsectiontrue}
\preto\enddocument{\flushkeywords}
\newcommand{\flushkeywords}{%
\ifsection\addtocontents{toc}{\formatkwsection{\protect\@gobble\the\keywordstoks\relax}}\fi
\ifsubsection\addtocontents{toc}{\formatkwsubsection{\protect\@gobble\the\keywordstoks\relax}}\fi
\keywordstoks={}}
\newcommand{\keyword}[1]{\@bsphack\keywordstoks=\expandafter{\the\keywordstoks\kwsep#1}\@esphack}
\newrobustcmd{\kwsep}{~-- }
\newrobustcmd{\formatkwsection}[1]{#1\par\medskip}
\newrobustcmd{\formatkwsubsection}[1]{{\leftskip=2.2em\relax#1\par}\smallskip}
\makeatother
\begin{document}
\tableofcontents
\section{Section}
Abc \keyword{key1} def \keyword{key2}
\subsection{Subsection}
Ciao \keyword{key3} ciao \keyword{key4}
\subsection{Another}
x
\end{document}
\formatkwsection
我将把重新定义并\formatkwsubsection
满足其需求的任务留给 OP 。
答案2
这tocloft
包为章节提供了这种功能:\cftchapterprecistoc
;为章节创建类似的命令并不难。这是一个小例子:
\documentclass{report}
\usepackage{tocloft}
% Define a \cftsectionprecistoc
% based on the existing \cftchapterprecistoc
\makeatletter
\newcommand{\cftsectionprecistoc}[1]{\addtocontents{toc}{%
{\leftskip \cftsecindent\relax
\advance\leftskip \cftsecnumwidth\relax
\rightskip \@tocrmarg\relax
\textit{#1}\protect\par}}}
\makeatother
\begin{document}
\tableofcontents
\chapter{A chapter title}
\cftchapterprecistoc{some keywords}
\section{A section title}
\cftsectionprecistoc{some more keywords}
\subsection{A subsection title}
\end{document}
答案3
您可以使用\addtocontents
和/或\addcontentsline
命令;您可以控制要添加的文本的许多方面:
\documentclass{book}
\usepackage{lipsum}
\begin{document}
\tableofcontents
\addtocontents{toc}{\smallskip\hfil\protect\parbox[t]{.8\textwidth}
{\protect\lipsum[1]}\hfil\par\smallskip}
\chapter{Test chapter}
\lipsum[1]
\addtocontents{toc}{Here we add some text without page number.\par}
\section{Test section}
\lipsum[1-10]
\addcontentsline{toc}{subsection}{Some text formatted like an unnumbered subsection}
\lipsum[1-5]
\subsection{Test subsection}
\addcontentsline{toc}{chapter}{Some text formatted like a chapter and with page number\protect\numberline{}}
\lipsum[1-6]
\section{Another test section}
\end{document}
编辑:考虑到新的要求,我定义了一个\AddToToC
带有两个强制参数的新命令:第一个参数表示部分单元的级别(-1 表示部分、0 表示章节、1 表示节等...),第二个参数包含将添加到目录的文本(关键字);下面是该命令的定义及其使用示例:
\documentclass{book}
\usepackage{ifthen}
\newlength\UnitIndent
\newlength\UnitHangInd
% \AddToToC{<level>}{<text>}
\newcommand\AddToToC[2]{%
\ifthenelse{\equal{#1}{-1}}
{\gdef\UnitIndent{2em}\gdef\UnitHangInd{2em}}{}
\ifthenelse{\equal{#1}{0}}
{\gdef\UnitIndent{0em}\gdef\UnitHangInd{1.5em}}{}
\ifthenelse{\equal{#1}{1}}
{\gdef\UnitIndent{2.3em}\gdef\UnitHangInd{3.8em}}{}
\ifthenelse{\equal{#1}{2}}
{\gdef\UnitIndent{5.5em}\gdef\UnitHangInd{7em}}{}
\addtocontents{toc}{\protect\hspace*{\UnitIndent}\hangindent=\UnitHangInd{\itshape#2}\par}
}
\begin{document}
\tableofcontents
\part{Test part}
\AddToToC{-1}{some keywords for the part.}
\chapter{Test chapter one}
\AddToToC{0}{some keywords for the chapter.}
\section{Test section}
\AddToToC{1}{some keywords for the section.}
\subsection{Test subsection}
\AddToToC{2}{some keywords for the subsection.}
\end{document}
所用的长度是书籍文档类的长度;其他文档类将需要调整长度。该命令不满足最后一个要求,但它所需的只是对第一个参数进行简单的更改。