! 段落在 \@optionaltemp 完成之前结束

! 段落在 \@optionaltemp 完成之前结束

下面是我的注释示例代码:

\a 
\begingl
\gla nie ale jeśli ją \underline{pan} \underline{zobaczy} \underline{będzie}
\underline{pan} \underline{wiedział} że to do mnie //
\glb non mais si {\sc 3sg.dat} {\sc 2sg.pol} voir-{\sc 3sg.fut} être-{\sc 3sg.fut}
{\sc 2sg.pl} savoir-{\sc 3sg.pp} que ce{$_etre-{\sc 3sg}$} pour {\sc 1sg}//
\glft 'non, mais quand vous la verrez vous saurez que c'est pour moi'//
\endgl

这是我在编译时遇到的错误:

! Paragraph ended before \@optionaltemp was complete.
<to be read again>
\par
l.2035 ... \underline{wiedział} że to do mnie //
I suspect you've forgotten a `}',

所以我检查了所有东西},一切似乎都很好。所以要么是我眼瞎了,要么是我漏掉了其他东西。

答案1

这个问题是一个很好的例子,说明了为什么最少的例子而不是代码片段对于向他人解释问题以及自己找到问题的根源都非常有帮助。

错误和行号

如果我将您提供的代码片段转换为最小示例,它可以编译而不会出现错误:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{expex}
\begin{document}

\pex
\a 
\begingl
\gla nie ale jeśli ją \underline{pan} \underline{zobaczy} \underline{będzie}
\underline{pan} \underline{wiedział} że to do mnie //
\glb non mais si {\sc 3sg.dat} {\sc 2sg.pol} voir-{\sc 3sg.fut} être-{\sc 3sg.fut}
{\sc 2sg.pl} savoir-{\sc 3sg.pp} que ce{$_etre-{\sc 3sg}$} pour {\sc 1sg}//
\glft 'non, mais quand vous la verrez vous saurez que c'est pour moi'//
\endgl
\xe
\end{document}

代码输出

这清楚地表明有问题的代码不是您遇到的错误的根源。这通常是 TeX 中相当常见的问题:TeX 丢失的行不一定是错误的真正根源:它可能位于文档中更早的位置。

如果您遇到错误,我们可以在最小示例中重现该错误,方法是删除//注释行末尾的一对结束符。(我没有在此处包含代码,而是显示了编辑器中的屏幕截图,其中明确显示了行号。)

编辑器截图

请注意,//代码的第 11 行已删除。现在让我们看一下错误:

./expexerror.tex:13: Argument of \@optionaltemp has an extra }.
<inserted text> 
            \par 
l.13 ...que ce{$_etre-{\sc 3sg}$} pour {\sc 1sg}//

? 

错误显示 位于第 13 行,尽管该行本身格式正确。出现这种情况的原因(大致)是 ExPex 扫描其注释行,直到找到结束符//,在本例中位于第 13 行的末尾。但是在\gla第 10 行的开始和 //第 13 行之间有另一个\glb命令,它不知道该如何处理,因此导致错误。

因此,不幸的是,查找错误并不像简单地阅读日志或控制台输出并查看行号那么简单(尽管这绝对是一个很好的起点)。如果您确定报告的行没有错误,那么您应该始终向后查看以查看错误可能来自何处。在这种情况下,它可能不是太远(可能是前一行\gla),但在其他类型的类似错误中(不是 ExPex),实际来源可能相当远。一个典型的例子是当您忘记\end{...}环境时。

关于您的代码的一些其他评论

您的代码中还有一些其他问题,您可能需要更改。首先,您使用了两个字母的字体更改命令,这些命令在 LaTeX 中基本上已被弃用。请参阅双字母字体样式命令 (\bf,\it,...) 会在 LaTeX 中复活吗?进行一些讨论。

除此之外,最好为这样的语言特征创建一个宏,并使用它,而不是直接添加格式。因此,{\sc 3sg.fut}您可以使用宏,例如\fts{3sg.fut}。(请参阅下面的完整代码。)

此外,您在数学模式中使用它们,这实际上会引发警告,告诉您相关数学字体中没有小写字母。这是由于ce{$_etre-{\sc 3sg}$}您最后一行注释中的 ,如您从上图所见,它以小写形式呈现。处理此问题的最佳方法是加载包amsmath,并使用其\text命令,这允许您在数学表达式中嵌入常规文本。因此,ce{$_etre-{\sc 3sg}$}您应该写而不是ce{$_\text{etre-\fts{3sg}}$}

最后,您在源代码中使用了直引号,这会导致错误的开引号。您应该使用`表示开引号,'使用 表示闭引号(或者,如果您的编辑器支持自动智能引号,并且您使用的是 UTF-8 编码,则只需在源文件中直接使用and即可。)

下面是最小示例的新版本,其中修复了这些问题:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{expex}
\usepackage{amsmath}
\newcommand*{\fts}{\textsc} % \fts = features (use something that works for you)

\begin{document}

\pex
\a 
\begingl
\gla nie ale jeśli ją \underline{pan} \underline{zobaczy} \underline{będzie}
\underline{pan} \underline{wiedział} że to do mnie//
\glb non mais si \fts{3sg.dat} \fts{2sg.pol} voir-\fts{3sg.fut} être-\fts{3sg.fut}
\fts{2sg.pl} savoir-\fts{3sg.pp} que ce{$_\text{etre-\fts{3sg}}$} pour \fts{1sg}//
\glft `non, mais quand vous la verrez vous saurez que c'est pour moi'//
\endgl
\xe
\end{document}

代码输出

相关内容