加法罗马数字 4

加法罗马数字 4

我正在研究一本 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

只需替换IVIIII

\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}

相关内容