我有一份文档,其中讨论了已满足的需求。每个需求都有一个正式名称,因此我制作了宏,这些宏使用需求名称并使用该名称创建边距和索引条目,并将其写入辅助文件中,以便我可以制作电子表格等。以下是一个例子:
\section{Offensive capabilities}
\implements{KEPO-1} The spud cannon is capable of imparting 3209 ft-lb
of kinetic energy to its projectile, raising an average potato to the
required maximum of 300 feet.
\implements{FEXT-1} A fire extinguisher is kept near the spud cannon
and checked hourly.
\section{Defensive capabilities}
\implements{POFT-1} Shingles and roof substructure are provided which
are capable of withstanding 300 potato strikes.
\implements{POFT-1} Non-stick coatings are applied to resist slime
attacks.
我的问题是:如何根据每个部分的内容更改部分名称,以便我的目录看起来像这样?
1.1 Offensive capabilities (KEPO-1, FEXT-1) ..... 5
1.2 Defensive capabilities (POFT-1) ............. 6
--
以下是我已经尝试过的方法:
% \def alphFOO macros: chapter, section, etc; see below for details
\let\old@sect\@sect
\def\@sect#1#2#3#4#5#6[#7]#8{%
% #1 is something like section or subsection; #2 is depth in
% hierarchy (1 = chapter, 2 = section, etc); mumble; #7 is section
% title for use in TOC (usually same as #8); #8 is section title
% for use in document body
\ifnum #2>\c@tocdepth
% section will not show in toc. do the usual thing
\old@sect{#1}{#2}{#3}{#4}{#5}{#6}[#7]{#8}
\else
% make unique name for section, e.g. paragraphptchseIsussIIp
\edef\last@division{#1\csname alph#1\endcsname}
% make unique name for macro to contain title of section
\edef\last@divtitle{\csname titleof\last@division \endcsname}
% define title macro initially
\expandafter\def\last@divtitle{#7}
% replace title written in toc file with reference to title macro
\old@sect{#1}{#2}{#3}{#4}{#5}{#6}[\noexpand%
\csname titleof\last@division\endcsname]{#8}
\fi}
\def\addtosectionname#1{%
\expandafter\edef\last@divtitle{\last@divtitle ---#1}}
\newcommand{\implements}[1]{%
\addtosectionname{#1}}
这似乎是一个好主意---在目录中添加了章节标题---但它破坏了 PDF 书签中的标题(“2.3 titleofsectionptchse1su2”),并且当我偶然多次提到一个要求时,目录变得过于重复(Bla---POFT-1---POFT-1---POFT-1)。
我开始尝试编写另一个辅助文件,如下所示:
division:section:Offensive capabilities
addition:KEPO-1
addition:FEXT-1
division:section:Defensive capabilities
addition:POFT-1
addition:POFT-1
并使用 Python 脚本将其后处理为替换的目录文件,但存在两个问题:(1)这是一个多文件文档,处理器需要按照 TeX 的顺序浏览包含和输入的文件,这很繁琐,而且容易出错;(2)此过程会改变目录的长度,可能会将各部分推到不同的页面上,但页码写在目录中。因此,LaTeX 需要在脚本之后更改目录,但脚本需要再次更改目录。哎呀。
--
完整文档:
\documentclass{article}
\usepackage[bookmarks=true,bookmarksnumbered=true,breaklinks=true,pdftex]{hyperref}
\hypersetup{plainpages=false, colorlinks=false}
\newcommand \alphpart {pt\Roman{part}}
\ifx\chapter\undefined
\newcommand \alphsection {\alphpart se\Roman{section}}
\else
\newcommand \alphchapter {\alphpart ch\Roman{chapter}}
\newcommand \alphsection {\alphchapter se\Roman{section}}
\fi
\newcommand \alphsubsection {\alphsection su\Roman{subsection}}
\newcommand \alphsubsubsection {\alphsubsection ss\Roman{subsection}}
\newcommand \alphparagraph {\alphsubsubsection p\Roman{paragraph}}
\newcommand \alphsubparagraph {\alphparagraph sp\Roman{subparagraph}}
\makeatletter
% paste "Here's what I've tried already" here
\makeatother
\begin{document}
\tableofcontents
% paste "So here's an example" here
\end{document}
将其命名为 main.tex。按如下方式构建:
pdflatex main.tex
pdflatex main.tex
查看 PDF。观察论文中的目录是否正常。现在查看 PDF 书签,发现它们的名称是错误的
答案1
这是有用的东西,但还不够通用。
我打开了 hyperref 包,发现\addcontentsline
宏就是添加 PDF 书签的那个。它的第三个参数,即 hyperref 注释中所说的节的“标签”,通常采用 的形式\numberline{\thesection}Section name
。根据我上面描述的更改,第三个参数看起来像\numberline{\thesection}\titleofsectionptchseII
。所以我复制了 的定义\addcontentsline
并替换了其中的这一部分:
\Hy@writebookmark{\csname the#2\endcsname}%
{#3}%
{\@currentHref}%
{\Hy@toclevel}%
{#1}%
有了这个:
\edef\Hy@expandedtag{#3}
\Hy@writebookmark{\csname the#2\endcsname}%
{\Hy@expandedtag}%
{\@currentHref}
{\Hy@toclevel}%
{#1}%
因此现在\titleofsectionptchseII
已展开。但其中的所有内容也是如此。这很糟糕,因为我不能再说\section{Foo {\tt bar} baz}
或\section{Foo \label{foo}}
:将这些宏扩展为 TeX 基元是不允许的 PDFDocStrings。
如果我更擅长计算扩展,我可以只扩展参数\addcontentsline
一次或两次,扩展\titleoffoo
宏但不扩展其值中的宏。有点像这或者这,只是我不完全理解这些。