什么原因导致“\@next 与其定义不匹配”错误?

什么原因导致“\@next 与其定义不匹配”错误?

我有以下(最小)文档类:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{minimal-article}[2013/01/11 Test class, extends article]
\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}}
\ProcessOptions

% Load parent class with preset options
\LoadClass[a4paper,titlepage]{article}

\RequirePackage{tikz}

\renewcommand\maketitle{%
 \begin{titlepage}%
  \begin{tikzpicture}[remember picture, overlay]%
  \typeout{Drawing a rectangle?} %
   \fill [fill=red] at (current page.south west) rectangle (current page.south east);%
  \typeout{Background rectangle built.}%
  \end{tikzpicture}%
 \end{titlepage}%
 }
 \AtBeginDocument{
  \maketitle
 }

 \endinput

从最小文档文件中使用它时:

\documentclass[11pt]{minimal-article}

\begin{document}
 \tableofcontents
\section{Foo!}
\end{document}

我收到一个奇怪的错误信息:

Drawing a rectangle?
! Use of \@next doesn't match its definition.
\maketitle ...ng a rectangle?} \fill [fill=red] at
                                               (current page.south west)...
l.3 \begin{document}

据我猜测,这一定是一些本地环境问题,因为昨天同一类的非最小版本运行良好,而现在一切都失败了,并出现了那条神秘的消息。

有什么想法会造成这种情况吗?

答案1

Jake 已经展示了导致问题的 Tikz 语法错误,但要回答有关错误消息含义的问题(而不是如何避免出现该错误消息:-) 这是使用“分隔参数”时导致的原始 TeX 错误。考虑

\documentclass{article}


\def\aaa * #1 *{\typeout{argument is #1}}

\aaa * hello *

\aaa !* goodbye *

\stop

该宏\aaa不是按照通常的方式接受参数\aaa 1,而是\aaa{123}接受由两个标记序列分隔的参数 *_ (并_*(用作_可见空格)注意在参数标记#1, #2, ...之间可以使用任何标记序列。

因此在第一种情况下

argument is hello

回显到终端,但在第二种情况下\aaa需要*以下令牌并且它不存在,因此您会在主题行中收到错误消息:

! Use of \aaa doesn't match its definition.
l.8 \aaa !
          * goodbye *
? x
No pages of output.

虽然\defLaTeX 的顶层不支持形式和分隔参数,但在内部使用它们执行各种解析任务是很常见的,显然是 TikZ,但标准 latex 可选参数和图片模式参数也在[ ]内部( )使用这种定义。

答案2

at你的 TikZ 代码中有一个错误。at仅用于放置节点,而不是路径命令。如果你使用

\fill [fill=red] (current page.north east) rectangle (current page.south west);%

相反(注意我也改变了坐标),一切正常。

相关内容