Оценить выражение/макрос в конце

Оценить выражение/макрос в конце

Предположим, у вас есть документ, в начале которого вы хотите указать, сколько в нем разделов. Например, что-то вроде этого:

\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.

Связанный контент