将环境内容写入文档和目录

将环境内容写入文档和目录

我想将环境的内容写入文档和目录。这是一个经过修改的 MWE,看起来(几乎)像我需要的。

\documentclass[pdftex,12pt]{book}
\usepackage{hyperref}

\newenvironment{g}
{}
{\newline}

\begin{document}

\tableofcontents{}

\chapter{First}

\begin{g}
first goal first chapter
\addcontentsline{toc}{section}{first goal first chapter}
%\addtocontents{toc}{first goal first chapter} %% yields error message
\end{g}
\begin{g}
second goal first chapter
\addcontentsline{toc}{section}{second goal first chapter}
\end{g}

Chapter contents here \ldots

\chapter{Second}

\begin{g}
first goal second chapter
\addcontentsline{toc}{section}{first goal second chapter}
\end{g}

Chapter contents here \ldots

\end{document}

产生以下目录:

实际目录

我想要的是这个(没有额外行的超链接):

所需目录

我不知道如何解决的问题:

  • 最重要的是:我如何才能捕捉环境定义中的两次写入行为,以便我不必每次都用剪切和粘贴来指定额外的目录行?

  • 次要的:为什么\addtocontents在注释时会产生错误?(这个问题的答案可能会解决条目格式和链接问题。)

如果可以提供更简单的解决方案,我可以使用该xparse包来定义环境。

答案1

当 LaTeX 读取目录文件时,它需要特殊格式的段落。以下是实现所需功能的方法。

\documentclass[12pt]{book}

\usepackage{environ}

\usepackage{hyperref}

\makeatletter
\newcommand\l@goal[1]{%
  \addpenalty{\@highpenalty}%
  \vskip \z@ \@plus \p@ 
  \begingroup
  \parindent\z@
  \rightskip\@pnumwidth
  \parfillskip-\@pnumwidth 
  \leavevmode #1\nobreak\hfil\nobreak\null\par 
  \penalty\@highpenalty
  \endgroup} 
\newcommand{\goal}[1]{%
  \par\addtocontents{toc}{\protect\l@goal{#1}}\noindent#1\par}
\NewEnviron{goal*}{\goal{\BODY}}
\makeatother

\begin{document}

\tableofcontents{}

\chapter{First}
\goal{first goal first chapter}
\goal{second goal first chapter}

\bigskip

Chapter contents here \ldots

\chapter{Second}
\begin{goal*}
first goal second chapter
\end{goal*}

\bigskip

Chapter contents here \ldots

\end{document}

如果目标文本不长,也许命令形式更可取。否则使用goal*

宏使用\goal写入文件,因为补丁会创建链接。我们写入,然后宏执行的操作与 基本相同,它负责在目录中排版章节标题。.toc\addtocontentshyperref\addcontentsline\l@goal{<goal text>}\l@goal\l@chapter

相关内容