根据内容添加章节名称

根据内容添加章节名称

我有一份文档,其中讨论了已满足的需求。每个需求都有一个正式名称,因此我制作了宏,这些宏使用需求名称并使用该名称创建边距和索引条目,并将其写入辅助文件中,以便我可以制作电子表格等。以下是一个例子:

\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宏但不扩展其值中的宏。有点像或者,只是我不完全理解这些。

相关内容