在 texlive2017 中使用 LuaLaTeX,但我认为这普遍适用。
问题:是否可以设置自定义错误消息,当错误值用作长度参数时将显示该消息?自定义消息将定义为字符串,可在文档中的各个位置进行更改。
通常的错误信息是“缺失数字,视为零”。就我而言,使用自定义文档类,我希望能够引导用户到文档中的特定位置。MWE:
\documentclass{article}
\newlength\mylength
\def\notalengthvalue{Hello!}
\def\isalengthvalue{20.6pt}
\begin{document}
\def\myerrmsg{Read documentation section 1.2.3.}
\setlength\mylength{\notalengthvalue} % error message is \myerrmsg
\def\myerrmsg{Read documentation section 3.7.2.}
\setlength\mylength{\notalengthvalue} % error message is \myerrmsg
\setlength\mylength{\isalengthvalue} % no error
\end{document}
如果 TeX 有 Try/Catch 例程,那就简单了。没有 Try/Catch,还有其他方法吗?也就是说,不需要对所有可能的长度字符串进行强力预解析。
答案1
这是一个低级 tex 解析错误(措辞来自 tex-the-program,传统上它在池文件中可见,但现代实现不使用单独的池文件)。
因此它不能从 tex 代码中更改,您所能做的就是修改(比如说)\setlength
以检测非长度输入并避免尝试原始长度分配。
对于 luatex 你可以这样做:
\documentclass{article}
\directlua{
function my_error ()
local e =status.lasterrorstring
if(e=='! Missing number, treated as zero') then
texio.write_nl ('! Missing number,\string\n\space\space perhaps you should look at page 6')
else if(e=='! Illegal unit of measure (pt inserted)') then
texio.write_nl ('! Illegal unit of measure\string\n\space\space you really should look at page 6 of the documentaion')
else
texio.write_nl(e)
end
end
end
luatexbase.add_to_callback('show_error_message',my_error,'error message hook')
}
\begin{document}
\setlength\oddsidemargin{x}
\newcommand\cos{\sin}
\def x {y}
\end{document}
其产生的终端输出为:
! Missing number,
perhaps you should look at page 6.
<to be read again>
x
l.19 \setlength\oddsidemargin{x}
?
! Illegal unit of measure
you really should look at page 6 of the documentaion.
<to be read again>
x
l.19 \setlength\oddsidemargin{x}
?
! LaTeX Error: Command \cos already defined.
Or name \end... illegal, see p.192 of the manual.
See the LaTeX manual or LaTeX Companion for explanation.
Type H <return> for immediate help.
...
l.21 \newcommand\cos{\sin}
?