是否存在针对 babel 和索引罗马数字页码的当前解决方法?

是否存在针对 babel 和索引罗马数字页码的当前解决方法?

直到最近,人们可以重新定义\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
...

如果你想创造当语言转换为希腊语时,罗马数字,但至少它是简单且不言自明的。

相关内容