我正在尝试使用这里解决方案中给出的方法带有额外参数的词汇表条目(看起来非常整洁)对于我拥有多个词汇表的应用程序;在原始版本中,我只有一个符号列表和缩写,但这里有一个 mwe 将符号列表调整为上述链接解决方案中提供的主列表
\documentclass{scrbook}
%
\usepackage[acronym,toc]{glossaries}
%this line is new
\newglossary[slg]{symbolslist}{syi}{syg}{List of Symbols}
\makeglossaries
\glsnoexpandfields
\newcommand*{\glsarg}{i}
\newglossaryentry{BetragVektor}{
name=\ensuremath{|\overline{u_i}|},
text=|\overline{u_{\glsarg}}|,
description={ABC}}
\newglossaryentry{s:tP}{
name=\ensuremath{T_p\mathcal M},
text=T_\glsarg\mathcal M,
description={},
type=symbolslist %in own list
}
% modify the entry's format
\defglsentryfmt{%
\let\orgglsarg\glsarg
\ifdefempty\glsinsert
{}%
{%
\let\glsarg\glsinsert
\let\glsinsert\relax
}%
\glsgenentryfmt
\let\glsarg\orgglsarg
}
\begin{document}
$\gls{BetragVektor}[1]$
$\gls{BetragVektor}$
$\gls{BetragVektor}[1]$
$\gls{BetragVektor}[2]$
$\gls{BetragVektor}[]$
$\gls{s:tP}[1]$
$\gls{s:tP}$
$\gls{s:tP}[1]$
$\gls{s:tP}[2]$
$\gls{s:tP}[]$
\printglossaries
\end{document}
如上所述,唯一的新东西是我引入了第二个列表。结果显示,该解决方案似乎仍然适用于主列表。
因此,不知何故,新的参数被添加到 and 中,并且\glsarg
保持不变。我该如何解决这个问题,以便我的新词汇表也可以在其条目中包含可选参数?
答案1
方法一:具体词汇表
\defglsentryfmt
有一个可选参数,指示此格式应控制哪个词汇表。如果省略,main
则假定为,因此您还需要对新词汇表执行相同操作:
\defglsentryfmt[symbolslist]{%
\let\orgglsarg\glsarg
\ifdefempty\glsinsert
{}%
{%
\let\glsarg\glsinsert
\let\glsinsert\relax
}%
\glsgenentryfmt
\let\glsarg\orgglsarg
}
方法 2:所有词汇表
或者,您可以重新定义\glsentryfmt
以应用于所有词汇表。(可以使用 覆盖个别词汇表\defglsentryfmt
,它\newacronym
会自动执行。)
\documentclass{scrbook}
%
\usepackage[acronym,toc]{glossaries}
%this line is new
\newglossary[slg]{symbolslist}{syi}{syg}{List of Symbols}
\makeglossaries
\glsnoexpandfields
\newcommand*{\glsarg}{i}
\newglossaryentry{BetragVektor}{
name=\ensuremath{|\overline{u_i}|},
text=|\overline{u_{\glsarg}}|,
description={ABC}}
\newglossaryentry{s:tP}{
name=\ensuremath{T_p\mathcal M},
text=T_\glsarg\mathcal M,
description={},
type=symbolslist %in own list
}
% modify the entry's format
\renewcommand*{\glsentryfmt}{%
\let\orgglsarg\glsarg
\ifdefempty\glsinsert
{}%
{%
\let\glsarg\glsinsert
\let\glsinsert\relax
}%
\glsgenentryfmt
\let\glsarg\orgglsarg
}
\begin{document}
$\gls{BetragVektor}[1]$
$\gls{BetragVektor}$
$\gls{BetragVektor}[1]$
$\gls{BetragVektor}[2]$
$\gls{BetragVektor}[]$
$\gls{s:tP}[1]$
$\gls{s:tP}$
$\gls{s:tP}[1]$
$\gls{s:tP}[2]$
$\gls{s:tP}[]$
\printglossaries
\end{document}
得出的结果为:
方法 3:特定类别(glossaries-extra
)
如果你想使用扩展包glossaries-extra
,这是一个更好的方法:
\documentclass{scrbook}
%
\usepackage[abbreviations]{glossaries-extra}
\newglossary[slg]{symbolslist}{syi}{syg}{List of Symbols}
\makeglossaries
\glsnoexpandfields
\newcommand*{\glsdefaultarg}{i}
\newcommand*{\glsarg}{\glsdefaultarg}
\newglossaryentry{BetragVektor}{
category=arg,% requires an argument
name=\ensuremath{|\overline{u_i}|},
text=|\overline{u_{\glsarg}}|,
description={ABC}}
\newglossaryentry{s:tP}{
category=arg,% requires an argument
name=\ensuremath{T_p\mathcal M},
text=T_\glsarg\mathcal M,
description={},
type=symbolslist %in own list
}
% modify the entry's format
\preto\glsentryfmt{%
\glsifcategory{\glslabel}{arg}% if category set to "arg"
{%
\ifdefempty\glsinsert
{\let\glsarg\glsdefaultarg}%
{%
\let\glsarg\glsinsert
\let\glsinsert\empty
}%
}%
{}%
}
\begin{document}
$\gls{BetragVektor}[1]$
$\gls{BetragVektor}$
$\gls{BetragVektor}[1]$
$\gls{BetragVektor}[2]$
$\gls{BetragVektor}[]$
$\gls{s:tP}[1]$
$\gls{s:tP}$
$\gls{s:tP}[1]$
$\gls{s:tP}[2]$
$\gls{s:tP}[]$
\printglossaries
\end{document}
现在,您只需要在条目定义中使用标签来标记哪些条目需要参数category=arg
。如果每个条目的默认参数都不同,您还可以存储默认参数。例如:
\documentclass{scrbook}
%
\usepackage[abbreviations]{glossaries-extra}
\newglossary[slg]{symbolslist}{syi}{syg}{List of Symbols}
\makeglossaries
\glsnoexpandfields
\newcommand*{\glsarg}{}
\newglossaryentry{BetragVektor}{
category=arg,% requires an argument
user1={i},
name=\ensuremath{|\overline{u_i}|},
text=|\overline{u_{\glsarg}}|,
description={ABC}}
\newglossaryentry{s:tP}{
category=arg,% requires an argument
user1={p},
name=\ensuremath{T_p\mathcal M},
text=T_\glsarg\mathcal M,
description={},
type=symbolslist %in own list
}
% modify the entry's format
\preto\glsentryfmt{%
\glsifcategory{\glslabel}{arg}% if category set to "arg"
{%
\ifdefempty\glsinsert
{\glsfieldfetch{\glslabel}{useri}{\glsarg}}%
{%
\let\glsarg\glsinsert
\let\glsinsert\empty
}%
}%
{}%
}
\begin{document}
$\gls{BetragVektor}[1]$
$\gls{BetragVektor}$
$\gls{BetragVektor}[1]$
$\gls{BetragVektor}[2]$
$\gls{BetragVektor}[]$
$\gls{s:tP}[1]$
$\gls{s:tP}$
$\gls{s:tP}[1]$
$\gls{s:tP}[2]$
$\gls{s:tP}[]$
\printglossaries
\end{document}
方法 4:具体输入(glossaries-extra
)
这是另一种方法:用于\glsxtrfmt
需要参数的情况。这与可选参数的概念不同,但值得考虑,因为它不会改变正常的显示格式。
指定字段(默认情况下为user1
,但可以通过重新定义 进行更改\GlsXtrFmtField
)存储接受单项强制与给定条目的格式相关的参数。然后\glsxtrfmt[
选项]{
标签}{
范围}
将该命令应用于范围(封装到\glslink
索引中,如果启用的话,则超链接到词汇表)。
例如,定义:
\newcommand{\vectorlength}[1]{|\overline{u_{#1}}|}
\newcommand{\tP}[1]{T_#1\mathcal{M}}
然后条目可以定义为:
\newglossaryentry{BetragVektor}{
user1={vectorlength},
name=\ensuremath{\vectorlength{i}},
description={ABC}}
\newglossaryentry{s:tP}{
user1={tP},
name=\ensuremath{\tP{p}},
description={},
type=symbolslist
}
因此现在使用/字段\gls{BetragVektor}
的值(正常情况下,这里是从字段中获取的)但本质上就像.¹first
text
name
\glsxtrfmt{BetragVektor}{1}
\glslink{BetragVektor}{\vectorlength{1}}
修改后的 MWE:
\documentclass{scrbook}
\usepackage[automake]{glossaries-extra}
\newglossary[slg]{symbolslist}{syi}{syg}{List of Symbols}
\makeglossaries
\glsnoexpandfields
\newcommand{\BetragVektor}[1]{|\overline{u_{#1}}|}
\newcommand{\tP}[1]{T_#1\mathcal{M}}
\newglossaryentry{BetragVektor}{
user1={BetragVektor},
name=\ensuremath{\BetragVektor{i}},
description={ABC}}
\newglossaryentry{s:tP}{
user1={tP},
name=\ensuremath{\tP{p}},
description={},
type=symbolslist %in own list
}
\begin{document}
$\glsxtrfmt{BetragVektor}{1}$
$\gls{BetragVektor}$
$\glsxtrfmt{BetragVektor}{1}$
$\glsxtrfmt{BetragVektor}{2}$
$\gls{BetragVektor}$
$\glsxtrfmt{s:tP}{1}$
$\gls{s:tP}$
$\glsxtrfmt{s:tP}{1}$
$\glsxtrfmt{s:tP}{2}$
$\gls{s:tP}$
\printglossaries
\end{document}
在第 3.1 节“函数”中还有更多示例glossaries-extra
和bib2gls
:入门指南glossaries-extra
(无论您是否使用,该部分都是通用的bib2gls
)。
¹ 这有点复杂:\glsxtrfmt[
选项]{
标签}{
文本}
有效地\glslink[
默认选项,
选项]{
标签}{\glsxtrfmtdisplay{
计算机名称}{
文本}{}}
在哪里计算机名称是从指定字段获取的控制序列名称。(如果该字段未设置计算机名称默认为@firstofone
.)
带星号的版本\glsxtrfmt*[
选项]{
标签}{
文本}[
插入]
有效地\glslink[
默认选项,
选项]{
标签}{\glsxtrfmtdisplay{
计算机名称}{
文本}{
插入}}
。
答案2
我选择了 Nicola 的回答中提到的第三个选项,效果非常好!
但是,我想对语法提出一些意见,这些意见对我来说并不明显,我不得不进行一些实验才能使其按预期工作。所以:
- 您可以通过
\gls{<primitive entry name>}
在相应字段内调用,在更原始的词汇表条目之上构建其他词汇表条目(参见示例;我猜这适用于整个词汇表包)。 - 您可以将参数从更复杂的词汇表条目传递到更原始的词汇表条目(
category=arg
必须在复杂的条目中设置才能传递参数)。- 参数被隐式传递(见示例)
- 示例评论中还提到了一些其他事项
例子
\documentclass{article}
\usepackage[automake]{glossaries-extra}
\makeglossaries
\glsnoexpandfields
\newcommand*{\glsarg}{}
\newglossaryentry{simple}{
category=arg,% requires an argument
user1={a},% default argument for \glsarg
name={\(A_{i}\)},
text={A_{\glsarg}},
description={simpler}}
\newglossaryentry{simple2}{
category=arg,% requires an argument
user1={b},
name={\(B_{\glsarg}\)},% \glsarg has no effect here nor does user1=b, it has to be B_{b} to appear that way in the glossary, this will evaluate to just \(B\)
text={B_{\glsarg}},% \glsarg works as usual here
description={simpler}}
\newglossaryentry{complex}{
category=arg,% required to require an argument
name={\(C_{\gls{simple}[k]}\)},% will evaluate as \(C_{A_k}\) in the glossary
text={C_{\gls{simple}}},% \glsarg will be passed to \gls{simple} without mentioning it here
description={more complex. You can use \(\gls{simple2}\) here as well}}
\preto\glsentryfmt{%
\glsifcategory{\glslabel}{arg}%
{%
\ifdefempty\glsinsert
{\glsfieldfetch{\glslabel}{useri}{\glsarg}}%
{%
\let\glsarg\glsinsert
\let\glsinsert\empty
}%
}%
{}%
}
\begin{document}
\[\gls{simple}\]% shows as A_a
\[\gls{simple}[i]\]% shows as A_i
\[\gls{simple2}[j]\]% shows as B_j
\[\gls{complex}[k]\]% shows as C_{A_k}
\printglossaries
\end{document}