本文是在筆者為班級同學編寫的指南的基礎上修改而來的。
前言
LaTeX 是目前主流的計算機排版系統之一。目前社群維護了一份合工大畢業論文的 LaTeX 模板(以下簡稱“模板”):https://github.com/HFUTTUG/HFUT_Thesis 考慮到大部分同學對 Word 都談不上精通,使用 LaTeX 排版畢設論文,可以讓你擺脫絕大多數格式問題的煩惱。
請記住,LaTeX 是可以速成的:其實這就是一種標記語言(在大多數情況下),而且模板已經幫我們做了最複雜的那部分工作,我們只需要往裡面填入內容就可以了。從零基礎到可以使用模板,我估計只需要半天時間。
編寫環境
有兩種辦法:
- 用 OverLeaf,一個線上的 LaTeX 編輯網站,支援多人協作,免費版支援兩人協作。
- 在本地裝一個 LaTeX 發行版,然後用 VSCode 搭配 LaTeX Workshop 擴充套件來編寫。你可以看 https://www.cnblogs.com/eslzzyl/p/17358405.html 這篇部落格來安裝。
考慮到大部分計算機專業的科研人員均能使用 LaTeX,前者可能是更好的選擇。你可以把工作空間共享給你的指導老師,這樣 Ta 就可以審閱了。後文將僅針對前者進行介紹。
使用模板
相信讀者能夠熟練地把 GitHub 倉庫下載到本地——無論你使用 git clone
還是 Download Zip 功能。把 https://github.com/HFUTTUG/HFUT_Thesis 這個倉庫下載到本地。
然後,把這玩意打包(.zip
)上傳到 OverLeaf:https://cn.overleaf.com/project 就在左上角的“建立新專案-上傳專案”。上傳後,OverLeaf 會自動建立一個工作空間,然後你可以看到編輯介面。
OverLeaf 的模板庫裡是有這個模板的,但是我看更新時間比較早了,感覺似乎不是最新的,保險起見我們不用。
模板在本地編譯時是很方便的,只需要 make
一下就行了。但在 OverLeaf 中可能需要一些額外設定。點選左上角的“選單”,找到“設定”部分,將編譯器改為 XeLaTeX,TeX Live 版本選擇最新,主文件選擇 main.tex
。其他根據你的偏好即可。改好之後點選“重新編譯”按鈕進行編譯,確保不會報錯。
這個模板的原始檔是按章節分類存放的。所有章節的原始檔都在 chapters
目錄中。有關你的題目、學號、導師等資訊則在 hfutsetup.tex
中設定。你可以在 main.tex
中修改引入的章節。
hfutthesis-doc.tex
是模板的使用說明。你可以在本地根據 README 的說明來編譯它。在 OverLeaf 中,你可能得修改“主文件”這個設定來編譯它;你也可以從模板的 Release 頁中下載到編譯好的使用說明:https://github.com/HFUTTUG/HFUT_Thesis/releases/download/v1.0.4/hfutthesis-doc.pdf
基礎
本文不會詳細介紹 LaTeX 的基礎知識。你可以透過以下資源快速入門。在使用時遇到的問題可以透過上網搜尋或詢問大語言模型來解決。
- 傳說中的
lshort
——《一份(不太)簡短的 LaTeX 2ε 介紹》:https://texdoc.org/serve/lshort-zh-cn.pdf 此為經典入門教程 - 劉海洋老師的一個入門講座:https://www.bilibili.com/video/BV1s7411U7Pr 劉老師在北大有過一個 LaTeX 講座,令我印象深刻,但我已經找不到了,這個應該也差不多
- 劉海洋老師的書《LaTeX 入門》,不過這書有點厚了,還是看前兩個吧 ╰(°▽°)╯
實際上需要學習的東西很少,我概括成以下內容:
概念
LaTeX 是一種編譯式的排版系統:輸入原始檔(.tex
格式),輸出 PDF。
實際上還可以輸出更復雜的格式,但那些我們不管。
你應該在 .tex
檔案中編寫的你的文件內容。
正文
在 \begin{document}
和 \end{document}
之間的部分就是你的正文。這裡面的文字在編譯後會呈現在 PDF 文件中。
檢查模板的 main.tex
檔案的正文部分,你會看到形如 \maketitle
、\tableofcontents
之類的東西,它們是定義好的宏。你當然熟悉 C/C++ 中宏的概念。其實就是文字替換。
你可能會發現模板的正文(main.tex
)中有形如 \input{chapters/abstract.tex}
之類的東西。這種 \input
命令和宏差不多,它們會把自己用引用的 .tex
檔案的內容替換掉。這樣,你在那些 .tex
檔案中編寫的內容就進入文件了。\input
允許你將一整個文件拆分為若干個 .tex
檔案。例如模板就按章進行了拆分。
大綱
較長的文件必須正確使用大綱來組織內容並生成目錄(對 Word 來說同樣如此)。LaTeX 中有一組大綱命令,在正文中,一個大綱命令A之後、文件結束之前或下一個大綱命令B之前的正文屬於大綱A的內容。在模板中,常用的大綱有三級:
\chapter
命令:章,對應一級標題 1\section
命令:節,對應二級標題 1.1\subsection
命令:小節,對應三級標題 1.1.1
在生成目錄時,以上三個級別的大綱標題將自動編入目錄。在 LaTeX 中,目錄的生成是完全自動化的,幾乎不需要任何干預。
如果你在一個小節中還想進一步分割大綱,那麼你可以使用 \subsubsection
。但根據模板的設定,這個級別不會給編號,也不會進入目錄。
你可能會想到什麼。但是,確實沒有
\subsubsubsection
這種東西。否則這樣下去沒完沒了了。ƪ(˘⌣˘)ʃ
列表
無序列表
- 這是
- 一個
- 無序
- 列表
使用以下命令來構建無序列表:
\begin{itemize}
\item 這是
\item 一個
\item 無序
\item 列表
\end{itemize}
有序列表
- 這是
- 一個
- 有序
- 列表
使用以下命令來構建無序列表:
\begin{enumerate}
\item 這是
\item 一個
\item 無序
\item 列表
\end{enumerate}
列表項的編號是自動的,你無需關係具體的編號取值。
順便一提,列表是可以巢狀使用的,無序有序均可。但沒什麼用就是了。
圖
LaTeX 的插圖功能由 graphicx
宏包提供。宏包和庫差不多,都是別人寫好的一些程式碼,供我們直接使用的。使用 \usepackage{graphicx}
來引入這個宏包。這與其他語言的 #include
、using
、import
有些類似。不過模板已經幫我們引用好了。
使用以下的程式碼段來插圖:
\begin{figure}[htb] % h表示優先在當前程式碼位置插入,t表示優先在某頁的頂部插入,b表示優先在底部插入。三者優先順序遞減。
\centering % 水平居中放置
\includegraphics[width=\textwidth]{/path/to/your/figure} % 引入圖片。[]中的內容表示圖片與文字同寬。你可以在\textwidth前面加一個小數如0.7來調整圖片的寬度。
\caption{在這裡填入題注} % 題注。caption寫在includegraphics的後面,因此題注就排版在圖片的下方。如果你把caption往前提,那麼就在上方。就這麼簡單。
\label{fig:your-label} % 這個是供你在文件的其他地方引用這個圖的
\end{figure}
figure
環境是浮動(float)的,這表示該環境的內容不會嚴格在程式碼出現的位置插入,而是會根據上下文調整到合適的位置。一般 LaTeX 會幫我們處理好的。當然,也有強制禁止浮動體浮動的方法,如果需要,你可以上網搜到。
表
和圖類似,也是一個浮動的東西。需要使用 tabular
或 tabularx
環境,巢狀在一個 table
浮動環境中。後文有一個生成表格的輔助工具。
交叉引用
注意到在插入圖和表時,我們使用了 \label{}
命令,為圖/表分配了一個引用名。在正文的其他位置,使用 \ref{引用名}
來引用你的圖/表:
如圖\ref{fig:your-label}所示
如表\ref{tab:your-label}所示
章節編號也是一樣的。在大綱命令之後使用 \label
:
\section{國內外研究現狀}
\label{aaaa}
% 其他正文
正如\ref{aaaa}節所介紹的那樣,……
參考文獻
最好搭配某種文獻管理軟體來使用,例如 Zotero。
LaTeX 使用一種稱為 BibTeX 的工具來管理參考文獻(當然也有其他的,但這個是最主流的)。你需要提供一個 .bib
檔案,其中存放了你所有可能會引用的參考文獻,將其存放在 bib
目錄中。然後,你要在 main.tex
中找到這一行:
\bibliography{bib/xxx} % 參考文獻使用 BibTeX 編譯
將其改為你的 .bib
檔案的目錄。將檔名修改為你的檔案。副檔名不是必須的。
絕大多數學術聚合網站(如谷歌學術、百度學術)和學術出版物網站(如IEEE Xplore)都會提供 BibTeX 格式的引用,因為 BibTeX 已經成為一種標準。你只需要找到對應的引用按鈕,點選,然後引用資訊就複製到你的剪貼簿。將資訊貼上到 .bib
檔案中即可。
在文件中,使用 \cite{}
命令(而不是 \ref{}
!)來引用一個參考文獻。每個參考文獻都有一個引用名,這名字在 .bib
檔案中定義。如果你自己編寫 .bib
檔案,那麼這個名字是你自己取的;如果你使用文獻管理軟體匯出 .bib
檔案,那麼它們可能遵循某種特定的命名模式,如“第一作者的姓氏_標題首詞_年份”,例如 vaswani_attention_2017
。
當你打出
\cite{}
命令時,OverLeaf 會幫助你補全引用名,很方便。
當你在文件中引用某個文獻時,LaTeX 會自動為參考文獻編號,並在文末的參考文獻表中插入這個文獻,還會自動建立編號到參考文獻表項的超連結。在模板中,將會按照文獻首次出現的順序進行編號。一切都是自動化的,你只需要透過名字引用就可以了。關鍵是你要把名字和文獻對應起來。
數學公式
網上應該有很多教程。
一些使用心得
關於圖
當我們向 LaTeX 文件中插入圖片時,總是希望圖片是向量的,這樣在放大文件檢視時,圖片仍然可以保持清晰。我使用 PowerPoint 繪製論文中的圖,那麼有兩種匯出向量圖的方法:
SVG
在 PPT 中選中該圖的所有形狀,右鍵,點選“另存為圖片”,在格式中選擇 svg。但是我在嘗試匯出時總遇到匯出圖片不完整的問題,所以我放棄了。
注意,在引入 SVG 圖片時,需要先引入 svg
宏包:
\usepackage{svg} % 建議放置在 hfutsetup.tex 中
然後使用 \includesvg{}
命令替代原有的 \includegraphics{}
命令。
大部分線上繪圖工具應該都支援匯出為 svg 格式。
你可能不知道,PDF也是一種向量圖格式。LaTeX 的 graphicx
宏包可以直接匯入 PDF 格式,就像你匯入 JPEG 或者 PNG 一樣。
在 PPT 中點選“檔案-匯出-匯出為 PDF”,在彈出的檔案對話方塊中點選“更多...”按鈕,在這裡,你可以設定匯出的頁。僅匯出自己希望匯出的那一頁即可。然後使用一些工具處理匯出的 PDF,然後上傳到 OverLeaf。
- PDF 裁剪工具:https://deftpdf.com/zh/crop-pdf 你可以將 PDF 中多餘的白邊裁剪掉。
- PDF 拆分工具:https://www.ilovepdf.com/zh-cn/split_pdf#split,range 如果你匯出的 PDF 有不止一頁,使用此工具來拆分。
LaTeX 中繪圖的終極解決方案是 PGF/TikZ。這是一個極致複雜、極致強大的繪圖宏包,但 PPT 對我們來說足夠了。
關於表
有個工具 https://tableconvert.com/zh-cn/latex-generator 你可以先在 Excel 中輸入資料,然後複製到這個工具裡,就能得到 LaTeX 程式碼。
如果你的表太寬,導致超出了頁面的寬度,你可能需要根據這個網頁的指導來調整你的表格。https://tex.stackexchange.com/questions/332902/my-table-doesnt-fit-what-are-my-options/
關於程式碼
行內引用程式碼時,應該使用等寬字型。你可以使用 \verb||
來插入等寬字型。
關於公式
有個工具 https://latex.vimsky.com/
有個透過 OCR 技術掃描數學公式然後轉 LaTeX 的工具:https://github.com/lukas-blecher/LaTeX-OCR
關於模板本身的問題
在使用模板的過程中,我也遇到了一些問題,這裡集中記錄一下。
bibtex 會議論文格式的問題
可參見:https://github.com/HFUTTUG/HFUT_Thesis/issues/62
當前版本的模板在引用會議論文時,參考文獻表中會出現額外的[A]
標記。如果有稽核老師認為此格式不正確,你可以從此處下載到修改過的bibtex樣式表,然後替換掉模板包中的同名檔案。感謝工大 LaTeX 交流群(904943223)的群友。
原創性和授權使用宣告頁中填入資訊
這個頁需要插入自己和指導老師的簽名,以及簽名時間。目前模板是不支援在該頁插入內容的。有兩種辦法:
-
編譯出 PDF,然後用 PDF 編輯工具來插入簽名和時間。例如 https://www.ilovepdf.com/zh-cn/edit-pdf 這個工具。
-
直接修改模板(
hfutthesis.cls
)中這一頁的程式碼,在裡面插入內容。搜尋“原創性和授權使用宣告”,找到對應的位置,然後在自己對應的學位(bachelor
或其他)的程式碼中新增內容。以學士為例,進行以下修改(修改的原文已經被註釋):\ifhfut@degree@bachelor {\centering\sffamily\fontsize{18bp}{18bp}\selectfont \textbf{畢業設計(論文)獨創性宣告}\par}% \vskip 1.0cm% \hfut@originality@bachelor\par \vskip 0.9cm% % 畢業設計(論文)作者簽名:\hfill% 畢業設計(論文)作者簽名:\includegraphics[width=0.15\textwidth]{student-signature.jpg}\hfill% % 簽字日期:\hspace{3\ccwd}年\hspace{2\ccwd}月\hspace{2\ccwd}日\par 簽字日期:2024年5月28日\par \vskip 2.33cm% {\centering\sffamily\fontsize{18bp}{18bp}\selectfont \textbf{畢業設計(論文)版權使用授權書}\par}% \vskip 1.0cm% \hfut@authorization@bachelor\par \vskip 1.0cm% \begin{tabular}{@{}p{6.5cm}p{6.5cm}@{}}% % 學位論文作者簽名:& 指導教師簽名:\\ 學位論文作者簽名:\includegraphics[width=0.15\textwidth]{student-signature.jpg} & 指導教師簽名:\includegraphics[width=0.15\textwidth]{teacher-signature.jpg}\\ % 簽名日期:\hspace{3\ccwd}年\hspace{2\ccwd}月\hspace{2\ccwd}日 & 簽名日期:\hspace{3\ccwd}年\hspace{2\ccwd}月\hspace{2\ccwd}日 簽名日期:2024年5月28日 & 簽名日期:2024年5月28日 \end{tabular}\par
注意有兩處作者簽名,一處指導教師簽名。
插圖清單和表格清單中的間距問題
可參見:https://github.com/HFUTTUG/HFUT_Thesis/issues/63
當前版本的模板會在插圖清單和表格清單中不同章之間插入額外的間距,這是 CTeX 宏集的預設行為,但學校釋出的《規範》中卻沒有這個間距,我在論文答辯時也有老師指出了這個問題。
解決方法:修改模板包中 hfutsetup.tex
檔案,在該檔案的任意位置插入以下程式碼段
\ctexset {
chapter/lofskip = 0pt,
chapter/lotskip = 0pt,
}
然後重新編譯。
字型並非 Windows 標準字型
可參見:https://github.com/HFUTTUG/HFUT_Thesis/issues/57 以及 hfutthesis-doc.pdf
的“字型設定”小節。
在 OverLeaf 上編譯的論文字型會和 Windows 下的中易字型(宋體、黑體、楷體、仿宋)有微小的不同。英文字型和 Times New Roman 也有微小的不同,等寬英文字型和 Courier 也有微小的不同。將 fontset
設為 windows
後編譯報錯,因為 OverLeaf 沒有對應的字型。
解決方法:有兩種辦法
- 從任意一臺 Windows 電腦中複製出上述 5 種字型(位置:
C:\Windows\Fonts
)上傳到 OverLeaf,然後在論文模板中修改字型。 - 在本地安裝 Tex Live,然後編譯。如果 Tex Live 是安裝在 Windows 系統中的,那就沒有額外的問題;如果是安裝在其他系統(包括 WSL)中的,那麼需要從 Windows 電腦中複製上述字型到對應的系統中並安裝這些字型。