错误:缺少插入的 \endcsname。\tex_let:D \begin{}

错误:缺少插入的 \endcsname。\tex_let:D \begin{}

我正在使用 texmaker 4.5。我试图在 Windows 10 上编译以下文本:

\documentclass[english]{MastersDoctoralThesis} 
\begin{document}
\frontmatter 
\begin{titlepage}

    The Title.

\end{titlepage}
\begin{declaration}

    The Declaration.

\end{declaration}
\end{document} 

但是当我编译它时,出现以下错误:

''! Missing \endcsname inserted.
<to be read again>
\tex_let:D
\begin{document}''

我该如何解决?


该模板可以在以下位置找到:http://www.latextemplates.com/template/masters-doctoral-thesis

答案1

更新日期:2017/03/09xparse从 2017/03/07 开始,随着和包的新更新,expl3可以使用 \DeclareDocumentCommand\csname ...\endcsname构造之前定义的命令,例如在“\pagestyle”的后台代码中就是这种情况。

\blank@p@gestyle宏定义在MDT不可\DeclareDocumentCommand扩展的地方,但\pagestyle需要一个可扩展的名称,因此失败。

使用这个绕过代码

\makeatletter
\AtBeginDocument{
  \renewcommand{\blank@p@gestyle}{empty}
}
\makeatother

宏可以再次扩展。

将来的版本xparse将消除这种绕过的必要性。

这个小文档显示了相同的错误(并且是所发生情况的简短版本)

\documentclass{article}

\usepackage{xparse}

\DeclareDocumentCommand{\foo}{}{empty}

\begin{document}
\pagestyle{\foo}

\end{document}

答案2

该模板显示了一些\NewDocumentCommand和的错误用法\DeclareDocumentCommand

例如,

\NewDocumentCommand{\supervisor}{m}{%
  \DeclareDocumentCommand{\supname}{}{#1}%
}

(为了便于阅读,代码重新格式化)应该是

\newcommand\supname{}
\NewDocumentCommand{\supervisor}{m}{%
  \renewcommand\supname{#1}%
}

因为\supname只是一个变量,而不是文档命令。更好的方法是,使用expl3编程,假设\ExplSyntaxOn有效,

\NewDocumentCommand{\supervisor}{m}
 {
  \tl_set:Nn \supname { #1 }
 }

更好的是,

\tl_new:Nn \g_mdt_supname_tl

\NewDocumentCommand{\supervisor}{m}
 {
  \tl_gset:Nn \g_mdt_supname_tl { #1 }
 }

如果\supname允许在文档中使用,

\cs_new:Npn \supname { \tl_use:N \g_mdt_supname_tl }

这个问题源于

\NewDocumentCommand{\blank@p@gestyle}{}{empty}

应该是

\tl_set:Nn \blank@p@gestyle { empty }

或者,使用传统编程,

\newcommand\blank@p@gestyle{empty}

因为的参数应该\pagestyle是完全可扩展的,而定义的某些东西\NewDocumentCommand却不是。

相似地,

\NewDocumentCommand{\setblankpagestyle}{ m }{%
  \DeclareDocumentCommand{\blank@p@gestyle}{}{#1}%
}

应该

\NewDocumentCommand{\setblankpagestyle}{ m }
 {
  \tl_set:Nn \blank@p@gestyle { #1 }
 }

或者,在传统编程中,

\NewDocumentCommand{\setblankpagestyle}{ m }{%
  \renewcommand\blank@p@gestyle{#1}%
}

相关内容