使用相对路径编写自己的 LaTeX 模板,包含、输入、类之间的区别

使用相对路径编写自己的 LaTeX 模板,包含、输入、类之间的区别

我在 Windows 环境中使用 Miktex 工作。我的大部分文档都是用 XeLaTeX 创建的,但我认为我的问题不是编译器特有的。

我想创建一个模板,其中包含我的所有软件包、标题设置和图形路径,例如包含标题徽标。在我所有使用该模板的文档中,我希望只包含文档特定的设置和文档内容。我的问题是,文档可能位于与模板不同的文件夹中,但我仍然希望包含来自模板文件夹的图片。我的设置如下所示:

.
├── templates/
│   ├── my_template.tex
│   └── pictures/
│       └── header_logo.pdf
└── documents/
    ├── my_document.tex
    └── pictures/
        └── some_picture.png

最小的例子可以是:

我的模板.tex:

\documentclass[
    11pt,
    a4paper,
]{scrarticle}

\usepackage{scrextend}
\usepackage{scrlayer-scrpage}

%%%%% Graphics %%%%%
\usepackage{graphicx}
\graphicspath{{./pictures/}}

%%%% Title Setup %%%%%
\ihead{\includegraphics[width=6cm]{header_logo.pdf}}
\cfoot{}
\setlength{\headheight}{14pt}

我的文档.tex:

\input{../templates/my_template.tex}

\graphicspath{{./pictures/}}

\begin{document}
\includegraphics[width=6cm]{some_picture.png}
\end{document}

我现在的问题是,实现这一工作的标准方法是什么。我发现这个问题非常有帮助,但我需要更多有关不同方法的详细信息,以确定哪种方法合适。我不完全理解此上下文中include和之间的区别input,或者我是否应该将模板变成类。

答案1

就像https://tex.stackexchange.com/a/250/162943\input将重新输入文件的内容并includes添加clearpages和不能嵌套。我会坚持使用\input
该命令\graphicspath接收文件夹列表作为参数:\graphcispath{{folder1}{folder2}},所以我建议使用模板图像文件夹(templates/pictures)的完整路径和文档图像文件夹(documents/pictures)的相对路径,我认为它们将始终具有相同的名称。

我的模板.tex:

\documentclass[
    11pt,
    a4paper,
]{scrarticle}

\usepackage{scrextend}
\usepackage{scrlayer-scrpage}

%%%%% Graphics %%%%%
\usepackage{graphicx}
\graphicspath{{C:/Path/to/template/image/folder}{./pictures/}}

%%%% Title Setup %%%%%
\ihead{\includegraphics[width=6cm]{header_logo.pdf}}
\cfoot{}
\setlength{\headheight}{14pt}

我的文档.tex:

\input{../templates/my_template.tex}

\begin{document}
\includegraphics[width=6cm]{some_picture.png}
\end{document}

另一个解决方案是使用符号链接。在项目图像文件夹内创建模板图像文件夹的符号链接,并仅使用\graphicspath{{./pictures/}}。在这种情况下,您需要记住在每个文件中添加文件夹的名称includegraphics

答案2

为了避免使用绝对路径,您可以使用subfiles包(尽管其主要用例略有不同)。所需的更改如下:

  • 通过添加,使模板成为完整的文档\begin{document}\end{document}

  • 在模板前言的末尾,加载包subfiles,然后设置图形路径,但让它只引用与模板相关的图片目录,使用相对路径。

  • 使用以下行开始您的实际文档

    \documentclass[rel.path to template]{subfiles}
    
  • 在实际文档的前言中,将进一步的本地图片目录添加到图形路径中。

相比其他解决方案,其优势在于模板只需要知道与模板相关的图片目录,文档可以将其特定图片保存在不必相同的目录中。此外,不需要绝对路径。

对于您的示例,这些更改如下所示:

% templates/my_template.tex
\documentclass[
    11pt,
    a4paper,
]{scrarticle}

\usepackage{scrextend}
\usepackage{scrlayer-scrpage}

%%%%% Graphics %%%%%
\usepackage{graphicx}
\usepackage{subfiles}
\graphicspath{{./pictures/}}% <<< PICTURES LOCAL TO template DIRECTORY

