使用 LuaLaTeX 映射天城文数字

使用 LuaLaTeX 映射天城文数字

我已经发布了一个名为marathi旨在高效地输入马拉地语。此包需要 XeLaTeX 或 LuaLaTeX。XeLaTeX 包fontspec提供了一种将阿拉伯数字与梵文数字映射的方法。尝试以下代码 -

% !TEX TS-Program = xelatex
\documentclass{article}
\usepackage{fontspec}
\setmainfont[Script=Devanagari,Mapping=devanagarinumerals]{Shobhika}

\begin{document}
\section{एक}
\section{दोन}
\end{document}

这给出了梵文数字的正确映射。遗憾的是,此功能不适用于LuaLaTeX。请尝试以下代码。

% !TEX TS-Program = lualatex
\documentclass{article}
\usepackage{fontspec}
\setmainfont[Renderer=Harfbuzz,Script=Devanagari,Mapping=devanagarinumerals]{Shobhika}

\begin{document}
\section{एक}
\section{दोन}
\end{document}

这将发出以下警告 -

Input mapping not supported in LuaTeX.

我的第一个疑问是,为什么在 LuaLaTeX 中这是不可能的。

我曾尝试使用 LuaLaTeX 生成梵文数字,使用给出的解决方案答案。除非使用使用定义的包,否则它几乎可以正常工作\@arabic。试试这个代码(您需要安装包marathi,并根据包要求安装 Shobhika 字体,该字体主要包含在 TeX 发行版中)-

\documentclass{article}
\usepackage{marathi}

\begin{document}
\section{एक}
\section{दोन}
\end{document}

这对于 XeLaTeX 和 LuaLaTeX 都会产生良好的效果,但是当我使用处理方式不同的包时,包会出错\@arabic。可能有很多这样的包。我提到的答案也警告了我们它的影响,虽然我想使用一种更温和的方式,它不会产生不可预测的错误,但在必要时会给我天城体数字。有没有办法让包忽略\@arabic已经被包使用的重新定义,但在没有加载这样的包时映射数字。相关定义可以在包的第 66 行和 67 行找到。


babel未提供本地枚举。请尝试此代码。

\tracinglostchars = 2 % Print a warning message if a character is missing.
\documentclass{article}
\usepackage[paperwidth=10cm]{geometry} % To format the MWE for TeX.SX
\usepackage[english, bidi=basic, layout=sectioning.counters]{babel}
\usepackage{fontspec}
\babelprovide[import, main, mapdigits]{marathi}
\defaultfontfeatures{Scale = MatchLowercase, Ligatures=TeX}
\babelfont{rm}[Scale=1.0,Ligatures={Common,Discretionary},Numbers=OldStyle]{Shobhika}
\babelfont{sf}[Ligatures={Common, Discretionary}]{Shobhika}
\babelfont[marathi]{rm}{Shobhika}
\babelfont[marathi]{sf}{Shobhika}

\begin{document}
\begin{enumerate}
    \item अबक
    \begin{enumerate}
        \item अबक
        \begin{enumerate}
            \item अबक
        \end{enumerate}
    \end{enumerate}
\end{enumerate}
\end{document}

答案1

babel软件包在 LuaHBTeX(即 2020 或更高版本的 LuaLaTeX)上运行,通过该mapdigits功能支持此功能。此示例将页码、章节号、目录等以及马拉地语文本中的数字更改为梵文,但不会在英语文本或数学模式下更改。

%% This MWE requires LuaHBTeX 1.12.0 or later.
\tracinglostchars = 2 % Print a warning message if a character is missing.
\documentclass{article}
\usepackage[paperwidth=10cm]{geometry} % To format the MWE for TeX.SX
\usepackage[english, bidi=basic, layout=sectioning.counters]{babel}
\usepackage{fontspec}

\babelprovide[import, main, mapdigits]{marathi}

\defaultfontfeatures{Scale = MatchLowercase, Ligatures=TeX, Renderer = HarfBuzz}
\babelfont{rm}
          [Scale = 1.0]{Shobhika}

\newcommand\textenglish[1]{\foreignlanguage{english}{#1}}
\newenvironment{english}{\begin{otherlanguage}{english}}{\end{otherlanguage}}

\begin{document}
\section{एक}
\textenglish{The number 42 in English. In math mode:} \(42\). 

\section{दोन}
\textenglish{In Marathi:} 42.
\textenglish{This is Section} \arabic{section}.

\end{document}

Shobhika 字体示例

如果您使用 Babel 和 XeLaTeX 进行编译,sectioning=则 package 选项将适用于页码和章节号等计数器,并且您可以传递maparabic而不是mapdigitsto\babelprovide以使\arabic计数器(例如编号列表)使用不同的数字。它还提供了命令\marathidigits{42}。或者您可以像平常一样在编辑器中输入 Marathi。

如果本地化的字符串不令人满意,您可以通过重新定义\marathicontentsname\marathichaptername\marathiabstractname等来覆盖它们。

polyglossia包提供了类似的命令来映射数字\devanagaridigits

答案2

我使用我的第一个答案来提供与目前存在的工具链兼容的解决方案。但我也会尝试回答您直接提出的几个问题。

仅 XeTeX 支持Mapping=功能fontspec。如果您有一个在 XeLaTeX 中运行的解决方案,另一个在 LuaLaTeX 中运行的解决方案,则可以使用包中的宏iftex在编译时选择正确的解决方案。

如果其他包的重新定义\@arabic方式与您的定义相冲突,您有几种选择。您可以将定义包装在\AtEndPreamble或中,使其位于最后\AtBeginDocument。您可以记录必须按照特定顺序加载包。您可以使用 检测其他包\@ifpackageloaded(可能延迟到,\AtEndPreamble以便无论您先加载包还是最后加载包,它都可以正常工作)并尝试对其进行 monkey-patch。

相关内容