如何撤消 \usepackage?

如何撤消 \usepackage?

我想使用两个互相冲突的包,希望在需要的时候可以分别应用它们,然后取消它们,这样可以解决问题吗?

例如我想要以下作品:

\documentclass{article}
\usepackage{A}
\begin{document}
ABC
\end{document}

\documentclass{article}
\usepackage{B}
\begin{document}
EFG
\end{document}

答案1

Tex/Latex 具有所谓的单片状态:您无法完全隔离一个软件包与另一个软件包所做的配置,这是可能出现不兼容的原因之一。这意味着无法确定如何撤消命令\usepackage造成的更改。想想在您的机器上安装软件:如果软件对操作系统特定的文件进行了大量更改,并且没有编写卸载脚本,那么除了重新安装操作系统之外,没有其他很好的方法来卸载软件。这里的情况类似,所以正如 Werner 所说,您的可逆性\usepackage是不可能的。

从主要评论来看,您说:正文中只使用了包A,而附录中只使用了包B?

这表明pdfpages如果包冲突确实无法解决,这种方法可能对你有用。工作流程是将文档分成两部分,分别编译附录,并在主文档末尾导入附录的 PDF 输出。请参阅使用 pdfpages 来设置文档页码解释如何在这种情况下使页码正常工作。

这通常不如将所有内容编译到一个文档中那么好,因为 Latex 会丢失整个文档的内容:它可以为页面添加编号并跟踪附录的长度,但它不会将子部分放入目录中,也不会跟踪表格和图片或参考资料。不过,有一款软件试图通过将来自不同编译过程的信息(通过它们的 .aux 文件)结合在一起来构建这个整体画面:请参阅T. Verron 的例子newclude

答案2

这个答案是对Charles Stewart 的精彩回答如果您需要在正文和附录之间进行交叉引用,它将向您展示一种(肮脏且烦人的)解决方法,以解决您将面临的问题。

它使用pdfpages,但不是分别从各自的主文件编译主体和附录,而是从同一个主文件编译它们。

请参阅下面的 MWE 示例。其思路是,您运行 pdflatex 来解析第一部分的引用,然后解析第二部分的引用,然后使用 合并各部分pdfpages

注意:

  • 如果你在正文中引用了附录,则需要额外的运行;
  • 如果您的文档中有目录,您将必须使用\includepdf选项跳过几页,或者仅在最后一次运行中打印目录;
  • mv命令应该替换为适合您操作系统的任何命令(mv应该适用于所有类 Unix 系统,包括 macOS 和 Linux,但值得注意的是不包括 Windows);
  • 您可以通过 调用重命名命令\write18,但我不想使示例变得复杂;
  • 同样地,(在 UNIX 上)您可以使用一个简单的脚本来自动执行此过程,但您需要自己完成;
  • 也许是最重要的部分:如果您的软件包不兼容是关于交叉引用(\ref\contentsline等),那么这种解决方法可能根本不起作用。

无论如何,我都不建议使用这样的工作流程。通常有更好的(依赖于软件包的)方法来解决不兼容问题。

%% Filename : document.tex
\documentclass{article}

\usepackage{pdfpages}
\usepackage{filecontents}

%% We fake a package incompatibility with \newcommand

%% First run pdflatex (enough times) with the following 4 lines uncommented
% \newcommand{\mycommand}{Foo} % Incompatibility
% \includeonly{main}
% \newcommand{\includemain}{\include{main}}
% \newcommand{\includeappendix}{\include{appendix}}
%% Now run 'mv document.pdf main.pdf'

%% Then comment them and uncomment the next 4 lines
% \newcommand{\mycommand}{Bar} % Incompatibility
% \includeonly{appendix}
% \newcommand{\includemain}{\include{main}}
% \newcommand{\includeappendix}{\include{appendix}}
%% Then run 'mv document.pdf appendix.pdf'

%% Then comment all and uncomment these 3 lines:
% \includeonly{}
% \newcommand{\includemain}{\includepdf{main.pdf}}
% \newcommand{\includeappendix}{\includepdf{appendix.pdf}}

\begin{filecontents}{main.tex}
  \section{Section}
  \label{sec:1}
  \mycommand
\end{filecontents}

\begin{filecontents}{appendix.tex}
  See section \ref{sec:1}.
  \mycommand
\end{filecontents}

\begin{document}

\includemain

\includeappendix

\end{document}

相关内容