这是一个可以以两种方式生成错误的类。除非给出两个选项之一,否则它会产生错误,并且它还有一个始终会产生错误的命令。
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{foo}[2014/05/06 foo]
\newif\iffoo@foo
\newif\iffoo@bar
\DeclareOption{foo}{\foo@footrue}
\DeclareOption{bar}{\foo@bartrue}
\ProcessOptions
\iffoo@foo
\AtBeginDocument{foo}
\else
\iffoo@bar
\AtBeginDocument{bar}
\else
\PackageError{foo}{Always use foo or bar option}{Please}
\fi
\fi
\newcommand*{\foobar}{
\PackageError{foo}{The \protect\foobar\space command is obsolete}{}}
\endinput
文件
\documentclass{article}
\usepackage{foo}
\begin{document}
hello
\foobar
\end{document}
触发它们两个:
! Package foo Error: Always use foo or bar option.
See the foo package documentation for explanation.
Type H <return> for immediate help.
...
l.16 ...foo}{Always use foo or bar option}{Please}
和
! Package foo Error: The \foobar command is obsolete.
See the foo package documentation for explanation.
Type H <return> for immediate help.
...
l.7 \foobar
我希望第一个更像第二个。也就是说,我希望它指示\usepackage{foo}
行而不是 sty 文件中的一行。毕竟,这是类的用户应该编辑的内容。
我该如何控制它?
答案1
你无法控制它,TeX 错误信息的最后一行是由底层 TeX 引擎发出的,显示了检测到错误时的位置。它不受宏层的控制
你唯一能做的就是改变检测到错误的位置,例如如果你使用
\AtBeginDocument{\PackageError{foo}{Always use foo or bar option}{Please}}
然后你得到
! Package foo Error: Always use foo or bar option.
See the foo package documentation for explanation.
Type H <return> for immediate help.
...
l.4 \begin{document}