包参数应该依赖于构建环境

包参数应该依赖于构建环境

我正在研究相同的TeX 文件(位于 git 存储库中)位于不同位置。但是,这些不同位置安装了不同版本的 LaTeX。

在工作中,我需要这些标题:

\usepackage[caption=false]{caption}
\usepackage[font=footnotesize]{subfig}

在家里(subfig 包的较新版本),我需要这些标题:

\usepackage[font=footnotesize,caption=false]{subfig}

错误的标头会导致编译失败:在家中使用“work”标头时,subfig 会抱怨我应该停止使用 caption 包。在工作中使用“home”标头时,subfig 会抱怨未知参数。

有没有办法让 LaTeX 检测可用的 subfig 版本并使用“正确”的\usepackage语句?

答案1

您可以使用外部文件:

header_work.tex:

\usepackage[caption=false]{caption}
\usepackage[font=footnotesize]{subfig}

header_home.tex:

% foo, see question

主要.tex:

\documentclass{foo}

\usepackage{bar}

\input{header}
%...
begin{document}
%...

然后,您可以编写一个小的 makefile 或 shell 脚本,根据您的环境创建正确的 header.tex 链接,例如 build.sh:

#!/bin/sh
rm -f header.tex
SOURCE="header_home.tex"
if [ `hostname` = "foo"]
then
  SOURCE="header_work.tex"
fi
ln -s $SOURCE header.tex

pdflatex main.tex

答案2

你可以尝试

\IfFileExists{caption3.sty}{
  % actual syntax to load the subfig package without the caption package
  \usepackage[font=footnotesize,caption=false]{subfig}
}{
  % abbandoned syntax to load the subfig package without the caption package
  \usepackage[caption=false]{caption}
  \usepackage[font=footnotesize]{subfig}
}

它不是万无一失的,但希望能够适用于大多数 TeX 系统。

答案3

这对评论来说有点复杂,但它是我在问题评论中所说的内容的延续,即这种事情正是版本控制系统旨在解决的问题。我使用的是bzr,而不是git,但它们都是分布式版本控制系统,所以我很确定这git也可以工作,但命令的名称会有所不同。

首先,建立一个主存储库并在其中放置一些内容:

mkdir bzr_test        # create the directory
cd bzr_test           # go into it
bzr init-repo .       # initialise the repository
bzr init main         # create the main tree for the project
cd main               # go into it
vi document.tex       # create the first document

对于此示例,我们从基本文档开始:

\documentclass{article}

\usepackage{subfig}

\begin{document}
Hello World
\end{document}

现在我们提交该文档并创建两个分支:

bzr add document.tex             # Tell bzr to notice this document
bzr commit -m 'Main document'    # Commit the changes
cd ..                            # Back to containing directory
bzr branch main work             # Create a work branch
bzr branch main home             # And a home one

在每个分支中,我们根据需要修改文档:

在上班:

\documentclass{article}

\usepackage[caption=false]{caption}
\usepackage[font=footnotesize]{subfig}

\begin{document}
Hello World
\end{document}

在家里:

\documentclass{article}

\usepackage[font=footnotesize,caption=false]{subfig}

\begin{document}
Hello World
\end{document}

我们承诺这些改变(并确保这些改变是仅有的在此阶段进行更改)。

cd work                             # Not sure which directory we're in!
bzr commit -m 'Headers for work'    # Commit changes for work
cd ../home                          # Go to home
bzr commit -m 'Headers for home'    # Commit changes for home

现在我们对其中一个分支做一些修改。

cd ../work
vi document.tex
bzr commit -m 'Major revisions'

假设work我们现在有:

\documentclass{article}

\usepackage[caption=false]{caption}
\usepackage[font=footnotesize]{subfig}

\begin{document}
Hello World

Greetings Earthlings
\end{document}

现在我们要将这些转移到分支home。这里的关键是可选择的合并。如果我们只是进行基本合并,那么它将合并从共同父级到当前修订版的所有内容。但是,我们想忽略第一个修订版。

cd ../home
bzr merge ../work -r2..

现在我们看到:

\documentclass{article}

\usepackage[font=footnotesize,caption=false]{subfig}

\begin{document}
Hello World

Greetings Earthlings
\end{document}

唯一令人讨厌的是,你必须记住每次合并的是哪个修订版本,这样你才能从那个修订版本合并到最后。我怀疑有更好的方法来管理这个问题,但我不是版本控制系统的专家,我提供这个更多的是概念验证,而不是理想的解决方案。我的基本观点是,跟踪这样的变化正是版本控制设计的目的,所以让它做它的工作,让 TeX 去做它是工作。

相关内容