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}
我认为我将其范围缩小到了当存在不同\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
... 要获取所在页码\linegoal
,linegoal
使用,即,如果文件中\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