保存当前位置而不修改文档布局

保存当前位置而不修改文档布局

描述

我想在文档的序言中添加代码,以便我能够识别和存储环境的垂直位置而无需修改布局。

也就是说,无论我的代码是否存在,我都要求呈现的文档是相同的。

我尝试过

平均能量损失

\documentclass{article}
\usepackage{amsmath}
\usepackage{zref-savepos}
\usepackage{etoolbox}
\newcounter{i}
\BeforeBeginEnvironment{equation}{
    \stepcounter{i}%
    \zsaveposy{start-\thei}%
}%
\begin{document}
    \begin{equation}
        x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a}
    \end{equation}
    \begin{equation}
        e = mc^2
    \end{equation}
    \begin{align}
        y &= mx + b \\
        a &= \frac{y - b}{x}
    \end{align}
\end{document}

问题

在开始方程环境之前使用\zsaveposy{}\pdfsavepos{}\tikzmark{}\tikzmarknode{}都会改变布局。

问题说明:

渲染文档的叠加层(使用和未使用命令\zsaveposy{})展示了布局的最终​​变化: 带有和不带有 \zsaveposy{} 的渲染文档的叠加

期望结果

能够在发货期间使用的每个环境的开始和结束时存储文档中的 y 位置,而无需改变原始页面布局。

答案1

问题是第二个\pdfsavepos(之前$$e=mc^2$$)在水平模式下插入在第一个方程之后。水平模式由内部打开\noindent。如果\pdfsavepos这里没有,则以下方程会立即关闭此水平模式,水平列表中没有任何材料,因此$$e=mc^2$$不会创建之前的段落行。但如果\pdfsavepos这里是,则段落行会在此处创建,因此主垂直列表中会多一个\hbox

如果我们处于水平模式,我建议关闭水平模式,然后插入\pdfsavepos,然后使用 再次打开水平模式。但是,当 之前有一个长句子时,这将无法正常工作,因为显示模式会获取错误的 值,并使用正确的。但这取决于您想在什么情况下使用它。也许您不想在方程式之前有任何句子。\noindentequation\predisplaysize\above/below/displayshortskip\above/below/dipslayskip

\BeforeBeginEnvironment{equation}{
    \stepcounter{i}%
    \ifhmode \par \zsaveposy{start-\thei}\noindent
    \else \zsaveposy{start-\thei}
    \fi
}%

相关内容