序数词和罗马小写数字

序数词和罗马小写数字

ordinalnum多次使用命令一个大命令,这非常有帮助。我希望我的序数词采用小写字母,并romannumeral符合几个世纪以来的法语排版规范。当然,不可能将第一个命令放在第二个命令中,反之亦然。我的最低配置:

% !TEX encoding = UTF-8 Unicode
% !TEX TS-program = arara
\documentclass{scrbook}
\usepackage[frenchb]{babel} 
\usepackage[quiet]{fontspec}                    
\usepackage[automark,headsepline]{scrpage2}         
\usepackage[babel,french=guillemets*]{csquotes}
\usepackage[french]{fmtcount}

% \setmainfont[Mapping=tex-text, Ligatures={Common, Rare}, Numbers={OldStyle}]{Adobe Garamond Pro}
\addtokomafont{disposition}{\normalfont}
\newcommand{\RNum}[1]{\textsc{\expandafter{\romannumeral #1\relax}}}

\begin{document}
\ordinalnum{1} siècle,  \ordinalnum{21} siècle.\\
\RNum{1}\up{er} siècle, \RNum{21}\up{eme} siècle.
\end{document}
% arara: xelatex

在此处输入图片描述

有没有办法使用ordinalnum具有完整功能(良好的后缀等)和罗马数字及小型大写的命令?谢谢。

答案1

我可以提供一个 * 变体,用于\ordinalnum以小写罗马数字打印数字。

\documentclass{scrbook}
\usepackage[frenchb]{babel} 
\usepackage[quiet]{fontspec}                    
\usepackage[automark,headsepline]{scrpage2}         
\usepackage[babel,french=guillemets*]{csquotes}
\usepackage[french]{fmtcount}

\usepackage{regexpatch}
\makeatletter
\regexpatchcmd{\@ordinalnum}
  {\cE.\c{@fc@ordstr}}
  {\cE\}\c{format@fc@ordstr}}
  {}{}
\def\format@fc@ordstr{%
  \begingroup
  \if@tempswa
    \scshape\romannumeral
  \fi
  \@fc@ordstr
  \endgroup
}
\xpatchcmd{\fmtord}{#1}{\upshape#1}{}{}
\let\fmtcount@ordinalnum\ordinalnum
\renewcommand{\ordinalnum}{%
  \@ifstar{\@tempswatrue\fmtcount@ordinalnum}%
          {\@tempswafalse\fmtcount@ordinalnum}%
}
\makeatother

\begin{document}

\ordinalnum*{1} siècle,  \ordinalnum*{21} siècle, \ordinalnum{3}[f] place.

\end{document}

在此处输入图片描述

regexpatch如果由于其他软件包正在加载而无法使用xpatch,则可以将前四行替换\makeatletter

\def\@ordinalnum#1[#2]{%
  {%
    \ifthenelse{\equal{#2}{f}}%
    {%
      \protect\@ordinalF{#1}{\@fc@ordstr}%
    }%
    {%
      \ifthenelse{\equal{#2}{n}}%
      {%
        \protect\@ordinalN{#1}{\@fc@ordstr}%
      }%
      {%
        \ifthenelse{\equal{#2}{m}}%
        {}%
        {%
          \PackageError{fmtcount}%
           {Invalid gender option `#2'}%
           {Available options are m, f or n}%
        }%
        \protect\@ordinalM{#1}{\@fc@ordstr}%
      }%
    }%
    \format@fc@ordstr
  }%
}

其作用相同。记得删除\usepackage{regexpatch}

答案2

我知道这是一个老话题了,但我想提交基于 Lua 的解决方案。已测试路拉泰克斯。欢迎批评。

\documentclass[french]{article}

\usepackage{fontspec}
\setmainfont{EBGaramond}
\usepackage{babel}

\usepackage{luacode}

\begin{luacode}
function PrintFrenchOrdinalRoman(ANumber)
  local LStr = '\\textsc{\\romannumeral ' .. tostring(ANumber) .. '}' ..
    (ANumber == 1 and '\\ier' or '\\ieme')
  tex.sprint(LStr)
end
\end{luacode}

\newcommand\ordinalroman[1]{\directlua{PrintFrenchOrdinalRoman(#1)}}

\begin{document}

C'était au \textsc{i}\ier~siècle.

C'était au \textsc{ii}\ieme~siècle.

C'était au \textsc{\romannumeral 1}\ier~siècle.

C'était au \textsc{\romannumeral 2}\ieme~siècle.

C'était au \luaexec{PrintFrenchOrdinalRoman(1)}~siècle.

C'était au \luaexec{PrintFrenchOrdinalRoman(2)}~siècle.

C'était au \ordinalroman{1}~siècle.

C'était au \ordinalroman{2}~siècle.

Nous sommes au \luaexec{PrintFrenchOrdinalRoman(os.date('*t').year // 100 + 1)}~siècle.

\end{document}

在此处输入图片描述

其他解决方案

其他解决方案仅使用 LaTeX。灵感来自这次讨论

% Tested with lualatex

\documentclass[french]{article}

\usepackage{fontspec}
\setmainfont{EBGaramond}
\usepackage{babel}

\newcommand*{\ordinalroman}[1]{%
\ifnum#1=1%
\textsc{\romannumeral #1}\ier%
\else%
\textsc{\romannumeral #1}\ieme%
\fi}

\begin{document}

C'était au \textsc{i}\ier~siècle.

C'était au \textsc{ii}\ieme~siècle.

C'était au \textsc{\romannumeral 1}\ier~siècle.

C'était au \textsc{\romannumeral 2}\ieme~siècle.

C'était au \ordinalroman{1}~siècle.

C'était au \ordinalroman{2}~siècle.

Nous sommes au \ordinalroman{\directlua{tex.sprint(os.date('*t').year // 100 + 1)}}~siècle.

\end{document}

仍然欢迎批评。我怀疑使用\newcommand或是否更好\newcommand*

相关内容