词汇表样式更改 - 添加单位

词汇表样式更改 - 添加单位

我开始使用词汇表包。我发现了一种我喜欢的新风格,但我想对它进行一些小改动,如下图所示。我发现了另一个他们使用“符号”来表示“单位”使用\glossentrysymbol{##2}和另一个使用相同方法的使用\glossentrysymbol{##1}

我一直试图将它添加到样式中,但总是出现严重错误或没有任何变化。有谁能帮我吗?

在此处输入图片描述

最小工作样本

\documentclass[onecolumn]{IEEEtran}
\usepackage[acronym,toc,nopostdot]{glossaries}


% % % % % % % % % % % % % % 
\newglossarystyle{dotglos}{%
    \glossarystyle{list}%
    \renewcommand*{\glossaryentryfield}[5]{%
        \item[\glsentryitem{##1}\glstarget{##1}{##2}] \emph{##3}%
        \unskip\leaders\hbox to 2.9mm{\hss.}\hfill##5}%
    \renewcommand*{\glsgroupskip}{}%
}

%% \glossentrysymbol{##1}  % <- Need this to fit in between the symbol and description for unit purpose.
% % % % % % % % % % % % % % 

\glossarystyle{dotglos}


% Some symbols
\newglossaryentry{a}{
    name = $abc$ ,
    description = Yes,
    symbol = $m^2$
}
\newglossaryentry{d}{
    name = $def$ ,
    description = No,
    symbol = $m^2$
}
\newglossaryentry{g}{
    name = $ghi$ ,
    description = Maybe,
    symbol = $m^2$
}

\makeglossaries

\begin{document}
\printglossaries
\newpage
\gls{a}, \gls{d} and \gls{g} are part of the glossary. But I want the 
\end{document}

答案1

\glossarystyle现已\glossaryentryfield弃用。较新的命令是\setglossarystyle{风格}\glossentry{标签}{位置列表}

##1在 中重新定义命令时,需要使用双井号 ( ) 来引用命令参数\newglossarystyle,因此在重新定义 时\glossentry,标签(第一个参数)用##1(而不是#1)引用,因此您可以使用\glossentrysymbol{##1}来显示符号。我怀疑在您看到 的情况下\glossentrysymbol{##2},这适用于 定义中的子条目\subglossentry{等级}{标签}{位置列表},其中标签现在是第二个参数。

我不确定单位和描述之间需要多大的间距,所以我就用了\quad这里。您可以根据需要进行更改。

\newglossarystyle{dotglos}{%
    \setglossarystyle{list}%
    \renewcommand*{\glossentry}[2]{%
        \item[\glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}}]
        [\glossentrysymbol{##1}]\quad
        \emph{\glossentrydesc{##1}}%
        \unskip\leaders\hbox to 2.9mm{\hss.}\hfill##2}%
    \renewcommand*{\glsgroupskip}{}%
}

如果您想要对没有 的条目使用特殊情况symbol,您可以使用 来\ifglshassymbol测试它:

\newglossarystyle{dotglos}{%
    \setglossarystyle{list}%
    \renewcommand*{\glossentry}[2]{%
        \item[\glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}}]
        \ifglshassymbol{##1}{[\glossentrysymbol{##1}]\quad}{}%
        \emph{\glossentrydesc{##1}}%
        \unskip\leaders\hbox to 2.9mm{\hss.}\hfill##2}%
    \renewcommand*{\glsgroupskip}{}%
}

完成 MWE:

\documentclass[onecolumn]{IEEEtran}
\usepackage[acronym,toc,nopostdot]{glossaries}

\newglossarystyle{dotglos}{%
    \setglossarystyle{list}%
    \renewcommand*{\glossentry}[2]{%
        \item[\glsentryitem{##1}\glstarget{##1}{\glossentryname{##1}}]
        \ifglshassymbol{##1}{[\glossentrysymbol{##1}]\quad}{}%
        \emph{\glossentrydesc{##1}}%
        \unskip\leaders\hbox to 2.9mm{\hss.}\hfill##2}%
    \renewcommand*{\glsgroupskip}{}%
}

\setglossarystyle{dotglos}


% Some symbols
\newglossaryentry{a}{
    name = $abc$ ,
    description = Yes,
    symbol = $m^2$
}
\newglossaryentry{d}{
    name = $def$ ,
    description = No,
    symbol = $m^2$
}
\newglossaryentry{g}{
    name = $ghi$ ,
    description = Maybe,
    symbol = $m^2$
}

\makeglossaries

\begin{document}
\printglossaries
\newpage
\gls{a}, \gls{d} and \gls{g} are part of the glossary. But I want the 
\end{document}

词汇表图片

编辑:关于对齐单位和描述的评论,您可以根据表格样式之一来设置样式,但这需要计算虚线引线的剩余可用空间。另一种可能性是计算最宽的名称和最宽的单位。然后可以将名称和单位分别放在\makebox所需宽度内。

glossaries-extra软件包附带了补充软件包glossaries-extra-stylemods,它提供了一些可用于此目的的额外命令。这些命令相当新,因此您需要一个相当新版本的软件包。

命令\glsFindWidestUsedAnyNameSymbol[词汇表]{长度寄存器}可用于计算已标记为已使用的所有条目的最宽name和字段(对于第一个参数中列出的词汇表类型中的所有条目,默认为所有词汇表)。字段最宽值的宽度存储在提供的长度寄存器中。最宽字段使用 标记(由 提供)。可以使用 访问该值。symbolsymbolname\glssetwidestglossaries\glsgetwidestname

例如:

\newlength\widestsymbol
\newlength\widestname
\glsFindWidestUsedAnyNameSymbol{\widestsymbol}
\settowidth{\widestname}{\glsgetwidestname}

然后样式可以使用\makebox[\widestname][l]{\glossentryname{##1}}并将\makebox[\widestsymbol][l]{\glossentrysymbol{##1}}具有左对齐名称、符号(单位)和描述的效果。

缺点是您只能\glsFindWidestUsedAnyNameSymbol在文档末尾使用,因为没有任何条目在开头被标记为已使用。对于出现在文档末尾的词汇表来说,这不是问题,但如果词汇表位于开头(如在 MWE 中),则需要存储这些值以供下次运行使用。执行此操作的常用方法是将所需信息写入文件中.aux

更新的 MWE:

\documentclass[onecolumn]{IEEEtran}

\usepackage[acronym]{glossaries-extra}
\usepackage{glossaries-extra-stylemods}

\newlength\widestsymbol
\newlength\widestname

\newcommand*{\namebox}[1]{%
 \ifdim\widestname>0pt\makebox[\widestname][l]{#1}\else#1\fi}

\newcommand*{\symbolbox}[1]{%
 \ifdim\widestsymbol>0pt\makebox[\widestsymbol][l]{#1}\else#1\fi}

\makeatletter
\AtEndDocument
{%
  \glsFindWidestUsedAnyNameSymbol{\widestsymbol}%
  \settowidth{\widestname}{\glsgetwidestname}%
  \immediate\protected@write\@auxout{}
   {%
    \string\global\string\setlength{\string\widestsymbol}{\the\widestsymbol}%
    \string\global\string\setlength{\string\widestname}{\the\widestname}%
   }%
}
\makeatother

\newglossarystyle{dotglos}{%
    \setglossarystyle{list}%
    \renewcommand*{\glossentry}[2]{%
        \item[\glsentryitem{##1}\glstarget{##1}{\namebox{\glossentryname{##1}}}]
        [\symbolbox{\glossentrysymbol{##1}}]\quad
        \emph{\glossentrydesc{##1}}%
        \unskip\leaders\hbox to 2.9mm{\hss.}\hfill##2}%
    \renewcommand*{\glsgroupskip}{}%
}

\setglossarystyle{dotglos}


% Some symbols
\newglossaryentry{a}{
    name = $a$,
    description = Yes,
    symbol = $m^2$
}
\newglossaryentry{d}{
    name = $de$,
    description = No,
    symbol = $i^2$
}
\newglossaryentry{g}{
    name = $ghi$,
    description = Maybe,
    symbol = $n^2$
}

\makeglossaries

\begin{document}
\printglossaries
\newpage
\gls{a}, \gls{d} and \gls{g} are part of the glossary. But I want
the 
\end{document}

得出的结果为:

词汇表图片

编辑:calc(由 内部加载pdfpages)重新定义,\setlength因此它不能再以 为前缀\global。如果没有全局分配,则在.aux输入文件后长度将重置回 0pt(因为.aux文件是在组中输入的)。在这种情况下,需要较低级别的 TeX 分配:

\makeatletter
\AtEndDocument
{%
  \glsFindWidestUsedAnyNameSymbol{\widestsymbol}%
  \settowidth{\widestname}{\glsgetwidestname}%
  \immediate\protected@write\@auxout{}
   {%
    \string\global\string\widestsymbol=\the\widestsymbol
    \string\global\string\widestname=\the\widestname
   }%
}
\makeatother

相关内容