我使用以下代码获取希伯来数字作为页码:
\documentclass{book}
\usepackage{polyglossia}
\setdefaultlanguage{hebrew}
\setotherlanguage{english}
\usepackage{fontspec}
\newfontfamily\hebrewfont{Times New Roman}[Script=Hebrew]
\begin{document}
\pagenumbering{alph}
\setcounter{page}{270}
שלום
\end{document}
它按预期工作,并打印页码“רע”,用希伯来字母表示为 270。
然而,这个词“רע”的意思是“坏”,因此通常将字母顺序替换为“ער”。还有其他此类“不受欢迎”字母组合的例子。
我认为没有这样的现成的配置,所以我想自己实现它。
是否可以调用某个函数,并让它检查某个查找表,用“好的”值替换“不需要的”键?
我能否获得一些类似功能的参考,以供我构建?
或者有其他方法可以解决修改页码字母的问题吗?
答案1
看起来\alph
(或者说\@alph
)被重新定义为使用宏\@hebrew@numeral
,它会产生这些数字。我将其重新定义为首先查找数字是否错误,如果是,则打印不同的内容。否则,输出将保持不变。
使用 声明了错误的数字\newbadnum{<number>}{<good representation>}
,我也在下面进行了定义。
笔记:与原件一样,这是一个 XeLaTeX 文档。
\documentclass{book}
\usepackage{polyglossia}
\setdefaultlanguage{hebrew}
\setotherlanguage{english}
\usepackage{fontspec}
\newfontfamily\hebrewfont{Times New Roman}[Script=Hebrew]
\makeatletter %% <- make @ usable in command names
\let\@hebrew@numeral@bad\@hebrew@numeral %% <- store old definition
\newcommand*\@hebrew@numeral@good[1]{% %% <- new definition
\ifcsdef{badnum@\number#1} %% <- if this number is bad
{\csuse{badnum@\number#1}} %% <- replace it
{\@hebrew@numeral@bad{#1}}% %% <- otherwise use old definition
}
\let\@hebrew@numeral\@hebrew@numeral@good %% <- replace old definition
\makeatother %% <- revert @
%% Declare bad numbers:
\newcommand*\newbadnum[2]{\csdef{badnum@#1}{#2}}
\newbadnum{270}{ער} %% <- literally bad
\newbadnum{271}{אאאא} %% <- for demonstration purposes
\newbadnum{272}{בבבב} %% <- for demonstration purposes
\newbadnum{274}{:-)} %% <- I wonder if this will smile in reverse
\pagenumbering{alph}
\begin{document}
\setcounter{page}{270}
\textenglish{The page number is now correct: $\uparrow\uparrow$}
\begin{enumerate}
\item \textenglish{Also second level enumerations use these:}
\begin{enumerate}\setcounter{enumii}{268}
\item \textenglish{This is item \#\arabic{enumii}}
\item \textenglish{This is item \#\arabic{enumii}}
\item \textenglish{This is item \#\arabic{enumii}}
\item \textenglish{This is item \#\arabic{enumii}}
\item \textenglish{This is item \#\arabic{enumii}}
\item \textenglish{This is item \#\arabic{enumii}} %% <- Still smiling :-)
\end{enumerate}
\end{enumerate}
\end{document}
\hebrewnumeral
这也会改变、\Hebrewnumeral
和的行为\Hebrewnumeralfinal
,这可能是不可取的。(请参阅下面的附录以了解如何避免这种情况。)
以下是对上面几行代码作用的简单解释:
\newbadnum{270}{ער}
调用,它定义要扩展为的\csdef{badnum@270}{ער}
宏。\badnum@270
ער
您无法
\badnum@270
直接调用,因为它包含@
和数字。但是,如果按上述方式定义,\csuse{badnum@270}
则会扩展为。ער
如果你要调用
\@hebrew@numeral@good{\somectr}
并且\somectr
是一个 TeX 计数器(不是 LaTeX 计数器),其值为270
,它将有效运行\ifcsdef{badnum@270}{<true branch>}{<false branch>}
。这将测试 是否\badnum@270
已定义并选择适当的分支。真正的分支很简单
\csuse{badnum@\number#1}
,因此它会扩展为ער
如上所述。错误分支只是
\@hebrew@numeral
用相同的参数调用原始分支。
命令\csuse
、\ifcsdef
和\csdef
均来自etoolbox
包,已经被加载polyglossia
。
如果有很多坏数字,你可以用类似以下内容替换“声明坏数字”块
%% Declare bad numbers:
\makeatletter %% <- make @ usable in command names
\newcommand*\newbadnum[2]{\csdef{badnum@#1}{#2}}
\newcommand*\newbadnums[1]{\forcsvlist\newbadnum@{#1}}
\def\newbadnum@#1{\newbadnum@@#1\newbadnum@@}
\def\newbadnum@@#1=#2\newbadnum@@{\newbadnum{#1}{#2}}
\makeatother %% <- revert @
\newbadnums{{270}={ער},{271}={אאאא},{272}={בבבב},
{274}={:-)}}
编辑:有趣的是,上面的最后一行在我的编辑器中看起来不错,但在这里看起来相当混乱。如果你复制粘贴它,它会起作用,但我不能保证它是人类可读的。(单个文档中从左到右和从右到左的文本组合极其令人困惑。)
请注意,=
s 周围不允许有空格,,
s 前面也不允许有空格,但可以有关注用空格和/或单个换行符分隔。括号 ( {…}
) 完全是可选的,但如果没有它们,从左到右和从右到左的文本组合只会让我的文本编辑器和此网站(以及我)感到困惑:
\newbadnums{270=ער,271=אאאא,272=בבבב,274=:-)}
(这与上面最后两行相同,只是没有{…}
和换行符。)
附录
这是一个版本,它允许您分别指定数字\Hebrewnumeral
(使用\Alph
)和\Hebrewnumeralfinal
数字(未使用?)的样子。语法是
\newbadnum{<number>}{<hebrew>}{<Hebrew>}[<Hebrewfinal>]
其中<number>
是阿拉伯数字,其他三个参数是三种相关表示。如果省略可选参数,则使用相同的值,<Hebrew>
因为<Hebrewfinal>
这两种表示通常一致。
我必须说,尝试在此处发布包含希伯来语的代码片段简直是噩梦。下面四行在我的浏览器中显得相当混乱,但当我将它们复制到文本编辑器中时,它们就没问题了。
%% Declare bad numbers:
\makeatletter %% <- make @ usable in command names
\newcommand*\newbadnum[3]{\@testopt{\newbadnumopt{#1}{#2}{#3}}{#3}}
\def\newbadnumopt#1#2#3[#4]{%
\csdef{badnum@#1}{%
\if@gim@apost
\if@gim@final #4\else #3\fi
\else
#2%
\fi
}%
}
\makeatother %% <- revert @
%% The following looks fine in my editor, but not here.
\newbadnum{270}{ער}{ר״ע} %% <- leave \Hebrew unchanged
\newbadnum{271}{אאאא}{אאאא}[רע״א] %% <- leave only \Hebrewfinal version unchanged
\newbadnum{274}{:-)}{:-D}[:-P] %% <- In a good mood
\newbadnum{50}{נ}{נ׳}[ן׳] %% <- The default
如果您使用大于(或等于)1000 的数字,则可能需要(或不需要?)进行进一步修改,因为\@hebrew@numeral
这些数字实际上是递归的。我不知道这些替换是否也应应用于数字的部分。