如何按照希伯来字母表对枚举列表的编号进行字母排序?

如何按照希伯来字母表对枚举列表的编号进行字母排序?

列表中的项目如何能按照enumerate希伯来字母表有字母项目标记:不是、、、A等等,而是、、、等等?BCאבג

我想enumerate在我的文档中包含几种类型的列表。一些是数字列表,一些是英文字母列表,一些是希伯来字母列表。

babel另一个要求是解决方案必须与/兼容lualatex

作为一个最小的工作示例,请考虑以下保存在 中的 LaTeX 代码~/Test.tex

\documentclass{article}
\usepackage[shortlabels]{enumitem}
\begin{document}
A numeric list:
\begin{enumerate}
\item First item
\item Second item
\item Third item
\end{enumerate}

An alphabetic list with capital English list-labels:
\begin{enumerate}[A.]
\item First item
\item Second item
\item Third item
\end{enumerate}

An alphabetic list with lowercase English list-labels:
\begin{enumerate}[(a)]
\item First item
\item Second item
\item Third item
\end{enumerate}
\end{document}

当在终端中执行以下命令时:

> cd ~
> lualatex Test

文件~/Test.pdf已创建。在 PDF 查看器中打开时,文件显示如下。(我仅截取了显示的相关部分。)

Lists with various item symbols

我希望第三个列表有(א)、、(ב)和,而(ג)不是像项目标记的那样有(a)、、和(b)(c)并且我希望列表能够容纳很多(比如说四十个)项目,而不仅仅是三个。

答案1

让我们一步一步来。

希伯来数字

babel定义了大量数字,包括希伯来语加法数字。以下是部分列表这里,我们必须添加本机数字。\localenumeral和提供了一个通用且一致的接口\localecounter,该链接中有说明。 有一个例子GitHub,但这里是一个简单的文档,它打印“ג—א”:

\documentclass{article}

\usepackage[bidi=basic, hebrew, provide=*]{babel}
\babelfont{rm}{FreeSerif}

\begin{document}

\localenumeral{letters}{3}—\localecounter{letters}{page}

\end{document}

新数字可以很容易地定义,如下所述如何用任意字母定义计数器

不是依赖旧的\hebrewnumeral。除 外pdftex,它的使用应被视为已弃用babel+ xetex/ luatex

与语言环境相关的字母数字

计数器\alph\Alph可以通过键入 轻松以与区域相关的方式进行自定义\babelprovide。以下是示例:

\documentclass{article}

\usepackage[bidi=basic, hebrew, provide=*]{babel}
\babelprovide[Alph=letters]{hebrew}
\babelfont{rm}{FreeSerif}

\usepackage[shortlabels]{enumitem}

\begin{document}

\begin{enumerate}[A)]
\item First
\item Second
\end{enumerate}

\selectlanguage{english}

\begin{enumerate}[A)]
\item First
\item Second
\end{enumerate}

\end{document}

enter image description here

自定义枚举标签

目前,“装饰器”必须手动处理。有一个工具可以实现这一点,即\AddBabelHook,它允许在选择语言时注入代码。以下示例中有两个:第一个设置\mylabel“全局”,而第二个重新定义它hebrew


\documentclass{article}

\usepackage[bidi=basic, hebrew, provide=*]{babel}
\babelfont{rm}{FreeSerif}

\usepackage{enumitem}

\newcommand{\mylabel}{[\alph{enumi}]}
\setlist[enumerate,1]{label=\mylabel}

\AddBabelHook{lists}{afterextras}{% 
  \renewcommand{\mylabel}{[\alph{enumi}]}}
\AddBabelHook[hebrew]{lists}{afterextras}{% 
  \renewcommand{\mylabel}{\protect\localecounter{letters}{enumi})}}

\begin{document}

\begin{enumerate}
\item First
\end{enumerate}

\selectlanguage{english}

\begin{enumerate}
\item First
\end{enumerate}

\selectlanguage{hebrew}

\begin{enumerate}
\item First
\end{enumerate}

\end{document}

enter image description here

结束语

希伯来语不是必须使用主要语言才能使数字起作用。它甚至可以是动态加载的辅助语言:

\documentclass{article}

\usepackage[bidi=basic, french]{babel}
\babelfont{rm}{FreeSerif}

\usepackage{enumitem}

\begin{document}

\begin{enumerate}
\item First
\item Second
\end{enumerate}

\begin{enumerate}[label=\foreignlanguage{hebrew}{\protect\localecounter{letters}{enumi}})]
\item First
\item Second
\end{enumerate}

\end{document}

enter image description here

答案2

使用在枚举列表中应用希伯来数字的强大方法?基础程序如下:

  • 加载 Polyglossia \hebrewnumeral,如另一个问题一样
  • 重新定义标签使用enumitem,如在另一个问题中
  • 但使用现代语法,\setlist因为\setenumerate已被弃用
  • 为了能够在同一文档中使用各种类型的列表,可以将默认值设置为希伯来语,并指定\begin{enumerate}[1.]数字列表,

或者

  • 为希伯来语定义一个新的列表类型,并将该列表类型的计数器设置为仅希伯来语,如下面的 MWE 所示。
\documentclass{article}
\usepackage{polyglossia}
\setotherlanguage{hebrew}
\usepackage{fontspec}
\newfontfamily\hebfont[Script=Hebrew, Scale=MatchUppercase, Ligatures=TeX]{Noto Serif Hebrew}
\setmainfont{Noto Serif}
\usepackage[shortlabels]{enumitem}
\newlist{hebenum}{enumerate}{1}
\setlist[hebenum,1]{
   labelindent=\parindent,
   label={{\hebfont{\protect\hebrewnumeral{\value{hebenumi}}}}.}
}

