我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*
。