中文索引不按拼音顺序列举

中文索引不按拼音顺序列举

MWE 如下:

\documentclass{amsbook}
\usepackage{ctex}
%%%index setting%%%%%%%%%%%%%%%%%%%%
\usepackage{imakeidx}
\makeindex
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{document}
m
\index{康托}
\index{完全性}


\cleardoublepage
\printindex
\end{document}

我对其进行了编译XeLatex并得到以下PDF:

在此处输入图片描述

我发现索引不是按照汉语拼音顺序列举的,否则康托应该在之前完全性

问题: 谁能帮我把索引按照汉语拼音顺序列出来?顺便说一下,我用的是 MacTex。

答案1

正如 egreg 在评论中提到的,Makeindex 和 Xindy 都不支持中文,但这里有一种不同的方法。

我没有ctex安装,所以我已经切换到XeLaTeX fontspec。如果你想使用PDFLaTeX,那么它会稍微复杂一些。

此方法使用glossaries-extrabib2gls。不使用\index,而是首先在一个或多个文件中定义术语.bib。例如,entries-zh.bib

% Encoding: UTF-8

@index{康托}

@index{完全性}

使用 PDFLaTeX,您需要 ASCII 标签,例如:

% Encoding: UTF-8

@index{label1, name={康托}}

@index{label2, name={完全性}}

(选择更合适的标签。我不懂中文。)

该文件:

\documentclass{amsbook}
\usepackage{fontspec}
\setmainfont{SourceHanSansCN-Regular}

\usepackage[record,% using bib2gls
  nostyles,% don't load the default styles
  stylemods=bookindex,% load glossary-bookindex.sty
  style=bookindex % set the default style
]{glossaries-extra}

\GlsXtrLoadResources[
  src={entries-zh},% data in entries-zh.bib
  sort={zh}% sort by this language (zh = Chinese)
]

\begin{document}
m 
\glsadd{康托}\glsadd{完全性}

\printunsrtglossary[title={Index}]
\end{document}

这是最接近于您的 MWE 的等价物,其\glsadd行为类似于\index它索引但不显示任何文本。\glsadd标签,因此如果您使用上述 ASCII 标签:

\documentclass{amsbook}
\usepackage{fontspec}
\setmainfont{SourceHanSansCN-Regular}

\usepackage[record,% using bib2gls
  nostyles,% don't load the default styles
  stylemods=bookindex,% load glossary-bookindex.sty
  style=bookindex % set the default style
]{glossaries-extra}

\GlsXtrLoadResources[
  src={entries-zh},% data in entries-zh.bib
  sort={zh}% sort by this language (zh = Chinese)
]

\begin{document}
m 
\glsadd{label1}\glsadd{label2}

\printunsrtglossary[title={Index}]
\end{document}

如果调用该文档,test.tex则文档构建为:

xelatex test
bib2gls test
xelatex test

得出的结果为:

索引 康托, 1 完全性,1

如果您想要字母组,您需要使用--group(或-g)开关:

xelatex test
bib2gls -g test
xelatex test

现在产生:

索引 康 康托, 1 完 完全性,1

\glsadd您可以使用来\gls在文档中额外显示相关文本。

您可以有多个索引。例如,假设entries-en.bib包含:

% Encoding: UTF-8

@index{cat}
@index{dog}

然后:

\documentclass{amsbook}
\usepackage{fontspec}
\setmainfont{SourceHanSansCN-Regular}

\usepackage[record,% using bib2gls
  nostyles,% don't load the default styles
  stylemods=bookindex,% load glossary-bookindex.sty
  style=bookindex, % set the default style
  nomain % don't create default 'main' glossary
]{glossaries-extra}

\newglossary*{index-zh}{Index (Chinese)}
\newglossary*{index-en}{Index (English)}

\GlsXtrLoadResources[
   src={entries-zh},% data in 'entries-zh.bib'
   sort={zh},% sort by this language (zh = Chinese)
   type={index-zh}% put these entries into the 'index-zh' glossary
]

\GlsXtrLoadResources[
   src={entries-en},% data in 'entries-en.bib'
   sort={en},% sort by this language (en = English)
   type={index-en}% put these entries into the 'index-en' glossary
]

\begin{document}
Chinese: \gls{康托} \gls{完全性}.

English: \gls{cat} \gls{dog}.

\printunsrtglossary[type={index-zh}]
\printunsrtglossary[type={index-en}]
\end{document}

第 1 页:

中文: 康托 完全性。英语:猫狗。

第 3 页:

中国指数图片

第 5 页:

英文索引图片

对于分层条目,您需要使用字段parent。(该值是标签父条目。)例如:

% Encoding: UTF-8

@index{康托}

@index{完全性}

@index{的妻子,
  parent={康托}
}

@index{的弟弟,
  parent={康托}
}

可以编辑此文档以包含以下新术语:

Top-level terms: \gls{康托} and \gls{完全性}. 
Sub-entries: \gls{的妻子} and \gls{的弟弟}.

第 1 页现在有以下文字:

顶级术语:康托和完全性。子条目:的妻子和的弟弟。

以及第 3 页的索引:

索引图像,其子条目列于其父条目下

样式bookindex用于\glsxtrbookindexprelocation术语和位置(页码)之间的分隔符。其定义为:

\newcommand*{\glsxtrbookindexprelocation}[1]{%
  \glsxtrifhasfield{location}{#1}%
  {,\glsxtrprelocation}%
  {\glsxtrprelocation}%
}

(其中\glsxtrprelocation只是一个普通的空格)。这将检查location字段是否已设置。如果父条目未编入索引,则不会设置。(如果location未设置字段,则使用空格来允许样式使用未设置该字段的标准 makeindex/xindy 选项具有一些有限的功能。)因此,要使用带点的前导符作为分隔符:

\renewcommand*{\glsxtrbookindexprelocation}[1]{%
  \glsxtrifhasfield{location}{#1}%
  {\dotfill}% location provided
  {}% location field not set
}

当您使用(或)bib2gls开关调用时,它会为每个条目创建一个字段。此字段的值是--group-ggroup标签通常是字母数字标识符。与该标签对应的关联标题设置为\glsxtrsetgrouptitle{标签}{标题}。这是.glstex通过文件开头提供的辅助命令执行的。

在上面的例子中,.glstex文件中的相关行是:

\bibglssetlettergrouptitle{{康}{康}{142540800}{index-zh}}
\bibglssetlettergrouptitle{{完}{完}{232259584}{index-zh}}

默认行为是通过将词汇表类型 ( index-zh) 与排序方法使用的比较器获得的数值连接起来来创建组标签。相应的标题设置为相关字母(可能不止一个字符)。

所以在这个例子中,第一个组标签index-zh142540800对应的标题是康,第二个组标签index-zh232259584对应的标题是完。

使用这些组标签后,您可以更改标题\GlsXtrLoadResources。例如:

\glsxtrsetgrouptitle{index-zh142540800}{X}
\glsxtrsetgrouptitle{index-zh232259584}{Y}

每次组标签发生变化时,所使用的内部机制\printunsrtglossary都会插入一个新的组标题。因此,具有相同标题的两个标签仍将被视为两个不同字母的组。您可以通过创建自己的自定义排序规则来更改分组的方式(但这更复杂)。

答案2

尝试zhmakeindex

pdftex mylatexfile
zhmakeindex -s zh.ist mylatexfile
pdftex mylatexfile

以上是文档zh.ist中使用的索引样式文件。zhmakeindex

相关内容