我想使用两个互相冲突的包,希望在需要的时候可以分别应用它们,然后取消它们,这样可以解决问题吗?
例如我想要以下作品:
\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}