Valuta l'espressione / macro alla fine

Sep 01 2020

Supponi di avere un documento in cui vuoi menzionare quante sezioni ci sono all'inizio. Ad esempio, qualcosa del genere:

\documentclass{article}
\begin{document}

  Abstract\\There are ... sections in this document.

  \section{Section 1}
  \section{Section 2}
  \section{Section 3}

\end{document}

Qui ... sarebbe una macro (o qualcos'altro) che dice che ci sono 3 sezioni.

Io, purtroppo, non sono riuscito a trovare un modo per far valutare quella macro alla fine (dove riporta 3).

In questo esempio, voglio sapere il numero di sezioni alla fine. Potrebbe esserci una soluzione che utilizza i contatori (in qualche modo), ma sto davvero cercando una soluzione in cui posso avere una certa influenza sull'ordine di valutazione delle macro.

Risposte

3 Rmano Sep 01 2020 at 16:12

Puoi usare \AtEndDocument(e \AtBeginDocumentper impostare la macro nella prima esecuzione):

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

Dopo almeno due corse, ottieni:

Se hai bisogno di più controllo, il pacchetto etoolboxti offre molti hook.

PD: non utilizzare \\per terminare righe o paragrafi nel testo normale !

6 egreg Sep 01 2020 at 17:19

Puoi mettere il numero totale dove vuoi usando 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}

2 StevenB.Segletes Sep 01 2020 at 16:33

Questo utilizza un xyzfile aux per salvare le informazioni.

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

Al momento della compilazione, il .xyzfile contiene, in questo caso, il numero 3e il .auxfile contiene

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

L'output è quindi:

Nota: la versione fornita funziona indipendentemente dal nome del file di input. Se preferisci non lavorare con l'approccio toc, potresti averlo cablato al nome del tuo documento, invece di definire

\newcommand\writexyz{\input junk.xyz }

dove in questo caso il documento deve essere junk.tex.