\section과 itemize는 페널티 시스템에 어떤 역할을 합니까? (eledmac 컬럼 밸런싱 문제)

\section과 itemize는 페널티 시스템에 어떤 역할을 합니까? (eledmac 컬럼 밸런싱 문제)

eledmac.sty두 개의 열 각주 에서 열 균형을 맞추는 데 여전히 이상한 문제가 있습니다 . 그러나 나는 새로운 MWE를 가지고 있는데, 아마도 이것이 특정한 문제가 아닐 수도 있음을 보여줄 것입니다 eledmac(이것이 내가 더 많은 청중에게 여기에 게시하는 이유입니다).

다음과 같은 간단한 MWE가 있습니다.

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

이 MWE에서는 두 열의 각주가 다음과 같이 균형이 맞지 않는 것처럼 보입니다.

여기에 이미지 설명을 입력하세요

하지만 내가 제거하면어느 하나그만큼\section 또는환경 itemize(동일한 수직 공간을 유지하도록 일반 텍스트를 대신 배치)에 따라 열은 다음과 같이 균형을 이룹니다.

여기에 이미지 설명을 입력하세요

quote.NET 대신 환경을 사용하는 경우에도 마찬가지입니다 itemize.

페널티 시스템에 이상한 작업을 수행하여 각주에 있는 열 균형에 대한 페널티 계산이 "짜증나게" 되는 것이 itemize가능 quote합니까 ??\section

이전 게시물나는 패널티 변수를 설정하는 것만으로는 이 동작에 적절하게 영향을 미치는 것이 불가능하다는 점을 지적했습니다. ~ 안에다른 게시물, 나는 당신이 그것을 가지고 놀 수 있도록 열 균형 조정 알고리즘의 코드를 추출했습니다.

답변1

와, LaTeX 커널은 20년이 지난 지금도 여전히 놀라운 일을 해낼 수 있습니다!

정말 불쾌한 버그가 있었고 -1일부터 거기에 있었습니다.

이것은 eledmac의 문제가 아닙니다. LaTeX가 섹션 제목 뒤에 최소 2줄의 텍스트를 유지하려고 시도하는 방식의 문제입니다. 10000으로 설정한 \clubpenalty다음 \everypar두 번째 단락을 시작할 때 원래 설정을 복원하는 데 사용합니다.

불행히도 MWE의 두 번째 단락은 환경이므로 재설정은 그룹 내에서 발생합니다. 따라서 환경이 끝나면 \clubpenalty금지된 가치를 다시 얻습니다. \everypar재설정하기 위해 정의를 다시 가져오는 것도 나쁘지 않을 것입니다 .

그러나 환경 그룹이 종료된 후 LaTeX는 소위 "단락 환경"(추가 간격을 확보하여 주위에 빈 줄이 있는 환경)을 처리하기 위해 추가 코드를 실행하며 해당 메커니즘( \@doendpe)도 \everypar일부 설정을 복원하는 데 사용됩니다. 복원할 코드가 \clubpenalty손실됩니다.

그 결과 ``clubpenalty는 모든 추가 단락에서 처음 두 줄을 함께 유지하면서 10000으로 유지됩니다. 이것이 각주에 차이를 만드는 것입니다. 두 번째 각주는 첫 번째와 두 번째 사이에 중단점이 없습니다. 더 이상 줄을 서지 마세요).

LaTeX는 일반적으로 허용되는 가까운 페이지 나누기를 찾기 때문에 눈에 띄지 않는 일반 텍스트 또는 실제로 대부분의 LaTeX 문서에서(그리고 어쨌든 클럽 라인은 그다지 좋지 않습니다 :-) 여기에 명확하게 표시됩니다.

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

위 버전을 실행해보시면 드라마가 어떻게 전개되는지 보실 수 있습니다.

가능한 수정 사항은 다음과 같을 수 있습니다. (그러나 이것은 실제로 매우 민감한 영역이고 모든 의미에 대해 생각해 왔는지 확신할 수 없기 때문에 그럴 수도 있습니다. 따라서 이것을 테스트되지 않은 아이디어로 받아들이십시오. 기본적으로 \clubpenalty무조건 par env의 끝에 도달하면 저장된 값은 조건부로 수행되어야 하는 경우일 수 있습니다.

\makeatletter
\def\@doendpe{\@endpetrue
     \def\par{\@restorepar      
              \clubpenalty \@clubpenalty
              \everypar{}\par\@endpefalse}%
     \everypar{{\setbox\z@\lastbox}\everypar{}\clubpenalty \@clubpenalty
               \@endpefalse}}
\makeatother

관련 정보