定义基于 xfrac/nicefrac 的宏来自动附加内联分数的序数限定符

定义基于 xfrac/nicefrac 的宏来自动附加内联分数的序数限定符

我想为内联分数添加合适的序数后缀,类似于engord软件包oberdiek

让我澄清一下。我想使用宏\engordfrac{2}{3}来自动获取内联文本分数2/3在输出中。同样,\engordfrac{4}{5}应该产生4/5在输出中。

我在下面第二段中加入了 MWE 来说明 engord 包的示例以及所需的输出。

\documentclass{article}
\usepackage{nicefrac}
\usepackage{engord}
\begin{document}
This is the \engordnumber{1} ever time the runner finished
\engordnumber{2} in the race. This was her \engordnumber{14}
ever race.   % just an example demonstration of engord package capabilities

\bigskip

Oh no! I paid \nicefrac{2}{3}rd of the price you paid for 
only \nicefrac{1}{4}th of the quantity.  % need to replace nicefrac with a suitable macro
\end{document}

engordnum_示例 示例分数

我该如何实现这一点?如果普通的 TeX 很难,luatex那么如果它有帮助,对我来说就有用。它不一定必须基于xfracnicefrac只要达到预期结果即可。我只是在标题中建议这样做,因为这些在排版上看起来更好。

附言:我不确定排版 2/3、1/4 和其他内联分数的正确方法(印刷上可接受的)是什么。

答案1

(更新答案以充分利用 LuaLaTeX)

既然您可以使用 LuaLaTeX,我认为设置一个 Lua 函数来复制engord包中的部分工作是很自然的。具体来说,在下面显示的代码中,Lua 函数myord确定给定整数的后缀字符串应该是、、st还是。后缀字符串可以以两种不同的方式附加到的输出,具体取决于后缀字符串是应该是全尺寸的(如屏幕截图所示)还是与分母项的大小相同。下面的代码提供了两个 LaTeX 宏来执行此任务。选择更适合您的格式需求的形式。ndrdth\nicefrac\nicefrac

在此处输入图片描述

\documentclass{article}
\usepackage{nicefrac}

\makeatletter\let\percentchar\@percentchar\makeatother
\directlua{ % define a function that prints 2-letter ordinal strings
  function myord ( n )     % n: some positive number
    n = n \percentchar 100 % modulo-100
    if     m>3 and m<21           then tex.sprint ( "th" )
    elseif m \percentchar 10 == 1 then tex.sprint ( "st" ) 
    elseif m \percentchar 10 == 2 then tex.sprint ( "nd" )
    elseif m \percentchar 10 == 3 then tex.sprint ( "rd" )
    else                               tex.sprint ( "th" )
    end
  end 
}
\newcommand\myord[1]{\directlua{myord(#1)}} % LaTeX "wrapper macro"

\newcommand{\myfracA}[2]{\nicefrac{#1}{#2}\myord{#2}}
\newcommand{\myfracB}[2]{\nicefrac{#1}{#2\myord{#2}}}

\begin{document}
\myfracA{2}{3}, \myfracA{3}{4}

\myfracB{2}{3}, \myfracB{3}{4}
\end{document}

答案2

这就是你所追求的吗?

\documentclass{article}
\usepackage{nicefrac}
\usepackage{engord}
\newcommand{\ordfrac}[2]{\nicefrac{#1}{\engordnumber{#2}}}

\begin{document}

This is the \engordnumber{1} ever time the runner finished
\engordnumber{2} in the race. This was her \engordnumber{14}
ever race. % just an example demonstration of engord package capabilities

\bigskip

Oh no! I paid \ordfrac{2}{3} of the price you paid for
only \ordfrac{1}{4} of the quantity. % need to replace nicefrac with a suitable macro

\end{document}

在此处输入图片描述

相关内容