列表中的项目如何能按照enumerate
希伯来字母表有字母项目标记:不是、、、A
等等,而是、、、等等?B
C
א
ב
ג
我想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 查看器中打开时,文件显示如下。(我仅截取了显示的相关部分。)
我希望第三个列表有(א)
、、(ב)
和,而(ג)
不是像项目标记的那样有(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}
自定义枚举标签
目前,“装饰器”必须手动处理。有一个工具可以实现这一点,即\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}
结束语
希伯来语不是必须使用主要语言才能使数字起作用。它甚至可以是动态加载的辅助语言:
\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}
答案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}
以下是与 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}
结果:
请注意,哈维尔·贝佐斯 (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
将字体更改为 Adobe 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}
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}
。