如何在创建包/类时检查错误

如何在创建包/类时检查错误

简而言之:如果不将 .cls/.sty 文件导入到项目/不使用该包,如何能找到包/类中的错误?

注意:我正在寻找一种检查包/类错误的通用方法,而不是寻找帮助定位 V1 包中的(特定)错误。

我最近一直在编写包 (.sty) 和类 (.cls),有时在加载它们时,我会收到包/类文件中出现的错误。我在 Overleaf 中编写 LaTeX,为了使用我的包和类,我会从保存所有 .sty/.cls 文件的项目中导入它们。因此,项目中的文件如下所示: 看起来像这样

问题是,如果这是包中的错误,它只会出现在 main.txt 文件中,并且不会显示错误在包(.sty)中的哪个位置。

例如,当我使用包 V1 时出现此错误: 错误!

但是当我不使用包 V1 时,它工作得很好,所以我知道问题出在包 V1 内部,或者与包 V1 有关。

有时可能会因为缺少 $$ 而导致错误或其他问题。令人讨厌的是,它只会在我加载包的地方显示错误,而不会在包本身中显示错误。所以在这个例子中,我必须通读整个包,并猜测缺少 $ 符号的位置。

我的问题是:

如何在包/类中查找错误?如何在不使用/导入包的情况下做到这一点?有没有一种方法可以检查错误并显示它们,而无需在 document.txt 文件中测试包和命令?是否有一个按钮可以检查 .cls/.sty 文件中是否存在编译错误或类似内容?

答案1

(披露:我是 Overleaf 的支持人员。)

另一个答案已经解决了文件/行报告的问题以及确定包或类是否语法正确先验。我将解答该问题中与 Overleaf 相关的部分。

当您将文件从另一个项目导入到 Overleaf 项目时,根据设计,该文件不能在新项目中进行编辑。此功能的目的是让一个源项目可以在其中编辑文件。然后,链接到该文件的任何项目都将在编辑器中看到该文件的只读显示。

如果您一心想在 Overleaf 上开发包/类,那么开发工作应该在原始源项目中完成,而不是在任何其他与包文件有链接的项目中完成。您可以在开发包/类的项目中创建一个测试文档,以便轻松测试。一旦包/类开发完成并稳定下来,您就可以根据需要在其他 Overleaf 项目中开始使用该文件。(或者您可以刷新指向自定义包的任何现有链接,以使新开发成果在您的项目中可用。)

我还要提一下,在正常情况下 Overleaf将要报告包或类中的文件/行号(就像您可以在自己的计算机上运行的任何 TeX 发行版一样)。例如,以下代码:

\documentclass{article}
\usepackage{custom-pkg}

\begin{document}
Some text.
\end{document}

项目中有一个名为custom-pkg.sty的文件:

\ProvidesPackage{custom-pkg}

\ifnum\the\year 2019
  \def\mycustom{This is some macro from my package.}
\fi

将导致以下原始日志输出1

(/compile/custom-pkg.sty
Package: custom-pkg 
! Missing = inserted for \ifnum.
<to be read again> 
                   \def 
l.4   \def
          \mycustom{This is some macro from my package.}
I was expecting to see `<', `=', or `>'. Didn't.

! Missing number, treated as zero.
<to be read again> 
                   \def 
l.4   \def
          \mycustom{This is some macro from my package.}
A number should have been here; I inserted `0'.
(If you can't figure out why I needed to see a number,
look up `weird error' in the index to The TeXbook.)

)

或者,在 Overleaf 的日志摘要中(类似于您在许多其他 (La)TeX 编辑器中发现的内容):

在此处输入图片描述

单击后可直接打开.sty报告错误的第 4 行文件。因此,您的软件包文件中可能存在另一个错误,导致行号报告无法正常工作。(并且我假设,如果您使用本地安装的 TeX 发行版进行编译,也会看到相同的行为。

我使用的测试项目是可在 Overleaf 上获取以供参考。


1:对于任何精明的读者来说,compile/子目录是 Overleaf 上的编译器架构的结果。使用本地 TeX 安装编译的文件不会列出这个额外的子目录。

答案2

我无法回答 Overleaf 的具体问题,但一般来说,导入时测试包和类可能很困难,因为您无法获得 TeX 阻塞位置的准确行号。它通常会为您提供足够的行数来找到它,但如果做不到这一点,您可能会遇到麻烦。

事实上,TeX 是一种宏语言;它非常很难拿一个文件说“这是有效的 TeX”,除非真的把它输入 TeX 并看看它说了什么。这也是将 TeX 转换为其他格式如此困难的原因;TeX 是唯一能够正确解析 TeX 文件的东西。

一个选项是将软件包代码插入 LaTeX 文档的前言部分(如果您使用字母字符,请记住用\makeatletter和命令将其括起来,如果这些软件包的用途更广泛,您绝对应该这样做)并在那里进行编译。然后 TeX 将使用行号报告任何错误。\makeatother@

我不相信可以扫描一个包或类文件并说“这是正确的”;你需要给 TeX 一个它可以完全编译的文件。syntonly如果你只是不想生成任何输出,这个包可能值得一看;但如果你想看看它是否有效,你必须给它一个可编译的文件。

相关内容