\DeclareUnicodeCharacter 处出现未定义的控制序列错误

\DeclareUnicodeCharacter 处出现未定义的控制序列错误

我正在尝试使用期刊《语义学与语用学》提供的文档类文件编写一个文件,网址为http://info.semprag.org/style。但是,我甚至无法编译他们提供的示例模板...每当我尝试运行LaTeX它时,都会出现以下错误:

ERROR: Undefined control sequence.

--- TeX said ---
./sp.cls:107:
Undefined control sequence.
<recently read> \DeclareUnicodeCharacter 

l.107 \DeclareUnicodeCharacter
                              {2011}{\mbox{-}\nobreak\hskip0pt}

我尝试使用auctex和 overleaf.com,但错误仍然相同。

奇怪的是,我通过谷歌搜索找不到任何与“未定义的控制序列”错误相关的内容\DeclareUnicodeCharacter。这对我来说毫无意义,因为显然 TeX 引擎认为这\DeclareUnicodeCharacter根本不是一个有效的命令,而文档类文件以及互联网上的各种示例直接使用此命令没有任何问题。在最新版本的 TeX 引擎中使用文档类文件时,是否存在问题,还是我配置错误?


编辑:编译日志:https://www.dropbox.com/s/49mkenzngua0we0/sp-template.log?dl=0

答案1

该宏\DeclareUnicodeCharacter在包中定义inputenc当加载编码utf8. 因此通常在使用之前你需要以下行\DeclareUnicodeCharacter

\usepackage[utf8]{inputenc}

但在本例中,sp.cls已经包含\RequirePackage[utf8]{inputenc}第 103 行,它在第 107 行使用,因此即使没有明确添加该行,\DeclareUnicodeCharacter您也应该能够进行编译。sp-template.texpdflatex

然而,如果您使用xelatexlualatex引擎(基于Unicode并默认为utf8)进行编译,则inputenc包将被忽略,并且(仅)在错误日志中打印一条警告:

% xelatex sp-template.tex
This is XeTeX, Version 3.14159265-2.6-0.99998 (TeX Live 2017) (preloaded format=xelatex)
 restricted \write18 enabled.
entering extended mode
(./sp-template.tex
LaTeX2e <2017-04-15>
Babel <3.10> and hyphenation patterns for 84 language(s) loaded.
(./sp.cls
Document Class: sp 2015/01/04 v.3.0 Class for Semantics & Pragmatics
(/usr/local/texlive/2017/texmf-dist/tex/latex/base/article.cls
Document Class: article 2014/09/29 v1.4h Standard LaTeX document class
(/usr/local/texlive/2017/texmf-dist/tex/latex/base/size12.clo)) (/usr/local/texlive/2017/texmf-dist/tex/latex/stmaryrd/stmaryrd.sty) (/usr/local/texlive/2017/texmf-dist/tex/latex/base/textcomp.sty (/usr/local/texlive/2017/texmf-dist/tex/latex/base/ts1enc.def)) (/usr/local/texlive/2017/texmf-dist/tex/latex/amsfonts/amssymb.sty (/usr/local/texlive/2017/texmf-dist/tex/latex/amsfonts/amsfonts.sty)) (/usr/local/texlive/2017/texmf-dist/tex/latex/base/fontenc.sty (/usr/local/texlive/2017/texmf-dist/tex/latex/base/t1enc.def) (/usr/local/texlive/2017/texmf-dist/tex/latex/lm/t1lmr.fd)) (/usr/local/texlive/2017/texmf-dist/tex/latex/psnfss/mathptmx.sty) (/usr/local/texlive/2017/texmf-dist/tex/latex/base/inputenc.sty

Package inputenc Warning: inputenc package ignored with utf8 based engines.

)
! Undefined control sequence.
<recently read> \DeclareUnicodeCharacter 

l.107 \DeclareUnicodeCharacter
                              {2011}{\mbox{-}\nobreak\hskip0pt}
? 

(请注意以“Package inputenc warning”开头的行。在我看来,这是一个错误是有道理的,但可能是的作者inputenc选择将其设为警告,因为许多用它编写的文件inputenc即使不执行任何操作也有机会在基于 Unicode 的引擎上运行inputenc。)

因此你需要

  1. 使用 pdfTeX 引擎编译你的文件,或者
  2. 如果您希望使用 XeTeX/LuaTeX 进行编译,请sp.cls删除以下行:

    \DeclareUnicodeCharacter{2011}{\mbox{-}\nobreak\hskip0pt}
    

    (注意,它被添加来处理连字符问题使用基于 Unicode 的引擎不太可能出现这种情况,因为大概没有人会在 U+2011 之后定义连字符),以及这些用于\ifpdf表示“非 PostScript 输出”但不幸的是不包括 XeTeX 的行但不是 LuaTeX(可以移除,因为breakurl不需要):

    % If the author is using postscript (discouraged), then load the
    % breakurl package, else don't load it.
    \RequirePackage{ifpdf}
    \ifpdf
    \else
      \RequirePackage{breakurl}
    \fi
    

(请注意,如果您将源.tex文件发送给其他人,例如期刊,则不应选择后者:并且一般而言,如果您向期刊提交论文,则不应弄乱其样式文件。但如果您不打算将文件发送给任何人,而只是为了自娱自乐而按照期刊的样式进行排版,那么您可以做任何您想做的事情。)

相关内容