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自動提供的編號與您提供的編號不同(這很可能會發生),您將非常困惑。命名檔案時,停下來思考一下,想出一個簡短的名稱,該名稱可以在不產生歧義的情況下完全解釋檔案中的內容,一旦文件變得更大,這將為您節省大量時間。
