以我目前經驗,在資訊界還是有用中文寫報告的機會,例如一些計畫的期中期末報告,通常會有給 word 檔案來遵守現有的格式。但如果什麼都沒有,又不想用 word,那 latex 可能是協作下又保有好看格式的好幫手。
此篇文章提供一個簡易的繁體中文設定,並改良之前 Latex Examples 提供的程式碼設定。
用中文最重要的部分是需要改用 xelatex 或 lualatex 作為編譯器 (安裝 MikTex 就會包含了,不需要另外安裝)。我在使用後者的體驗較好,所以這裡以 lualatex 作為編譯器,參考文獻則是用 biber。若是使用 vscode,可以將 settings.json 修改如下。
settings.json
{
"latex-workshop.latex.tools": [
{
"name": "lualatexmk",
"command": "latexmk",
"args": [
"-synctex=1",
"-interaction=nonstopmode",
"-file-line-error",
"-lualatex",
"-outdir=%OUTDIR%",
"%DOC%"
],
"env": {}
},
{
"name": "biber",
"command": "biber",
"args": [
"%DOCFILE%"
],
"env": {}
}
],
"latex-workshop.latex.recipes": [
{
"name": "lualatexmk ➞ biber ➞ lualatexmk × 2",
"tools": [
"lualatexmk",
"biber",
"lualatexmk",
"lualatexmk"
]
}
],
}
接著是字體設定,我使用下載並放到 fonts 資料夾裡的 ttf 或 otf,希望這樣可以有效避免不同系統相依本地安裝的字型。完整的檔案架構請參考: aben20807/traditional_chinese.tex。比較難的是找出如何載入相對路徑下的文字檔,這裡使用 luatexja
及 luatexja-fontspec
詳細如下。目前我自行測試下還無法同時使用多個中文字型,但英文字型可以,下方範例以 Iosevka 作為程式碼字型 (因為比較瘦,變數名稱很長時還是好看)。
report.tex
% !TEX root = ./report.tex
\documentclass[12pt, a4paper]{article}
\usepackage[a4paper, margin=1.0in, foot=.25in]{geometry}
% Detect lualatex
\usepackage{ifluatex}
\ifluatex\else\errmessage{Please use LuaLaTex.}\stop\fi
% ----------------------------
% Fonts
% ----------------------------
\usepackage{luatexja}
\usepackage{luatexja-fontspec}
% English font
\setmainfont[ExternalLocation=fonts/]{linlibertine_re-4.7.5ro.ttf}[
Ligatures=TeX,
BoldFont=linlibertine_bd-4.1.5ro.ttf,
ItalicFont=linlibertine_it-4.2.6ro.ttf
]
% Chinese font
% 思源宋體
\setmainjfont[Scale=0.85,ExternalLocation=fonts/]{NotoSerifTC-Regular.otf}[
Ligatures=TeX,
BoldFont=NotoSerifTC-Bold.otf,
ItalicFont=NotoSerifTC-Regular.otf,
BoldItalicFont=NotoSerifTC-Regular.otf,
]
% 芫荽體
% \setmainjfont[Scale=0.85,ExternalLocation=./fonts/]{Iansui-Regular.ttf}
% font for code
\newfontfamily{\Iosevka}[Path=./fonts/, Scale=0.86]{iosevka-fixed-ss15-regular.ttf}
\newfontfamily{\IosevkaItalic}[Path=./fonts/, Scale=0.86]{iosevka-fixed-ss15-italic.ttf}
\newfontfamily{\IosevkaBold}[Path=./fonts/, Scale=0.86]{iosevka-fixed-ss15-bold.ttf}
% ----------------------------
% Bibliography
% ----------------------------
\usepackage[backend=biber,maxbibnames=99,sorting=ynt,isbn=false]{biblatex}
\renewcommand{\cite}{\autocite}
\addbibresource{report.bib}
% ----------------------------
% Code
% ----------------------------
\usepackage{listings}
\usepackage[dvipsnames]{xcolor} % color
\usepackage[most]{tcolorbox}
\tcbset{on line,
boxsep=0pt, left=3pt,right=3pt,top=2pt,bottom=2pt,
colframe=white,
highlight math style={enhanced}
}
% my color
\definecolor{MyRed}{HTML}{FF6666}
\definecolor{MyGreen}{HTML}{00CC00}
\definecolor{MyBlue}{HTML}{3399FF}
\definecolor{MyOrange}{HTML}{FF9933}
\definecolor{MyGreenBG}{HTML}{CCFF99}
\definecolor{MyYellowBG}{HTML}{FFFF99}
\definecolor{MyGreyBG}{HTML}{E6E6E6}
% copy indent from the code
\lstset{keepspaces=true}
\makeatletter
\def\lst@outputspace{{\ifx\lst@bkgcolor\empty\color{white}\else\lst@bkgcolor\fi\lst@visiblespace}}
\makeatother
% make line number of code no be copied
% https://tex.stackexchange.com/a/122270
\usepackage[space=true]{accsupp}
\newcommand{\noncopynumber}[1]{%
\BeginAccSupp{method=escape,ActualText={}}%
#1%
\EndAccSupp{}%
}
% Python style for highlighting
\newcommand\pythonstyle{\lstset{%
language=Python,%
basicstyle=\Iosevka,%
morekeywords={self,with},% Add keywords here
keywordstyle=\IosevkaBold\color{BlueViolet},%
emph={MyClass,__init__},% Custom highlighting
emphstyle=\IosevkaBold\color{BrickRed},% Custom highlighting style
stringstyle=\color{ForestGreen},%
frame=single,% Any extra options here
showstringspaces=false,%
showspaces=true,%
commentstyle=\IosevkaItalic\color{Gray},%
morecomment=[l][\IosevkaItalic\color{Gray}]{\#},%
numbers=left,%
stepnumber=1,%
literate={-}{-}1,%
columns=fullflexible,%
numberstyle=\footnotesize\noncopynumber,%
mathescape=true,% show math equation, e.g., $x = \sqrt{2}$
}}
% remove space char
\makeatletter
\def\lst@visiblespace{ }
\makeatother
% Python for inline
\newcommand\pythoninline[1]{%
{\pythonstyle\lstinline[breaklines=false]{#1}}}
\newcommand\pythoninlinebg[1]{%
\tcbox[colback=MyGreyBG]{{\pythonstyle\lstinline[breaklines=false]{#1}}}%
}
% Python for block
\lstnewenvironment{python}[1][]{%
\pythonstyle\footnotesize\lstset{#1}%
}{}
% ----------------------------
% links of cite, ref
% ----------------------------
\usepackage{xurl} % url wrap
\usepackage{hyperref}
\hypersetup{
colorlinks,
linkcolor=[RGB]{120, 29, 125},
citecolor=[RGB]{120, 29, 125},
urlcolor=[RGB]{0, 85, 150}
}
% ----------------------------
% Figure
% ----------------------------
\usepackage{graphicx} % figure
\usepackage{caption}
% ----------------------------
% Misc.
% ----------------------------
\usepackage{placeins} % \FloatBarrier
\usepackage{booktabs} % \toprule, \midrule, \bottomrule
\renewcommand{\figurename}{圖}
\newcommand{\sectionname}{節}
\newcommand{\chaptername}{章}
\renewcommand{\tablename}{表}
\renewcommand{\lstlistingname}{程式碼}
\newcommand{\Figure}[1]{\figurename~#1}
\newcommand{\Table}[1]{\tablename~#1}
\newcommand{\Section}[1]{\sectionname~#1}
\newcommand{\Chapter}[1]{\chaptername~#1}
\newcommand{\Listing}[1]{\lstlistingname~#1}
\title{繁體中文標題}
\author{作者:黃柏瑄\\
\texttt{aben20807@gmail.com}
}
\date{} % skip date
\begin{document}
\maketitle
\section{介紹}\label{sec:first}
這是一個關於 LaTeX 的介紹。測試引用功能 \cite{huang2023securetvm}。
\subsection{第一節的一個小節}\label{sec:first_sub}
這是第一章的一個小節。參見第 \ref{sec:second} 節中的更多細節。
\section{第二節標題}\label{sec:second}
這是第二節的內容。\textcolor{MyRed}{參見}第 \ref{sec:first} 節以獲得\textcolor[HTML]{FF6666}{更多資訊}。
\section{程式碼}\label{sec:code}
使用行內程式碼,\pythoninline{print("Hello")},也可以使用有背景顏色版本\pythoninlinebg{x = 42}。程式碼區塊如下方~\Listing{\ref{list:example}}。
\begin{python}[caption={定義 \protect\pythoninlinebg{main} 函式。},label=list:example,escapechar=|]
def main():
x = 42
print(f"Hello {x}")
if __name__ == "__main__":
main()
\end{python}
\section{圖片}
參考~\Figure{\ref{fig:A}} 和~\Figure{\ref{fig:B}}。
\begin{table}[t]
\centering
\begin{minipage}[t]{.48\linewidth}
\includegraphics[width=\linewidth]{figures/paper-example.pdf}
\captionof{figure}{第一張圖。}
\label{fig:A}
\end{minipage}
\qquad
\begin{minipage}[t]{.44\linewidth}
\includegraphics[width=\linewidth]{figures/cat.png}
\captionof{figure}{第二張圖。}
\label{fig:B}
\end{minipage}
\end{table}
\section{表格}
參考~\Table{\ref{tab:example}}。
\begin{table}[t]
\centering
\caption{表格說明。}\label{tab:example}
\begin{tabular}{lll}
\toprule
\textbf{Category} & \textbf{Work} & \textbf{Tags} \\
\midrule
Open & Title A & A, B, C \\
Open & Title B & B, D \\
Close & Title C & A, B, D \\
Close & ``Title D'' & E \pythoninlinebg{TestClass} \\
\bottomrule
\end{tabular}
\end{table}
\FloatBarrier
\renewcommand*{\bibfont}{\small}
\printbibliography[
heading=bibintoc,
title={參考文獻}
]
\end{document}
完成效果: