LaTeX/模块化文档
在本指南中,我们已经了解了LaTeX可以做什么以及如何实现,但问题是:我想用LaTeX写一篇合适的文章,那该怎么做?我应该从哪里开始?这是一个关于如何正确开始文档的简短分步指南,保持良好的高级结构。这都是关于使用LaTeX的模块化功能来组织文件。这样,即使文档即将完成,修改起来也会非常容易。这些都只是一些建议,但您可以从中获得灵感,创建您自己的文档。
以这种方式创建整个项目的清晰结构
- 仅为项目创建一个目录。在接下来的部分中,我们将将其称为根目录
- 在根目录中创建另外两个目录,一个用于LaTeX文档,另一个用于图像。由于您需要经常写它们的名称,因此选择简短的名称。建议只需使用tex和img。
- 创建您的文档(我们将它称为document.tex,但您可以使用您喜欢的名称)和您自己的包(例如mystyle.sty);第二个文件将帮助您保持代码更简洁。
如果您按照所有这些步骤操作,则这些文件应位于您的根目录中,使用“/”分隔每个目录
./document.tex ./mystyle.sty ./tex/ ./img/
仅此而已。
随着工作的进展,您的LaTeX文件可能会变得笨拙且混乱,尤其是在您撰写包含大量离散章节的长篇文章或整本书时。在这种情况下,最好将您的工作分成几个文件。例如,如果您正在写一本书,那么将每一章写在一个单独的.tex文件中很有意义。LaTeX通过两个命令使这变得非常容易
\input{filename}
和
\include{filename}
它们的共同点是它们会处理filename.tex的内容,然后继续处理基础文件的其余部分(包含这些语句的文件)。类似于C或C++语言的预处理器。
当编译器处理您的基础文件并到达\input
或\include
命令之一时,它会读取filename.tex并根据基础文件中指定的格式化命令处理其内容。这样,您可以将所有格式化选项放在基础文件中,并使用\input
或\include
在包含您工作实际内容的文件中编写内容。这意味着您的工作流程中重要的部分,即写作,在很大程度上与格式化选择分开。这是LaTeX非常适合严肃写作的主要原因之一!因此,您将只处理文本和非常基本的命令,例如\section
、\emph
等。您的文档将井井有条,并且更容易使用。
这两种方法在某些重要方面有所不同
\include{texfile}
:- 不能嵌套
\include
语句。 - 但是,该文件可以包含
\input
语句。 - 强制分页符,这使其成为书籍章节的理想选择。
- 期望.tex文件名不带扩展名,否则项目将不会编译附加文件。
- 不能嵌套
\input{textfile}
:- 可以嵌套
\input
。将其视为跨文件连接。 - 不会强制分页符——使其成为在包含离散章节的长文章中使用的理想选择,当然,这些章节通常不会在新页面上设置)。
- 输入文件的.tex扩展名是可选的。
- 可以嵌套
嵌套文件必须谨慎进行,使项目结构的复杂性尽可能简单,并牢记内容的增长/规模。
处理文档的离散部分会对基础文件的编译方式产生影响;这些将在下面进行处理。
编译器从基础tex文件的目录引用外部文件。您可以使用绝对路径和相对路径。根据操作系统的不同,文件路径会有所不同,请牢记绝对地址。
绝对路径是包含每个元素的完整路径和文件名。因此,filename.tex
可能具有完整路径,
\input{/home/user/texfiles/filename.tex}
如果您为写作项目创建了myfiles
目录,在您的texfiles
目录中,其完整路径将是,
\input{/home/user/texfiles/myfiles/filename.tex}
显然,如果您引用的是当前目录中的文件,则使用绝对路径效率低下。但是,如果您需要包含始终保存在系统特定位置的文件,则可以使用绝对路径引用它,例如,
\input{/home/user/documents/useful/foo.tex}
在实践中,当必须引用文件系统中(或甚至是在不同的服务器上!)相当远的文件时,通常使用绝对文件路径!一个警告:不要在文件名中留有空格,它们会导致不明确的行为。要么不留空格,要么使用下划线_代替。
但是,您可能需要使您的源代码可移植(到另一台计算机或硬盘驱动器的不同位置),在这种情况下,如果您希望避免不必要的重写路径名,则应使用相对路径。或者,相对路径可能只是引用文件的一种更有效且更优雅的方式。相对路径是相对于当前目录定义的路径,在本例中,是包含基础文件的目录。LaTeX使用标准的UNIX表示法:使用简单的点.
引用当前目录,使用两个点..
引用上一个目录,即文件系统树中当前目录上方的目录。斜杠/
用于分隔路径名的不同组件:目录和文件名。因此,通过./
引用当前目录,通过../
引用上一个目录,通过../../
引用文件系统树中向上两级的目录。编写
\input{./filename.tex}
将具有与编写
\input{filename.tex}
完全相同的效果,但如果您发现将所有文件放在当前目录的子目录中更方便,该子目录称为myfiles,您将通过指定以下内容来引用该文件:
\input{./myfiles/filename.tex}
实际上,在我们上面绝对路径的示例中,您也可以相对地引用该文件
\input{../../documents/useful/foo.tex}
当然,所有常用的文件系统——Linux、Mac OS X和Windows——也具有上面概述的UNIX ./
、../
功能。但是请注意,即使在使用反斜杠 \
作为路径名的Microsoft Windows平台上,LaTeX也使用正斜杠 /
。Windows 系统的 LaTeX 实现会为您执行此转换,确保您的文档在所有安装中都有效。
这种灵活性是LaTeX与现代文件系统集成方式固有的,它允许您以适合您特定设置的方式输入文件。
在使用由 \input
或 \include
导入的LaTeX文件中的相对路径时,请务必注意,这些路径相对于主.tex文件所在的目录,而不是相对于包含(或输入)文件所在的目录。如果您每个章节使用一个文件夹,并将每个章节的图片放在该章节的文件夹中,并使用 \include
将章节源代码读入父文件夹中的主LaTeX文件中,则这很可能成为一个问题。可以使用 import 包解决此问题(请参见下文)。此包添加了命令 \subimport
,它允许相对于命令所在的文件导入文件。
编译文档时,页面引用等将根据您使用 \input
和 \include
命令的方式发生变化。通常,LaTeX 用户只在文档的部分内容上运行编译器,以检查单个章节在语法上是否正确以及是否符合作者的意图。通常,只有在生成完整草稿或最终版本时才会执行完整运行。在这种情况下,通常需要运行 LaTeX 两次或更多次才能解决所有页码、引用等。(尤其是在您也使用 BiBTeX 等文献软件时)。
检查工作各个组成部分中一个或多个部分的语法是否健壮的最简单方法是使用百分号注释掉该命令,例如
\documentclass{article}
\begin{document}
%\input{Section_1}
%\input{Section_2}
%\input{Section_3}
\input{Section_4}
%\input{Section_5}
\end{document}
此代码将使用以下代码处理您的基础文件article约定,但仅处理文件中的内容Section_4.tex。如果这是您在发送给该主要期刊之前需要检查的最后一件事,那么您只需删除所有百分号并重新运行 LaTeX,并根据需要重复编译过程以解决所有引用、页码等。
使用此命令可以提供更复杂,因此更有用的可能性。如果您在序言中包含以下命令,即在 \begin{document} 之前,
\includeonly{filename1,filename2,...}
则仅包含大括号之间指定的文件。请注意,您可以将一个或多个文件作为此命令的参数:用逗号分隔它们,不要使用空格。如果您使用文件的绝对路径或相对路径,请键入完整的引用。
这要求文档中存在 \include
命令来指定这些文件。文件名应在没有.tex文件扩展名
\documentclass{book}
\includeonly{Chapter_1,Chapter_4} % compile just chapters 1 and 4, space characters not permitted
\begin{document}
\include{Chapter_1} % omit the '.tex' extension
\include{Chapter_2}
\include{Chapter_3}
\include{Chapter_4}
\end{document}
的情况下编写此代码将处理基础文件,但仅包含作者的第一章和第四章的内容(Chapter_1.tex和Chapter_4.tex)。重要的是,这种替代方案保留了尽可能多的.aux信息来自之前的运行,因此与上面的临时建议相比,它对交叉引用的破坏要小得多。
import 包 提供了两个命令 \import
和 \subimport
,它们与内置的 \input
和 \include
命令非常相似,但具有两个附加功能:1. 允许嵌套导入子文档,以及 2. 允许导入文档的相对目录。
与 \input
和 \include
类似,它对所有子文档使用主文档中的序言。
示例
我们有以下目录树
main.tex paragraphs | -– paragraph1.tex paragraph2.tex subparagraphs | -– subparagraph1.tex
文件 paragraph1.tex
通过命令 \input{paragraphs/paragraph1.tex}
包含在主文件 main.tex
中,当文件 paragraph1.tex
包含另一个具有相对路径的文件时会出现问题,例如,\input{subparagraphs/subparagraph1.tex
。在这种情况下,我们会收到错误,因为路径 subparagraphs/
相对于子文件夹 paragraphs
,它是主文件的子文件夹。
我们可以通过在主文件 main.tex
中添加 import 包 \usepackage{import}
,以及使用 \subimport{paragraphs/}{paragraph1.tex}
命令代替 \input{paragraphs/paragraph1.tex}
来包含文件 paragraph1.tex
来解决此错误。这样,我们就可以在包含该文件中的文件时指定相对路径。
仅使用 \input
和 \include
的缺点是只能编译基础文档。但是,您可能决定更好地处理文本的各个部分,并希望独立于主文件编辑和编译这些部分。有一些包可以解决此问题。
subfiles 包 提供了一种使用与主文档相同的序言编译文档部分的方法。
在主文档中,必须加载该包,如下所示
\usepackage{subfiles}
不要使用 \input
和 \include
,子文档必须按如下方式加载
\subfile{filename}
子文档必须以以下语句开头
\documentclass[main.tex]{subfiles}
\begin{document}
并以以下语句结尾
\end{document}
可以通过在主文档中定义一个“标识”命令 \newcommand{\onlyinsubfile}[1]{#1}
,然后在 \begin{document}
后使用 \renewcommand{\onlyinsubfile}[1]{}
覆盖它,来添加仅在单独编译子文档时才应用的部分。类似地,对于仅在主文档编译时显示的部分,也可以执行相同的操作。
总之,基础文档(main.tex
)如下所示
\documentclass{book}
\usepackage{subfiles}
\newcommand{\onlyinsubfile}[1]{#1}
\newcommand{\notinsubfile}[1]{}
\begin{document}
\renewcommand{\onlyinsubfile}[1]{}
\renewcommand{\notinsubfile}[1]{#1}
%% my document content
\subfile{chapter1}
%% more of my document content
\end{document}
而第 1 章(chapter1.tex
)如下所示
\documentclass[main.tex]{subfiles}
\begin{document}
%% my chapter 1 content
\onlyinsubfile{this only appears if chapter1.tex is compiled (not when main.tex is compiled)}
\notinsubfile{this only appears if main.tex is compiled (not when chapter1.tex is compiled)}
%% more of my chapter 1 content
%%
\end{document}
某些 Linux 发行版在其 LaTeX 发行版中没有 subfiles 包,因为它直到 TeXLive 2012 才被包含进来。您可以从 CTAN 下载 subfiles.tds.zip。此包将包含两个文件 subfiles.cls
和 subfiles.sty
。将这些文件移动到路径 /usr/share/texmf/tex/latex
下名为 subfiles
的目录中。但这仍然无法使该包可用;必须首先执行 texhash
程序。现在您就可以开始了!
虽然 subfiles 无法让子文件本身具有相对于其自身目录的引用,但 \subimport
命令提供了此功能。
在主文件和子文件中包含 bibtex 参考文献有点棘手。以下是一个解决方案
主文件
\documentclass[11pt,reqno]{amsart}
\usepackage{subfiles}
\def\biblio{\bibliographystyle{amsalpha}\bibliography{bibgraf}} % *Modification: added `\main/` to specify relative file location.
\begin{document}
\def\biblio{}
\subfile{sub.tex}
\bibliographystyle{amsalpha}
\bibliography{bibgraf}
\end{document}
子文件
\documentclass[main.tex]{subfiles}
\begin{document}
This is a test \cite{kato88:_commut_euler_navier_stokes% Kato \& Ponce 1988, Comm. Pure Appl. Math. 41, 891
}
\biblio
\end{document}
解决此问题的方法如下:主文件
\documentclass[12pt]{article}
\usepackage{subfiles}
\begin{document}
Hallo
\subfile{BlattAnalysis/blatt1}
\subfile{BlattAnalysis/blatt2}
\end{document}
而 BlattAnalysis 中的子文件如下所示
\makeatletter
\def\input@path{{../}}
\makeatother
\documentclass[../main.tex]{subfiles}
\begin{document}
Hallo
this is a test
\begin{equation}
\label{eq:sec1:1}
\int dx =0
\end{equation}
\end{document}
为了能够设置特定于子文件的图形路径,以及能够构建每个子文件作为独立文档,必须提供两次 graphicspath。对于使用与上述相同的设置的子文件编号 X,这将导致
\makeatletter
\def\input@path{{../}}
\makeatother
\documentclass[../main.tex]{subfiles}
\graphicspath{
{"../myfiles/Blatt_X/Pictures/"}
{"../../myfiles/Blatt_X/Pictures/"}
}
\begin{document}
Hallo
this is a test
\begin{figure}[H]
\includegraphics{example.png}
\end{figure}
\end{document}
用于创建独立文档的standalone包的设计方向与subfiles包相反。它提供了一种将子文档的前言导入主文档的方法,从而提供了一种灵活的方式来在多个文档(例如文章和演示文稿)中包含文本或图像。
在主文档中,必须加载该包,如下所示
\usepackage{standalone}
子文档使用\input
或\include
加载。
例如,子文档包含以下语句
\documentclass{standalone}
% Load any packages needed for this document
\begin{document}
% Your document or picture
\end{document}
总之,基础文档(main.tex
)如下所示
\documentclass{book}
\usepackage{standalone}
\begin{document}
%% my document content
\input{chapter1}
%% more of my document content
\end{document}
而第 1 章(chapter1.tex
)如下所示
\documentclass{standalone}
% Preamble
\begin{document}
%% my chapter 1 content
%%
%% more of my chapter 1 content
\end{document}
pdfpages可用于插入现成的PDF文件或单独的页面,以及在一个页面上插入多个页面,并采用任意布局(例如)。
该包有几个选项
\usepackage[ options ]{pdfpages}
|
选项
- final:插入页面。这是默认选项。
- draft:不插入页面,而是打印一个方框和文件名。
- enable-survey:激活调查功能。(实验性功能,可能会发生变化。)
包含pdf文档
\includepdf[ key=val ]{ filename }
|
key=val的选项——使用key = value语法以逗号分隔的选项列表。最新的、完整的键/值参数列表可以在包文档中找到。下面是一些常用的参数
pages | 选择要插入的页面。参数是一个逗号分隔的列表,包含页码(pages={3,5,6,8})、页码范围(pages={4-9})或任意组合。要插入空白页,请使用{}。例如pages={3,{},8-11,15} 将插入第3页、一个空白页以及第8、9、10、11和15页。实际上,不仅链接,所有类型的PDF注释都会丢失。页面范围由以下语法指定:m - n。这将选择从m到n的所有页面。省略m默认为第一页;省略n默认为文档的最后一页。另一种选择文档最后一页的方法是使用关键字last。(这仅在页面范围内允许。)例如:pages=-将插入文档的所有页面,而pages=last-1将以相反的顺序插入所有页面。(默认值:pages=1) |
angle | 您可以使用angle选项来旋转包含的页面,例如,当latex文档为纵向时,旋转横向文档。例如:angle=90 |
addtolist | 向图列表、表列表或任何其他列表(例如来自float.sty的列表)添加条目。此选项需要四个参数,用逗号分隔
与addtotoc类似,addtolist接受上述四个参数的多个集合,所有这些集合都用逗号分隔。正确的递归定义是: |
pagecommand | 声明在每一张纸上执行的LaTeX命令。(默认值:pagecommand={\thispagestyle{empty}} 例如,要包含一个pdf并引用其某些页面的页码,您可以增加一个计数器并为包含的pdf的每一页创建一个新标签 \newcounter{inclPDFpage}
\includepdf[pages=-,pagecommand={\refstepcounter{inclPDFpage}\label{test.\theinclPDFpage}}]{toInclude.pdf}
The fourth page of toInclude.pdf is page \pageref{test.4} in the compiled document
|
您还可以插入多个外部PDF文档的页面。
\includepdfmerge[ key=val ]{ file-page-list }
|
可以在一个页面上以表格的形式放置多个PDF。有关更多信息,请参阅其文档。
如果您需要从模块化文档生成单个tex文件,则可以使用多个脚本[1]
您可以将所有需要的包放在文档开头,但最好的方法是将所有需要的包加载到另一个名为mystyle的虚拟包中,您将专门为您的文档创建此包。这样做的优点是您只需添加一个\usepackage到您的main.tex文档中,使代码更简洁。此外,所有关于您样式的信息都将保存在一个文件中,因此当您开始另一个文档时,您只需复制该文件并正确包含它,这样您就可以获得与之前完全相同的样式。
创建您自己的样式非常简单:创建一个名为mystyle.sty(您可以根据需要命名它,但必须以“.sty”结尾)的文件。在文件的开头写上mystyle.sty文件
\ProvidesPackage{mystyle}
然后使用标准命令添加所有所需的包\usepackage{...}就像您平时一样,更改所有所需变量的值等。它将像将此处放置的代码复制并粘贴到文档中一样工作。
在编写过程中,无论何时需要做出关于格式化的决策,请为其定义您自己的命令并将其添加到您的mystyle.sty:让LaTeX为您工作。如果您这样做,如果改变主意,更改它将非常容易。
这实际上是编写包过程的开始。有关更多详细信息,请参阅LaTeX/Macros。
有关您可以使用的多个包的列表,请参阅包列表部分。
然后创建一个名为document.tex的文件;这将是主文件,您将编译的文件,即使您可能不需要经常编辑它,因为您将在其他文件上工作。它应该如下所示(这是report的示例代码,但您可以轻松地将其更改为article或其他任何内容)
\documentclass[12pt,a4paper]{report}
\usepackage{graphicx}
% put all the other packages here:
\usepackage{mystyle}
\usepackage{hyperref}
\begin{document}
\input{./tex/title.tex}
%\maketitle
\tableofcontents
\listoffigures
\listoftables
\input{./tex/intro.tex}
\input{./tex/main_part.tex}
\input{./tex/conclusions.tex}
\appendix
\input{./tex/myappendix.tex}
% Bibliography:
\clearpage
\input{./tex/mybibliography.tex}
\end{document}
此处使用了前面各节中表达的大量代码。您导入唯一需要的包,即您的mystyle.sty(请注意,在代码中必须在没有扩展名的情况下导入它),然后您的文档开始。然后它插入标题:我们不喜欢\maketitle的输出,因此我们创建了自己的输出,其代码将位于名为title.tex的文件中,位于我们之前创建的名为tex的文件夹中。如何在标题创建部分中说明如何编写它。然后插入目录、图和表。如果您不需要它们,只需注释掉这些行。然后插入文档的主要部分。如您所见,document.tex中没有文本:所有内容都在tex目录中的其他文件中,以便您可以轻松地编辑它们。我们将文本与结构代码分离,从而提高了LaTeX的“所见即所得”特性。然后我们可以看到附录,最后是参考文献。它在单独的文件中。
创建完document.tex后,您将不再需要编辑它,除非您想在tex目录中添加其他文件,但这不会经常发生。现在您可以编写文档,将其分成任意多个文件并添加许多图片而不会感到困惑:由于您为项目提供了严格的结构,因此您将能够清楚地跟踪所有编辑。
建议:不要为文件命名为“chapter_01.tex”或“figure_03.png”,即尽量避免在文件名中使用数字:如果LaTeX自动提供的编号与您提供的编号不同(这很可能会发生),您将非常困惑。命名文件时,停下来思考一下,想出一个简短的名称,该名称可以在不产生歧义的情况下完全解释文件中的内容,一旦文档变得更大,这将为您节省大量时间。