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-extra
和bib2gls
。不使用\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
得出的结果为:
如果您想要字母组,您需要使用--group
(或-g
)开关:
xelatex test
bib2gls -g test
xelatex test
现在产生:
\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
-g
group
标签通常是字母数字标识符。与该标签对应的关联标题设置为\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