我想使用 \makeglossaries 创建一个符号列表,但它必须按顺序排列,并且符号也必须具有各自的单位。在寻求问题解决方案的过程中,我遇到了两个答案,它们都包含我想要的内容,但都只有一个期望的结果。
1st- 有单位但没有排序的符号(摘自词汇表:如何自定义带有单位附加列的符号列表?
\documentclass{book}
\usepackage{siunitx}
\usepackage[symbols,nogroupskip,nonumberlist,automake]{glossaries-extra} % use glossaries-package
\usepackage{subfiles}
\setlength{\glsdescwidth}{15cm}
\newglossary[slg]{symbolslist}{syi}{syg}{Symbolslist} % create add. symbolslist
\glsaddkey{unit}{\glsentrytext{\glslabel}}{\glsentryunit}{\GLsentryunit}{\glsunit}{\Glsunit}{\GLSunit}
\makeglossaries % activate glossaries-package
% ==== EXEMPLARY ENTRY FOR SYMBOLS LIST =========================================
\newglossaryentry{symb:Pi}{name=\ensuremath{\pi},
description={Geometrical value},
unit={},
type=symbolslist}
\newglossaryentry{height}{name=\ensuremath{h},
description={Height of tower},
unit={\si{m}},
type=symbolslist}
\newglossaryentry{energyconsump}{name=\ensuremath{P},
description={Energy consumption},
unit={\si{kW}},
type=symbolslist}
\newglossaryentry{Eficiency}{name=\ensuremath{\eta},
description={Useful portion of work},
unit={\si{}},
type=symbolslist}
\newglossarystyle{symbunitlong}{%
\setglossarystyle{long3col}% base this style on the list style
\renewenvironment{theglossary}{% Change the table type --> 3 columns
\begin{longtable}{lp{0.6\glsdescwidth}>{\centering\arraybackslash}p{2cm}}}%
{\end{longtable}}%
%
\renewcommand*{\glossaryheader}{% Change the table header
\bfseries Simbolo & \bfseries Description & \bfseries Unit \\
\hline
\endhead}
\renewcommand*{\glossentry}[2]{% Change the displayed items
\glstarget{##1}{\glossentryname{##1}} %
& \glossentrydesc{##1}% Description
& \glsunit{##1} \tabularnewline
}
}
\begin{document}
\glsaddall
%\printglossary[type=\acronymtype,style=long] % list of acronyms
\printglossary[type=symbolslist,style=symbunitlong,title={Lista de Símbolos}] % list of symbols
% \printglossary[type=main] % main glossary
\end{document}
第二个,可以排序,但是我无法添加单位。
\documentclass{report}
\usepackage[colorlinks]{hyperref}
\usepackage[symbols,nogroupskip,sort=none]{glossaries-extra}
\glsxtrnewsymbol[description={position}]{x}{\ensuremath{x}}
\glsxtrnewsymbol[description={velocity}]{v}{\ensuremath{v}}
\glsxtrnewsymbol[description={acceleration}]{a}{\ensuremath{a}}
\glsxtrnewsymbol[description={time}]{t}{\ensuremath{t}}
\glsxtrnewsymbol[description={force}]{F}{\ensuremath{F}}
\begin{document}
\tableofcontents
\printunsrtglossary[type=symbols,style=long]
\chapter{Sample}
Reference symbols: $\gls{x}$, $\gls{v}$, $\gls{a}$, $\gls{t}$,
$\gls{F}$.
\end{document}
真的很抱歉打扰,我是 Latex 的新手,我已经被这个问题困扰了一段时间了。
答案1
你的第二个例子使用long
style=long
词汇表样式(在 的可选参数中设置\printunsrtglossary
)。这仅显示术语(例如\ensuremath{x}
)和描述(例如position
),但不显示任何其他信息(除了位置列表,该示例中不存在)。您不仅需要添加单位,还需要提供显示它们的样式。
一些预定义样式symbol
也会显示该字段,因此如果您使用该字段来存储单位,那么您只需使用显示符号的样式即可。表 15.1在glossaries
用户手册中指明哪些样式显示该符号。
例如,
\documentclass{report}
\usepackage{siunitx}
\usepackage[colorlinks]{hyperref}
\usepackage[symbols,nogroupskip,sort=none]{glossaries-extra}
\glsxtrnewsymbol[description={position},symbol={\si{m}}]{x}{\ensuremath{x}}
\glsxtrnewsymbol[description={velocity},symbol={\si{\metre\per\second}}]{v}{\ensuremath{v}}
\glsxtrnewsymbol[description={acceleration},symbol={\si{\metre\per\second\squared}}]{a}{\ensuremath{a}}
\glsxtrnewsymbol[description={time},symbol={\si{s}}]{t}{\ensuremath{t}}
\glsxtrnewsymbol[description={force},symbol={\si{N}}]{F}{\ensuremath{F}}
\begin{document}
\tableofcontents
\printunsrtglossary[type=symbols,style=long4col]
\chapter{Sample}
Reference symbols: $\gls{x}$, $\gls{v}$, $\gls{a}$, $\gls{t}$,
$\gls{F}$. Reference unit: $\glssymbol{v}$.
\end{document}
得出的结果为:
这实际上有四列,但第四列是空的,因为没有位置列表。该\glssymbol
命令的工作原理类似于\gls
,但显示符号值(在本例中为单位)。
如果您希望使用自定义unit
键,而不是使用提供的symbol
键,则可以像第一个示例一样添加一个。有两个命令可以添加新键:\glsaddkey
和\glsaddstoragekey
。这取决于您是否要使用如上例中的命令\glssymbol
。如果要,则需要:
\glsaddkey{unit}{}{\glsentryunit}{\Glsentryunit}{\glsunit}{\Glsunit}{\GLSunit}
(对于单位来说,大小写转换命令没有多大意义,但语法需要它们。)如果您只需要单位显示在符号列表中,那么您可以执行以下操作:
\glsaddstoragekey{unit}{}{\glsentryunit}
您还需要使用\glsnoexpandfields
以避免以下问题:扩张。
您可以在第一个示例中使用词汇表样式,但应该\glsentryunit
使用\glsunit
:
\newglossarystyle{symbunitlong}{%
\setglossarystyle{long3col}% base this style on the list style
\renewenvironment{theglossary}{% Change the table type --> 3 columns
\begin{longtable}{lp{\glsdescwidth}>{\centering\arraybackslash}p{2cm}}}%
{\end{longtable}}%
\renewcommand*{\glossaryheader}{% Change the table header
\bfseries Symbol & \bfseries Description & \bfseries Unit\\\hline
\endhead}%
\renewcommand*{\glossentry}[2]{% Change the displayed items
\glstarget{##1}{\glossentryname{##1}} %
& \glossentrydesc{##1}% Description
& \glsentryunit{##1} \tabularnewline
}%
}
描述列的宽度由 给出\glsdescwidth
。如果尺寸不合适,您可以更改它。例如:
\setlength{\glsdescwidth}{.5\textwidth}
这使其成为可用文本宽度的一半,或者您可以使用绝对值:
\setlength{\glsdescwidth}{3in}
l
或者,如果您有简短的描述,您也可以将所有列更改为:
\renewenvironment{theglossary}%
{\begin{longtable}{lll}}%
{\end{longtable}}%
完整示例:
\documentclass{report}
\usepackage{siunitx}
\usepackage[colorlinks]{hyperref}
\usepackage[symbols,nogroupskip,sort=none]{glossaries-extra}
% new keys must be defined before use
\glsaddstoragekey{unit}{}{\glsentryunit}
\glsnoexpandfields
\glsxtrnewsymbol[description={position},unit={\si{m}}]{x}{\ensuremath{x}}
\glsxtrnewsymbol[description={velocity},unit={\si{\metre\per\second}}]{v}{\ensuremath{v}}
\glsxtrnewsymbol[description={acceleration},unit={\si{\metre\per\second\squared}}]{a}{\ensuremath{a}}
\glsxtrnewsymbol[description={time},unit={\si{s}}]{t}{\ensuremath{t}}
\glsxtrnewsymbol[description={force},unit={\si{N}}]{F}{\ensuremath{F}}
\newglossarystyle{symbunitlong}{%
\setglossarystyle{long3col}% base this style on the list style
\renewenvironment{theglossary}{% Change the table type --> 3 columns
\begin{longtable}{lp{\glsdescwidth}>{\centering\arraybackslash}p{2cm}}}%
{\end{longtable}}%
%
\renewcommand*{\glossaryheader}{% Change the table header
\bfseries Symbol & \bfseries Description & \bfseries Unit\\\hline
\endhead}%
\renewcommand*{\glossentry}[2]{% Change the displayed items
\glstarget{##1}{\glossentryname{##1}} %
& \glossentrydesc{##1}% Description
& \glsentryunit{##1} \tabularnewline
}%
}
\begin{document}
\tableofcontents
\printunsrtglossary[type=symbols,style=symbunitlong]
\chapter{Sample}
Reference symbols: $\gls{x}$, $\gls{v}$, $\gls{a}$, $\gls{t}$,
$\gls{F}$.
\end{document}
符号列表如下:
这涉及如何在符号列表中显示单位,但排序是通过按所需顺序定义每个符号来手动执行的。如果您想先按拉丁文再按希腊文自动排序,则需要使用额外的工具。最适合此任务的是bib2gls
因为它可以识别诸如的希腊命令\alpha
,但为此您需要在.bib
文件中定义所有符号。
例如,symbols.bib
:
% Encoding: UTF-8
@symbol{alpha,
unit= {\si{\radian\per\second\squared}},
name = {\ensuremath{\alpha}},
description = {angular acceleration}
}
@symbol{x,
unit = {\si{m}},
name = {\ensuremath{x}},
description = {position}
}
@symbol{v,
unit = {\si{\metre\per\second}},
name = {\ensuremath{v}},
description = {velocity}
}
@symbol{a,
unit = {\si{\metre\per\second\squared}},
name = {\ensuremath{a}},
description = {acceleration}
}
@symbol{t,
unit = {\si{s}},
name = {\ensuremath{t}},
description = {time}
}
@symbol{F,
unit = {\si{N}},
name = {\ensuremath{F}},
description = {force}
}
该文件:
\documentclass{report}
\usepackage{siunitx}
\usepackage[colorlinks]{hyperref}
\usepackage[record,% using bib2gls
symbols % create list of symbols
]{glossaries-extra}
% new keys must be defined before \GlsXtrLoadResources
\glsaddstoragekey{unit}{}{\glsentryunit}
\GlsXtrLoadResources[
src={symbols}, % data in symbols.bib
sort-field={name}, % sort by name field
sort={letter-nocase}, % case-insensitive letter sort
type=symbols % put these terms in the symbols list
]
% Define new glossary style
\newglossarystyle{symbunitlong}{%
\setglossarystyle{long3col}% base this style on the list style
\renewenvironment{theglossary}{% Change the table type --> 3 columns
\begin{longtable}{lp{\glsdescwidth}>{\centering\arraybackslash}p{2cm}}}%
{\end{longtable}}%
%
\renewcommand*{\glossaryheader}{% Change the table header
\bfseries Symbol & \bfseries Description & \bfseries Unit\\\hline
\endhead}%
\renewcommand*{\glossentry}[2]{% Change the displayed items
\glstarget{##1}{\glossentryname{##1}} %
& \glossentrydesc{##1}% Description
& \glsentryunit{##1} \tabularnewline
}%
}
\begin{document}
\tableofcontents
\printunsrtglossary[type=symbols,style=symbunitlong]
\chapter{Sample}
Reference symbols: $\gls{x}$, $\gls{v}$, $\gls{a}$, $\gls{t}$,
$\gls{F}$ and $\gls{alpha}$.
\end{document}
如果调用该文档,test.tex
则文档构建为:
pdflatex test
bib2gls test
pdflatex test
(如果您需要帮助将其与文本编辑器集成,请参阅将 makeglossaries 或 makeglossaries-lite 或 bib2gls 纳入文档构建中。
该sort=letter-nocase
选项执行不区分大小写的字符排序,因此拉丁字符自然会排在希腊字符之前。结果是:
如果您更喜欢使用样式long4col
,那么第四列现在将包含位置列表(文档中使用该术语的位置)。例如:
\documentclass{report}
\usepackage{siunitx}
\usepackage[colorlinks]{hyperref}
\usepackage[record,% using bib2gls
symbols % create list of symbols
]{glossaries-extra}
\GlsXtrLoadResources[
src={symbols}, % data in symbols.bib
sort-field={name}, % sort by name field
sort={letter-nocase}, % case-insensitive letter sort
type=symbols, % put these terms in the symbols list
field-aliases={unit=symbol}% convert unit key to symbol
]
\begin{document}
\tableofcontents
\printunsrtglossary[type=symbols,style=long4col]
\chapter{Sample}
Reference symbols: $\gls{x}$, $\gls{v}$, $\gls{a}$, $\gls{t}$,
$\gls{F}$ and $\gls{alpha}$. Unit for $\gls{v}$: $\glssymbol{v}$.
\end{document}
该选项field-aliases={unit=symbol}
使bib2gls
自定义unit
字段被视为实际symbol
字段,因此无需更改文件symbols.bib
。(如果没有此别名,bib2gls
将忽略该unit
字段,因为该unit
键不再在文档中定义。)
您可以使用任一选项省略位置列表nonumberlist
。例如:
\usepackage[record,symbols,nonumberlist]{glossaries-extra}
或者
\printunsrtglossary[type=symbols,style=long4col,nonnumberlist]
save-locations=false
或者,您可以在资源选项中使用:
\GlsXtrLoadResources[
src={symbols}, % data in symbols.bib
sort-field={name}, % sort by name field
sort={letter-nocase}, % case-insensitive letter sort
type=symbols, % put these terms in the symbols list
field-aliases={unit=symbol},% convert unit key to symbol
save-locations=false % don't save location lists
]
该glossaries-extra
软件包现在附带一个补充软件包glossary-longextra
,它提供了使用环境的其他词汇表样式。这些样式比基础软件包提供的样式longtable
更灵活,因此更容易调整。有long
glossaries
每种longextra
风格的样本glossaries
画廊。(如果glossary-longextra.sty
未找到,请尝试升级您的glossaries-extra
安装。)
例如:
\documentclass{report}
\usepackage{siunitx}
\usepackage[colorlinks]{hyperref}
\usepackage[record,% using bib2gls
symbols, % create list of symbols
stylemods={longextra} % load glossary-longextra.sty
]{glossaries-extra}
\GlsXtrLoadResources[
src={symbols}, % data in symbols.bib
sort-field={name}, % sort by name field
sort={letter-nocase}, % case-insensitive letter sort
type=symbols, % put these terms in the symbols list
field-aliases={unit=symbol},% convert unit key to symbol
save-locations=false % don't save location lists
]
% change column headers:
\renewcommand{\entryname}{Symbol}
\renewcommand{\symbolname}{Unit}
\begin{document}
\tableofcontents
\printunsrtglossary[type=symbols,style=long-name-desc-sym]
\chapter{Sample}
Reference symbols: $\gls{x}$, $\gls{v}$, $\gls{a}$, $\gls{t}$,
$\gls{F}$ and $\gls{alpha}$. Unit for $\gls{v}$: $\glssymbol{v}$.
\end{document}
这使用long-name-desc-sym
样式,其名称在第一列,描述在第二列,符号在第三列。名称和符号列的标题文本由语言敏感命令\entryname
和给出\symbolname
。这些在上例中重新定义。此样式不显示位置列表,因此我已指示bib2gls
不要费心保存位置(使用save-locations=false
)。
\glslongextraNameAlign
可以通过重新定义(名称列)和(符号列)来更改列对齐方式\glslongextraSymbolAlign
。例如:
\renewcommand{\glslongextraNameAlign}{c}
\renewcommand{\glslongextraSymbolAlign}{r}
如果您想要不同的列顺序,您可以使用其他样式之一。例如,long-name-sym-desc
第一列是名称,第二列是符号,第三列是描述。
答案2
@Nicola Talbot 感谢您的出色回答。效果非常好!也许可以作为上一个示例的一个小扩展。如果您有多个列表并且不想对所有列表进行更改,您还可以像前面的示例一样调整 glossaries-extra 样式,并根据它们定义新样式。您只需使用 glossaries-extra 即可获得更多选项,例如:
\documentclass{report}
\usepackage{siunitx}
\usepackage[abbreviations, % create list of abbreviations
symbols, % create list of symbols
nomain, % omit main glossary
nopostdot, % remove dot at the end of entry
nonumberlist, % don't show numbers where referenced
stylemods={longextra} % load glossary-longextra.sty
]{glossaries-extra}
% new keys must be defined before use
\glsaddstoragekey{unit}{}{\glsentryunit}
\glsnoexpandfields
\glsxtrnewsymbol[description={position},unit={\si{m}}]{x}{\ensuremath{x}}
\glsxtrnewsymbol[description={velocity},unit={\si{\metre\per\second}}]{v}{\ensuremath{v}}
\glsxtrnewsymbol[description={acceleration},unit={\si{\metre\per\second\squared}}]{a}{\ensuremath{a}}
\glsxtrnewsymbol[description={time},unit={\si{s}}]{t}{\ensuremath{t}}
\glsxtrnewsymbol[description={force},unit={\si{N}}]{F}{\ensuremath{F}}
\newglossarystyle{long-sym-desc-unit}{%
\setglossarystyle{long-name-desc-sym}% base this style on the list style
% change column headers:
\renewcommand{\entryname}{Symbol}
\renewcommand{\symbolname}{Unit}
\renewcommand*{\glossentry}[2]{% Change the displayed items
\glstarget{##1}{\glossentryname{##1}} %
& \glossentrydesc{##1} % Description
& \glsentryunit{##1} % Unit
\tabularnewline
}%
}
\begin{document}
\printglossary[type=symbols,title=List of Symbols,style=long-sym-desc-unit]
\chapter{Sample}
Reference symbols: $\gls{x}$, $\gls{v}$, $\gls{a}$, $\gls{t}$,
$\gls{F}$ and $\gls{alpha}$. Unit for $\gls{v}$: $\glssymbol{v}$.
\end{document}