elsarticle frontmatter: 当 \output 处于活动状态时,\hbox 已过满

elsarticle frontmatter: 当 \output 处于活动状态时,\hbox 已过满

最小工作示例

% !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 []

如果我使用原始模板,也会出现同样的警告:

我在用着

这是 pdfTeX,版本 3.14159265-2.6-1.40.20(MiKTeX 2.9.7200 64 位)

并且我的软件包都是最新的(截至2019年10月30日),并且我拥有最新版本的elsarticlehttps://ctan.org/pkg/elsarticle(2019年4月6日)

答案1

这是elsarticle2018 年某个时候引入的一个错误(在 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已加载,否则将不起作用):

  1. 将上述定义复制到您的文档中并%在其后添加}(并确保在定义周围添加\makeatletter和):\makeatother

             \fi%
             \fi%
             }% <--- Here
           }%
         \let\@evenfoot\@oddfoot}
    
  2. 制作本地副本elsarticle.cls并执行相同操作。

  3. 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
    
  4. 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空,其余代码运行良好。真是一段美妙的旅程 :-)

相关内容