测试两个事物的排版结果是否相同

测试两个事物的排版结果是否相同

我想测试两个任意的东西是否排版为完全相同的东西。例如,我希望测试告诉我abcxyz但与 相同\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}

它根据框的高度、宽度和深度进行测试。这显然不是很可靠,因为两个非常不同的东西(例如xyzzyx)可以具有相同的宽度、高度和深度。它也不能处理任意输入(例如\par\vspace}。

虽然我想要一个完美的 LaTeX 解决方案,但我对失败频率更低的测试更感兴趣,即使是基于 LuaTeX 的解决方案

答案1

在标准 TeX 中,没有办法查看已经打包的盒子内部;可以将其拆箱,但只有当最后一个项目是惩罚或跳过时才可以移除它(该过程可以重复,但会在任何其他项目处停止)。

排版框内的列表无法从用户层面访问,并且存储在 TeX 内部。基本上,您只能测试框的尺寸,这当然不是一个可靠的测试。

利用 LuaTeX,可以通过适当的回调访问几乎每个级别。

相关内容