Colocação errada para \preto usando etoolbox

Colocação errada para \preto usando etoolbox

Estou observando que adicionar um texto a uma lista de tabelas (ou figuras) através do \preto do etoolbox não funciona corretamente quando a tabela é colocada na próxima página se ela não couber na página onde está configurada.

Considere o seguinte código

\documentclass[twoside,a4paper]{memoir}

\usepackage{etoolbox, tocloft}
\preto\figure{%
  \ifnum\value{figure}=0\addtocontents{lof}{{\bfseries Chapter \thechapter\vskip10pt}}\fi
}
\preto\table{%
  \ifnum\value{table}=0\addtocontents{lot}{{\bfseries Chapter \thechapter\vskip10pt}}\fi
}

\begin{document}

\cleardoublepage
\tableofcontents
\cleardoublepage
\listoftables
\cleardoublepage

\chapter{Chapter}

blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 
\\

blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 
\\

blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 
\\

blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 
\\

%blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 

\begin{table}
  \begin{center}
  \caption{My table's caption}
    \begin{tabular}{l c c} 
        \hline
        column 1 & column 2 & column 3 \\
        \hline
        r1 & r2 & r3 \\
        r1 & r2 & r3 \\
        r1 & r2 & r3 \\
        r1 & r2 & r3 \\
        \hline
    \end{tabular}
  \end{center}
\end{table}

\end{document}

Se eu deixei o último comentário sobre "blá, blá, blá", a lista de tabelas será assim:

Lista de mesas

Capítulo 1

1.1 Legenda da minha tabela... 6

Se eu remover o caractere de comentário, a lista de tabelas ficará estranha e será semelhante a

Lista de mesas

1.1 Legenda da minha tabela... 6

Capítulo 1

Se eu forçar a tabela a ficar aqui ela será resolvida, porém prefiro ter tabelas no topo. Alguém pode apontar como resolver esse problema?

Obrigado!

Responder1

É melhor adicionar a anotação ao comando de criação de capítulo; com o livro de memórias há o gancho \mempostaddchaptertotochookpara esse propósito.

O código a seguir é adaptado para umresposta minha no fórum GuIT; como você pode ver, a anotação só é impressa se em um capítulo forem encontradas algumas tabelas (ou figuras).

\documentclass[twoside,a4paper]{memoir}

\renewcommand\mempostaddchaptertotochook{%
  \addchaptertoloft{lof}%
  \addchaptertoloft{lot}%
}
\def\addchaptertoloft#1{% 
   \addtocontents{#1}{% 
     \protect\xcontentsline{chapter} 
      {\chaptername\ \thechapter\protect\nopagebreak\protect\vspace{1ex}}{}}}
\makeatletter
\def\xcontentsline#1#2#3{\@ifnextchar\contentsline 
  {\contentsline{#1}{#2}{#3}}{}} 
\makeatother


\newcommand{\blah}{%
  blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 
  blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 
  blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 
  blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 
  blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 
  blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah 
  blah blah blah blah\par}

\begin{document}

\tableofcontents*
\listoftables

\chapter{Chapter}

\blah\blah\blah\blah

\begin{table}
\centering

\caption{My table's caption}

\begin{tabular}{l c c} 
\hline
column 1 & column 2 & column 3 \\
\hline
r1 & r2 & r3 \\
r1 & r2 & r3 \\
r1 & r2 & r3 \\
r1 & r2 & r3 \\
\hline
\end{tabular}

\end{table}

\chapter{Chapter}

\blah\blah\blah\blah

\chapter{Chapter}

\blah \blah \blah \blah

\begin{table}
\centering

\caption{My table's caption}

\begin{tabular}{l c c} 
\hline
column 1 & column 2 & column 3 \\
\hline
r1 & r2 & r3 \\
r1 & r2 & r3 \\
r1 & r2 & r3 \\
r1 & r2 & r3 \\
\hline
\end{tabular}

\end{table}

\end{document}

insira a descrição da imagem aqui

Não use centerdentro figureou table, mas \centering. Além disso, não adicione \\no final de um parágrafo.


Observe que quando hyperrefé usado, uma definição diferente de \xcontentslinedeveria ser usada. Altere o código acima com

\makeatletter
\def\xcontentsline#1#2#3{\@ifnextchar\contentsline 
  {\contentsline{#1}{#2}{#3}{}{}}{}} % two {} groups for hyperref
\makeatother

(todo o resto permanece o mesmo). A mudança também é compatível para quando hyperrefnão for utilizada.

informação relacionada