我已经发布了一个名为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}
如果您使用 Babel 和 XeLaTeX 进行编译,sectioning=
则 package 选项将适用于页码和章节号等计数器,并且您可以传递maparabic
而不是mapdigits
to\babelprovide
以使\arabic
计数器(例如编号列表)使用不同的数字。它还提供了命令\marathidigits{42}
。或者您可以像平常一样在编辑器中输入 Marathi。
如果本地化的字符串不令人满意,您可以通过重新定义\marathicontentsname
、\marathichaptername
、\marathiabstractname
等来覆盖它们。
该polyglossia
包提供了类似的命令来映射数字\devanagaridigits
。
答案2
我使用我的第一个答案来提供与目前存在的工具链兼容的解决方案。但我也会尝试回答您直接提出的几个问题。
仅 XeTeX 支持Mapping=
功能fontspec
。如果您有一个在 XeLaTeX 中运行的解决方案,另一个在 LuaLaTeX 中运行的解决方案,则可以使用包中的宏iftex
在编译时选择正确的解决方案。
如果其他包的重新定义\@arabic
方式与您的定义相冲突,您有几种选择。您可以将定义包装在\AtEndPreamble
或中,使其位于最后\AtBeginDocument
。您可以记录必须按照特定顺序加载包。您可以使用 检测其他包\@ifpackageloaded
(可能延迟到,\AtEndPreamble
以便无论您先加载包还是最后加载包,它都可以正常工作)并尝试对其进行 monkey-patch。