%%%% Title Setup %%%%%
\ihead{\includegraphics[width=6cm]{header_logo.pdf}}
\cfoot{}
\setlength{\headheight}{14pt}
\begin{document}% <<< NECESSARY FOR subfiles TO WORK
\end{document}% <<< NECESSARY FOR subfiles TO WORK

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% documents/my_document.tex
\documentclass[../templates/my_template]{subfiles}% <<< LOAD PREAMBLE FROM ../templates/my_template.tex

\makeatletter% <<< EXTEND THE GRAPHICS SEARCH PATH BY LOCAL DIRECTORIES
\edef\Ginput@path{\Ginput@path{./pictures/}}% <<<<<<<<<<<<<<<<<
\makeatother% <<<<<<<<<<<<<<<<<

\begin{document}
\includegraphics[width=6cm]{some_picture.png}
\end{document}

答案3

正如其他答案中提到的,\input直接从另一个文件复制文本,就像您刚刚手动合并它们一样。这通常是最简单的做法,并且可以嵌套大型文档。\include将始终创建一个新页面来放置内容,并且不能嵌套。

使用 的好处\include是,在文档开始时,您可以使用\includeonly文件名列表,然后任何指定不同文件名的包含都将被忽略。我曾在非常大的项目中使用过这种方法,其中主要部分使用,\include这样当我在处理其中一个部分时,我就不必等待其他部分编译完成。然后,\input由于您无法嵌套,因此我将 用作子部分\include。您也可以通过输入部分并包含子部分来以另一种方式执行此操作。

将前言放在另一个文件中是很常见的。有些方法比其他方法更正确或更不正确。最常见的方法是将前言(除 之外\documentclass)放入一个单独的文件中,您可以随意命名该文件,例如mypreamble.sty,请注意它必须以 结尾.sty,然后您就可以\usepackage{mypreamble}像任何其他包一样使用它。您还必须将行添加\ProvidesPackage{mypreabmle}到前言文件的顶部。也可以使用 来完成,\include但不建议这样做,因为\usepackage它会进行一些内部处理并允许可选参数等。

另一个对多个文件有用的软件包叫做 ,import它允许使用如下命令:\import{path\to\secton}{sectionname.tex}。这个软件包的好处是,如果你想要导入一个已经导入的文件中的内容,你可以调用 ,\subimport{relitive/path/}{plot1.tex}它使用相对于导入文件的路径,这非常有用。

答案4

gernot 和 bryce 的回答让我真正尝试将我的序言放入文件中.cls。我不得不重新排列一些文件,以便我的文件树现在看起来像:

.
├── templates/
│   └── tex/
│       └── latex/
│           └── my_template/
│               ├── my_template.cls
│               └── header_logo.pdf
└── documents/
    ├── my_document.tex
    └── pictures/
        └── some_picture.png

my_template.cls 现在变成

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{my_template}
\LoadClass[
    11pt,
    a4paper,
]{scrarticle}

\RequirePackage{scrextend}
\RequirePackage{scrlayer-scrpage}

%%%%% Graphics %%%%%
\RequirePackage{graphicx}
\graphicspath{{./pictures/}}

%%%% Title Setup %%%%%
\ihead{\includegraphics[width=6cm]{header_logo.pdf}}
\cfoot{}
\setlength{\headheight}{14pt}

并且 my_document.tex 变成

\documentclass{my_template}

\begin{document}
\includegraphics[width=6cm]{some_picture.png}
\end{document}

里面的 graphicspathmy_template.cls现在与文件相关,my_document.tex而 cls 直接从其自身位置提取图形。为了工作,目录templates需要初始化为其自己的 texmf 根目录(我使用 完成此操作Miktex console --> Settings --> Directories --> Add)。此设置的优点是,我可以从 PC 上的任何地方使用模板,而无需为其所在目录提供相对或绝对路径。这对我的 GIT 版本控制有很大帮助。

这里还有一些关于这种方法的答案和可移动安装的详细信息:

我应该将自己的 .sty 或 .cls 文件放在哪里,以使它们可供我的所有 .tex 文件使用?

如何编写一个 LaTeX 包,不仅捆绑 .sty 和 .cls 文件,还捆绑一些 .pdf 或 .eps 格式的徽标?

尤其是默认路径的答案。

相关内容