采用polyglossia杂语宏包支持梵语,编译后正文一切正常,但目录不能正常列印:
望达人指导。
问题页及源码如下:

\documentclass[UTF8,openany,a4paper,fontset=none,zihao=-4]{ctexbook}
\ctexset{chapter/name = {第,章},
section/name = {},
contentsname = \hfill 目\ 录 \hfill,
}
\usepackage{xeCJK}
%============================= 字体设置 ============================%
\setCJKmainfont[BoldFont=KaiTi,ItalicFont=FangSong]{NSimSun}
\setmainfont[BoldFont=Times New Roman]{Times New Roman}
\usepackage{polyglossia} % 杂语支持(针对梵语)
\setotherlanguage{sanskrit}
\newfontfamily\sanskritfont[Script=Devanagari]{Sanskrit2003.ttf}
\begin{document}
\frontmatter
\tableofcontents
\chapter{导论}
梵语\footnote{梵语(梵语:\begin{sanskrit}संस्कृता वाक्\end{sanskrit},Saṃskṛtā vāk,简称\begin{sanskrit}संस्कृतम्\end{sanskrit},Saṃskṛtam;英语Sanskrit)属于印欧语系中印度–伊朗语族的印度–雅利安语支,是该语系中最古老的语言之一。和拉丁语一样,梵语已经成为一种属于学术和宗教的专门用语。虽然现代梵语的母语使用者非常少,但是因为梵文本身的特殊性,在现代佛教、印度教和耆那教的经典中依然可以随处找到梵语。古印度相信梵文是由梵天发明。}优雅动听,是印度高等种姓以及更早雅利安人所说的语言,历史比其它任何已知语言都更为久远。
\chapter{梵语的格}
主格:用于句子的主语。宾格:用作直接宾语,也用于“to”表达的与格(间接宾语)。具格:在英语中用于“by”,“with”或“by means of”句式中。与格:在“for”,“to”或“toward”意思上使用。离格:在“of”和“from”意思上使用。
\begin{sanskrit}कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं\end{sanskrit}
\mainmatter
\chapter{主格}
\begin{sanskrit}कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं\end{sanskrit}
\chapter{宾格}
\begin{sanskrit}कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं\end{sanskrit}
\chapter{具格}
\begin{sanskrit}कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं\end{sanskrit}
\chapter{与格}
\begin{sanskrit}कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं\end{sanskrit}
\end{document}
事实上,如下的多个字体配置宏包功能可能相互冲突:
ctex(xeCJK/luatexja)bidibabelpolyglossia既然已经选定了使用polyglossia做杂语支持,一种workaround是可以直接使用polygollssia的框架,不过「字体选择似乎有些受限(无法实现西文用TNR中文用NSimSun)」且「会失去\ctexset与format的功能」...
polyglossia的方案没有细调的一份代码如下(使用titlesec和titletoc调整样式):
\documentclass[openany]{book}
\usepackage{zhlipsum}
\usepackage{zhnumber}
\usepackage{fontspec}
\usepackage{polyglossia}
% \setmainfont{Times New Roman}
% \setCJKmainfont{NSimSun}
% \setmainfont{NSimSun}
\setdefaultlanguage{chinese}
\setmainfont{Noto Serif CJK SC}
\setotherlanguage{sanskrit}
\newfontfamily\sanskritfont[Script=Devanagari]{Sanskrit2003.ttf}
\usepackage{setspace}%
\setstretch{1.5}%
\usepackage{titlesec}
\usepackage{titletoc}
\titleformat{\chapter}{\filcenter\Huge\bfseries}{第\zhnum{chapter}章}{1cm}{}
\titlecontents{chapter}[3.8em]{}{第\zhnumber{\thecontentslabel}章\quad}{}{\hfill\bfseries\thecontentspage}
\begin{document}
\frontmatter
\tableofcontents
\chapter{导论}
梵语\footnote{梵语(梵语:\begin{sanskrit}संस्कृता वाक्\end{sanskrit},Saṃskṛtā vāk,简称\begin{sanskrit}संस्कृतम्\end{sanskrit},Saṃskṛtam;英语Sanskrit)属于印欧语系中印度–伊朗语族的印度–雅利安语支,是该语系中最古老的语言之一。}优雅动听优雅动听,是印度高等种姓以及更早雅利安人所说的语言,这是一段中English 0123-4567英混排历史 history 比其它任何已知语言都更为久远。\zhlipsum[2]
\chapter{梵语的格}
主格:用于句子的主语。
\begin{sanskrit}कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं\end{sanskrit}
\mainmatter
\chapter{主格}
\begin{sanskrit}कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं\end{sanskrit}
\chapter{宾格}
\begin{sanskrit}कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं\end{sanskrit}
\chapter{具格}
\begin{sanskrit}कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं\end{sanskrit}
\chapter{与格}
\begin{sanskrit}कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं\end{sanskrit}
\end{document}
问题似乎很好解决...虽然明显「xelatex」有严重的问题(「xelatex」什么时候彻底淘汰啊!!真该死啊!!)
另外,为何一定要使用polyglossia而不是babel,后者似乎没有"Contents"的目录问题,和ctex的兼容性更好(Ref: https://tex.stackexchange.com/questions/757653/unexpected-conflict-between-polyglossia-and-ctex-bundles#comment1889532_757653)。
将
\begin{sanskrit}कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं\end{sanskrit}(或者同样在xe下有问题的)
\begin{otherlanguage}{sanskrit}
कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं
\end{otherlanguage}全部替换为
\textsanskrit{कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं}或者
\begin{otherlanguage*}{sanskrit}
कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं
\end{otherlanguage*}似乎则可以防止在.toc中写入脏东西(无论xe还是lua都work)
\documentclass[
UTF8,openany,
a4paper,zihao=-4,
fontset=none
]{ctexbook}
\usepackage[paperheight=17cm]{geometry}
\ctexset{
chapter/name = {第,章},
% section/name = {},
% contentsname = \hfill 目\ 录 \hfill,
}
\setCJKmainfont[BoldFont=KaiTi,ItalicFont=FangSong]{NSimSun}
\setmainfont[BoldFont=Times New Roman]{Times New Roman}
\usepackage{polyglossia}
\setotherlanguage{sanskrit}
\newfontfamily\sanskritfont[Script=Devanagari]{Sanskrit2003.ttf}
\begin{document}
\renewcommand{\contentsname}{目\ 录}%after \begin{document}!
\frontmatter
\tableofcontents
\chapter{导论}
梵语
\footnote{梵语(梵语:\textsanskrit{संस्कृता वाक्},Saṃskṛtā vāk,简称\begin{otherlanguage*}{sanskrit}संस्कृतम्\end{otherlanguage*},Saṃskṛtam;英语Sanskrit)属于印欧语系中印度–伊朗语族的印度–雅利安语支,是该语系中最古老的语言之一。和拉丁语一样,梵语已经成为一种属于学术和宗教的专门用语。虽然现代梵语的母语使用者非常少,但是因为梵文本身的特殊性,在现代佛教、印度教和耆那教的经典中依然可以随处找到梵语。古印度相信梵文是由梵天发明。}
优雅动听,是印度高等种姓以及更早雅利安人所说的语言,历史比其它任何已知语言都更为久远。
\chapter{梵语的格}
主格:用于句子的主语。宾格:用作直接宾语,也用于“to”表达的与格(间接宾语)。具格:在英语中用于“by”,“with”或“by means of”句式中。与格:在“for”,“to”或“toward”意思上使用。离格:在“of”和“from”意思上使用。
\begin{otherlanguage*}{sanskrit}
कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं
\end{otherlanguage*}
\mainmatter
\chapter{主格}
\textsanskrit{कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं}
\chapter{宾格}
\textsanskrit{कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं}
\chapter{具格}
\begin{otherlanguage*}{sanskrit}
कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं
\end{otherlanguage*}
\chapter{与格}
\textsanskrit{कृपयाविष्टमश्रुपूर्णाकुलेक्षणम्विषीदन्तमिदं}
\end{document}
谢谢回复!
我的编译环境为:win10,TexLive2023;polyglossia宏包为v1.60版。
在TexLive2022、上版本polyglossia下编译结果一样。
目录不能正常列印问题,感觉是.toc文件中每个条目都增加了语言选择命令:
手动删除后编译正常。但不知如何解决。
我就一个问题:
Sanskrit2003.ttf这个字体提问者不提供???等着别人到互联网上帮你搜索吗???
不好意思,字体如下:
Sanskrit2003.ttf
一个有趣的发现是:
上面的代码在
xelatex下目录字体显示异常、章节目录样式异常:但在
lualatex下目录字体显示正常、章节目录样式异常:由于在这里提到更建议使用
lualatex,所以针对这个MWE,可以考虑:使用「
lualatex」编译可以得到: