
Предположим, у вас есть документ, в начале которого вы хотите указать, сколько в нем разделов. Например, что-то вроде этого:
\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.