Évaluer l'expression / macro à la fin
Supposons que vous ayez un document dans lequel vous souhaitez mentionner le nombre de sections qu'il y a au début. Par exemple, quelque chose comme ceci:
\documentclass{article}
\begin{document}
Abstract\\There are ... sections in this document.
\section{Section 1}
\section{Section 2}
\section{Section 3}
\end{document}
Ici ... serait une macro (ou autre chose) qui dit qu'il y a 3 sections.
Malheureusement, je n'ai pas pu trouver un moyen de faire évaluer cette macro à la fin (où elle rapporte 3).
Dans cet exemple, je veux connaître le nombre de sections à la fin. Il peut y avoir une solution utilisant des compteurs (d'une certaine manière), mais je recherche vraiment une solution où je peux avoir une certaine influence sur l'ordre d'évaluation des macros.
Réponses
Vous pouvez utiliser \AtEndDocument(et \AtBeginDocumentpour définir la macro lors de la première exécution):
\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}
Après au moins deux courses, vous obtenez:
Si vous avez besoin de plus de contrôle, le package etoolboxvous offre de nombreux hooks.
PD: ne pas utiliser \\pour terminer les lignes ou les paragraphes en texte normal !
Vous pouvez mettre le nombre total où vous le souhaitez en utilisant 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}
Cela utilise un xyzfichier aux pour enregistrer les informations.
\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}
Lors de la compilation, le .xyzfichier contient, dans ce cas, le numéro 3et le .auxfichier contient
\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}
La sortie est donc:
Remarque: la version donnée fonctionne quel que soit le nom de votre fichier d'entrée. Si vous préférez ne pas travailler avec l'approche toc, vous pourriez l'avoir câblé au nom de votre document, en définissant à la place
\newcommand\writexyz{\input junk.xyz }
où dans ce cas le document doit être junk.tex.