我想将环境的内容写入文档和目录。这是一个经过修改的 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
\addtocontents
hyperref
\addcontentsline
\l@goal{<goal text>}
\l@goal
\l@chapter