这是我的第一个 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 }".
如上图所示,除了我认为是错误消息之外,还有一些来自 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 的调试信息,似乎 @MT@gobble@to@nil 和 \MT@prot@getfirstgrouptc 可能导致了该问题,并且它是 abstractpage.tex 文件中的内容,位于 metafiles/abstractpage.tex。
打开 abstractpage.tex 后,发现它确实包含创建组的命令(\begingroup 和 \endgroup)。我非常怀疑问题出在摘要中,因此我注释掉了 dissertation.tex 中的 \makeabstract 部分,如下图所示(行:36-38):
并且项目编译正常,没有错误(在 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
以某个命令开头,这通常会导致错误。
center
item
在内部实现为具有一个元素的列表,并以以下内容开头文本:
\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}