我在 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 格式的徽标?
尤其是这默认路径的答案。