使用带有 `\import` 的 `amsthm` 包时出现“已定义”错误

使用带有 `\import` 的 `amsthm` 包时出现“已定义”错误

我使用\import命令来模块化我的章节。我也使用amsthm包来定义我自己的定理环境。

当我尝试编译主(根)文件时,出现以下错误:

Command \thm already defined. ...bered,vlined]{algorithm2e}\newtheorem {thm}
Command \lem already defined. ...em {thm}{Theorem}[section]\newtheorem {lem}
Command \cor already defined. ...orem {lem}{Lemma}[section]\newtheorem {cor}
Command \dfn already defined. ...\theoremstyle {definition}\newtheorem {dfn}
Command \rem already defined. ...ion}\theoremstyle {remark}\newtheorem {rem}

我必须为每个子文件重新定义它们,因为我想独立编译和查看它们的输出。

我的源文件如下:

根:

%%temp.tex
\documentclass[12pt]{report}
\usepackage[subpreambles=true]{standalone}
\usepackage[ruled,linesnumbered,vlined]{algorithm2e}

\usepackage{sectsty}

\chapternumberfont{\LARGE} 
\chaptertitlefont{\Huge}
\usepackage{import}
\usepackage{amsmath,amssymb,amsfonts,amsthm,complexity,tikz,parskip,subcaption}
\usepackage{graphicx}
\usepackage[nottoc]{tocbibind}
\usepackage{setspace}
\setcounter{tocdepth}{1}


\begin{document}

    \chapter{Introduction}
    \import{./}{import1}
    \import{./}{import2}
    

\end{document}

首次导入:

%!TeX root = import1


\documentclass{article}

\usepackage{amsthm,enumerate,euscript,tikz}
\usepackage[ruled,linesnumbered,vlined]{algorithm2e}
\newtheorem{thm}{Theorem}[section]
\newtheorem{lem}{Lemma}[section]
\newtheorem{cor}{Corollary}[section]

\theoremstyle{definition}
\newtheorem{dfn}{Definition}

\theoremstyle{remark}
\newtheorem{rem}{Remark}
\begin{document}
    
\subsection{Theorem}
\begin{thm}
Example theorem
\end{thm}
\begin{proof}
    Example proof
\end{proof}
\end{document}

第二次导入:

%!TeX root = import2


\documentclass{article}

\usepackage{amsthm,enumerate,euscript,tikz}
\usepackage[ruled,linesnumbered,vlined]{algorithm2e}
\newtheorem{thm}{Theorem}[section]
\newtheorem{lem}{Lemma}[section]
\newtheorem{cor}{Corollary}[section]

\theoremstyle{definition}
\newtheorem{dfn}{Definition}

\theoremstyle{remark}
\newtheorem{rem}{Remark}
\begin{document}
    
\subsection{Theorem}
\begin{lem}
Example lemma
\end{lem}
\begin{proof}
    Example proof
\end{proof}
\end{document}

什么原因导致了此错误?我该如何解决?

答案1

据我了解,您需要可编译的子文件。因此,您在其中提供了完整的前言。编译主文件时出现错误,因为有多个定义完全相同\newtheorem。这是由于subpreambles=true您传递给的选项造成的standalone

第一个选项

您可以测试不同的环境/宏是否已定义。例如,您编写了\newtheorem{thm}{Theorem}[section],它定义了\beginthm\endthm。相反,使用

\ifdefined\beginthm\else
\newtheorem{thm}{Theorem}[section]
\fi

对于您定义的每一个,依此类推newtheorem

第二种选择

在主文件中添加完整的前言并删除该standalone选项。缺点是你必须注意各种前言中的更改……

第三种选择

使用subfiles软件包。你只需要在主文件中编写一个前言,它与所有子文件共享,这些子文件可以单独编译。

您的main.tex如下

\documentclass[12pt]{report}
\usepackage{amsmath,amssymb,amsfonts,amsthm}
\newtheorem{thm}{Theorem}[section]
\newtheorem{lem}{Lemma}[section]
\newtheorem{cor}{Corollary}[section]

\theoremstyle{definition}
\newtheorem{dfn}{Definition}

\theoremstyle{remark}
\newtheorem{rem}{Remark}

% end of shared preamble
\usepackage{subfiles}

