在独立的多个子文件中使用 newcommand

在独立的多个子文件中使用 newcommand

因此,我正在使用该包standalone合并多个单独的文件。在每个子文件中,我定义了一个新命令(每个子文件中的命令都相同)。问题是,当我使用 standalone 合并两个子文件时,我收到与重新定义命令相关的错误。

主文件:

\documentclass[class=article,float=true,crop=false, paper=a4,fontsize=11pt,twocolumn]{standalone}
\usepackage[subpreambles=true]{standalone}
\usepackage{import}

\begin{document}
    \import{1/}{1}
    \import{2/}{2}
\end{document}

子文件1:

\documentclass[class=article,float=true,crop=false,paper=a4,fontsize=11pt,twocolumn]{standalone}
\usepackage[subpreambles=true]{standalone}
\newcommand{\opt}{\text{OPT}}

\begin{document}
    Subfile 1 $\opt$
\end{document}

子文件2:

\documentclass[class=article,float=true,crop=false,paper=a4,fontsize=11pt,twocolumn]{standalone}
\usepackage[subpreambles=true]{standalone}
\newcommand{\opt}{\text{OPT}}

\begin{document}
    Subfile 2 $\opt$
\end{document}

编译的时候出现如下错误信息:

! LaTeX Error: Command \opt already defined.

答案1

方法 1:

正如 Skillmon 已经说过的,您可以使用\providecommand而不是\newcommand

\providecommand仅当尚未定义时才会尝试定义所讨论的宏。)

方法 2:

独立手册说document导入文件的环境被视为本地范围/组。

因此,您可以通过将的定义放入 -environment 中\opt来将其限制在 -environment 的范围内。我知道您通常不会在-environment 中执行,但您可以这样做:documentdocument\newcommanddocument

主文本

\documentclass[class=article,float=true,crop=false, paper=a4,fontsize=11pt,twocolumn]{standalone}
\usepackage[subpreambles=true]{standalone}
\usepackage{import}

\begin{document}
    \import{1/}{1}
    \import{2/}{2}
\end{document}

/1/1.tex

\documentclass[class=article,float=true,crop=false,paper=a4,fontsize=11pt,twocolumn]{standalone}
\usepackage[subpreambles=true]{standalone}
\usepackage{amsmath}

\begin{document}
    % have defining performed inside the document-environment:
    \newcommand{\opt}{\text{OPT 1}}%
    Subfile 1 $\opt$
\end{document}

/2/2.tex

\documentclass[class=article,float=true,crop=false,paper=a4,fontsize=11pt,twocolumn]{standalone}
\usepackage[subpreambles=true]{standalone}
\usepackage{amsmath}

\begin{document}
    % have defining performed inside the document-environment:
    \newcommand{\opt}{\text{OPT 2}}%
    Subfile 2 $\opt$
\end{document}

当然,这种方法只适用于不在文档环境范围之外使用的宏。即:在文档环境中定义的标记不应该未扩展就进入移动参数如参考标签或章节标题或\captions!

方法 3:

在所有文件都使用完全相同的前导码和后导码的情况下,我根本不使用独立或子文件之类的包,而是将前导码和后导码保存在单独的文件中,并让 LaTeX 维护一个计数器,用于跟踪的嵌套级别,\input如果的嵌套级别为\input0 ,则可能需要后导码
。如果前导码已经加载,因此\documentclass-command 被重新定义为等于,则在增加输入嵌套级别的计数器后,将通过提前\@twoclasseserror中止处理 preamble.tex 。如果输入嵌套级别的计数器大于 0,则在减少输入嵌套级别的计数器后, 将提前中止处理 postamble.tex 。\endinput
\endinput

./preamble.tex

\expandafter\ifx\csname @twoclasseserror\endcsname\documentclass
  \stepcounter{preambleinputcounter}%
  \expandafter\endinput
\fi
%
% The preamble:
%
\documentclass[a4paper, 11pt,twocolumn]{article}
\newcounter{preambleinputcounter}
% import – establish input relative to a directory
\usepackage{import}
\usepackage{amsmath}
\newcommand{\opt}{\text{OPT}}%
\begin{document}%

./postamble.tex

\ifnum\number\value{preambleinputcounter}>0 %
  \addtocounter{preambleinputcounter}{-1}%
  \expandafter\endinput
\fi
%
% The "postamble":
%
\end{document}%

./main.tex

\input{./preamble.tex}%
\import{./1/}{1}
\import{./2/}{2}
\input{./postamble.tex}%

./1/1.tex

\input{../preamble.tex}%
Subfile 1 $\opt$
\input{../postamble.tex}%

./2/2.tex

\input{../preamble.tex}%
Subfile 2 $\opt$
\input{../postamble.tex}%

答案2

我不确定您想要的最终结果是什么 - 如果您想集成由Subfile1和生成的 PDF Subfile2,或者您只是将.tex文件拆分为多个子文件。 (我假设您正在执行后者,但如果我错了,请纠正我)。

如果您使用该命令,对您来说会容易得多input{},因为那时您只有一个前导码,.tex您稍后在项目中合并的每个文件都可以访问它。

因此,你的项目将如下所示:

主文件

\documentclass[class=article,float=true,crop=false, paper=a4,fontsize=11pt,twocolumn]{standalone}
\usepackage[subpreambles=true]{standalone}

% global declaration of command - can be used in any file called by \input
\newcommand{\opt}{\text{OPT}}

\begin{document}
    \input{Subfile1.tex}
    
    \input{Subfile2.tex}
\end{document}

子文件1.tex(请注意,这些文件根本不需要任何前言)

Subfile 1 $\opt$

子文件2.tex

Subfile 2 $\opt$

这会给你结果

在此处输入图片描述

相关内容