使用 noidxglossaries 时更改组名称

使用 noidxglossaries 时更改组名称

使用该包,可以使用命令、等glossaries更改组名称,例如\newcommand*{\Agroupname}{}\newcommand*{\Bgroupname}{}这里

在这里,我不得不使用\printnoidxglossary,虽然可以工作,但是前面的命令似乎都不起作用\renewcommand{\glssymbolsgroupname}{}

有什么建议吗?

\documentclass{article}
\usepackage{hyperref}
\usepackage[nogroupskip]{glossaries}

\newglossaryentry{Almond}{ name=Almond,  description={A fruit},
  sort={Almond}  }
\newglossaryentry{Berry}{ name=Berry,  description={Another fruit},
  sort={Berry}  }
\newglossaryentry{Cherry}{ name={Cherry},  description={Yet another fruit},
  sort={Cherry}  }
\newglossaryentry{Tomato}{ name={Tomato},  description={Again another fruit},
  sort={Tomato}  }
\newglossaryentry{Strawberry}{ name={Strawberry},  description={Not a fruit},
  sort={Strawberry}  }


\makenoidxglossaries

\begin{document}
\gls{Almond}, \gls{Berry}, \gls{Cherry} and \gls{Tomato} are fruits, unlike \gls{Strawberry}.

%\renewcommand{\glssymbolsgroupname}{Non-fruits}
\newcommand*{\Agroupname}{a A}
\newcommand*{\Bgroupname}{b B}
\printnoidxglossary[sort=standard,style=listhypergroup]
\end{document}

答案1

我已经发现了这个问题,但仍在努力寻找适当的解决方案。

在内部,glossaries似乎将标题存储为 Unicode 数字,因此“A”为 65,“B”为 66,等等。检索标题并检查是否\Xgroupname设置了适当命令的函数是(缩进我的):

\@gls@getgrouptitle=macro:
#1#2->\DTLifint {#1}{%
  \edef #2{\char #1\relax }%
}{%
  \ifcsundef {#1groupname}{%
    \def #2{#1}%
  }{%
    \letcs #2{#1groupname}%
  }%
}

从该命令来看,当使用或 时,似乎#2是一个字符(A,B,...),但当使用 时,是一个整数。xindymakeindexnoidx

要做的“简单”事情就是重新定义它,使它是一个整数,它仍然会检查是否\Xgroupname定义了适当的内容。

以下几乎就是您想要的:

\def\@gls@getgrouptitle#1#2{
  \DTLifint {#1}{%
    \def\@tmp@char{\char#1}%
  }{%
    \def\@tmp@char{#1}%
  }%
  \ifcsundef {\@tmp@char groupname}{%
    \def #2{\@tmp@char}%
  }{%
    \letcs #2{\@tmp@char groupname}%
  }%
}

唯一的问题似乎是它\def\@tmp@char{\char#1}没有按照我想要的方式运行(如能就如何解决这个问题提供评论将不胜感激)。

更新

在无法\def\@tmp@char{\char#1}做自己想做的事之后,我问过别人。以下采用Heiko的解决方案:

\begingroup
  \catcode0=12 %
  \gdef\chrdef#1#2{%
    \begingroup%
      \lccode0=\numexpr(#2)\relax%
    \lowercase{\endgroup%
      \def#1{^^@}%
    }%
  }%
\endgroup

\def\@gls@getgrouptitle#1#2{%
  \DTLifint {#1}{%
    \chrdef\@tmp@char{#1}%
  }{%
    \def\@tmp@char{#1}%
  }%
  \ifcsundef {\@tmp@char groupname}{%
    \def #2{\@tmp@char}%
  }{%
    \letcs #2{\@tmp@char groupname}%
  }%
}

如果在加载包后将其粘贴到序言中glossaries(和 内部),则词汇表将使用、、 ...\makeatletter ... \makeatother中定义的名称。\Agroupmame\Bgroupname

以下是完整的 MWE(其中还包括对你的其它问题

\documentclass{article}
\usepackage[
  hmargin=8cm,
  showframe
]{geometry}
\usepackage{hyperref}
\usepackage[
  style=listhypergroup,
]{glossaries}
\renewcommand{\glossaryheader}{\item \parbox{0.9\textwidth}{\glsnavigation}}

\newglossaryentry{A}{name=A, description={Letter of the alphabet}}
\newglossaryentry{B}{name=B, description={Letter of the alphabet}}
\newglossaryentry{C}{name=C, description={Letter of the alphabet}}
\newglossaryentry{D}{name=D, description={Letter of the alphabet}}
\newglossaryentry{E}{name=E, description={Letter of the alphabet}}
\newglossaryentry{F}{name=F, description={Letter of the alphabet}}
\newglossaryentry{G}{name=G, description={Letter of the alphabet}}
\newglossaryentry{H}{name=H, description={Letter of the alphabet}}
\newglossaryentry{I}{name=I, description={Letter of the alphabet}}
\newglossaryentry{J}{name=J, description={Letter of the alphabet}}
\newglossaryentry{K}{name=K, description={Letter of the alphabet}}
\newglossaryentry{L}{name=L, description={Letter of the alphabet}}
\newglossaryentry{M}{name=M, description={Letter of the alphabet}}
\newglossaryentry{N}{name=N, description={Letter of the alphabet}}
\newglossaryentry{O}{name=O, description={Letter of the alphabet}}
\newglossaryentry{P}{name=P, description={Letter of the alphabet}}
\newglossaryentry{Q}{name=Q, description={Letter of the alphabet}}
\newglossaryentry{R}{name=R, description={Letter of the alphabet}}
\newglossaryentry{S}{name=S, description={Letter of the alphabet}}
\newglossaryentry{T}{name=T, description={Letter of the alphabet}}
\newglossaryentry{U}{name=U, description={Letter of the alphabet}}
\newglossaryentry{V}{name=V, description={Letter of the alphabet}}
\newglossaryentry{W}{name=W, description={Letter of the alphabet}}
\newglossaryentry{X}{name=X, description={Letter of the alphabet}}
\newglossaryentry{Y}{name=Y, description={Letter of the alphabet}}
\newglossaryentry{Z}{name=Z, description={Letter of the alphabet}}

\makenoidxglossaries

\makeatletter
\begingroup%
  \catcode0=12 %
  \gdef\chrdef#1#2{%
    \begingroup%
      \lccode0=\numexpr(#2)\relax%
    \lowercase{\endgroup%
      \def#1{^^@}%
    }%
  }%
\endgroup

\def\@gls@getgrouptitle#1#2{%
  \DTLifint {#1}{%
    \chrdef\@tmp@char{#1}%
  }{%
    \def\@tmp@char{#1}%
  }%
  \ifcsundef {\@tmp@char groupname}{%
    \def #2{\@tmp@char}%
  }{%
    \letcs #2{\@tmp@char groupname}%
  }%
}
\makeatother

\newcommand\Agroupname{Alpha}
\newcommand\Bgroupname{Bravo}
\newcommand\Cgroupname{Charlie}

\begin{document}
\glsaddall
\printnoidxglossary
\end{document}

输出

相关内容