我目前正在编写一份大型文档(书籍类分为几个部分),并且想在文档的每个部分的开头引入合适的符号表。
到目前为止,我一直在查看一些(标准?)参考文献的文档,以制作索引和符号表,例如包glossaries
或包nomencl
,但我没有发现任何迹象表明可以在文本的每个部分或章节的开头自动生成此类符号表。特别是,我正在寻找一种方法,在同一章/部分的开头打印每个部分/章节中使用的相关符号列表,可能重复前面部分中已经使用过的符号。
我想到的唯一解决方案是在词汇表包中手动为每个部分/章节定义不同的词汇表。但是,这可能很耗时,而且不太便携,并且可能会导致交叉引用定义时出现问题。有没有更好、更灵活的解决方案?
我尝试获取的输出示例
第1章
符号
一..第 1 页
B.. 第 2 页
包含符号 A 和 B 的第一次出现的文本
第2章
符号
答...第 1 页
C ... 第 11 页
包含符号 C 的首次出现和符号 A 的标记出现的文本
答案1
这是一个使用 的可能解决方案datagidx
。此方法通过在位置列表中插入与章节相关的前缀,并在使用 时仅列出具有适当前缀的条目来实现\printterms
。\printterms
位置列表中需要进行调整,以便仅列出具有适当前缀的位置,最后,需要在显示之前删除前缀。
编辑:修改为仅列出首次使用位置。
\documentclass{report}
\usepackage{etoolbox}
\usepackage{datagidx}
% Define a database of notations
\newgidx{notation}{Notation}
% Set this as the default database so we don't have to keep
% explicitly mentioning it
\DTLgidxSetDefaultDB{notation}
% Define some terms
\newterm[description={description for A}]{A}
\newterm[description={description for B}]{B}
\newterm[description={description for C}]{C}
% Fake a counter called "notation" to be used in the location list
% Two digits are used to make the substring comparison easier
% (used in the condition of \printterms)
\makeatletter
\newcommand*{\twodigits}[1]{\two@digits{\value{#1}}}
\makeatother
\newcommand*{\thenotation}{C\twodigits{chapter}.\thepage}
\renewcommand*{\DTLgidxCounter}{notation}
% Define a command to print the notation list
\newcommand{\printnotation}{%
\bgroup
\edef\locationprefix{C\twodigits{chapter}.}%
\printterms
[heading={\section*},% put the heading in an unnumbered section
% only list entries with this prefix in the location list:
condition={\DTLisSubString{\Location}{\locationprefix}},%
sort={},% suppress sorting - do it manually
location=first,% only show first location
columns=1% one column list - change as required
]%
\egroup
% Add a vertical gap so it's not right on top of the next paragraph
\vskip\baselineskip
% Set the after heading flag (remove if not required):
\csuse{@afterheading}%
% Something is confusing the rerun warnings, so disable it and
% just remember to use multiple LaTeX runs:
\csdef{@datagidx@dorerun@warn}{}%
}
% Patch \datagidx@formatlocation so that it strips the location prefix
% and inserts "p." before the location
\makeatletter
\let\orgformatlocation\datagidx@formatlocation
\renewcommand*{\datagidx@formatlocation}[2]{%
\expandafter\DTLsplitstring\expandafter{#2}{.}{\locprefix}{\locsuffix}%
\orgformatlocation{#1}{p.\locsuffix}%
}
\makeatother
% after all terms have been defined, so manually to avoid the
% redundancy of sorting each time the notation list is display.
\dtlsort{Sort}{notation}{\dtlwordindexcompare}
\begin{document}
\chapter{First Sample Chapter}
\printnotation
Referencing \gls{A}. Referencing \gls{B}.
\newpage
Referencing \gls{A} again.
\chapter{Second Sample Chapter}
\printnotation
Referencing \gls{A}. Referencing \gls{C}.
\newpage
Referencing \gls{C} again.
\end{document}
在上面的例子中,“A”用于第 1 和第 2 页(第一章)和第 3 页(第二章)。“B”用于第 1 页(第一章),“C”用于第 3 和第 4 页(第二章)。
第一章的符号表如下:
第二章的符号表如下:
需要运行两到三次 LaTeX。
针对 v2.14 之前的补丁:
\makeatletter
\newcommand*{\printterms@condition}{\boolean{true}}
\define@key{printterms}{condition}{\renewcommand*{\printterms@condition}{#1}}
\renewcommand{\DTLgidxForeachEntry}[1]{%
\def\datagidxprevgroup{}%
\edef\datagidx@doforeachentry{%
\noexpand\DTLforeach*[\expandonce\printterms@condition]{\DTLgidxCurrentdb}%
{\expandonce\DTLgidxAssignList}
}%
\datagidx@doforeachentry
{%
\DTLifnull{\Parent}%
{%
\DTLifnull\Location
{%
\DTLifnull\CurrentLocation
{%
}%
{%
\global\let\@datagidx@dorerun@warn\@data@rerun@warn
}%
}%
{%
\ifcsdef{datagidx@prev@loc@\Label}%
{%
\ifcsequal{datagidx@prev@loc@\Label}{CurrentLocation}%
{}%
{%
\global\let\@datagidx@dorerun@warn\@data@rerun@warn
}%
}%
{%
\global\let\@datagidx@dorerun@warn\@data@rerun@warn
}%
}%
\datagidx@doifdisplayed
{%
\edef\datagidx@dowrite{%
\noexpand\protected@write\noexpand\@auxout{}%
{%
\string\datagidx@save@loc{\Label}{\CurrentLocation}%
}%
}%
\datagidx@dowrite
\datagidx@level=1\relax
\expandafter\datagidx@getgroup\Sort{}\datagidx@endgetgroup
#1%
\global\let\datagidxprevgroup\datagidxcurrentgroup
}%
}%
{}%
}%
}
\makeatother