最小工作示例
% !TeX TS-program = pdflatex
% !TeX encoding = UTF-8
\documentclass{elsarticle}
\begin{document}
\begin{frontmatter}
\end{frontmatter}
\end{document}
导致
Overfull \hbox (2.22221pt too wide) has occurred while \output is active []
如果我使用原始模板,也会出现同样的警告:
- https://www.elsevier.com/authors/author-schemas/latex-instructions
- 直接链接:https://www.elsevier.com/__data/assets/file/0007/56842/elsarticle-template.zip
我在用着
这是 pdfTeX,版本 3.14159265-2.6-1.40.20(MiKTeX 2.9.7200 64 位)
并且我的软件包都是最新的(截至2019年10月30日),并且我拥有最新版本的elsarticle
:https://ctan.org/pkg/elsarticle(2019年4月6日)
答案1
这是elsarticle
2018 年某个时候引入的一个错误(在 TeXLive 2017 中没有问题),由%
行末的常见缺失引起。罪魁祸首是:
\def\ps@pprintTitle{%
\let\@oddhead\@empty
\let\@evenhead\@empty
\def\@oddfoot
{\hbox to \textwidth%
{\ifnopreprintline\relax\else
\@myfooterfont%
\ifx\@elsarticlemyfooteralign\@elsarticlemyfooteraligncenter%
\hfil\@elsarticlemyfooter\hfil%
\else%
\ifx\@elsarticlemyfooteralign\@elsarticlemyfooteralignleft%
\@elsarticlemyfooter\hfill{}%
\else%
\ifx\@elsarticlemyfooteralign\@elsarticlemyfooteralignright%
{}\hfill\@elsarticlemyfooter%
\else%
Preprint submitted to \ifx\@journal\@empty%
Elsevier%
\else\@journal\fi\hfill\@date\fi%
\fi%
\fi%
\fi%
} % <------------
}%
\let\@evenfoot\@oddfoot}
标有 的行应在 后% <--
包含一个右对齐的行。(有趣的是,此定义中的大部分行尾都是无用的:-)%
}
%
这里有四个选项可以解决这个问题(除了 2 个之外,其他的都应该去掉)后 elsarticle
已加载,否则将不起作用):
将上述定义复制到您的文档中并
%
在其后添加}
(并确保在定义周围添加\makeatletter
和):\makeatother
\fi% \fi% }% <--- Here }% \let\@evenfoot\@oddfoot}
制作本地副本
elsarticle.cls
并执行相同操作。用1
\patchcmd
进行修补比较棘手,因为额外的空格位于两个 之间。但是通过一些括号破解和 是可能的。将其添加到您的序言中也应该可以解决问题:}
\romannumeral
\usepackage{etoolbox} \makeatletter \patchcmd\ps@pprintTitle {\fi\fi\fi\fi} {\fi\fi\fi\fi \afterassignment\fix@elsarticle\let\@tempa} {}{\FailedToPatch} \def\fix@elsarticle{\iffalse{\fi}\romannumeral-`0} \makeatother
LaTeX3 的正则表达式引擎不遵循与 相同的规则
\patchcmd
,因此您可以直接} }
用替换}}
:\usepackage{regexpatch} \makeatletter \regexpatchcmd\ps@pprintTitle {\cE\}\ \cE\}}{\cE\}\cE\}} {}{\FailedToPatch} \makeatother
1用 修补该错误etoolbox
很棘手,因为补丁需要用 替换序列。 问题在于,你不能在 的参数中使用不平衡的} }
括号}}
\patchcmd
事实上,任何宏的参数都是如此)。 实际上,括号并不是真正必要的,但我们需要某种方法来区分我们实际上想要从Preprint
和之间的一个中删除submitted
。
定义的结尾\ps@pprintTitle
如下:
% V space we want to remove
\fi\fi\fi\fi} }\let\@evenfoot\@oddfoot
我上面提出的补丁挂接\fi
在宏中的四个连续处并附加到\afterassignment\fix@elsarticle\let\@tempa
它们:
% space we want to remove V
\fi\fi\fi\fi\afterassignment\fix@elsarticle\let\@tempa} }
当代码执行到达那里时,这四个\fi
像往常一样完成它们的工作然后消失。\afterassignment
将标记存储\fix@elsarticle
在临时内存中,该内存将在下一次分配后检索。接下来的事情是\let\@tempa}
。该指令将标记存储在(与)}
中,并因此将其从标记流中删除。但是现在(请记住这一点)我们通过删除 来使 TeX 的括号计数不平衡。\@tempa
\egroup
}
但请注意,刚刚发生的事情(\let
)是一个赋值。TeX 现在触发标记\afterassignment
,\fix@elsarticle
然后将其扩展为其定义。到目前为止,输入流如下所示:
% V space we want to remove
\iffalse{\fi}\romannumeral-`0 }
现在,\iffalse
扩展并消耗了{
。这个括号移除抵消了我们之前移除的另一个括号,下一个标记是}
,它的作用与我们移除的那个括号相同。现在剩下的就是\romannumeral-`0 }
。\romannumeral
首先读取-`0
,这是一个负值。然后,像其他扫描数字的 TeX 基元一样,它会消耗数字后面的可选空格,这最后删除了讨厌的空格。但是,由于读取的整数为负数,因此的展开为\romannumeral
空,其余代码运行良好。真是一段美妙的旅程 :-)