直到最近,人们可以重新定义\textlatin
扩展其参数,以便在非 ASCII 编码与 ASCII 编码一起加载时允许使用罗马数字和 babel 的索引条目。
babel 的最新更改现在已使此操作过时。如果存在任何非 ASCII 编码,则会进行编码选择以及字体切换。这是通过\AtBeginDocument
和 相关的过程完成的\ensureascii
。
考虑一下这个MWE:
%!TEX program=pdflatex
\documentclass{memoir}
\usepackage[utf8]{inputenc}
\usepackage[LGR,T1]{fontenc}
\usepackage[greek,english]{babel}
\usepackage{makeidx}
\makeindex
\begin{document}
\frontmatter
\meaning\thepage
\index{\string\thepage}
\mainmatter
\meaning\thepage
\index{\string\thepage}
\backmatter
\printindex
\end{document}
该.idx
文件将包含:
\indexentry{\string\thepage}{{\fontencoding {T1}\selectfont i}}
\indexentry{\string\thepage}{1}
由于与以前使用 的原因类似,此方法无法与 makeindex 配合使用\textlatin
。你将丢失前言中的所有索引条目。
有没有人发现了什么优雅的解决方法?或者坚持使用旧版本的 Babel?
我犹豫是否要使用 sed.idx
与 latexmk 结合来描边文件,否则它在创建我正在处理的文档时会做得非常出色。
尽管我理解为什么这个设计决策在很多地方非常有用,但它确实使索引变得复杂。
答案1
您可以\ensureascii
对扩展进行强大的防御\edef
;\write
然后使用可怕的黑客手段摆脱\ensureascii
索引文件被写出的问题。
\documentclass{memoir}
\usepackage[utf8]{inputenc}
\usepackage[LGR,T1]{fontenc}
\usepackage[greek,english]{babel}
\usepackage{etoolbox}
\usepackage{makeidx}
\makeindex
\makeatletter
\AtBeginDocument{%
\robustify\ensureascii
\def\@@@wrindexm@m#1#2{%
\if@filesw
\global\let\@gtempa\@idxfile
\endgroup % end \@sanitize
\begingroup
\let\ensureascii\@firstofone
\everyeof{\noexpand}%
\immediate\write\@gtempa{\string\indexentry{#1}{\scantokens{#2\@empty}}}%
\fi
\endgroup
}%
}
\makeatother
\begin{document}
\frontmatter
\meaning\thepage
\index{\string\thepage}
\mainmatter
\meaning\thepage
\index{\string\thepage}
\backmatter
\printindex
\end{document}
该文件的内容.idx
将是
\indexentry{\string\thepage}{i}
\indexentry{\string\thepage}{1}
一些解释。memoir
将索引条目写入辅助文件中,并使 idx 文件仅在文档末尾。首次写出索引条目时,\ensureascii
会展开。因此,要做的第一件事是使其在写入操作期间能够抵抗扩展。接下来,我们希望在写入 idx 文件时摆脱它。这里的问题是,的参数是\@@@wrindexm@m
逐字读取的,因此我们需要终止的范围\@sanitize
并使用标准设置重新读取第二个参数,在本地制作\ensureascii
。
memoir
当然,这只适用于。
答案2
另一种解决方案是 zapbabel
重新定义\@roman
和\@Roman
。
...
\makeatletter
\let\save@roman\@roman
\let\save@Roman\@Roman
\usepackage[greek,english]{babel}
\let\@roman\save@roman
\let\@Roman\save@Roman
\makeatother
...
如果你想创造当语言转换为希腊语时,罗马数字,但至少它是简单且不言自明的。