Como posso descobrir em quais páginas meus carros alegóricos estão (sem olhar todas as páginas do documento)?

Como posso descobrir em quais páginas meus carros alegóricos estão (sem olhar todas as páginas do documento)?

Esta questão levou a um novo pacote:
chkfloat

Fazer pequenos ajustes em meu documento (de duas colunas) pode fazer com que meus flutuadores (colunas simples e duplas) se movam para todos os lados. Eu sei que é mais provável que meu documento tenha uma boa aparência se float Festiver na página P, digamos, do que se estiver na página P+1. No entanto, tenho um documento longo e é cansativo verificar cada página após cada construção para ver se meus carros alegóricos foram movidos.

Portanto, eu gostaria que o LaTeX gerasse um erro (ou pelo menos me alertasse de alguma forma) se o float F(n)não estiver na página P(n)onde F(n)e P(n)for especificado para algum subconjunto dos meus floats (ficaria feliz com uma resposta que pudesse lidar com o rastreamento um carro alegórico para começar!). Porém, não é possível colocar código de verificação dentro dos próprios carros alegóricos, porque esse código é executado quando os carros alegóricos são "lidos" e não quando são "colocados".

Mesmo que eu possa ajustar os parâmetros flutuantes para que eles apareçam nos locais que eu prefiro, isso ainda seria um teste automatizado útil, portanto, o foco da minha pergunta não é sobre parâmetros flutuantes, a menos que existam alguns parâmetros mágicos que forcem LaTeX para colocar os carros alegóricos em locais aproximados que eu especifico (ou seja, lugares flutuantes! --- não apenas 'aqui', o que presumo que não seja possível para carros alegóricos de duas colunas de qualquer maneira).

Claramente, o LaTeX rastreia quais carros flutuantes aparecem em cada página, pois \listoffigurespode mostrar essas informações. Mas não tenho certeza de qual é a melhor maneira de acessar essas informações para fazer os testes; existe um gancho que é chamado quando um float é colocado? De preferência, o teste funcionaria em uma única execução (observe que a lista de figuras leva duas execuções para ser atualizada), mas isso não é essencial.

Incluí um MWE de coluna única com um único flutuador para brincar. Alterar o \lipsumintervalo altera onde o flutuador é colocado. (Se a natureza da coluna dupla fizer uma grande diferença, posso tentar fornecer um 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}

Responder1

Abordagem diferente do JLDIaz. Basta colocar o código entre START HEREe END HEREno final do preâmbulo. O código é auto-comentado.

Observação:Eu transformei isso em um pacote. Não use este código diretamente, melhorobtenha e use o pacote.

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

Responder2

Aqui está uma ideia. Quando você usa o comando \labelpróximo a uma legenda, o LaTeX escreve no .auxarquivo o número da figura e o número da página (o número real da página em que a figura aparece). Além disso, define uma macro que armazena esse número de página, que pode ser recuperado com o comando \pageref.

A idéia é adicionar a cada figura um \labelque especifique a página em que a figura deve aparecer, como por exemplo: \label{ShouldBeOnPage1}. Um script externo poderia ler o -auxarquivo e comparar o nome da etiqueta com o valor do número da página.

Melhor ainda, o LaTeX pode fazer essa verificação no final do documento. O MWE a seguir fornece a ideia básica, mas verifica apenas uma única figura. Uma solução adequada incluiria um loop para verificar todos os números, mas não tenho conhecimento para implementar a solução completa. Você pode especificar manualmente cada verificação como fiz na primeira 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}

Executando este exemplo você recebe o aviso:

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

Observe que meu código assume um único número por página. Uma solução adequada definiria uma macro para cada figura, baseada no número da figura, que armazenasse a página em que a figura deveria aparecer, e criaria um rótulo baseado também no número da figura e na página esperada, que forneceria a página real via \pageref.

Sei que não é uma solução completa, mas espero que essa ideia valha a pena e que alguém mais habilidoso que eu a complete.

informação relacionada