在 checkandfixthelayout 之后,Memoir 将文本宽度向下舍入到最接近的 pt

在 checkandfixthelayout 之后,Memoir 将文本宽度向下舍入到最接近的 pt

使用 LuLaTeX 的 memoir 时,我注意到\checkandfixthelayout向下舍入textwidth到最接近的 pt。我该如何避免这种舍入?在下面的示例中,我缺少了 0.35 pt textwidth

编辑:

我查看了 memoir.cls (v3.7f, 2016/05/16) 行号 1295,发现\textwidth实际上是用 向下舍入到最接近的 pt \@settopoint。通过注释掉该行,我的问题就消失了。我还注释掉了接下来两个对\oddsidemargin和执行相同操作的行\evensidemargin。我想知道这是否安全。我还想知道为什么代码首先是这样的。为什么要向下舍入?我想设置\textwidth精确。

\documentclass[a4paper]{memoir}
\usepackage{calc}

\settrims{0mm}{0mm}
\setlength{\textwidth}{127mm}
\setlrmargins{*}{*}{*}
\checkandfixthelayout  % options: fixed, classic, lines, nearest

\begin{document}
\newlength{\mylength}
\setlength{\mylength}{\spinemargin+\textwidth+\foremargin}%
\noindent spinemargin + textwidth + foremargin =\\ \the\spinemargin\ + \the\textwidth\ + \the\foremargin\ = \the\mylength

\ \newline
paperwidth = \the\paperwidth
\end{document}

在此处输入图片描述

答案1

仅供有兴趣的人参考。\@settopoint在这种情况下,“忽略”的最安全方法可能是下面的代码。

我问过作者 Peter Wilson memoir。他这样做的唯一原因是,打印出来后看起来更好。但话又说回来,这样做只适合某些长度。

在未来的版本中,我们可能会重写它,以便\@settopoint更容易地删除它。

\makeatletter
\let\normalsettopoint\@settopoint
% this just writes the lengths that would be adjustsed to log
\def\@settopoint#1{\typeout{\string#1}}
\makeatother
\documentclass[a4paper]{memoir}

% run margins as soon as possible
\setlength{\textwidth}{127mm}
\setlrmargins{*}{*}{*}
\checkandfixthelayout  % options: fixed, classic, lines, nearest
% restore \@settopoint just if other packages rely on it, has to go
% AFTER margin adjustments
\makeatletter
\let\@settopoint\normalsettopoint
\makeatother


\begin{document}

\newlength{\mylength}

\setlength{\mylength}{\dimexpr\spinemargin+\textwidth+\foremargin}%

spinemargin + textwidth + foremargin =

\the\spinemargin\ + \the\textwidth\ + \the\foremargin\ = \the\mylength


\bigskip


paperwidth = \the\paperwidth

 \end{document}

相关内容