l3build 使用独立类测试整个页面

l3build 使用独立类测试整个页面

我仍在尝试了解l3build测试是如何进行的,尤其是针对课程的测试。standalone更具体地说

myclass.cls考虑以下基于该类的自定义类( ) standalone,其中varwidth=15cm设置确实很重要:

\ProvidesExplClass
  {myclass}
  {2023/03/27}
  {0.1}
  {
    My Nice Class.
  }
\NeedsTeXFormat{LaTeX2e}
\LoadClass[varwidth=15cm]{standalone}
\endinput

显然,以下测试文件的输出:

\documentclass{myclass}
\usepackage{lipsum}
\begin{document}
\lipsum
\end{document}

varwidth=15cm如果被 取代 的话 就会 完全 不同varwidth=10cm

我尝试创建一个l3build测试来检查这个差异,按照文档第 2.4 节“测试整个页面”l3build提供了以下示例:

\input{regression-test.tex}
\documentclass{article}
\usepackage{expl3}
\START
\showoutput
% Test content here
\vfil\break
\END

为此,我创建了一个sandbox目录,其内容如下:

$ tree sandbox/
sandbox/
├── build.lua
├── myclass.cls
└── testfiles
    └── myclass-test.lvt

可以使用以下命令生成此目录结构和这些各种文件的内容:

mkdir -p sandbox/testfiles
pdflatex generate-sandbox.tex

其中generate-sandbox.tex有以下内容:

\begin{filecontents*}[overwrite]{sandbox/build.lua}
#!/usr/bin/env texlua

-- Build script for "myclass" files

-- Identify the bundle and module
module = "myclass"

-- Engines checked
checkengines = {"luatex"}

-- Source files cover those for rollback
sourcefiles = {"*.cls"}

-- Installed files
installfiles = sourcefiles
\end{filecontents*}

\begin{filecontents*}[overwrite]{sandbox/myclass.cls}
\ProvidesExplClass
  {myclass}
  {2023/03/27}
  {0.1}
  {
    My Nice Class.
  }
\NeedsTeXFormat{LaTeX2e}
\LoadClass[varwidth=15cm]{standalone}
\endinput
\end{filecontents*}

\begin{filecontents*}[overwrite]{sandbox/testfiles/myclass-test.lvt}
\input{regression-test.tex}
\documentclass{myclass}
\usepackage{lipsum}
\START
\showoutput
\lipsum
\vfil\break
\END
\end{filecontents*}

\documentclass{article}
\begin{document}
\end{document}

如果我将测试输出保存myclass-test.lvt.tlg文件:

cd sandbox
l3build save myclass-test

然后替换varwidth=15cmvarwidth=10cm,则:

l3build check myclass-test

声称“所有检查都通过”,而如上所述,“真实”输出完全不同。

我是否遗漏了什么?

顺便说一句,如果自定义类依赖于(),standalone而不是,那么随后用替换会导致检查失败。article\LoadClass[a4paper]{article}a4papera5paper

答案1

文件lvt必须像“普通”文档一样工作。在这里,当您测试排版文本时,您需要\begin{document}日志或多或少只是记录

! LaTeX Error: Missing \begin{document}

因此当您进行更改时,您仍然会遇到相同的错误,并且测试“通过”。

一般来说,手动检查保存的标准化日志是一个重要原则。如果您只是保存tlg测试版本的内容,l3build 将尝试确保保留所有早期错误。

通常情况下,只需添加就足够了,但在这里,您以(或多或少)原始( )\begin{document}结束,使用可避免通常由完成的一些工作,其中一些工作可能会在日志中显示为不需要的行。但是一个非常特殊的包,将所有内容都放在一个框中,以便它可以测量并裁剪到宽度,因此会出现错误,您需要\END\end\@@end\end{document}standalone\END\end{document}

对于任何其他类别

\input{regression-test.tex}
\documentclass{myclass}
\usepackage{lipsum}
\begin{document}
\START
\lipsum
\vfil\break
\showoutput
\end{document}

然后就可以工作了,但是由于standalone调整document环境的方式使得内部框在输出之前被保存和测量,所以\showoutput没有效果,因为该组在输出之前已经完成。

你可以使用

\input{regression-test.tex}
\documentclass{myclass}
\usepackage{lipsum}
\begin{document}
\START
\lipsum
\vfil\break
{\globaldefs=1 \showoutput}
\end{document}

但是 globaldefs 使用起来很棘手,它可能会破坏代码,所以您需要确保正在测试“好的”代码路径。

更安全的做法是从盒子寄存器设置中记录一些内容,例如\showlists

\input{regression-test.tex}
\documentclass{myclass}
\usepackage{lipsum}
\begin{document}
\START
\lipsum
\vfil\break
\showlists
\end{document}

相关内容