![测试两个事物的排版结果是否相同](https://linux22.com/image/279480/%E6%B5%8B%E8%AF%95%E4%B8%A4%E4%B8%AA%E4%BA%8B%E7%89%A9%E7%9A%84%E6%8E%92%E7%89%88%E7%BB%93%E6%9E%9C%E6%98%AF%E5%90%A6%E7%9B%B8%E5%90%8C.png)
我想测试两个任意的东西是否排版为完全相同的东西。例如,我希望测试告诉我abc
,xyz
但与 相同\def\bar{abc}\bar
。设计不良的测试和 MWE 是
\documentclass{article}
\makeatletter
\newsavebox{\@tempboxb}
\newcommand{\iftypesetsame}[4]{\begingroup%
\savebox{\@tempboxa}{#1}%
\savebox{\@tempboxb}{#2}%
\ifdim\ht\@tempboxa=\ht\@tempboxb%
\ifdim\dp\@tempboxa=\dp\@tempboxb%
\ifdim\wd\@tempboxa=\wd\@tempboxb%
#3%
\else%
#4%
\fi%
\else%
#4%
\fi%
\else%
#4%
\fi%
\endgroup}
\makeatother
\begin{document}
\iftypesetsame{abc}{abc}{same}{different}
\iftypesetsame{abc}{bcd}{same}{different}
\newcommand{\foo}{\begingroup\def\bar{abc}\bar\endgroup}
\iftypesetsame{abc}{\foo}{same}{different}
\iftypesetsame{xyz}{zyx}{same}{different} % Test gets it wrong
\iftypesetsame{a\vspace{1in}\par b}{ab}{same}{different} % Test gets it wrong
\end{document}
它根据框的高度、宽度和深度进行测试。这显然不是很可靠,因为两个非常不同的东西(例如xyz
和zyx
)可以具有相同的宽度、高度和深度。它也不能处理任意输入(例如\par
和\vspace
}。
虽然我想要一个完美的 LaTeX 解决方案,但我对失败频率更低的测试更感兴趣,即使是基于 LuaTeX 的解决方案
答案1
在标准 TeX 中,没有办法查看已经打包的盒子内部;可以将其拆箱,但只有当最后一个项目是惩罚或跳过时才可以移除它(该过程可以重复,但会在任何其他项目处停止)。
排版框内的列表无法从用户层面访问,并且存储在 TeX 内部。基本上,您只能测试框的尺寸,这当然不是一个可靠的测试。
利用 LuaTeX,可以通过适当的回调访问几乎每个级别。