1. LaTeX公式排版:从基础到进阶
第一次用LaTeX写公式时,我被那些反斜杠和花括号搞得头晕眼花。直到发现用$E=mc^2$就能轻松插入质能方程,才意识到这比Word的公式编辑器高效多了。LaTeX的数学模式分为两种:行内公式用单美元符号包裹,独立公式用双美元符号或equation环境。比如这段文字里的质能方程就是行内公式,而下面这个麦克斯韦方程组就是独立公式:
\begin{equation} \nabla \cdot \mathbf{E} = \frac{\rho}{\epsilon_0} \end{equation}公式编号是学术写作的刚需。在equation环境里,LaTeX会自动给公式加上编号。如果需要引用,记得在环境内加上\label{eq:maxwell}这样的标签,之后用\eqref{eq:maxwell}就能自动生成编号引用。我写论文时经常遇到公式需要对齐的情况,这时候align环境就是神器:
\begin{align} f(x) &= (x+1)^2 \label{eq:example1} \\ &= x^2 + 2x + 1 \label{eq:example2} \end{align}&符号指定对齐位置,通常放在等号前面。每个\\表示换行,每行都会自动编号。如果不需要编号,可以用align*环境或在行尾加上\nonumber。对于多行公式组,gather环境可以让每个公式居中独立显示,而multline环境适合特别长的公式需要折行的情况。
矩阵和分段函数是理工科论文的常客。用bmatrix环境可以生成方括号矩阵,pmatrix生成圆括号矩阵。我经常用这个来展示神经网络权重:
\mathbf{W} = \begin{bmatrix} w_{11} & w_{12} & \cdots & w_{1n} \\ w_{21} & w_{22} & \cdots & w_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ w_{m1} & w_{m2} & \cdots & w_{mn} \end{bmatrix}分段函数建议用cases环境,它能自动加上左边的大括号:
f(x) = \begin{cases} x^2 & \text{当 } x \geq 0 \\ -x^2 & \text{当 } x < 0 \end{cases}2. 专业级表格制作技巧
三线表是学术论文的标准格式,用booktabs宏包可以轻松实现。我刚开始总是用\hline画线,直到审稿人指出这不够专业。正确做法是用\toprule、\midrule和\bottomrule:
\begin{table}[htbp] \centering \caption{不同算法的准确率比较} \begin{tabular}{lcc} \toprule 算法 & 训练集准确率 & 测试集准确率 \\ \midrule SVM & 95\% & 89\% \\ 随机森林 & 97\% & 91\% \\ 神经网络 & 99\% & 93\% \\ \bottomrule \end{tabular} \label{tab:performance} \end{table}表格位置参数[htbp]中的字母分别代表here、top、bottom和page,LaTeX会按优先级尝试放置。\label要放在\caption之后才能正确引用。
复杂表格经常需要跨列或跨行,这时候\multicolumn和\multirow就派上用场了(需要multirow宏包)。比如这个合并单元格的例子:
\begin{tabular}{|c|c|c|} \hline \multirow{2}{*}{模型} & \multicolumn{2}{c|}{准确率} \\ \cline{2-3} & 训练集 & 测试集 \\ \hline CNN & 98\% & 92\% \\ \hline \end{tabular}表格太宽超出页面怎么办?用tabularx宏包的X列类型可以自动调整列宽。我还会用\small临时缩小字体,或者用\rotatebox旋转表头。对于超长表格,longtable宏包支持跨页显示,记得在表头重复\endfirsthead和\endhead定义的内容。
3. 图片排版与多图并排
图片排版最头疼的就是浮动体位置问题。我的经验是尽量用[htbp]组合,必要时用!强制优先放置。\centering比center环境更节省空间:
\begin{figure}[htbp] \centering \includegraphics[width=0.8\textwidth]{network.pdf} \caption{神经网络架构图} \label{fig:network} \end{figure}图片尺寸可以用相对单位(如\textwidth)或绝对单位(如5cm)。scale参数等比例缩放,但矢量图建议用width或height保持清晰度。PDF格式的矢量图在LaTeX中显示效果最好,我通常用Inkscape绘制后导出为PDF。
多图并排是论文常见的需求,subfigure已经过时了,现在推荐用subcaption宏包配合minipage:
\begin{figure}[htbp] \centering \begin{minipage}[b]{0.48\textwidth} \centering \includegraphics[width=\textwidth]{loss.pdf} \subcaption{训练损失曲线} \label{fig:loss} \end{minipage} \hfill \begin{minipage}[b]{0.48\textwidth} \centering \includegraphics[width=\textwidth]{accuracy.pdf} \subcaption{测试准确率} \label{fig:accuracy} \end{minipage} \caption{模型训练结果} \label{fig:results} \end{figure}\hfill让两个minipage左右撑满,中间的间距会自动调整。注意总宽度要小于\textwidth,留出间距空间。子图引用用\subref{fig:loss},会自动生成(a)这样的标签。
4. 代码高亮与专业呈现
技术文档少不了代码展示,listings宏包是最常用的解决方案。我习惯在导言区统一设置样式:
\usepackage{xcolor} \usepackage{listings} \lstset{ basicstyle=\ttfamily\small, keywordstyle=\color{blue}, commentstyle=\color{green!50!black}, stringstyle=\color{red}, numbers=left, numberstyle=\tiny\color{gray}, stepnumber=1, numbersep=5pt, backgroundcolor=\color{white}, showspaces=false, showstringspaces=false, showtabs=false, tabsize=4, captionpos=b, breaklines=true, breakatwhitespace=true, escapeinside={\%*}{*)}, morekeywords={*,...} }然后在正文中插入Python代码:
\begin{lstlisting}[language=Python,caption=快速排序算法] def quicksort(arr): if len(arr) <= 1: return arr pivot = arr[len(arr)//2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quicksort(left) + middle + quicksort(right) \end{lstlisting}对于复杂代码,可以用\lstinputlisting直接导入源文件。如果需要强调某行代码,用firstline和lastline参数指定范围。我经常用emph参数给特定关键字加粗显示:
\lstset{emph={import,def,return},emphstyle=\bfseries}算法伪代码推荐用algorithm2e宏包,它生成的排版更接近学术论文风格:
\begin{algorithm}[H] \SetAlgoLined \KwData{训练集 $X$, 标签 $y$} \KwResult{模型参数 $\theta$} 初始化 $\theta$\; \While{未收敛}{ 计算梯度 $\nabla J(\theta)$\; 更新 $\theta \leftarrow \theta - \eta \nabla J(\theta)$\; } \caption{梯度下降算法} \end{algorithm}5. 文档结构与自动化工具
好的文档结构能让读者更容易理解内容。\section和\subsection自动编号,用\tableofcontents生成目录。我习惯在导言区设置章节格式:
\usepackage{titlesec} \titleformat{\section}[hang]{\normalfont\Large\bfseries}{\thesection}{1em}{} \titleformat{\subsection}[hang]{\normalfont\large\bfseries}{\thesubsection}{1em}{}参考文献管理用BibTeX最方便。创建.bib文件存储文献条目,然后在文档中引用:
\cite{key} % 引用编号 \citep{key} % 括号引用 \citet{key} % 文本引用编译顺序是LaTeX → BibTeX → LaTeX ×2。现在更推荐用biber后端配合biblatex宏包,支持更多文献类型和排序方式。
交叉引用用\label和\ref组合,LaTeX会自动处理编号。我习惯给所有可引用对象加上前缀:
\label{fig:architecture} % 图片 \label{tab:comparison} % 表格 \label{eq:matrix} % 公式 \label{sec:intro} % 章节自动化工具可以大幅提升效率。用\includeonly选择性编译章节,用minted宏包实现更好的代码高亮(需要Python Pygments)。对于大型项目,subfiles宏包允许单独编译子文件。我常用的编译命令是:
pdflatex -shell-escape main.tex biber main pdflatex -shell-escape main.tex6. 常见问题与调试技巧
遇到编译错误时,先看日志文件里!标记的错误位置。我遇到最多的问题是特殊字符未转义,比如&、%、_等在LaTeX中有特殊含义,需要写成\&、\%、\_。
图片找不到通常是路径问题。我建议:
- 使用相对路径而非绝对路径
- 避免中文和空格文件名
- 确认文件扩展名正确
- 用
\graphicspath{{figures/}}设置搜索路径
公式编号混乱时,检查是否误用了equation*等不编号环境。如果需要重置编号,用\setcounter{equation}{0}。子公式编号用subequations环境:
\begin{subequations} \begin{align} a &= b \label{eq:sub1} \\ c &= d \label{eq:sub2} \end{align} \end{subequations}参考文献显示问号?说明需要运行BibTeX。引用显示问号?可能是标签未定义或需要重新编译。我习惯用\usepackage{refcheck}检查未引用的标签。
性能优化方面,可以:
- 用
\include替代\input加速编译 - 预编译页眉页脚
\usepackage{prelim2e} - 禁用不必要的宏包
- 用
\usepackage{draftwatermark}加速预览
7. 进阶技巧与个性化定制
自定义命令和环境能让代码更简洁。比如我经常定义矩阵命令:
\newcommand{\mat}[1]{\mathbf{#1}} \newcommand{\trans}{\mathsf{T}}这样\mat{A}^\trans就能生成$\mathbf{A}^\mathsf{T}$。对于常用数学符号,可以在导言区统一定义:
\newcommand{\diff}{\mathop{}\!\mathrm{d}} \newcommand{\expect}{\mathbb{E}}页面布局调整用geometry宏包:
\usepackage[top=2cm,bottom=2cm,left=2.5cm,right=2.5cm]{geometry}字体设置推荐用fontspec(XeLaTeX/LuaLaTeX下):
\usepackage{fontspec} \setmainfont{Times New Roman} \setsansfont{Arial} \setmonofont{Courier New}颜色主题可以用xcolor定义:
\usepackage[dvipsnames]{xcolor} \definecolor{myblue}{RGB}{0,74,155}页眉页脚设计用fancyhdr:
\usepackage{fancyhdr} \pagestyle{fancy} \fancyhf{} \rhead{\thepage} \lhead{\leftmark}最后提醒,重要的LaTeX文件一定要用版本控制。我习惯用Git管理,.gitignore里排除临时文件:
*.aux *.log *.out *.toc *.bbl *.blg