errmessage 中的命令扩展

errmessage 中的命令扩展

当我跑步时

\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}.

相关内容