大罗马数字

大罗马数字

我正在尝试在使用 XeLaTeX 编译的投影仪演示文稿中插入一些罗马数字和希腊数字(选择取决于我还必须插入一些埃及、巴比伦和玛雅数字)

是否可以romannum采用上划线来处理大于 3999 的数字,而不是使用重复的 M?

答案1

我从未使用过(或听说过)romannum,但我敢打赌它的工作原理如下:

\documentclass{article}

\newcounter{fingers}
\def\romannum#1{\setcounter{fingers}{#1}\Roman{fingers}}

\begin{document}
\romannum{4005}
\end{document}

修订的解决方案:

\documentclass{article}

\makeatletter
\def\romannum#1{\bgroup
  \count1=#1\relax
  \ifnum\count1<4000\relax\@Roman{\count1}%
  \else
    \count2=\numexpr \count1/1000\relax
    \sbox0{\@Roman{\count2}}%
    \count1=\numexpr \count1-1000*\count2\relax
    \usebox0\llap{\rule[\dimexpr \ht0+1pt]{\wd0}{0.5pt}}\@Roman{\count1}%
  \fi
\egroup}
\makeatother    

\begin{document}
\romannum{4005}

\romannum{5000}

\romannum{9005}
\end{document}

此版本使用 xstring 包将千倍罗马数字中的 I 替换为 M 等。

\documentclass{article}
\usepackage{xstring}

\newsavebox{\vbar}
\sbox0{V}\savebox\vbar{\usebox0\llap{\rule[\dimexpr \ht0+1pt]{\wd0}{0.5pt}}}%
\newsavebox{\xbar}
\sbox0{X}\savebox\xbar{\usebox0\llap{\rule[\dimexpr \ht0+1pt]{\wd0}{0.5pt}}}%
\newsavebox{\lbar}
\sbox0{L}\savebox\lbar{\usebox0\llap{\rule[\dimexpr \ht0+1pt]{\wd0}{0.5pt}}}%
\newsavebox{\cbar}
\sbox0{C}\savebox\cbar{\usebox0\llap{\rule[\dimexpr \ht0+1pt]{\wd0}{0.5pt}}}%
\newsavebox{\dbar}
\sbox0{D}\savebox\dbar{\usebox0\llap{\rule[\dimexpr \ht0+1pt]{\wd0}{0.5pt}}}%
\newsavebox{\mbar}
\sbox0{M}\savebox\mbar{\usebox0\llap{\rule[\dimexpr \ht0+1pt]{\wd0}{0.5pt}}}%

\makeatletter
\def\romannum#1{\bgroup
  \count1=#1\relax
  \ifnum\count1<4000\relax
    \@Roman{\count1}%
  \else
    \count2=\numexpr \count1/1000\relax
    \count1=\numexpr \count1-1000*\count2\relax
    \edef\tempstr{\@Roman{\count2}}% substitute letters
    \StrSubstitute{\tempstr}{M}{\usebox\mbar}[\tempstr]% goes first
    \StrSubstitute{\tempstr}{I}{M}[\tempstr]%
    \StrSubstitute{\tempstr}{V}{\usebox\vbar}[\tempstr]%
    \StrSubstitute{\tempstr}{X}{\usebox\xbar}[\tempstr]%
    \StrSubstitute{\tempstr}{L}{\usebox\lbar}[\tempstr]%
    \StrSubstitute{\tempstr}{C}{\usebox\cbar}[\tempstr]%
    \StrSubstitute{\tempstr}{D}{\usebox\dbar}\@Roman{\count1}%
  \fi
\egroup}
\makeatother    

\begin{document}
\romannum{4005}

\romannum{5000}

\romannum{9005}

\romannum{17005}

\romannum{1000000}
\end{document}

相关内容