小型页面环境后的奇怪行为

小型页面环境后的奇怪行为

我有这段代码,为了演示目的,我在整数值处画了红线\baselineskip并框住了小页面:

\documentclass{article}
\usepackage{calc}
\usepackage[margin = 1.0in, showframe, heightrounded]{geometry}
\usepackage{lipsum}

\setlength{\fboxsep}{-\fboxrule}% Remove space between fbox frame and content

% Red lines at baselines.
\usepackage{eso-pic}
\usepackage{atbegshi,picture,xcolor}
\AtBeginShipout{%
    \AtBeginShipoutUpperLeft{%
        \color{red}%
         \put(\dimexpr 1in+\oddsidemargin,
             -\dimexpr 1in+\topmargin+\headheight+\headsep+\topskip)%
        {%
            \vtop to\dimexpr\vsize+\baselineskip{
            \hrule
            \leaders\vbox to\baselineskip{\hrule width\hsize\vfill}\vfill
        }%
    }%
}%

\begin{document}

    \fbox
    {%
        \begin{minipage}[t][\heightof{Lorem} + 9\baselineskip]{0.85\textwidth}
            \lipsum[1]
        \end{minipage}%
    }

    \hfill

    Hello,

\end{document}

我的问题很简单:为什么“Hello”的基线不在小页面之后的下一条红线上?

输出

答案1

下列

\begin{minipage}[t][\heightof{Lorem} + 9\baselineskip]{0.85\textwidth}

指定minipage第一行的高度(“Lorem”)。因此,\topskip对于网格线而言,设置是正确的。

但是框的深度是 的剩余空间9\baselineskip。最后一行的深度甚至超出了框。由于 的深度非常大minipage,因此\baselineskip未使用和设置,但\lineskip(默认值:1 pt)。“g”的深度超出了框,约为 2 pt,下一行“Hello”覆盖了“g”的下行部分(当然没有\hfill)。

可以通过两种方式修复该示例:

  • 设置\prevdepth为零:

    \fbox{%
      \begin{minipage}[t][\heightof{Lorem} + 9\baselineskip]{0.85\textwidth}
        \lipsum[1]
      \end{minipage}%
    }\par
    \setlength{\prevdepth}{0pt}
    Hello,
    

    最后一行的下行过大minipage或带重音的大写字母可能会发生冲突,因为在设置“Hello”行时,TeX 不知道最后一行的深度。但网格更受尊重。

  • 可以添加一个框,它模拟最后一行的深度minipage

    \fbox{%
      \begin{minipage}[t][\heightof{Lorem} + 9\baselineskip]{0.85\textwidth}
        \lipsum[1]
        \par
        \xdef\lastprevdepth{\the\prevdepth}%
      \end{minipage}%
    }\par
    \nobreak
    \nointerlineskip 
    \hbox{\vrule width0pt depth\lastprevdepth}
    Hello,
    

两种情况的结果:

结果

相关内容