¿Cómo contar el número total de secciones dentro de un capítulo?

¿Cómo contar el número total de secciones dentro de un capítulo?

¿Cómo se puede contar el número total de secciones?dentro¿cada capítulo?

Estoy intentando utilizar el totcountpaquete, 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.

totcountinforma 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: totcountinforma 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 cntperchapque está disponible en su versión 0.2 en CTAN desde el 5/9/2015.

Esto utiliza el assoccntpaquete (cuyo autor accidentalmente conozco bastante bien ;-))

Asocia un contador totalsectionsal sectioncontador: cada vez que sectionse aumenta el contador, el totalsectionscontador 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 \chapteruso \xpretocmddel xpatchpaquete

NotaEl autor de assoccntrealmente 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.seccntpor ejemplo, foo.seccntpara abreviar. Este archivo se lee nuevamente en la siguiente ejecución de compilación de látex y los valores se almacenan en una etoolboxlista. La macro \GetTotalSectionCounteravanzará 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.seccntarchivo 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.seccntarchivo.

Utilicé el addtocontentsenfoque para permitir LaTeXescribir los números de sección en un archivo separado tal como se hace con el tocmaterial relacionado. Luego se foo.seccnttrata 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 \@startfaketocintenta leer el foo.seccntarchivo 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.

información relacionada