假设我有以下代码:
\documentclass{article}
\begin{document}
We have totally 7 columns, describing the user:
\begin{enumerate}
\item ID --- users.name
\item Forename --- users\_profiles.first\_name
\item Surname --- users\_profiles.last\_name
\item Email --- users.mail
\item Primary Service --- services.name
\item Start date --- FROM\_UNIXTIME(users.created)
\item Employment Status --- users\_profiles.employment\_status
\end{enumerate}
\end{document}
制作此文件:
是否可以根据列表中元素的数量自动设置值 7?问题是,它位于列表之前。
答案1
只需在最后一项后放置一个标签并在文中引用该标签:
\documentclass{article}
\begin{document}
We have \ref{last} columns, describing the user:
\begin{enumerate}
\item ID --- users.name
\item Forename --- users\_profiles.first\_name
\item Surname --- users\_profiles.last\_name
\item Email --- users.mail
\item Primary Service --- services.name
\item Start date --- FROM\_UNIXTIME(users.created)
\item Employment Status --- users\_profiles.employment\_status \label{last}
\end{enumerate}
\end{document}
答案2
\label
-机制\ref
是此类应用程序的必由之路;在这种情况下,需要进行一些调整以确保我们获得一个简单的数字。
我将介绍两种可能性。在这两种情况下,我都使用\numberstringnum
fromfmtcount
以文字形式显示数字,这是更好的风格。
推荐形式
我们使用一个refenumerate
具有标签(任意字符串)作为参数的环境,用作的参数\getenumcount
,产生数字。
\documentclass{article}
\usepackage{xparse,fmtcount,refcount}
\makeatletter
\NewDocumentEnvironment{refenumerate}{m}
{\begin{enumerate}}
{\edef\@currentlabel{\arabic{\@enumctr}}\label{#1}\end{enumerate}}
\makeatother
\newcommand{\getenumcount}[1]{\numberstringnum{\getrefnumber{#1}}}
\begin{document}
\section*{Recommended form}
We have \getenumcount{profile} columns, describing the user:
\begin{refenumerate}{profile}
\item ID --- users.name
\item Forename --- users\_profiles.first\_name
\item Surname --- users\_profiles.last\_name
\item Email --- users.mail
\item Primary Service --- services.name
\item Start date --- FROM\_UNIXTIME(users.created)
\item Employment Status --- users\_profiles.employment\_status
\end{refenumerate}
优点
该refenumerate
环境可以在任何嵌套级别使用
缺点
它需要运行两次 LaTeX。这实际上不是什么大问题,因为一次运行就足够了的情况很少见(想想目录或任何交叉引用)。
不推荐的形式
我们使用一个getreference
环境,将从段落开头到enumerate
我们想要计算项目的环境的所有代码都包含在内。
\documentclass{article}
\usepackage{fmtcount,environ}
\makeatletter
\NewEnviron{getreference}
{\let\latex@label\label\let\label\@gobble\global\let\printnumber\relax
\setbox0=\vbox{\@tempswafalse\if@nobreak\@tempswatrue\fi
\BODY\xdef\printnumber{\noexpand\numberstringnum{\number\value{enumi}}}
\if@tempswa\aftergroup\@afterheading\fi
}%
\let\label\latex@label
\BODY}
\makeatother
\begin{document}
\section*{Not recommended form}
\begin{getreference}
We have \printnumber{} columns, describing the user:
\begin{enumerate}
\item ID --- users.name
\item Forename --- users\_profiles.first\_name
\item Surname --- users\_profiles.last\_name
\item Email --- users.mail
\item Primary Service --- services.name
\item Start date --- FROM\_UNIXTIME(users.created)
\item Employment Status --- users\_profiles.employment\_status
\end{enumerate}
\end{getreference}
\end{document}
优点
需要运行一次 LaTeX。
缺点
只有一个级别可以计算,确切地说是最外层的enumerate
环境。