\begin{document}
    
    \chapter{Introduction}
    \subfile{./import1}
    \subfile{./import2}
    
\end{document}

你的import.tex文件有这种结构

\documentclass[main]{subfiles}

\begin{document}
    
    \subsection{Theorem}
    \begin{thm}
        Example theorem
    \end{thm}
    \begin{proof}
        Example proof
    \end{proof}
\end{document}

编辑

您可以进行子导入。例如,您可以将其编码import1.tex

\documentclass[main]{subfiles}

\begin{document}
    
    \subsection{Theorem}
    \begin{lem}
        Example lemma
    \end{lem}
    \begin{proof}
        Example proof
    \end{proof}
    \subfile{import2}
    \subfile{import3}
\end{document}

但是您import3.tex必须与 共享序言main.tex,而不是与import1.tex,即您必须\documentclass[main]{subfiles}在所有子文件中使用。

答案2

组织项目和测试文档部分的另一种方法是使用和注释您不想编译的部分的\input( )。input

最大的优点是您在一个地方就有完整的序言,所以如果您更改定义或添加包,您不必更改所有部分文件。

主文本

\documentclass[12pt]{report}
\usepackage[subpreambles=true]{standalone}
\usepackage[ruled,linesnumbered,vlined]{algorithm2e}

\usepackage{sectsty}

\chapternumberfont{\LARGE} 
\chaptertitlefont{\Huge}
\usepackage{import}
\usepackage{amsmath,amssymb,amsfonts,amsthm,complexity,tikz,parskip,subcaption}
\usepackage{graphicx}
\usepackage[nottoc]{tocbibind}
\usepackage{setspace}
\setcounter{tocdepth}{1}

\usepackage{amsthm,enumerate,euscript,tikz}
\usepackage[ruled,linesnumbered,vlined]{algorithm2e}
\newtheorem{thm}{Theorem}[section]
\newtheorem{lem}{Lemma}[section]
\newtheorem{cor}{Corollary}[section]
\theoremstyle{definition}
\newtheorem{dfn}{Definition}

\theoremstyle{remark}
\newtheorem{rem}{Remark}

\begin{document}

\chapter{Introduction}

\input{import1c}

\input{import2c}

\end{document}

导入1c.tex

\section{Theorem}
\begin{thm}
Example theorem
\end{thm}
\begin{proof}
    Example proof
\end{proof}

导入2c.tex

\section{Theorem}
\begin{lem}
Example lemma
\end{lem}
\begin{proof}
    Example proof
\end{proof}

笔记

我将\subsection其改为\section符合\newtheorem定义,从而得到正确的编号。

t2

答案3

有一个subfiles专门用于此类目的的包,尽管您应该\input按照其他答案中的建议首先尝试,因为它要简单得多。

使用此subfiles包,您可以将前言保留在主文件中,也可以从子文件中加载它。有关详细信息,请参阅subfiles 包的文档

% temp.tex
\documentclass[12pt]{report}
%\usepackage[subpreambles=true]{standalone}
\usepackage[ruled,linesnumbered,vlined]{algorithm2e}
\usepackage{sectsty}
\chapternumberfont{\LARGE} 
\chaptertitlefont{\Huge}

\usepackage{amsmath,amssymb,amsfonts,amsthm,complexity,tikz,parskip,subcaption}
\newtheorem{thm}{Theorem}[section]
\newtheorem{lem}{Lemma}[section]
\newtheorem{cor}{Corollary}[section]
\theoremstyle{definition}
\newtheorem{dfn}{Definition}
\theoremstyle{remark}
\newtheorem{rem}{Remark}

\usepackage{graphicx}
\usepackage[nottoc]{tocbibind}
\usepackage{setspace}
\setcounter{tocdepth}{1}

\usepackage{subfiles}%%%%% <<<<< load subfiles package last
\begin{document}
....
\end{document}
% import1.tex
\documentclass[temp]{subfiles}%%%% <<< Reference to the main file with the preamble
\begin{document}
\subsection{Theorem}
\begin{thm}
Example theorem
\end{thm}
\begin{proof}
    Example proof
\end{proof}
\end{document}

注意:我是该软件包的维护者subfiles,但我并不一定提倡使用它。

相关内容