!\MT@gobble@to@nil 的参数有一个额外的 }

!\MT@gobble@to@nil 的参数有一个额外的 }

这是我的第一个 StackExchange 问题 - 请温柔一点 :) 我有在 Overleaf 上在线使用 Latex 的经验,但从未在本地使用过,所以我对此完全陌生。

我正在尝试使用我大学的论文 Latex 模板,可以在这个 github 链接上找到:https://github.com/DigiUGA/UGA-Dissertation-LaTeX-Template它在 Overleaf 上运行良好。但是,我想在我的个人电脑上使用它(为了安心,也为了用 git 跟踪它)。我使用的是 VScode,带有 James Yu 的 Latex Workshop 扩展和 tex live 安装。在 vscode 上构建项目失败,出现以下错误:"pdflatex: Command for 'pdflatex' gave return code 1".

当然,我打开了 Tex Live 命令行并运行命令“pdlatex dissertation.tex”,它返回了此错误"!Argument of \MT@gobble@to@nil has an extra }".

Tex Live 控制台错误

如上图所示,除了我认为是错误消息之外,还有一些来自 microtype 包的警告。因此,我按照建议,在文件 metafiles/structure.tex 第 28 行禁用了间距选项,如下所示:

%Word spacing and letter spacing
\usepackage[activate={true,nocompatibility},final,tracking=true,kerning=true,spacing=false,factor=1100,stretch=10,shrink=10]{microtype}

这清除了警告,但错误仍然存​​在,并且 pdflatex 命令无法输出 pdf 文件。

有趣的是,虽然 VScode 编译失败并出现错误,但它输出的 pdf 包含所有内容,但目录、图片列表和表格列表均为空白。当我在 VScode 上打开 dissertation.tex 时,第 38 行下方有一条红色波浪线,这表明代码中有错误,如下图所示: vscode 指示 \makeabstract 命令后第 38 行出现错误

将鼠标悬停在此行上会调出 VScode 的调试信息,似乎 @MT@gobble@to@nil 和 \MT@prot@getfirstgrouptc 可能导致了该问题,并且它是 abstractpage.tex 文件中的内容,位于 metafiles/abstractpage.tex。 将鼠标悬停在错误上会显示一些调试信息

打开 abstractpage.tex 后,发现它确实包含创建组的命令(\begingroup 和 \endgroup)。我非常怀疑问题出在摘要中,因此我注释掉了 dissertation.tex 中的 \makeabstract 部分,如下图所示(行:36-38):

在 dissertation.tex 中注释掉 \makeabstract 命令

并且项目编译正常,没有错误(在 VScode 和 Tex Live 命令提示符上),但是缺少摘要。

我使用搜索功能尝试在项目中找到 @MT@gobble@to@nil 或 \MT@prot@getfirstgrouptc 的位置,但没有任何结果,所以我假设它们位于 Tex Live 安装中的某个文件中。

这里可能存在什么问题?我该如何解决?我目前正在研究 abstractpage.tex 文件,看看能否缩小问题范围。我已禁用 \group 和 \endgroup,但这并不能解决问题。提前谢谢您!

(PS:我的设置可以完美编译基本的 IEEE 会议模板)

更新:我将错误缩小到 abstractpage.tex 中的以下三行代码:

  \textsc{\Large{\doctitle}}\\[18pt]
  by\\[18pt]
  \textsc{\Large\docauthor}\\[12pt]

并用以下几行替换它们可以成功编译:

\doctitle\\
by\\
\docauthor\\

然后最奇怪的事情发生了:我本想通过更改每一行来进一步缩小范围,但最后得到的代码几乎与以前相同,而且它有效!我百思不得其解,为什么这会有效:

\newcommand{\makeabstract}[1]{
\begingroup
\newpage

\thispagestyle{empty}
\vspace*{18pt}
\begin{center}

    % \doctitle\\
    % by\\
    % \docauthor\\
  \textsc{\Large{\doctitle}}\\[18pt]
  by\\[18pt]
  \textsc{\Large\docauthor}\\[12pt]
  (Under the Direction of [Prof's Name] (No Dr. or PhD))\\[12pt]
  \textsc{Abstract}
\end{center}

#1

\thispagestyle{empty}

\begin{list}{\textsc{Index words:\hfill}}{\labelwidth 1.2in\leftmargin 1.4in\labelsep 0.2in}
  \item \begin{flushleft}
    [PUT YOUR LIST OF INDEX WORDS HERE SEPERATED BY COMMAS]
  \end{flushleft}
\end{list}
\endgroup
}

但这不起作用:

\newcommand{\makeabstract}[1]{
\begingroup
\newpage

\thispagestyle{empty}
\vspace*{18pt}
\begin{center}
  \textsc{\Large{\doctitle}}\\[18pt]
  by\\[18pt]
  \textsc{\Large\docauthor}\\[12pt]
  (Under the Direction of [Prof's Name] (No Dr. or PhD))\\[12pt]
  \textsc{Abstract}
\end{center}

#1

\thispagestyle{empty}

\begin{list}{\textsc{Index words:\hfill}}{\labelwidth 1.2in\leftmargin 1.4in\labelsep 0.2in}
  \item \begin{flushleft}
    [PUT YOUR LIST OF INDEX WORDS HERE SEPERATED BY COMMAS]
  \end{flushleft}
\end{list}
\endgroup}

第二次更新:好的,那么显然这两行之间需要一个空行?

\begin{center}
  
  \textsc{\Large{\doctitle}}\\[18pt]

如果没有,编译器 (或其他东西) 会添加 \par?希望有经验的人能对此有所启发。

答案1

microtype 修补了\item命令,以实现项目主体开头的突出。此修补程序会提前查看以下命令。遗憾的是,如果后面的文本\item以某个命令开头,这通常会导致错误。

centeritem在内部实现为具有一个元素的列表,并以以下内容开头文本:

\documentclass{article}
\usepackage{microtype}

\newcommand\doctitle{abc}
\begin{document}

\begin{center}
  \textsc{\Large{\doctitle}}
\end{center}

\end{document}

解决方法是

  • 禁用补丁
\microtypesetup{nopatch=item}
  • 例如用一对括号来中断,或者像你发现的那样用一个空行来中断。
\documentclass{article}
\usepackage{microtype}

\newcommand\doctitle{abc}
\begin{document}

\begin{center}
  {}\textsc{\Large{\doctitle}}
\end{center}

\end{document}

相关内容