修改页码上的特定希伯来语“Alpha”数字

修改页码上的特定希伯来语“Alpha”数字

我使用以下代码获取希伯来数字作为页码:

\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这些数字实际上是递归的。我不知道这些替换是否也应应用于数字的部分。

相关内容