描述
我想在文档的序言中添加代码,以便我能够识别和存储环境的垂直位置而无需修改布局。
也就是说,无论我的代码是否存在,我都要求呈现的文档是相同的。
我尝试过
平均能量损失
\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{}
)展示了布局的最终变化:
期望结果
能够在发货期间使用的每个环境的开始和结束时存储文档中的 y 位置,而无需改变原始页面布局。
答案1
问题是第二个\pdfsavepos
(之前$$e=mc^2$$
)在水平模式下插入在第一个方程之后。水平模式由内部打开\noindent
。如果\pdfsavepos
这里没有,则以下方程会立即关闭此水平模式,水平列表中没有任何材料,因此$$e=mc^2$$
不会创建之前的段落行。但如果\pdfsavepos
这里是,则段落行会在此处创建,因此主垂直列表中会多一个\hbox
。
如果我们处于水平模式,我建议关闭水平模式,然后插入\pdfsavepos
,然后使用 再次打开水平模式。但是,当 之前有一个长句子时,这将无法正常工作,因为显示模式会获取错误的 值,并使用正确的。但这取决于您想在什么情况下使用它。也许您不想在方程式之前有任何句子。\noindent
equation
\predisplaysize
\above/below/displayshortskip
\above/below/dipslayskip
\BeforeBeginEnvironment{equation}{
\stepcounter{i}%
\ifhmode \par \zsaveposy{start-\thei}\noindent
\else \zsaveposy{start-\thei}
\fi
}%