假设您有一份文档,您想在开头提到有多少个部分。例如,像这样:
\documentclass{article}
\begin{document}
Abstract\\There are ... sections in this document.
\section{Section 1}
\section{Section 2}
\section{Section 3}
\end{document}
这里...将是一个宏(或其他东西),表示有 3 个部分。
不幸的是,我找不到一种方法来在最后评估这个宏(它报告 3)。
在这个例子中,我想知道最后有多少个部分。可能有一个使用计数器的解决方案(以某种方式),但我真正寻找的是可以对宏的评估顺序产生一定影响的解决方案。
答案1
您可以使用\AtEndDocument
(并\AtBeginDocument
在第一次运行中设置宏):
\documentclass{article}
\makeatletter
\AtEndDocument{
\write\@auxout{\string\gdef\string\previousrunsections{\thesection}}%
}
\AtBeginDocument{%
\ifcsname previousrunsections\endcsname
\else
\gdef\previousrunsections{??}%
\fi
}
\makeatother
\begin{document}
Abstract
\noindent There are \previousrunsections{} sections in this document.
\section{Section 1}
\section{Section 2}
\section{Section 3}
\end{document}
至少运行两次后,您将获得:
如果您需要更多控制,该软件包etoolbox
会给您提供很多钩子。
答案2
您可以使用 将总数放置在您想要的任何位置totcount
。
\documentclass{article}
\usepackage{totcount}
\regtotcounter{section}
\begin{document}
\title{Title}
\author{Ömer}
\maketitle
\begin{abstract}
This is the abstract.
There are \total{section} sections in this document.
\end{abstract}
\section{Section 1}
\section{Section 2}
\section{Section 3}
\end{document}
答案3
这使用xyz
辅助文件来保存信息。
\documentclass{article}
\newcommand\addxyzline[1]{\addtocontents {xyz}{#1}}
\makeatletter
\newcommand\writexyz{\@starttoc{xyz}}
\makeatother
\begin{document}
%\tableofcontents% CAN UNCOMMMENT TO SEE THAT toc WORKS FINE
\noindent Abstract\\There are \writexyz sections in this document.
\section{Introduction}
\section{Next}
\section{Third}
\addxyzline{\thesection}
\end{document}
编译后,该.xyz
文件在本例中为数字3
,.aux
文件包含
\relax
\@writefile{toc}{\contentsline {section}{\numberline {1}Introduction}{1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {2}Next}{1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {3}Third}{1}\protected@file@percent }
\@writefile{xyz}{3}
输出结果如下:
注意:无论输入文件的名称是什么,给定的版本都可以工作。如果您不喜欢使用 toc 方法,您可以将其硬编码到文档名称中,而不是定义
\newcommand\writexyz{\input junk.xyz }
在这种情况下,文档必须是 junk.tex。