最后评估表达式/宏

最后评估表达式/宏

假设您有一份文档,您想在开头提到有多少个部分。例如,像这样:

\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会给您提供很多钩子。

PD:不要用于\\结束普通文本中的行或段落

答案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。

相关内容