本文已加入专栏文章目录,归入「进阶使用」文章系列。
背景信息
- 阿拉伯数字:1,2,3,4,5,6,7,8,9,10,11,12
(由数字符号 0,1,2,3,4,5,6,7,8,9 构成) - 小写罗马数字:i,ii,iii,iv,v,vi,vii,viii,ix,x,xi,xii
(由小写字母符号 i,v,x,l,c,d,m 构成,某些记法下还会在字母顶部添加横线) - 大写罗马数字:I,II,III,IV,V,VI,VII,VIII,IX,X,XI,XII
(由大写字母符号 I,V,X,L,C,D,M 构成)
Unicode 还把前 12 个罗马数字单独收录为了符号,大小写共 24 个,位于「数字形式」区段(Number Forms Block)。一种区分方式:比较 xii 和 ⅻ,前者是三个符号可以依次选中,后者是「数字形式的」单个符号只能整体选中。
- UTF-8 Browser Test for Unicode Block 'Number Forms' | fileformat.info
中文场景下的使用
正常情况下,罗马数字直接使用西文字母拼出来就行,例如 4 就是 iv(i + v 两个字母)。中文字体通常也收录了「数字形式」的前 10 个罗马数字(有的字体收全了 12 个),并且把它们定义成了(占据空间)和汉字宽度相当的形式 [注]。一些用户喜欢这种形式,觉得比较紧凑。
但不能认为以中文字体输出的「数字形式」罗马数字,是唯一正确的罗马数字输出效果。直接用西文字母拼出来的,在西文场景中用得更多。
[注:这里故意避免了使用「全角」一词。]
在 LaTeX 里的使用
输入端
- 作为内容手动输入,直接插入相应符号即可。可以从网页、Word 文件复制,也可以从输入法的特殊符号表里点选插入。
- 作为计数器的输出形式。
输出端
- 找一个合适的字体,通常为中文字体
- 让 LaTeX 用中文字体,而非西文字体输出相应符号
以下的例子,定义了新计数器输出形式命令 romanCn
和 RomanCn
,并配置了 xeCJK 中文方案下的字体。
documentclass{ctexart}
usepackage{pgffor}
xeCJKDeclareCharClass{CJK}{`ⅰ -> `ⅻ, `Ⅰ -> `Ⅻ}
makeatletter
% chars in unicode block "number forms"
% https://www.fileformat.info/info/unicode/block/number_forms/utf8test.htm
newcommand{romanCn}[1]{%
expandafter@romanCncsname c@#1endcsname
}
def@romanCn#1{%
ifcase#1relax
or ⅰor ⅱor ⅲor ⅳor ⅴor ⅵor ⅶor ⅷor ⅸor ⅹor ⅺor ⅻ%
else
@roman#1%
fi
}
newcommand{RomanCn}[1]{%
expandafter@RomanCncsname c@#1endcsname
}
def@RomanCn#1{%
ifcase#1relax
or Ⅰ or Ⅱor Ⅲor Ⅳor Ⅴor Ⅵor Ⅶor Ⅷor Ⅸor Ⅹor Ⅺor Ⅻ%
else
@Roman#1%
fi
}
makeatother
begin{document}
newcounter{xcnt}
foreach i in {romanCn, RomanCn} {%
setcounter{xcnt}{0}%
foreach j in {1, ..., 12} {%
stepcounter{xcnt}%
i{xcnt},
}
par
}
end{document}
附注:
- 可以看到,这个字体没有提供符号 ⅺ 和 ⅻ。
- 与 LaTeX 提供的其他计数器输出命令保持一致,
romanCn
和RomanCn
都是可展开的(expandable) - 因为中文字体把「数字形式」的罗马数字定义成了(占据空间)和汉字宽度相当的形式,所以这些符号的左右侧自带空距,一般不适合在它们之后紧跟标点: