我偶然发现了datagidx
软件包,它是软件包的一部分datatool
,这个软件包的致命功能是您可以独立使用它,而不依赖于外部索引应用程序,例如xindy
或makeidx
。另一个功能是,您可以使用它来处理索引、词汇表(定义)、首字母缩略词(缩写)、符号,并且可以进一步扩展以包含自定义数据库,所有这些都由一个软件包完成。我倾向于将数据库分开保存在不同的 tex 文件中,并\input{<filenamen>}
在主文件中使用这些数据库。
有时,人们想用文本中的不同关键字做不同的事情,可能需要以下可能性:
- 词汇表+索引中出现的一些单词
- 一些出现在首字母缩略词+索引中的单词
- 词汇表 + 缩略词 + 索引中出现的一些单词
问题:
如何一次使用一个命令来满足这些不同可能性的需求?记住,为了让生活更轻松,人们总是希望在文本流中使用条目的短版本(尽可能避免拼写错误),而在目标列表中显示长版本。
笔记:
请确保至少有 2.13 版本的datatool
软件包,以便加载datagidx
答案1
下面的示例定义了一些命令,允许您向多个数据库添加条目。然后,您可以使用示例命令\xgls
代替\gls
,它将为每个数据库的条目编制索引。因此,如果pdf
位于glossary
、acronym
和index
数据库中,\xgls{pdf}
则会向每个数据库添加一个位置,而如果html
仅位于acronym
和index
数据库中,\xgls{html}
则只会向这两个数据库添加位置。
编辑: \newacronymentry
有一个额外的参数来指示词汇表中使用的描述。
\documentclass{article}
\usepackage{datagidx}
\usepackage[colorlinks]{hyperref}
\newgidx{glossary}{Glossary}
\newgidx{acronyms}{Acronyms}
\newgidx{index}{Index}
% Syntax: \newacronym[options]{short}{long}
% Defines an acronym that also has an entry in the index
\newcommand{\newacronym}[3][]{%
\newterm[database={index},sort={#3},label={index.#2}]%
{\MakeTextUppercase{#2}}%
\newacro[database={acronyms},label={acronym.#2},#1]%
{\MakeTextUppercase{#2}}{#3}%
}
% Syntax: \newentry[options]{label}{name}
% Defines a glossary entry that also appears in the index
\newcommand{\newentry}[3][]{%
\newterm[database={glossary},label={glossary.#2},#1]{#3}%
\newterm[database={index},label={index.#2},#1]{#3}%
}
% Syntax: \newacronymentry[options]{short}{long}{description}
% Like \newacronym but also adds the entry to the glossary
\newcommand{\newacronymentry}[4][]{%
\newterm[database={glossary},label={glossary.#2},%
sort={#2},#1,description={#4}]%
{\MakeTextUppercase{#2}}%
\newterm[database={index},sort={#3},label={index.#2}]%
{\MakeTextUppercase{#2}}%
\newacro[database={acronyms},label={acronym.#2},#1]%
{\MakeTextUppercase{#2}}{#3}%
}
% Syntax: \xgls{label}
% If acronym.#1 exists use that and index
% Otherwise if glossary.#1 exists, use that and index the others.
% Otherwise if index.#1 use index.#1
% If none of the above, just do \gls{label}
\newcommand{\xgls}[1]{%
\iftermexists{acronym.#1}%
{%
\acr{acronym.#1}%
\iftermexists{glossary.#1}%
{\glsadd{glossary.#1}}%
{}%
\iftermexists{index.#1}%
{\glsadd{index.#1}}%
{}%
}%
{%
\iftermexists{glossary.#1}%
{%
\gls{glossary.#1}%
\iftermexists{index.#1}%
{\glsadd{index.#1}}%
{}%
}%
{%
\iftermexists{index.#1}%
{\gls{index.#1}}%
{%
\gls{#1}%
}%
}%
}%
}
% Define some acronyms
\newacronym{html}{hypertext markup language}
\newacronym{csv}{comma-separated variable}
% Define some glossary entries
\newentry[description={A typesetting language},sort={TeX}]{tex}{\TeX}
\newentry[description={A format of \TeX},sort={LaTeX}]{latex}{\LaTeX}
% Define some acronyms that also go in the glossary
\newacronymentry{pdf}{portable document format}{A file format}
% Define a term that isn't an acronym or a glossary entry
\newterm[database=index]{sample}
\begin{document}
First use: \xgls{html}.
First use: \xgls{csv}.
First use: \xgls{pdf}.
Reference \xgls{tex}.
Reference \xgls{latex}.
Reference the \xgls{sample} term.
\clearpage
Second use: \xgls{html}.
Second use: \xgls{csv}.
Second use: \xgls{pdf}.
Reference \xgls{tex}.
Reference \xgls{latex}.
Reference the \xgls{sample} term.
\printterms[database=acronyms,columns=1,location=hide]
\printterms[database=glossary,columns=1,location=hide]
\printterms[database=index,columns=1]
\end{document}
第 1 页:
第2页:
编辑2:
如果您不确定是否要使用datagidx
或glossaries
,您可以尝试以下方法:
首先,我们有两个文件,我将分别命名为test-datagidx.tex
和test-glossaries.tex
。它们都定义了相同的控制序列,但第一个文件使用 包datagidx
,第二个文件使用 包glossaries
。如果您坚持在文档中使用这些命令,那么应该可以在这两个包之间切换。编辑:但是,我强烈建议您坚持使用,glossaries
因为它比 效率高得多datagidx
。尽管这两个包的功能类似,但它们的内部结构却大不相同,这意味着它们不兼容,因此有些事情您可以在一个包中做,而在另一个包中做不到,因此如果可能的话,请坚持使用test-glossaries.tex
下面的代码。
这是第一个文件test-datagidx.tex
:
\usepackage{etoolbox}
\usepackage{datagidx}
\usepackage[colorlinks]{hyperref}
\newgidx{glossary}{Glossary}
\newgidx{acronyms}{Acronyms}
\newgidx{index}{Index}
% Syntax: \newacronymterm[options]{short}{long}
% Defines an acronym that also has an entry in the index
\newcommand{\newacronymterm}[3][]{%
\newterm[database={index},sort={#3},label={index.#2},#1]%
{\MakeTextUppercase{#2}}%
\newacro[database={acronyms},label={acronym.#2},#1]%
{\MakeTextUppercase{#2}}{#3}%
}
% Syntax: \newentry[options]{label}{name}
% Defines a glossary entry that also appears in the index
\newcommand{\newentry}[3][]{%
\newterm[database={glossary},label={glossary.#2},#1]{#3}%
\newterm[database={index},label={index.#2},#1]{#3}%
}
% Syntax: \newacronymentry[options]{short}{long}{description}
% Like \newacronym but also adds the entry to the glossary
\newcommand{\newacronymentry}[4][]{%
\newterm[database={glossary},label={glossary.#2},%
sort={#2},#1,description={#4}]%
{\MakeTextUppercase{#2}}%
\newterm[database={index},sort={#3},label={index.#2},#1]%
{\MakeTextUppercase{#2}}%
\newacro[database={acronyms},label={acronym.#2},#1]%
{\MakeTextUppercase{#2}}{#3}%
}
% Just an index entry
\newcommand{\newindexentry}[2][]{%
\newterm[database=index,label={index.#2},#1]{#2}%
}
% Syntax: \xgls[format]{label}
% If acronym.#1 exists use that and index
% Otherwise if glossary.#1 exists, use that and index the others.
% Otherwise if index.#1 use index.#1
% If none of the above, just do \gls{label}
\newcommand{\xgls}[2][]{%
\ifstrempty{#1}{\def\fmtopt{}}{\def\fmtopt{[#1]}}%
\iftermexists{acronym.#2}%
{%
\acr{acronym.#2}%
\iftermexists{glossary.#2}%
{\glsadd{glossary.#2}}%
{}%
\iftermexists{index.#2}%
{\expandafter\glsadd\expandafter{\fmtopt index.#2}}%
{}%
}%
{%
\iftermexists{glossary.#2}%
{%
\gls{glossary.#2}%
\iftermexists{index.#2}%
{\glsadd{index.#2}}%
{}%
}%
{%
\iftermexists{index.#2}%
{\expandafter\gls\expandafter{\fmtopt index.#2}}%
{%
\expandafter\gls\expandafter{\fmtopt #2}%
}%
}%
}%
}
\newcommand{\PrintAcronyms}{%
\printterms[database=acronyms,columns=1,location=hide]%
}
\newcommand{\PrintGlossary}{%
\printterms[database=glossary,columns=1,location=hide]%
}
\newcommand{\PrintIndex}{%
\printterms[database=index,showgroups]%
}
这是第二个文件(test-glossaries.tex
):
\usepackage{etoolbox}
\usepackage{textcase}
\usepackage[colorlinks]{hyperref}
\usepackage[acronym,xindy]{glossaries}
\usepackage{glossary-mcols}
\newglossary[ilg]{index}{ind}{idx}{\indexname}%
\makeglossaries
\SetCustomStyle
\renewcommand{\acrfullformat}[2]{#1 (\MakeTextUppercase{#2})}
% Syntax: \newacronym[options]{short}{long}
% Defines an acronym that also has an entry in the index
\newcommand{\newacronymterm}[3][]{%
\newacronym[name={\MakeTextUppercase{#2}},#1]{acronym.#2}{#2}{#3}%
\newglossaryentry{index.#2}{name={\MakeTextUppercase{#2}},%
type={index},sort={#2},#1,description={\nopostdesc}}%
}
% Syntax: \newentry[options]{label}{name}
% Defines a glossary entry that also appears in the index
\newcommand{\newentry}[3][]{%
\newglossaryentry{glossary.#2}{name={#3},#1}%
\newglossaryentry{index.#2}{name={#3},type={index},%
#1,description={\nopostdesc}}%
}
% Syntax: \newacronymentry[options]{short}{long}{description}
% Like \newacronym but also adds the entry to the glossary
\newcommand{\newacronymentry}[4][]{%
\newglossaryentry{glossary.#2}{name={\MakeTextUppercase{#2}},%
sort={#2},description={#4},#1}%
\newglossaryentry{index.#2}{name={\MakeTextUppercase{#2}},type={index},%
#1,description={\nopostdesc}}%
\newacronym[name={\MakeTextUppercase{#2}},#1]{acronym.#2}{#2}{#3}%
}
% Just an index entry
\newcommand{\newindexentry}[2][]{%
\newglossaryentry{index.#2}{name={#2},%
type={index},sort={#2},#1,description={\nopostdesc}}%
}
% Syntax: \xgls[format]{label}
% If acronym.#1 exists use that and index
% Otherwise if glossary.#1 exists, use that and index the others.
% Otherwise if index.#1 use index.#1
% If none of the above, just do \gls{label}
\newcommand{\xgls}[2][]{%
\ifglsentryexists{acronym.#2}%
{%
\ifglsentryexists{glossary.#2}%
{\glsadd{glossary.#2}}%
{}%
\ifglsentryexists{index.#2}%
{\glsadd[#1]{index.#2}}%
{}%
\gls[#1]{acronym.#2}%
}%
{%
\ifglsentryexists{glossary.#2}%
{%
\ifglsentryexists{index.#2}%
{\glsadd{index.#2}}%
{}%
\gls{glossary.#2}%
}%
{%
\ifglsentryexists{index.#2}%
{\gls[#1]{index.#2}}%
{%
\gls[#1]{#2}%
}%
}%
}%
}
\glsnogroupskiptrue
\newcommand{\PrintAcronyms}{%
\printglossary[type=\acronymtype,nonumberlist]
}
\newcommand{\PrintGlossary}{%
\printglossary[type=main,nonumberlist]
}
\newcommand{\PrintIndex}{%
\bgroup
\glsnogroupskipfalse
\renewcommand{\glsnamefont}[1]{\textmd{##1}}%
\printglossary[type=index,style=mcolindexgroup]
\egroup
}
现在我们有了一个测试文档,名为test.tex
:
\documentclass{article}
\input{test-datagidx}% use datagidx
%\input{test-glossaries}% use glossaries
% Define some acronyms
\newacronymterm{html}{hypertext markup language}
\newacronymterm{csv}{comma-separated variable}
% Define some glossary entries
\newentry[description={A typesetting language},sort={TeX}]{tex}{\TeX}
\newentry[description={A format of \TeX},sort={LaTeX}]{latex}{\LaTeX}
% Define some acronyms that also go in the glossary
\newacronymentry{pdf}{portable document format}{A file format}
% Define some terms that aren't an acronym or a glossary entry
\newindexentry{sample}
\newindexentry{comma}
\newindexentry{cat}
\begin{document}
First use: \xgls{html}.
First use: \xgls{csv}.
First use: \xgls{pdf}.
Reference \xgls{tex}.
Reference \xgls{latex}.
Reference the \xgls{sample} term.
Reference the \xgls{comma} term.
Reference the \xgls{cat} term.
\clearpage
Second use: \xgls{html}.
Second use: \xgls{csv}.
Second use: \xgls{pdf}.
Reference \xgls{tex}.
Reference \xgls{latex}.
Reference the \xgls{sample} term.
Reference the \xgls{comma} term.
Reference the \xgls{cat} term.
\PrintAcronyms
\PrintGlossary
\PrintIndex
\end{document}
datagidx
如果有的话,它将使用 ,如果有的话,\input{test-datagidx}
它将使用。(不要同时取消注释两者!)使用第一种方法,您需要三次调用。使用第二种方法,您需要+ + + 。在两者之间切换时,请确保在重新编译之前删除该文件。glossaries
\input{test-glossaries}
pdflatex
pdflatex
makeglossaries
pdflatex
pdflatex
.aux
第一种方法(\input{test-datagidx}
):
第 1 页:
第2页:
第二种方法(\input{test-glossaries}
):
第 1 页:
第2页:
词汇表/缩写/索引样式略有不同。您可以根据实际输出的显示效果进行调整。
编辑:您可以调整代码来\xgls
定义变体的类似命令,例如大写、复数、短格式或长格式。只需将\gls
定义更改为适当的命令即可。例如,要\xglspl
为glossaries
版本定义:
\newcommand{\xglspl}[2][]{%
\ifglsentryexists{acronym.#2}%
{%
\ifglsentryexists{glossary.#2}%
{\glsadd{glossary.#2}}%
{}%
\ifglsentryexists{index.#2}%
{\glsadd[#1]{index.#2}}%
{}%
\glspl[#1]{acronym.#2}%
}%
{%
\ifglsentryexists{glossary.#2}%
{%
\ifglsentryexists{index.#2}%
{\glsadd{index.#2}}%
{}%
\glspl{glossary.#2}%
}%
{%
\ifglsentryexists{index.#2}%
{\glspl[#1]{index.#2}}%
{%
\glspl[#1]{#2}%
}%
}%
}%
}
请注意,使用glossaries
版本时,使用上述定义,您仍然可以拥有跟随强制参数的最终可选参数,但您不能为版本拥有它datagidx
,这也是坚持使用的另一个原因glossaries
。