进球数 (scr)

进球数 (scr)

book使用或文档类别时,Linegoal 会计算错误的剩余线宽。使用等scrbook时不会发生此问题。article

梅威瑟:

\documentclass{book}
\usepackage{linegoal}

\begin{document}
\overfullrule=5pt % To show the overfull lines

some line \parbox[t]{\linegoal}{some parbox content some parbox content some parbox content some parbox content some parbox content some parbox content some parbox content some parbox content some parbox content some parbox content}

\clearpage

some different line \parbox[t]{\linegoal}{some parbox content some parbox content some parbox content some parbox content some parbox content some parbox content some parbox content some parbox content some parbox content some parbox content}

\end{document}

第 1 页的结果: 在此处输入图片描述

第 2 页很好: 在此处输入图片描述

我认为我将其范围缩小到了当存在不同\evensidemargin/时发生的情况\oddsidemargin

答案1

好的,我花了太多时间才找到答案......

tl;dr 修复

将此添加到您的序言中(加载后linegoal):

\makeatletter
\let\Z@E@linegoal\relax % undefine the property
\zref@newprop*{linegoal}[\linewidth]{\dimexpr
   \linewidth -\the\pdflastxpos sp
   +\ifodd\c@page
      \oddsidemargin
   \else\evensidemargin
   \fi
   +1in+\hoffset
   \relax
}% linegoal zref-property
\makeatother

请注意,如果分页符依赖于 ,\linegoal并且\linegoal本身因此跨页移动,则这可能会导致标签无限循环更改。在这种情况下,您可能需要手动调整分页符。

背景

基本上,linegoal使用一个内部计数器\LNGL@unique,每次发生时计数器都会增加一\linegoal。此计数器的当前值用于创建标签(在文件中aux),如下所示:

\zref@newlabel{linegoal/posx.3}{\page{35}\posx{19599809}}
\zref@newlabel{linegoal.3}{\linegoal{\dimexpr \linewidth -19599809sp +\evensidemargin +1in+\hoffset \relax }}

\LNGL@unique在这个例子中,的值为3

这个例子也已经暗示了这个问题:第 35 页是奇数页,但我们却看到\evensidemargin。然而,这个linegoal包并不是\evensidemargin到处都假设;它会检查页码是偶数还是奇数,并使用相应的边距:

   \ifodd\zref@extractdefault{linegoal/posx.\the\LNGL@unique}{page}\c@page
      \oddsidemargin
   \else\evensidemargin
   \fi

... 要获取所在页码\linegoallinegoal使用,即,如果文件中\zref@extractdefault{linegoal/posx.\the\LNGL@unique}{page}\c@page有一个标签,那么它从那里提取页面,否则它使用当前页面计数器值()。linegoal/posx.<counter value>aux\c@page

然而,由于某种原因,的当前值\LNGL@unique几乎总是错误的,¹因此返回的页码是错误的(从第二次 LaTeX 运行开始)。

¹:你可以自己尝试编辑一份副本linegoal.sty,例如将上面显示的代码片段替换为

   \ifodd\zref@extractdefault{linegoal/posx.\the\LNGL@unique}{page}\c@page
      \oddsidemargin + \the\LNGL@unique pt
   \else\evensidemargin + \the\LNGL@unique pt
   \fi

然后查看aux文件中生成的标签。

修复

所提出的修复方案始终使用页面计数器,而不是依赖于\zref@extractdefault(因此显然是错误的值)。\LNGL@unique

相关内容