在 XeTeX 中使用 unicode 罗马数字

在 XeTeX 中使用 unicode 罗马数字

正如所提到的如何在文本中获取罗马数字?,有几种方法可以在 TeX 文本中添加罗马数字。但是,这些解决方案似乎都使​​用三个 I 来组成罗马数字 3,而不是使用许多字体中出现的“数字形式”符号(例如“Ⅲ”)进行组合。

有没有办法让 XeTeX 使用许多字体中的特殊罗马数字符号来呈现文档中的所有罗马数字?

答案1

\documentclass{article}
\usepackage{fontspec}
\usepackage{libertine}
\def\uromannumeral#1{\symbol{\numexpr"216F+#1\relax}}
\def\uRomannumeral#1{\symbol{\numexpr"215F+#1\relax}}
\def\uroman#1{\uromannumeral{\the\value{#1}}}
\def\uRoman#1{\uRomannumeral{\the\value{#1}}}

\begin{document}
\uromannumeral{12} \uRomannumeral{7}

\uroman{page} \uRoman{page}

\def\theenumi{\uRoman{enumi}}
\begin{enumerate}
\item foo
\item foo
\item foo
\item foo
\item foo
\end{enumerate}

\end{document}

输出

答案2

\makeatletter
\def\UniRoman#1{\expandafter\@UniRoman\csname c@#1\endcsname}
\def\uniroman#1{\expandafter\@uniroman\csname c@#1\endcsname}

\def\@UniRoman#1{\ifcase#1\or
  Ⅰ\or Ⅱ\or Ⅲ\or Ⅳ\or Ⅴ\or Ⅵ\or Ⅶ\or Ⅷ\or Ⅸ\or Ⅹ\or Ⅺ\or Ⅻ\else
  \expandafter\@slowUniRoman\romannumeral #1@\fi}
\def\@slowUniRoman#1{\ifx @#1% then terminate
     \else
       \if i#1Ⅰ\else\if v#1Ⅴ\else\if x#1Ⅹ\else\if
       l#1Ⅼ\else\if c#1Ⅽ\else\if d#1Ⅾ\else \if
       m#1Ⅿ\else#1\fi\fi\fi\fi\fi\fi\fi
       \expandafter\@slowUniRoman
     \fi
}
\def\@uniroman#1{\ifcase#1\or
  ⅰ\or ⅱ\or ⅲ\or ⅳ\or ⅴ\or ⅵ\or ⅶ\or ⅷ\or ⅸ\or ⅹ\or ⅺ\or ⅻ\else
  \expandafter\@slowuniroman\romannumeral #1@\fi}
\def\@slowuniroman#1{\ifx @#1% then terminate
     \else
       \if i#1ⅰ\else\if v#1ⅴ\else\if x#1ⅹ\else\if
       l#1ⅼ\else\if c#1ⅽ\else\if d#1ⅾ\else \if
       m#1ⅿ\else#1\fi\fi\fi\fi\fi\fi\fi
       \expandafter\@slowuniroman
     \fi
}
\makeatother

\newcounter{cnta}
\renewcommand{\thecnta}{\uniroman{cnta}} % lowercase Roman numerals
\newcounter{cntb}
\renewcommand{\thecnta}{\UniRoman{cntb}} % uppercase Roman numerals

由您来决定\roman\@roman分别变成\uniroman\@uniroman(大写变体类似)。

这些宏允许用罗马数字系统表示任何正整数。如果还想使用“ↁ”、“ↂ”、“ↇ”和“ↈ”,则需要做更多工作。

添加

可以通过一种非常直接的方式获得对扩展数字的支持:

\usepackage{bigintcalc}
\makeatletter
\def\extUniRoman#1{\expandafter\@extUniRoman\csname c@#1\endcsname}

\def\@extUniRoman#1{%
  \expandafter\@slowhighUniRoman\romannumeral\bigintcalcDiv{\number#1}{1000}@%
  \expandafter\@slowUniRoman\romannumeral\bigintcalcMod{\number#1}{1000}@}
\def\@slowhighUniRoman#1{\ifx @#1% then terminate
     \else
       \if i#1ↀ\else\if v#1ↁ\else\if x#1ↂ\else\if
       l#1ↇ\else\if c#1ↈ\else\if d#1ↈↈↈↈↈ\else \if
       m#1ↈↈↈↈↈↈↈↈↈↈ\else#1\fi\fi\fi\fi\fi\fi\fi
       \expandafter\@slowhighUniRoman
     \fi
}
\makeatother

举个例子,

\newcounter{cntc}
\renewcommand{\thecntc}{\extUniRoman{cntc}}
\setcounter{cntc}{792409}
\thecntc

我们得到

在此处输入图片描述

答案3

免费(开放字体许可)字体Junicode如果您激活自由连字 ( ) ,则会自动将“拼写出来的”罗马数字从IXII(大写和小写) 转换为其 Unicode 对应项dlig。其工作原理与fl组合到输出中的 fl 连字一样。

优点:

  • 编写时无需额外的代码
  • 非常棒的免费字体,不仅如此,尤其适合中世纪学者

缺点:

  • 像 XIII 这样的数字看起来很奇怪,因为它们被呈现为 XII+I
    但这确实是 Unicode 方面的一个问题,因为 Unicode 只有最多 12 个罗马数字。再说一次,我猜 Junicode 可以继续并在 Unicode 的私有区域使用区域中添加更多数字作为连字符。

  • 您可能不希望文档中包含所有连字符dlig
    对于后一个问题,Mico 即将推出的selnolig软件包可能会很有用,它允许您使用单个宏全局禁用特定连字符,全部使用 LuaTeX。敬请期待。

下面的文档展示了一些 Junicode 的自由连字符:

% compile with XeLaTeX or LuaLaTeX
\documentclass{article}

\usepackage{fontspec}
    \setmainfont[Ligatures={Discretionary}]{Junicode}
    % Naturally, I'd also enable "TeX" and "Common" ligatures
    % when using discretionary ligatures
    % I dare you to check out Junicode's historical ligatures!
    % http://junicode.sourceforge.net/Junicode.pdf#page=13

\textwidth=4cm % These two lines are just
\parindent=0cm % to keep my example compact

\begin{document}

i, ii, iii, iv, v, vi, vii, viii, ix, x, xi, xii

I, II, III, IV, V, VI, VII, VIII, IX, X, XI, XII

{\Huge XIII} % That ain't pretty

Ⅼ, Ⅽ, Ⅾ, Ⅿ, ↀ, ↁ, ↂ % These are (all?) other Unicode Roman numerals Junicode has
                         % (which have nothing to do with dlig though)

tt, tr, tty % These are some presumably acceptable discretionary ligatures of Junicode

ct, hv, st % These are the weird ligatures in dlig

[7], [[4]], <13>, [g], [W] % These are also part of dlig, but probably not bothersome

\end{document}

输出

相关内容