用于从数字生成序数词的宏?

用于从数字生成序数词的宏?

是否有可用的宏可以将“1”转换为“第一”,将“2”转换为“第二”等。我们称此宏为“ wordth”。然后,例如,如果enumerate环境中的项目编号 2 标记为\label{item:blah},我可以编写如下代码

The \wordth{\ref{item:blah}} item is problematic.

其格式为“第二项有问题”。

(其他语言可获得加分,但我只需要英语。)

这个答案指向第 n 个将“1”变成“1st”的包,等等。恩戈尔德包也这样做。似乎都没有提供完整拼写的英文序数词。在许多情况下,只有完整的序数词(而不是缩写)才合适。

这可能是常见问题解答,但它是那些难以搜索的内容之一。请随意指向重复的问题并关闭。

答案1

您可以使用以下组合fmtcount(用于写出柜台) 和refcount提取与参考相关的数字:

在此处输入图片描述

\documentclass{article}
\usepackage{refcount, fmtcount}

\newcommand*{\wordth}[1]{% \wordth{<reference>}
  \ordinalstringnum{\getrefnumber{#1}}}%

\begin{document}

\begin{enumerate}
  \item\label{enum:first} First item.
  \item\label{enum:second} Second item.
  \item Last item.
\end{enumerate}

See the \wordth{enum:second} item above, or item number~\ref{enum:first}.

\end{document}

由于您使用的是\label-\ref系统,因此您需要在第一次运行时至少编译两次才能使用已确定的引用。

请注意,\wordth{<reference>}需要引用某个标签。如果您希望引用分层编号方案(例如编号为 的子部分1.1),那么您将遇到麻烦。但是,可以使用zref的魔法来规避这种情况。这需要更多的努力才能奏效,包括可能的界面变化。

答案2

如果这是您打算引用该项目的唯一方式,您可以将其合并\ordinalstring\theenumi。 (我假设这仅适用于环境中enumerate。)例如:

\documentclass{article}

\usepackage{fmtcount}

\renewcommand{\labelenumi}{\arabic{enumi}.}
\renewcommand{\theenumi}{\ordinalstring{enumi}}

\begin{document}

\begin{enumerate}
\item First item.
\item\label{item:blah} Second item.
\item Third item.
\end{enumerate}

The \ref{item:blah} item is problematic.

\end{document}

或者,确定变更的范围,使其仅影响此特定enumerate环境:

\documentclass{article}

\usepackage{fmtcount}

\begin{document}

\begin{enumerate}
\renewcommand{\labelenumi}{\arabic{enumi}.}
\renewcommand{\theenumi}{\ordinalstring{enumi}}
\item First item.
\item\label{item:blah} Second item.
\item Third item.
\end{enumerate}

The \ref{item:blah} item is problematic.

\end{document}

两者都产生:

结果图像

相关内容