
¿Cómo se puede contar el número total de secciones?dentro¿cada capítulo?
Estoy intentando utilizar el totcount
paquete, pero me devuelve el número total de secciones delúltimocapítulo, no el número total de secciones delactualcapítulo.
En el siguiente MWE, el comportamiento deseado sería informar 3 secciones para el primer capítulo y 1 sección para el segundo y último capítulo.
totcount
informa solo 1 sección (el valor del contador del último capítulo).
\documentclass[12pt]{book}
\usepackage{totcount}
\regtotcounter{section}
\begin{document}
\chapter*{First Chapter}
The total number of sections in this chapter should be 3.
The totcount package reports: \total{section}
\section{First Section}
First text
\section{Second Section}
Second text
\section{Third Section}
Third text
\chapter*{Last Chapter}
The total number of sections in this chapter should be 1.
The totcount package reports: \total{section}
\section{First and only section}
Section text
\end{document}
¿Cómo se puede contar el número total de secciones dentro de cada capítulo?
Nota: totcount
informa 0 secciones si se usa \section*
, consulte el comentario de Sigur.
Respuesta1
EditarLa versión anticipada para conocer los números de sección por capítulo de antemano se encuentra al final de esta publicación. Requiere dos ejecuciones de compilación.
Esta pregunta conduce a un nuevo paquete cntperchap
que está disponible en su versión 0.2 en CTAN desde el 5/9/2015.
Esto utiliza el assoccnt
paquete (cuyo autor accidentalmente conozco bastante bien ;-))
Asocia un contador totalsections
al section
contador: cada vez que section
se aumenta el contador, el totalsections
contador también se incrementa.
Sin embargo, no existe un restablecimiento automático del \chapter*
uso. En este caso, se puede hacer automáticamente anteponiendo algún código al \chapter
uso \xpretocmd
del xpatch
paquete
NotaEl autor de assoccnt
realmente debería incorporar esto en su paquete ;-)
\documentclass[12pt]{book}
\usepackage{assoccnt}
\usepackage{xpatch}
\newcounter{totalsections}[chapter] % Does not work with `chapter*`
% Automatically provide for resetting of the section counter each time
%`\chapter` or `\chapter*` is used -- in this setup this is requested.
\xpretocmd{\chapter}{\setcounter{totalsections}{0}}{}{}
\DeclareAssociatedCounters{section}{totalsections}
\begin{document}
\chapter*{First Chapter}
The total number of sections in this chapter should be 3.
\section{First Section}
First text
\section{Second Section}
Second text
\section{Third Section}
Third text
There \number\value{totalsections} sections in this chapter
\chapter*{Last Chapter}
\section{First and only section}
Section text
There \number\value{totalsections} sections in this chapter
\end{document}
EditarAlguna versión nueva, que utiliza un recuento de secciones por capítulo (requiere dos ejecuciones para tener éxito).
Explicación: Cada vez que se utiliza un nuevo capítulo, el número acumulado de secciones se escribe en un archivo externo, \jobname.seccnt
por ejemplo, foo.seccnt
para abreviar. Este archivo se lee nuevamente en la siguiente ejecución de compilación de látex y los valores se almacenan en una etoolbox
lista. La macro \GetTotalSectionCounter
avanzará a través de esta lista hasta que esté en la posición correcta y luego imprimirá el número de secciones de este capítulo, incluso más adelante. (La macro debería ser ampliable, creo que este es el caso)
Por el momento, es necesario eliminar manualmente el foo.seccnt
archivo si ha habido cambios en el número de capítulos/secciones.
Intentaré solucionar este inconveniente.
\documentclass{book}
\usepackage{ifthen}
\usepackage{assoccnt}
\usepackage{xpatch}
\usepackage{pgffor} % Only for quick usage of a lot of sections, demo only
\newwrite\seccountfile%
\newread\seccountinfile%
\listgadd{\seccountlist}{}% Initialize an empty list
\newcounter{currentchapter}
\newcounter{totalsections}
\newcounter{togglecounter}
\DeclareAssociatedCounters{section}{totalsections}
\newcommand{\getsectioncountnumbers}{%
\setcounter{togglecounter}{0}%
\whiledo {\value{togglecounter} < 1}{%
\read\seccountinfile to \gandalf%
\ifeof\seccountinfile%
\stepcounter{togglecounter}%
\else%
\listxadd{\seccountlist}{\gandalf}%
\fi%
}%
}
\xpretocmd{\chapter}{%
\stepcounter{currentchapter}%
\immediate\write\seccountfile{%
\number\value{totalsections}%
}%
\setcounter{totalsections}{0}
}{}{}
\makeatletter
\newcounter{tempcount@a}
\newcommand{\@getsectiontotalcounter}[1]{%
\setcounter{tempcount@a}{0}%
\renewcommand*{\do}[1]{%
\ifnumequal{\value{#1}}{\value{tempcount@a}}{%
##1\listbreak%
}{%
\stepcounter{tempcount@a}%
}%
}%
\dolistloop{\seccountlist}%
}
\newcommand{\GetSectionTotalCounter}[1][currentchapter]{%
\ifdef{\seccountlist}{%
\@getsectiontotalcounter{#1}%
}{}%
}
\makeatother
\AtBeginDocument{%
\IfFileExists{\jobname.seccnt}{%
% Open for reading
\immediate\openin\seccountinfile=\jobname.seccnt%
\getsectioncountnumbers%
}{%
% Open for writing
\immediate\openout\seccountfile=\jobname.seccnt%
}%
}
\AtEndDocument{%
\immediate\write\seccountfile{%
\number\value{totalsections}%
}%
\immediate\closeout\seccountfile%
}
\begin{document}
\chapter*{First}
This chapter will have \GetSectionTotalCounter sections
\section{First}
\section{Second}
\chapter*{Second}
This chapter will have \GetSectionTotalCounter sections
\section{First}
\section{Second}
\section{Third}
\section{Fourth}
% Now a really large chapter
\chapter*{Third}
This chapter will have \GetSectionTotalCounter sections
\foreach \x in {1,...,100} {%
\section{\x}
}
\end{document}
EditarEsta es la versión sin eliminar explícitamente el foo.seccnt
archivo.
Utilicé el addtocontents
enfoque para permitir LaTeX
escribir los números de sección en un archivo separado tal como se hace con el toc
material relacionado. Luego se foo.seccnt
trata como un toc falso, leído antes (y los valores almacenados temporalmente) reescritos en la ejecución.
\documentclass{book}
\usepackage{ifthen}
\usepackage{assoccnt}
\usepackage{xpatch}
\usepackage{pgffor}
\listgadd{\seccountlist}{}% Initialize an empty list
\newcounter{currentchapter}
\newcounter{totalsections}
\newcounter{togglecounter}
\DeclareAssociatedCounters{section}{totalsections}
\makeatletter
\newcommand{\getsectioncountnumbers}{%
\setcounter{togglecounter}{0}%
\whiledo {\value{togglecounter} < 1}{%
\read\tf@seccnt to \seccountnumberfromfile%
\ifeof\tf@seccnt
\stepcounter{togglecounter}%
\else%
\listxadd{\seccountlist}{\seccountnumberfromfile}%
\fi%
}%
}
\xpretocmd{\chapter}{%
\stepcounter{currentchapter}%
\addtocontents{seccnt}{%
\number\value{totalsections}%
}%
\setcounter{totalsections}{0}
}{}{}
\newcounter{tempcount@a}
\newcommand{\@getsectiontotalcounter}[1]{%
\setcounter{tempcount@a}{0}%
\renewcommand*{\do}[1]{%
\ifnumequal{\value{#1}}{\value{tempcount@a}}{%
##1\listbreak%
}{%
\stepcounter{tempcount@a}%
}%
}%
\dolistloop{\seccountlist}%
}
\newcommand{\GetSectionTotalCounter}[1][currentchapter]{%
\ifdef{\seccountlist}{%
\@getsectiontotalcounter{#1}%
}{}%
}
% This is a modified version from \@starttoc, being defined latex.ltx
\def\@startfaketoc#1{%
\begingroup
% Generate the file handle first
\expandafter\newwrite\csname tf@#1\endcsname%
\makeatletter
% Read first before deleting it
\ifcsdef{tf@#1}{%
\IfFileExists{\jobname.#1}{%
\immediate\openin\csname tf@#1\endcsname \jobname.#1\relax
\getsectioncountnumbers%
}{}
}{%
\typeout{No section count numbers so far}
}%
\if@filesw
% Write only if not `\nofiles` is specified
\immediate\openout \csname tf@#1\endcsname \jobname.#1\relax
\fi
\@nobreakfalse
\endgroup%
}
\AtBeginDocument{%
\@startfaketoc{seccnt}
}
\AtEndDocument{%
% Write the last section count to the file
\addtocontents{seccnt}{%
\number\value{totalsections}%
}%
}
\makeatother
\begin{document}
\tableofcontents
\chapter*{First}
This chapter will have \GetSectionTotalCounter sections
\section{First}
\section{Second}
\chapter*{Second}
This chapter will have \GetSectionTotalCounter sections
\section{First}
\section{Second}
\section{Third}
\section{Fourth}
% Now a really large chapter
\chapter*{Third}
This chapter will have \GetSectionTotalCounter sections
\foreach \x in {1,...,100} {%
\section{\x}
}
\chapter{Fourth}
This chapter will have \GetSectionTotalCounter sections
\section{A single section}
\end{document}
EditarEl OP gsl notó algún error en este código. Podría rastrearlo hasta el hecho de que ya \@startfaketoc
intenta leer el foo.seccnt
archivo externo en la primera ejecución. Por supuesto, esto falla, ya que no existe dicho archivo si se eliminó o el documento se compiló por primera vez.