当我跑步时
\documentclass{article}
\def\pet{dog}
\errmessage{My \pet\ is {sick}}
\begin{document}
My \pet\ is {sick}.
\end{document}
错误信息是:
我的狗{病了}。
但 PDF 输出内容如下:
我的狗病了。
这是怎么回事?为什么\pet
展开了,但\␣
却没有展开?为什么错误消息中会打印出那些括号?我不应该写\{
和\}
来得到括号吗?
答案1
文档clsguide.pdf
的第 4.9 节提到\space
,但不是\
(即反斜杠后跟空格)。
\newcommand{\foo}{FOO}
\PackageError{ethel}{%
Your hovercraft is full of eels,\MessageBreak
and \protect\foo\space is \foo
}{%
Oh dear! Something's gone wrong.\MessageBreak
\space \space Try typing \space <return>
\space to proceed, ignoring \protect\foo.
}
不要\space
与混淆\
;前者扩展为一个空格,而后者不可扩展;你会发现,在 LaTeX 内核中,
\def\space{ }
答案2
不是问题的答案,但足够相关,值得写出来。LaTeX3 提供了格式化消息的方法。特别是,在命令中\iow_wrap:nnnN
(因此在所有消息中),\
被定义为扩展为空格(就像\space
)。可用的格式化命令列表目前是
\
扩展为一个空间\{
扩展为{
\}
扩展为}
\#
扩展为#
\%
扩展为%
\~
扩展为~
\\
转到下一行\iow_indent:n
接受一个参数并将其缩进四个空格。
例如(好吧,我应该做点什么\rescale
而不是总是抛出错误......)。
\documentclass{article}
\usepackage{expl3, xparse}
\ExplSyntaxOn
\msg_new:nnnn { mypkg } { percentage-too-high }
{ The~fuction~\token_to_str:N\rescale\ cannot~scale~more~than~1000\% ! }
{
You~asked~to~rescale~the~picture\\\\
\iow_indent:n {#1} \\ \\
by~#2\%,~but~this~is~impossible.
}
\NewDocumentCommand{\rescale}{mm}
{ \msg_error:nnnn { mypkg } { percentage-too-high } {#1} {#2} }
\ExplSyntaxOff
\begin{document}
\rescale{foobar}{3250}
\end{document}
答案3
根据 [clsguide.pdf,§4.9],在错误消息中输入空格的正确方法是写\space
而不是\␣
。
要理解这里发生了什么,我们必须记住\errmessage
输出到文本控制台,而大多数 LaTeX 命令输出到正在制作 pdf。 像 这样的命令\␣
已经完全展开;剩下要做的就是执行它们。 但在纯文本的情况下执行这种命令是没有意义的。 因此,只有像 这样的少数命令\space
被编程为在 中有意义\errmessage
。
答案4
您认为\edef\temp{My \pet\space is sick}
会扩展到什么程度?
\documentclass{article}
\def\pet{dog}
\begin{document}
\edef\temp{My \pet\ is {sick}}
\meaning\temp
\show\temp
\end{document}
\temp=macro:->My dog\ is {sick}.