.png)
Ainda tenho um problema estranho com o balanceamento de colunas em eledmac.sty
notas de rodapé de duas colunas. Mas tenho um novo MWE, possivelmente mostrando que este pode não ser um problema específico eledmac
(é por isso que o publico aqui para um público mais amplo).
Eu tenho este MWE simples:
\documentclass{article}
\usepackage{lipsum}
\usepackage{eledmac}
\foottwocolX{A}
\def\footnote#1{\footnoteA{#1}}
\begin{document}
% Either remove this section:
\section{Section Headline}
\lipsum[1]
% ... or remove the item / quote environment:
\begin{itemize}
%\begin{quote}
\item The same problem happens if this is not an itemize but a quote
environment.
%\end{quote}
\end{itemize}
Bla\footnote{Test.}
Foo\footnote{Test Test Test Test Test Test Test Test Test Test Test Test Test
Test Test }
Bar \footnote{Test.}
\end{document}
Neste MWE, as notas de rodapé das duas colunas parecem desequilibradas assim:
Mas se eu removerqualquero\section
ouo itemize
ambiente (colocando texto normal para que mantenha o mesmo espaço vertical), as colunas ficarão balanceadas assim:
O mesmo acontece se eu usar um quote
ambiente em vez do itemize
.
É possível que itemize
ee quote
faça \section
algo estranho no sistema de penalidades para que o cálculo da penalidade para o balanceamento da coluna na nota de rodapé fique "irritado" ou algo assim?
No meupostagem anteriorSalientei que não é possível influenciar adequadamente esse comportamento por meio da configuração das variáveis do painel. Emoutra postagem, extraí o código do algoritmo de balanceamento de coluna para que você possa brincar com ele.
Responder1
Uau, o kernel do LaTeX ainda é capaz de trazer surpresas depois de duas décadas!
Que bug desagradável e está lá desde o dia -1.
Este não é um problema do eledmac, é um problema da maneira como o LaTeX tenta manter pelo menos 2 linhas de texto após o título de uma seção. Ele faz isso definindo \clubpenalty
como 10.000 e depois usa \everypar
para restaurar a configuração original quando inicia o segundo parágrafo.
Infelizmente o segundo parágrafo do MWE é um ambiente e então a redefinição acontece dentro de um grupo. Portanto, no final, o meio ambiente \clubpenalty
recupera seu valor proibitivo. Isso não seria tão ruim, pois \everypar
também está recuperando sua definição para redefini-la.
No entanto, após o término do grupo de ambiente, o LaTeX executa mais código para lidar com o chamado "ambiente de parágrafo" (envs que possuem linhas em branco ao redor deles à medida que obtêm espaçamento extra) e esse mecanismo ( \@doendpe
) também usa \everypar
para restaurar algumas configurações e ao longo do caminho o o código para restaurar \clubpenalty
se perde.
Como resultado daí em diante `\clubpenalty permanece em 10000 mantendo em todos os parágrafos seguintes as duas primeiras linhas juntas --- e é isso que faz a diferença nas notas de rodapé: a segunda nota de rodapé não tem um ponto de interrupção entre a primeira e a segunda linha por mais tempo).
No texto normal ou mesmo na maioria dos documentos LaTeX, isso passa despercebido, pois o LaTeX geralmente encontra uma quebra de página próxima que é aceitável (e as linhas do clube não são tão boas de qualquer maneira :-)), mas aqui é mostrado claramente.
\documentclass{article}
\def\X{\showthe\clubpenalty\showthe\everypar}
\begin{document}
\section{Section Headline}
\X
a little bit of text
\X
% Uncomment this para then the issue goes away
%Another paragraph that makes \verb=\clubpenalty= okay again.
\X
% ... or remove the item / quote environment:
\begin{itemize}
\item \X
The same problem happens if this is not an itemize but a quote
environment.
\end{itemize}
\X
\par
\X Here is the issue: \verb=\clubpenalty= is restored back to 10000 but the \verb=\@doendpe= kills the also restored \verb=\everypar= so that it is never set back to normal.
Bla\footnote{Test.}
Foo\footnote{\X Test Test Test Test Test Test Test Test Test Test Test Test Test
Test Test }
Bar \footnote{Test.}
\X
Another paragraph
\X
\end{document}
Se você executar a versão acima, poderá ver como o drama se desenrola.
Uma possível solução pode ser a seguinte (mas eu digo que pode, pois esta é realmente uma área extremamente delicada e não tenho certeza se pensei em todas as implicações... então tome isso como uma ideia não testada - basicamente, ela volta \clubpenalty
incondicionalmente para seu valor salvo quando o final de um ambiente de par é atingido, pode muito bem ser o caso de que isso precise ser feito condicionalmente:
\makeatletter
\def\@doendpe{\@endpetrue
\def\par{\@restorepar
\clubpenalty \@clubpenalty
\everypar{}\par\@endpefalse}%
\everypar{{\setbox\z@\lastbox}\everypar{}\clubpenalty \@clubpenalty
\@endpefalse}}
\makeatother