正如所提到的如何在文本中获取罗马数字?,有几种方法可以在 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如果您激活自由连字 ( ) ,则会自动将“拼写出来的”罗马数字从I
到XII
(大写和小写) 转换为其 Unicode 对应项dlig
。其工作原理与f
和l
组合到输出中的 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}