如何在 datagidx 包中同时标记不同的条目类型(索引/词汇表/首字母缩略词/符号)?

如何在 datagidx 包中同时标记不同的条目类型(索引/词汇表/首字母缩略词/符号)?

我偶然发现了datagidx软件包,它是软件包的一部分datatool,这个软件包的致命功能是您可以独立使用它,而不依赖于外部索引应用程序,例如xindymakeidx。另一个功能是,您可以使用它来处理索引、词汇表(定义)、首字母缩略词(缩写)、符号,并且可以进一步扩展以包含自定义数据库,所有这些都由一个软件包完成。我倾向于将数据库分开保存在不同的 tex 文件中,并\input{<filenamen>}在主文件中使用这些数据库。
有时,人们想用文本中的不同关键字做不同的事情,可能需要以下可能性:

  • 词汇表+索引中出现的一些单词
  • 一些出现在首字母缩略词+索引中的单词
  • 词汇表 + 缩略词 + 索引中出现的一些单词

问题:
如何一次使用一个命令来满足这些不同可能性的需求?记住,为了让生活更轻松,人们总是希望在文本流中使用条目的短版本(尽可能避免拼写错误),而在目标列表中显示长版本。

笔记:
请确保至少有 2.13 版本的datatool软件包,以便加载datagidx

答案1

下面的示例定义了一些命令,允许您向多个数据库添加条目。然后,您可以使用示例命令\xgls代替\gls,它将为每个数据库的条目编制索引。因此,如果pdf位于glossaryacronymindex数据库中,\xgls{pdf}则会向每个数据库添加一个位置,而如果html仅位于acronymindex数据库中,\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:

如果您不确定是否要使用datagidxglossaries,您可以尝试以下方法:

首先,我们有两个文件,我将分别命名为test-datagidx.textest-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}pdflatexpdflatexmakeglossariespdflatexpdflatex.aux

第一种方法(\input{test-datagidx}):

第 1 页:

第 1 页图片

第2页:

第 2 页图片

第二种方法(\input{test-glossaries}):

第 1 页:

第 1 页图片

第2页:

第 2 页图片

词汇表/缩写/索引样式略有不同。您可以根据实际输出的显示效果进行调整。

编辑:您可以调整代码来\xgls定义变体的类似命令,例如大写、复数、短格式或长格式。只需将\gls定义更改为适当的命令即可。例如,要\xglsplglossaries版本定义:

\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

相关内容