使用 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}