我正在研究一本 15 世纪书籍的外交版,它使用当时的标准罗马数字对页码进行编号。我一直使用以下方法将页面/页码放入我的页眉中:
\newcommand{\rectoverso}[1]{\ifthenelse{\isodd{#1}}{r}{v}}
\newcommand{\folio}[1]{\the\numexpr (#1+1)/2\relax}
\uppercase\expandafter{\romannumeral \value{\folio{\thepage}}}\rectoverso{\thepage}
效果很好,但问题是罗马数字序列不符合我的需要。而不是我,二,三,三,五,六,七,八,九,X,我得到减法四(这在某种程度上是可以理解的,因为它在现代用法中更为常见)。我的原文只(并且总是)使用附加词4在个位上:24是二一三,三十四是三三但四十四是四十三。 9普遍被减法表示为九或者西科。
是否有一个包可以控制哪些数字是加法运算、哪些数字是减法运算,或者我最好的选择是编写自己的自定义定义来解释我的书中使用的特定样式?
答案1
这是一个完全可扩展的版本,因此在页眉或页脚中您只需使用\thepage
,而不需要复杂的不可扩展结构。
\documentclass[twocolumn]{article}
\usepackage{xparse}
\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\rectoversoroman}{m}
{ % #1 is a counter name
\guifa_rectoverso_roman:n { #1 }
}
\cs_new:Nn \guifa_rectoverso_roman:n
{
\guifa_rectoverso_fix:f { \int_div_round:nn { \value{#1} } { 2 } }
\int_if_odd:nTF { \value{#1} } { r } { v }
}
\cs_new:Nn \guifa_rectoverso_fix:n
{
\int_compare:nTF { \int_mod:nn { #1 } { 10 } == 4 }
{
\int_to_Roman:n { \int_div_truncate:nn { #1 } { 10 } * 10 } IIII
}
{
\int_to_Roman:n { #1 }
}
}
\cs_generate_variant:Nn \guifa_rectoverso_fix:n { f }
\ExplSyntaxOff
\renewcommand{\thepage}{\rectoversoroman{page}}
\newcounter{test}
\renewcommand{\thetest}{\rectoversoroman{test}}
\begin{document}
\ExplSyntaxOn
\prg_replicate:nn {250}
{
\stepcounter{test}\thetest\par
}
\ExplSyntaxOff
\label{test}
This text is on page \pageref{test}
\end{document}
答案2
只需替换IV
为IIII
。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand \myRomannumeral { m }
{
\tl_set:Nx \l_tmpa_tl { \int_to_Roman:n { #1 } }
\tl_replace_all:Nnn \l_tmpa_tl { IV } { IIII }
\tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff
\begin{document}
4 \myRomannumeral{4}
14 \myRomannumeral{14}
44 \myRomannumeral{44}
\end{document}
答案3
如果您不介意加载xparse
,这里有一个使用expl3
代码的解决方案:
\documentclass{article}
\pagestyle{empty}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand\myRomannumeral{m}
{
\bool_if:nTF { \int_compare_p:n {#1 = 4} }
{
IIII
}
{
\bool_if:nTF { \int_compare_p:n { \int_mod:nn {#1} {10} = 4 } }
{
\int_to_Roman:n { \int_eval:n {#1/10*10} } IIII
}
{
\int_to_Roman:n {#1}
}
}
}
\ExplSyntaxOff
%% used solely for illustrative purposes.
\usepackage{pgffor}
\begin{document}
\foreach \myn in {1,...,30}
{\myn $\rightarrow$ \myRomannumeral{\myn}\par}
\end{document}