我开始使用词汇表包。我发现了一种我喜欢的新风格,但我想对它进行一些小改动,如下图所示。我发现了另一个他们使用“符号”来表示“单位”使用\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
和字段(对于第一个参数中列出的词汇表类型中的所有条目,默认为所有词汇表)。字段最宽值的宽度存储在提供的长度寄存器中。最宽字段使用 标记(由 提供)。可以使用 访问该值。symbol
symbol
name
\glssetwidest
glossaries
\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