是否有可用的宏可以将“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}
两者都产生: