Ausdruck/Makro am Ende auswerten

Ausdruck/Makro am Ende auswerten

Angenommen, Sie haben ein Dokument, in dem Sie am Anfang angeben möchten, wie viele Abschnitte es hat. Zum Beispiel so etwas:

\documentclass{article}
\begin{document}

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

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

\end{document}

Hier … wäre ein Makro (oder etwas anderes), das besagt, dass es 3 Abschnitte gibt.

Ich konnte leider keine Möglichkeit finden, dieses Makro am Ende auswerten zu lassen (wo es 3 meldet).

In diesem Beispiel möchte ich am Ende die Anzahl der Abschnitte wissen. Es könnte (in gewisser Weise) eine Lösung mit Zählern geben, aber ich suche wirklich nach einer Lösung, bei der ich die Reihenfolge der Auswertung der Makros beeinflussen kann.

Antwort1

Sie können Folgendes verwenden \AtEndDocument(und \AtBeginDocumentdas Makro beim ersten Durchlauf festlegen):

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

Nach mindestens zwei Durchläufen erhalten Sie:

Bildbeschreibung hier eingeben

Wenn Sie mehr Kontrolle benötigen, etoolboxbietet Ihnen das Paket zahlreiche Haken.

PD: nicht \\zum Beenden von Zeilen oder Absätzen im normalen Text verwenden!

Antwort2

Sie können die Gesamtzahl mithilfe von an einer beliebigen Stelle eingeben 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}

Bildbeschreibung hier eingeben

Antwort3

Dabei wird eine xyzAUX-Datei zum Speichern der Informationen verwendet.

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

Nach der Kompilierung .xyzenthält die Datei in diesem Fall die Nummer 3und die .auxDatei enthält

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

Die Ausgabe ist daher:

Bildbeschreibung hier eingeben

Hinweis: Die angegebene Version funktioniert unabhängig vom Namen Ihrer Eingabedatei. Wenn Sie nicht mit dem toc-Ansatz arbeiten möchten, können Sie ihn fest mit Ihrem Dokumentnamen verknüpfen, anstatt

\newcommand\writexyz{\input junk.xyz }

In diesem Fall muss das Dokument junk.tex sein.

verwandte Informationen