长度值不正确的自定义错误消息?

长度值不正确的自定义错误消息?

在 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}

? 

相关内容