latex分文件編寫技巧

什麼是latex分文件編寫,爲什麼要分

一篇大的文章或者書籍,包含很多章節,各個章節很可能是由不同的作者分別編寫的。無論是在編寫還是修訂階段,大量的修改是難免的,如果對於每一個修改,都要去複製粘貼地合併到同一個文件裏面,很容易出現紕漏,另外還極大地降低了開發效率。即使是使用軟件開發過程中常見的版本管理工具來進行,也面臨很多同步問題。這顯然是與latex出現的初衷向違背的。

因而latex允許我們將一個大的源文件拆分許多個小的源文件(按章節),並通過另一個文件將它們組合起來。可以近似地理解爲C/C++語言中的頭文件。

這樣各個部分可以獨立編寫,非常方便合作編寫和審閱修訂。


怎麼分


一般來說latex提供了兩種包含子文件的方法:
\input 和 \include

一般編寫書籍的時候使用\include,並且一章一個文件,因爲它會自動給每個被include的部分創建一個新頁。而寫論文的時候多用\input。
需要提一下,導言區只需要宿主文件有就可以了,被包含的文件會沿用它。

用法

\input{chapter1}
\include{chapter2}
注意不加.tex的後綴。

區別

\input

它完全相當於C/C++語言中的#include,可以理解爲只起一個文本替換的作用。
因而,它可以嵌套使用。可以在任何位置使用(特別強調一下:可以在導言區使用)。
但是,任何一個子文件修改後,都需要對全文進行重新編譯。所以對於編譯有好幾百頁的書籍來說用它來管理章節是不太方便的(但是各個章節內部可以使用它),但對於論文,這點額外時間完全可以接受。

由於它只是一個文本替換,因而如果想只編譯某些章節,那麼所有的自動編號都會根據現在的內容重新編排。即如果第一章有3個公式,那麼第二章的第一個公式應該是“公式4”,如果我把第一章的\input註釋掉,那麼第二章第一個公式會是“公式1”。同樣的情況還出現在圖標、章節等所有自動編號上。

\include

爲了實現不改變最終效果(編號等資源的顯示)的部分章節調試,可以使用\include和與之配套的\includeonly。
它類似於編程中編譯好的庫文件。

它只能用在正文區,用來引入正文。
每個\include的部分開始時會新起一頁。
在某個部分修改的時候,針對宿主文件的重新編譯不會影響其他文件。因而很節約編譯時間。

如果只想在生成的文件中顯示部分章節,不需要對正文區的\include 做任何操作,只需要在導言區寫諸如\includeonly{chapter1,chapter3,chapter14}的一句就可以了。它表示只生成第1、3、14章。並且它不會因爲把顯示中間的章節,就把它們的自動編號空過去(但是如果在正文區註釋掉了,那就另當別論了)。

一個論文的例子

很多朋友學些latex都是爲了編寫論文,下面我就寫一個關於論文的例子說明一下怎麼用。

----------------my_paper.tex--------------

\documentclass{article}
%導言區\usepackage{...}
\begin{document}
\input{1-abstract}
\input{2-introduction}
\input{3-model}
\input{4-data}
\input{5-solve}
\input{6-conclusion}
\input{7-acknowledgment}
\bibliography{ref}
\bibliographystyle{abbrv}
\end{document}

----------------1-abstract.tex---------------

\begin{abstract}
This paper .....
\end{abstract}

-----------------2-introduction.tex------------

\section{Introduction}
..........

----------------3-model.tex----------------

\section{Model}
............
\begin{equation}
........
\end{equation}
\subsection{Provement}
..............


一些經驗技巧

在上面例子中,如果只想看看第三章的某個公式、某個圖片顯示的效果如何,需要編譯宿主文件。這對於較大的文件而言依然比較麻煩。另外對於很多ide環境(尤其是windows平臺常用的WinEdt),默認是編譯當前正在編輯的文件,而這個文件由於不包含完整的結果信息,無法編譯,比較麻煩。
一個解決方便就是使用類似C/C++中的條件編譯的概念,讓編譯器去判斷,如果當前是隻希望編輯一個子文件,就補充上完整的結構信息。

條件編譯

latex可以使用:
\ifx...
...
\else
...
\fi
的結構執行條件指令。這在一些會議期刊所提供的latex模板中很常見,多是用來根據編譯器版本選擇合適的包和參數。

我們可以利用它來實現自動補完結構信息的功能。
如果你有C/C++語言的相關知識,下面的概念會非常好理解,如果沒有也沒有關係,只需要按照後面“一個論文的例子2.0”中黑體的部分操作就可以了。
我們可以在宿主文件中定義(\def)一個編譯期常量,然後讓各個子文件去檢測這個常量是否存在,如果不存在就寫入結構信息。
例如:
\def的用法是這樣的:
\def\my_variable{hello}
它定義了一個名爲“my_variable”的宏,它的內容是“hello”。
再在各個子文件中使用\ifx\my_variable\undefine 來檢測這個宏是否沒有定義(latex沒有提供"\defined"來檢測是否已定義),並添加相應的內容。

一個論文的例子2.0

由於導言區在每個獨立編譯的部分都中要使用,所以在這裏可以將它也獨立成一個文件(命名爲0-preamble.tex)。
----------------my_paper.tex--------------

\input{0-preamble}
\def\all_in_one{all_in_one}

\begin{document}
\input{1-abstract}
\input{2-introduction}
\input{3-model}
\input{4-data}
\input{5-solve}
\input{6-conclusion}
\input{7-acknowledgment}
\bibliography{ref}
\bibliographystyle{abbrv}
\end{document}

----------------0-preamble.tex---------------

\documentclass{article}
%導言區\usepackage{...}

----------------3-model.tex----------------

\ifx\all_in_one\undefined
\input{0-preamble}
\begin{document}
\fi


\section{Model}
............
\begin{equation}
........
\end{equation}
\subsection{Provement}
..............

\ifx\all_in_one\undefined
\end{document}
\fi



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章