\begin{document}
A numeric list:
\begin{enumerate}
\item First item
\item Second item
\item Third item
\end{enumerate}

An alphabetic list with capital English list-labels:
\begin{enumerate}[A.]
\item First item
\item Second item
\item Third item
\end{enumerate}

Hebrew list labels:
\begin{hebenum}[1.]
\item First item
\item Second item
\item Third item
\end{hebenum}

An alphabetic list with lowercase English list-labels:
\begin{enumerate}[(a)]
\item First item
\item Second item
\item Third item
\end{enumerate}

\end{document}

enter image description here


以下是与 Babel 而不是 Polyglossia 配合使用的版本。实际上,Polyglossia 的代码\hebrewnumeral最初是在文件中为 Babel 开发的。然而,由于不兼容,hebrew.ldf现代版本的 Babel 不再加载。因此,一种解决方法是加载hebrew.ldf仅有的Polyglossia 版本的 Babel 代码,\hebrewnumeral无需加载 Polyglossia 本身。

可以通过编写一个小宏\hebnum来执行转换并\hebnum*在枚举规范中调用该宏来实现额外的改进。这意味着不再需要使用特殊列表,您还可以使用括号或其他标点符号完全自定义计数器。

\documentclass{article}
\usepackage{fontspec}
\usepackage[english,bidi=basic]{babel}
\babelprovide[import=he]{hebrew}
\usepackage{etoolbox}
\makeatletter
\input{babel-hebrewalph.def}
\makeatother
\newfontfamily\hebfont[Script=Hebrew, Scale=MatchUppercase, Ligatures=TeX]{Noto Serif Hebrew}
\setmainfont{Noto Serif}
\usepackage[shortlabels]{enumitem}
\newcommand{\hebnum}[1]{%
\begingroup%
\hebfont{\protect\hebrewnumeral{\value{#1}}}%
\endgroup%
}
\begin{document}
A numeric list:
\begin{enumerate}
\item First item
\item Second item
\item Third item
\end{enumerate}

An alphabetic list with capital English list-labels:
\begin{enumerate}[A.]
\item First item
\item Second item
\item Third item
\end{enumerate}

Hebrew list labels:
\begin{enumerate}[(\hebnum*)]
\item First item
\item Second item
\item Third item
\end{enumerate}

An alphabetic list with lowercase English list-labels:
\begin{enumerate}[(a)]
\item First item
\item Second item
\item Third item
\end{enumerate}

\end{document}

结果:

enter image description here

请注意,哈维尔·贝佐斯 (Javier Bezos) 暗示的解决方案更好/更为强大。

答案3

这里还有另一种可行的方法,尽管它是基于 XeLaTeX 的,并且特定于字体(增加了神秘性)。但它可以适应系统中的其他字体。代码片段取自 如何在 LaTeX 中按其代码打印 Unicode 字符?(例如 \U0001316E)

\documentclass{article}
\usepackage{fontspec}
\usepackage{enumitem}
\newfontfamily{\hefont}{AdobeHebrew-Regular}
\begin{document}
alef = {\hefont \char"05D0} \quad bet = {\hefont \char"05D1}, etc.

\begin{enumerate}[left= \parindent .. 2\parindent, label=({\hefont \char"05D\arabic*})]
    \item\label{a} Hello
    \item\label{b} Test
    \item\label{c} QRZ?
    \item\label{d} Hey!
\end{enumerate}

\ref{a}\quad \ref{b} \quad \ref{c}\quad \ref{d}
\end{document}

因此,您需要在系统中安装具有所需字形的字体,并且需要有希伯来字母表的 Unicode 代码。而且,它们需要按升序排列。

关键行是label=({\hefont \char"05D\arabic*})()创建括号样式(因此将其更改label={\hefont \char"05D\arabic*}.)为带有尾随句点的项目),\hefont将字体更改为 Adob​​e Hebrew,并\char"05D\arabic*生成代码序列 05D0、05D1 等。这里的秘密是它以 0 开头;我原本希望需要将计数器重置为 -1 才能将 0 作为计数器枚举的第一个值。

另一件可能好事是交叉引用功能可以按原样工作。希望这有用。

答案4

以下答案基于哈维尔·贝佐斯的评论。仅当通过 将希伯来语设置babel为文档的主要语言时,它才有效。

\documentclass{article}
\usepackage[bidi=basic,hebrew,provide=*]{babel}
\babelfont{rm}[Renderer=HarfBuzz]{FreeSans}

\usepackage{enumitem}
\newcommand{\HeNum}{\protect\localenumeral{letters}{\value*}}

\begin{document}
\begin{enumerate}[label=\HeNum)]
   \item The woods are lovely
   \item Dark and deep
   \item But I have promises to keep
\end{enumerate}
\end{document}

An enumerated list with Hebrew numerals as the item numbering marks


babel如果有一些类似于的命令\localenumeral,即使在未加载时也能工作babel,以及在babel加载时也能工作,但文档的语言未设置为希伯来语,那就太好了。

换句话说,我希望上面给出的定义\HeNum能够起作用并产生与所示相同的输出(对齐和文本流方向除外),即使行

\usepackage[bidi=basic,hebrew,provide=*]{babel}
\babelfont{rm}[Renderer=HarfBuzz]{FreeSans}

缺失了,即使

\usepackage[bidi=basic,hebrew,provide=*]{babel}

被替换为\usepackage[french]{babel}

相关内容