我目前正在使用词汇表包制作符号列表。我调整了几个参数以适应我喜欢的布局,但在此过程中词汇表的排序发生了变化。现在排序如下:
大写字母 -> 希腊字母 -> 非大写字母
而不是期望的:
大写字母 -> 非大写字母 -> 希腊字母
梅威瑟:
\documentclass{report}
\usepackage[english]{babel}
\usepackage{tabularx}
\usepackage[acronyms,nonumberlist,nopostdot]{glossaries}
\glsaddkey{unit}{\glsentrytext{\glslabel}}{\glsentryunit}{\GLsentryunit}{\glsunit}{\Glsunit}{\GLSunit}
\newglossarystyle{symbunitlong}{%
\setglossarystyle{long3col}% base this style on the list style
\renewenvironment{theglossary}{% Change the table type --> 3 columns
\begin{longtable}{lp{1.5\glsdescwidth}>{\centering\arraybackslash}p{2cm}}}%
{\end{longtable}}%
%
\renewcommand*{\glossaryheader}{% Change the table header
\bfseries Sign & \bfseries Description & \bfseries Unit \\
\hline
\endhead}
\renewcommand*{\glossentry}[2]{% Change the displayed items
\glstarget{##1}{\glossentryname{##1}} %
& \glossentrydesc{##1}% Description
& \glsunit{##1} \tabularnewline}}
%abbreviations
\newacronym{tes}{TES}{thermal energy storage}
%symbols
\newglossaryentry{tau}
{name={\ensuremath{\tau_{s}}},
description={Shear modulus}, unit={\ensuremath{MPa}}}
\newglossaryentry{hf}
{name={\ensuremath{H_{f}}},
description={Heat of fusion}, unit={\ensuremath{kJ/kg}}}
\newglossaryentry{r}
{name={\ensuremath{r}},
description={Radius}, unit={\ensuremath{m}}}
\makeglossaries
\begin{document}
\setglossarysection{section}
\setglossarystyle{super}
\printglossary[style=symbunitlong,title=List of Symbols]
\printglossary[type=\acronymtype,title={List of Abbreviations}]
I use \gls{tes} to have \gls{tau},\gls{hf} and \gls{r}.
\end{document}
电流输出:
我该如何修复词汇表的排序?
答案1
由于您没有使用sort
键,排序值取自name
包含命令的字段,但makeindex
无法识别 LaTeX 命令。它只看到一串字符:
\
e
n
s
u
r
e
m
a
t
h
(空间)
{
H
_
{
f
}
}
\
e
n
s
u
r
e
m
a
t
h
(空格)
{
\
t
a
u
(空格)
_
{
s
}
}
\
e
n
s
u
r
e
m
a
t
h
(空间)
{
r
}
这些都以非字母 ( \
) 开头,因此makeindex
排序时使用简单的字符代码比较。此处的每个排序值都以相同的子字符串开头,\ensuremath {
因此该子字符串后面的字符决定了相对顺序:
H
(字符代码 0x48 = 72)\
(字符代码 0x5C = 92)r
(字符代码 0x72 = 114)
因此最终的顺序是\ensuremath {H_{f}}
< \ensuremath {\tau _{s}}
<\ensuremath {r}
。
您需要使用sort
键来更改此顺序。如果您希望区分大小写的字母顺序(即所有大写字母都位于小写字母之前),则sort
仍需要以非字母开头。最好的做法是选择非字母前缀,以确保您想要的顺序。
例如,<
具有字符代码 0x3C = 60 并且>
具有字符代码 0x3E = 62,因此以 开头的任何排序值<
都将位于以 开头的任何排序值之前>
:
\newglossaryentry{tau}
{name={\ensuremath{\tau_{s}}},
sort={>tau},
description={Shear modulus}, unit={\ensuremath{MPa}}}
\newglossaryentry{hf}
{name={\ensuremath{H_{f}}},
sort={<Hf},
description={Heat of fusion}, unit={\ensuremath{kJ/kg}}}
\newglossaryentry{r}
{name={\ensuremath{r}},
sort={<r},
description={Radius}, unit={\ensuremath{m}}}
现在将生成排序<Hf
< <r
< >tau
。您可能希望定义自定义命令来自动sort
从标签中形成,但由于所有标签都是小写的,因此=
小写版本需要另一个前缀(例如,字符代码 0x3D)。例如:
\documentclass{report}
\usepackage[english]{babel}
\usepackage{tabularx}
\usepackage[acronyms,nonumberlist,nopostdot]{glossaries}
\glsaddkey{unit}{\glsentrytext{\glslabel}}{\glsentryunit}{\GLsentryunit}{\glsunit}{\Glsunit}{\GLSunit}
\newglossarystyle{symbunitlong}{%
\setglossarystyle{long3col}% base this style on the list style
\renewenvironment{theglossary}{% Change the table type --> 3 columns
\begin{longtable}{lp{1.5\glsdescwidth}>{\centering\arraybackslash}p{2cm}}}%
{\end{longtable}}%
%
\renewcommand*{\glossaryheader}{% Change the table header
\bfseries Sign & \bfseries Description & \bfseries Unit \\
\hline
\endhead}
\renewcommand*{\glossentry}[2]{% Change the displayed items
\glstarget{##1}{\glossentryname{##1}} %
& \glossentrydesc{##1}% Description
& \glsunit{##1} \tabularnewline}}
\makeglossaries
%abbreviations
\newacronym{tes}{TES}{thermal energy storage}
% syntax: \newgreeksymbol[options]{label}{name}{description}{unit}
\newcommand{\newgreeksymbol}[5][]{%
\newglossaryentry{#2}{name={#3},sort={>#2},description={#4},unit={#5},#1}%
}
\newcommand{\newsymbol}[5][]{%
\newglossaryentry{#2}{name={#3},sort={=#2},description={#4},unit={#5},#1}%
}
\newcommand{\newSymbol}[5][]{%
\newglossaryentry{#2}{name={#3},sort={<#2},description={#4},unit={#5},#1}%
}
%symbols
\newgreeksymbol{tau}{\ensuremath{\tau_{s}}}{Shear modulus}{\ensuremath{MPa}}
\newSymbol{hf}{\ensuremath{H_{f}}}{Heat of fusion}{\ensuremath{kJ/kg}}
\newsymbol{r}{\ensuremath{r}}{Radius}{\ensuremath{m}}
\begin{document}
\setglossarysection{section}
\setglossarystyle{super}
\printglossary[style=symbunitlong,title=List of Symbols]
\printglossary[type=\acronymtype,title={List of Abbreviations}]
I use \gls{tes} to have \gls{tau},\gls{hf} and \gls{r}.
\end{document}
如果你有兴趣,这里有一个完全不同的方法。创建一个名为的文件,abbrvs.bib
其中包含缩写:
% Encoding: UTF-8
@abbreviation{tes,
short = {TES},
long = {thermal energy storage}
}
创建一个名为的文件,syms.bib
其中包含以下符号:
% Encoding: UTF-8
@symbol{tau,
name={\ensuremath{\tau_{s}}},
description={Shear modulus},
unit={\ensuremath{MPa}}
}
@symbol{hf,
name={\ensuremath{H_{f}}},
description={Heat of fusion},
unit={\ensuremath{kJ/kg}}
}
@symbol{r,
name={\ensuremath{r}},
description={Radius},
unit={\ensuremath{m}}
}
该文件现为:
\documentclass{report}
\usepackage[english]{babel}
\usepackage{tabularx}
\usepackage[record,abbreviations]{glossaries-extra}
\glsaddkey{unit}{\glsentrytext{\glslabel}}{\glsentryunit}{\GLsentryunit}{\glsunit}{\Glsunit}{\GLSunit}
\newglossarystyle{symbunitlong}{%
\setglossarystyle{long3col}% base this style on the list style
\renewenvironment{theglossary}{% Change the table type --> 3 columns
\begin{longtable}{lp{1.5\glsdescwidth}>{\centering\arraybackslash}p{2cm}}}%
{\end{longtable}}%
%
\renewcommand*{\glossaryheader}{% Change the table header
\bfseries Sign & \bfseries Description & \bfseries Unit \\
\hline
\endhead}
\renewcommand*{\glossentry}[2]{% Change the displayed items
\glstarget{##1}{\glossentryname{##1}} %
& \glossentrydesc{##1}% Description
& \glsunit{##1} \tabularnewline}}
%abbreviations
\GlsXtrLoadResources[
src={abbrvs},% definitions in abbrvs.bib
save-locations=false % no number list required
]
%symbols
\GlsXtrLoadResources[
src={syms},% definitions in syms.bib
save-locations=false, % no number list required
sort-field={name},
sort=letter-case
]
\begin{document}
\setglossarysection{section}
\setglossarystyle{super}
\printunsrtglossary[style=symbunitlong,title=List of Symbols]
\printunsrtglossary[type=abbreviations,title={List of Abbreviations}]
I use \gls{tes} to have \gls{tau},\gls{hf} and \gls{r}.
\end{document}
如果调用该文档myDoc.tex
则构建过程如下:
pdflatex myDoc
bib2gls myDoc
pdflatex myDoc
得出的结果为:
如果你检查bib2gls
转录文件(myDoc.glg
)你应该找到:
texparserlib: {}\ensuremath{\tau_{s}} ->