¿Cómo puedo saber en qué páginas están mis flotadores (sin mirar cada página del documento)?

¿Cómo puedo saber en qué páginas están mis flotadores (sin mirar cada página del documento)?

Esta pregunta condujo a un nuevo paquete:
chkfloat

Hacer pequeños ajustes en mi documento (de dos columnas) puede hacer que mis elementos flotantes (tanto de columnas simples como dobles) se muevan por todas partes. Sé que es más probable que mi documento se vea bien si float Festá en la página P, por ejemplo, que si está en la page P+1. Sin embargo, tengo un documento largo y resulta tedioso revisar cada página después de cada compilación para ver si mis flotadores se han movido.

Por lo tanto, me gustaría que LaTeX genere un error (o al menos me avise de alguna manera) si el flotante F(n)no está en la página P(n)donde se especifican F(n)y P(n)para algún subconjunto de mis flotantes (estaría contento con una respuesta que pueda abordar el seguimiento ¡Para empezar, un flotador!). Sin embargo, no es posible poner código de verificación dentro de los propios flotantes, porque este código se ejecuta cuando los flotantes se "leen" en lugar de cuando se "colocan".

Incluso si puedo modificar los parámetros flotantes para que aparezcan en las ubicaciones que prefiero, esta seguiría siendo una prueba automatizada útil, por lo que el enfoque de mi pregunta no pretende ser los parámetros flotantes, a menos que haya algunos parámetros mágicos que fuercen LaTeX para colocar los flotadores en los lugares aproximados que especifico (es decir, ¡lugares flotantes! --- no solo 'aquí', lo cual supongo que no es posible para flotadores de dos columnas de todos modos).

Claramente, LaTeX realiza un seguimiento de qué flotantes aparecen en cada página, ya que \listoffigurespuede mostrar esta información. Pero no estoy seguro de cuál es la mejor manera de acceder a esa información para realizar las pruebas; ¿Existe algún anzuelo que se llame cuando se coloca un flotador? Preferiblemente, la prueba funcionaría en una sola ejecución (tenga en cuenta que la lista de figuras requiere dos ejecuciones para actualizarse), pero esto no es esencial.

He incluido un MWE de una sola columna con un único flotador para jugar. Cambiar el \lipsumrango cambia dónde se coloca el flotador. (Si la naturaleza de la doble columna marca una gran diferencia, puedo intentar suministrar un MWE modificado).

\documentclass{article}
\usepackage[a4paper]{geometry}%don't trust MikTeX's defaults!
\usepackage{lipsum}
\begin{document}
    % choose which of the following two lines to use to configure where the float appears.
    \lipsum[1-5]% figure appears on page 2 if this line is used
    %\lipsum[1-4]% figure appears on page 1 if this line is used
    \begin{figure}
        \centering
        Hello world. I was typeset on page \thepage, but that may not be where I appear!

        \rule{4cm}{4cm}

        \caption{fig}
    \end{figure}
    ***Figure appeared in the text just above here.***

    \lipsum[5-8]
    \listoffigures
\end{document}

Respuesta1

Enfoque diferente al de JLDIaz. Simplemente coloque el código entre START HEREy END HEREal final de su preámbulo. El código está autocomentado.

Observación:Hice esto en un paquete. No uses este código directamente, mejorobtener y utilizar el paquete.

\documentclass{article}

% START HERE
\makeatletter
% tolerances
\PassOptionsToPackage{patch}{kvoptions}
\RequirePackage{kvoptions}
\DeclareStringOption{tolerance}
\def\chkfloat@tolerance{1}
\ProcessKeyvalOptions*
% store original macros \@float and \@caption
\let\chkfloat@float\@float
\let\chkfloat@caption\@caption
% make \@float remember the page where the float should be
\def\@float{\edef\chkfloat@page{\thepage}\chkfloat@float}
% make \@caption write to a file .fof the information about final page, original page and float caption
\def\@caption#1[#2]#3{\chkfloat@caption{#1}[#2]{#3}%
  \addtocontents{fof}{\protect\chkfloat@{\thepage}{\chkfloat@page}{\csname fnum@#1\endcsname: #2}}%
}
% checking macro
\def\chkfloat@#1#2#3{\ifnum#1>\numexpr#2+\chkfloat@tolerance\relax
  \begingroup\let\on@line\@gobble\def\nobreakspace{ }\GenericWarning{}{Float misplaced on pages #2->#1, #3}\endgroup
\fi
}
% process the file .fof
\@starttoc{fof}

\makeatother
% END HERE

\begin{document}

Hello world!

\begin{figure}[b]
FIGURE BOTTOM
\caption{Figure at bottom}
\end{figure}

\begin{figure}[p]
FIGURE PAGE
\caption{Figure at its page}
\end{figure}

\end{document}

Respuesta2

Aquí tienes una idea. Cuando usa el comando \labeljunto a un título, LaTeX escribe en el .auxarchivo el número de la figura y el número de página (el número de página real en el que aparece la figura). Además, define una macro que almacena ese número de página, que se puede recuperar con el comando \pageref.

La idea es agregar a cada figura una \labelque especifique la página en la que debe aparecer la figura, como por ejemplo: \label{ShouldBeOnPage1}. Un script externo podría leer el -auxarchivo y comparar el nombre de la etiqueta con el valor de su número de página.

Aún mejor, LaTeX puede realizar esta verificación al final del documento. El siguiente MWE proporciona la idea básica, pero solo busca una cifra. Una solución adecuada incluiría un bucle para comprobar todas las cifras, pero me falta el conocimiento para implementar la solución completa. Puede especificar manualmente cada verificación como lo hice con la primera figura:

\documentclass{article}
\usepackage[a4paper]{geometry}%don't trust MikTeX's defaults!
\usepackage{lipsum}

\def\CheckFloat#1{%  The macro which does the check for a single figure
% The parameter is the page number at which the figure should appear
\expandafter\ifx#1\pageref{ShouldBeOnPage#1}%
\relax
\else\GenericWarning{(Floats)}{Warning: A float which should appear on page #1 is misplaced (to page \pageref{ShouldBeOnPage#1})}
\fi
}


\AtEndDocument{% Manually do all checks
 \CheckFloat{1}
}

\begin{document}
% choose which of the following two lines to use to configure where the float appears.
\lipsum[1-5]% figure appears on page 2 if this line is used
%\lipsum[1-4]% figure appears on page 1 if this line is used
\begin{figure}
\centering
Hello world. I was typeset on page \thepage, but that may not be where I appear!

\rule{4cm}{4cm}

\caption{fig}\label{ShouldBeOnPage1}  % <----- Add this to the figures
\end{figure}
***Figure appeared in the text just above here.***

\lipsum[5-8]
\listoffigures
\end{document}

Al ejecutar este ejemplo, aparece la advertencia:

Warning: A float which should appear on page 1 is misplaced (to page 2\hbox {})
 on input line 33.

Tenga en cuenta que mi código asume una sola cifra por página. Una solución adecuada definiría una macro para cada figura, basada en el número de figura, que almacena la página en la que debería aparecer la figura, y crearía una etiqueta basada también en el número de figura y la página esperada, que proporcionará la página real a través de \pageref.

Sé que esta no es una solución completa, pero espero que esta idea valga y alguien más hábil que yo la complete.

información relacionada