命令已定义,但在哪里?

命令已定义,但在哪里?

我正在尝试编译一份长文档,但收到以下错误消息:

Command \titlefont already defined

因此,我打开了 .log 文件以了解发生了什么。错误消息周围的行如下:

("C:\Program Files\MiKTeX 2.9\tex\latex\koma-script\scrlfile.sty"
Package: scrlfile 2017/09/07 v3.24 KOMA-Script package (loading files)
)))

LaTeX Warning: Command \@footnotemark  has changed.
           Check if current package is valid.


! LaTeX Error: Command \titlefont already defined.
           Or name \end... illegal, see p.192 of the manual.


See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...                                              

l.1225 \newcommand*\titlefont{\sectfont}
                                    %

因此,在我看来,其中scrlfile.sty包含了该\titlefont命令的新定义。但事实并非如此。如您所见,无论哪个文件包含该新定义,它都位于第 1225 行,而该文件scrlfile.sty只有 492 行。因此,我的问题是:

我如何确定哪个包正在尝试重新定义该\titlefont命令?

笔记:我的 LaTeX 没有定义该\titlesec命令。

答案1

根据包/类的定义\titlefont,非穷举搜索可能包括

$ pushd /usr/local/texlive/2018/texmf-dist/tex/latex/

$ grep -r '\\newcommand.*\\titlefont'
achemso/achemso.cls:\newcommand*\titlefont{\bfseries\sffamily}
curve/curve.cls:\newcommand\titlefont[1]{\gdef\@titlefont{#1}}
disser/disser.cls:  \newcommand\titlefont{\Large\bfseries}
koma-script/scrartcl.cls:\newcommand*\titlefont{\sectfont}%
koma-script/scrartcl.cls:\newcommand*{\scr@fnt@title}{\titlefont}%
koma-script/scrbook.cls:\newcommand*\titlefont{\sectfont}%
koma-script/scrbook.cls:\newcommand*{\scr@fnt@title}{\titlefont}%
koma-script/scrextend.sty:\newcommand*\titlefont{\sectfont}%
koma-script/scrextend.sty:\newcommand*{\scr@fnt@title}{\titlefont}%
koma-script/scrreprt.cls:\newcommand*\titlefont{\sectfont}%
koma-script/scrreprt.cls:\newcommand*{\scr@fnt@title}{\titlefont}%
moderncv/moderncv.cls:\newcommand*{\titlefont}{}
moderncv/moderncv.cls:\newcommand*{\titlestyle}[1]{{\titlefont#1}}
qcm/qcm.cls:\newcommand\titlefont[1]{\gdef\@titlefont{#1}}
simplecv/simplecv.cls:\newcommand{\titlefont}[1]{\def\cv@tit@fnt{#1}}

$ grep -r '\\def\\titlefont'
dialogl/listout.tex:\def\titlefont{bold}
dialogl/listout.tex:\def\titlefontsize{10}
dialogl/listout.tex:\def\titlefont{bold}
dialogl/listout.tex:\def\titlefontsize{10}
disser/autoref.rtx:\def\titlefont{\normalsize}
disser/bachelor.rtx:\def\titlefont{\Large\bfseries}
disser/candidate.rtx:\def\titlefont{\normalsize}
disser/doctor.rtx:\def\titlefont{\normalsize}
disser/master.rtx:\def\titlefont{\Large\bfseries}
disser/specialist.rtx:\def\titlefont{\Large\bfseries}
ifmslide/ifmslide.sty:  \def\titlefont{\LARGE\color{title}\bfseries}
paper/paper.cls:\def\titlefont#1{\def\t@font{#1}}            \def\t@font{}
pdfslide/pdfslide.cfg:  \def\titlefont{\@setfontsize\titlefont{24}{26}\color{dm}\rmfamily\bfseries}
pdfslide/pdfslide.sty:  \def\titlefont{\@setfontsize\titlefont{24}{26}\color{dm}\rmfamily\bfseries}

$ popd

带有行号(现在我读了 OP......)

$ grep -r -n '\\newcommand\*\\titlefont'
achemso/achemso.cls:582:\newcommand*\titlefont{\bfseries\sffamily}
koma-script/scrartcl.cls:2725:\newcommand*\titlefont{\sectfont}%
koma-script/scrbook.cls:2943:\newcommand*\titlefont{\sectfont}%
koma-script/scrextend.sty:1305:\newcommand*\titlefont{\sectfont}%
koma-script/scrreprt.cls:2940:\newcommand*\titlefont{\sectfont}%

1225 行指的是其他一些\newcommand*\titlefont

答案2

如果你从其中之一开始糟糕的模板,几十个包裹都装上去,你就麻烦了。

据我所知,只有三种方法可以找出哪个包定义了某个命令。

当然,你总是搜索所有使用的包的源代码。好的,可能需要很长时间。

其他选项:在您的问题中列出您在此处加载的所有包,也许有人知道哪个包定义了(在您的情况下)\titlefont

我建议为你的长篇作品创建一个新的 *.tex 文件,并提供一个不同的将此文件命名为。保留前言。但删除(在副本中,而不是在您宝贵的原始文件中!)除第 1225 行左右的文本之外的所有内容。

如果你运气好,编译时会得到相同的错误。然后你可以开始注释掉包,直到错误消失。小心,错误可能会消失,因为你事先会得到另一个错误。

如果你们不和睦,就把那份复制的文件作为 MWE 的基础。

我们最近遇到了一个类似的问题:如何找到导致明显不兼容问题的软件包?。最后,提问的人在构建 MWE 时找到了解决方案,但这确实是一个卑鄙的陷阱:词汇表包加载了 amsmath。如果在 amsmath 之前加载,unicode-math 包会抛出错误。如果没有 MWE,他永远不会发现。

相关内容