%3F.png)
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 F
estiver 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 \listoffigures
pode 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 \lipsum
intervalo 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 HERE
e END HERE
no 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 \label
próximo a uma legenda, o LaTeX escreve no .aux
arquivo 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 \label
que especifique a página em que a figura deve aparecer, como por exemplo: \label{ShouldBeOnPage1}
. Um script externo poderia ler o -aux
arquivo 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.