1. 从零到一:为什么国赛论文必须用LaTeX?
如果你正在准备全国大学生数学建模竞赛,或者任何需要提交高质量学术论文的比赛,那么“用什么工具写论文”这个问题,很可能已经困扰了你一阵子。你身边或许有同学在用Word,觉得所见即所得,上手快;也有的在用WPS,功能类似。但当你看到那些排版精美、公式工整、引用规范的获奖论文时,心里多半会嘀咕:他们是怎么做到的?
答案大概率是LaTeX。这不是一个软件,而是一个专业的排版系统。你可以把它理解为一个“代码驱动的排版引擎”。你写的是纯文本代码,比如\section{问题重述},然后通过编译,生成一个格式完美的PDF文档。这个过程,就像程序员写代码然后运行出程序一样。
为什么国赛这种级别的竞赛,LaTeX几乎是默认的“专业选手”入场券?原因很直接:
- 公式与排版的绝对优势:数学建模论文的核心是数学公式。在Word里插入复杂的多行公式、矩阵、分段函数,对齐和调整格式是场噩梦,一个微小的改动就可能让整个文档的排版乱掉。LaTeX则不然,它生来就是为了处理数学公式,用简洁的语法(如
\begin{equation})就能生成出版级质量的公式,且全局自动编号、交叉引用,稳如泰山。 - 结构与内容的分离:你只需要关心“写什么”(内容),而“长什么样”(格式)由文档类(.cls)和宏包预先定义好。这意味着,一旦你选好或定制了一个优秀的论文模板,你的所有论文都会自动遵循统一的、专业的格式,无需在字体、行距、页边距上浪费时间。
- 引用与文献管理的自动化:论文中引用参考文献是刚需。LaTeX配合BibTeX,可以让你用一个
.bib文件管理所有文献,在文中用\cite{}命令引用,最后自动生成格式完美的参考文献列表。完全不用担心顺序错乱、格式不一。 - 版本控制友好:因为源文件是纯文本,你可以用Git等工具进行版本管理,清晰地看到每一次修改的内容,方便团队协作。而Word的
.docx文件是二进制格式,很难进行有效的差异对比。
所以,当你决定参加国赛,使用LaTeX不是一个“可选项”,而是一个能让你在起跑线上就获得显著优势的“必选项”。它前期学习曲线稍陡,但一旦掌握,在撰写长篇、多公式、多参考文献的学术文档时,效率和质量是碾压级的。
接下来的内容,我将为你汇总一套经过实战检验的LaTeX代码框架、核心模块和避坑指南。这不是一个简单的模板压缩包,而是一套“可运营”的解决方案,我会解释每一部分为什么这样设计,以及在实际比赛中如何高效使用。
2. 国赛LaTeX论文的核心骨架与文件结构
一个管理良好的LaTeX项目,文件结构清晰至关重要。这不仅能让你自己思路清晰,也便于队友协作。下面是一个我推荐并经过多次比赛验证的目录结构:
your_project/ ├── main.tex # 主文档,论文的入口 ├── preamble.tex # 导言区设置,所有样式和宏包定义 ├── references.bib # BibTeX参考文献数据库 ├── assets/ # 资源文件夹 │ ├── figures/ # 存放所有图片(.pdf, .png, .jpg) │ └── codes/ # 存放重要的算法代码片段(备用) ├── chapters/ # 章节文件夹 │ ├── 01_abstract.tex │ ├── 02_introduction.tex │ ├── 03_model_building.tex │ ├── 04_model_solving.tex │ ├── 05_results_analysis.tex │ ├── 06_discussion.tex │ └── 07_conclusion.tex └── Makefile (或 compile.sh) # 编译脚本(可选,但强烈推荐)为什么这样设计?
- 主次分离 (
main.tex&preamble.tex): 将长长的宏包加载和样式设置扔进preamble.tex,让main.tex只负责组织文档结构(\include或\input章节),这样主文件非常干净,修改结构一目了然。 - 章节模块化 (
chapters/): 每个章节一个独立.tex文件。好处是:① 可以多人同时编辑不同章节,用Git管理时冲突概率低;② 编译时可以暂时注释掉未完成的章节,快速编译已完成部分进行检查;③ 心理上,攻克一个个小文件比面对一个巨型文件压力小得多。 - 资源集中管理 (
assets/): 所有图片集中放置,引用路径统一(如assets/figures/model_flow.pdf)。永远使用相对路径,这样你把整个项目文件夹打包发给队友或上传系统,不会出现图片丢失的惨剧。 - 编译自动化 (
Makefile): 国赛论文通常需要编译多次(LaTeX -> BibTeX -> LaTeX x2)才能生成正确的引用和目录。手动执行这些命令既容易错又浪费时间。一个简单的脚本能一键完成所有步骤。
下面,我们深入main.tex和preamble.tex的核心代码。
2.1 主文档 (main.tex) 的标准化写法
main.tex是论文的蓝图。它的核心任务是按顺序“组装”各个部分。
% main.tex \documentclass[12pt, a4paper]{article} % 国赛一般用article,12pt,A4纸 \input{preamble} % 引入导言区设置 \begin{document} % ========== 前置部分 ========== \maketitle % 生成标题,标题信息在preamble.tex中定义 \begin{abstract} \input{chapters/01_abstract} % 摘要单独文件 \end{abstract} \keywords{关键词一;关键词二;关键词三} % 关键词 % ========== 主体部分 ========== \tableofcontents % 目录 \newpage \input{chapters/02_introduction} % 问题重述与分析 \input{chapters/03_model_building} % 模型建立 \input{chapters/04_model_solving} % 模型求解 \input{chapters/05_results_analysis} % 结果分析 \input{chapters/06_discussion} % 模型的评价与推广 % \input{chapters/07_conclusion} % 结论(如果要求) % ========== 参考文献 ========== \newpage \bibliographystyle{plain} % 参考文献样式,国赛常用plain或unsrt \bibliography{references} % 指定BibTeX数据库文件 % ========== 附录(可选) ========== \newpage \begin{appendix} \section{核心算法代码} % 可以在这里直接写代码,或者输入外部文件 % \lstinputlisting[language=Python]{assets/codes/main_algorithm.py} \section{大型数据表格} % 如果正文放不下的超大表格可以放这里 \end{appendix} \end{document}注意:这里使用了
\input命令。它与\include的区别在于:\input是简单插入,而\include会另起一页,并且有缓存机制,适合更大的文档。对于国赛论文,\input完全足够且更灵活。
2.2 导言区 (preamble.tex) 的详细配置
这里是LaTeX的“控制中心”,所有样式和功能扩展都在此定义。一份好的导言区能让后续写作事半功倍。
% preamble.tex % !!! 标题、作者信息定义 !!! \title{基于XXXX模型的XXXX问题研究} % 你的论文标题 \author{ 作者一 \thanks{学校,邮箱} \\ 作者二 \thanks{学校,邮箱} \\ 作者三 \thanks{学校,邮箱} } \date{\today} % 自动生成当前日期,或手动指定 \date{2023年9月10日} % !!! 核心宏包加载 !!! \usepackage[UTF8]{ctex} % 中文支持,国赛必备!确保你的编译器支持(如XeLaTeX) \usepackage{geometry} % 页面设置 \geometry{a4paper, left=2.5cm, right=2.5cm, top=2.5cm, bottom=2.5cm} % 国赛建议页边距 \usepackage{amsmath, amssymb, amsthm} % AMS数学公式宏包套件,必备 \usepackage{bm} % 加粗的数学符号,如向量 \bm{v} \usepackage{graphicx} % 插入图片 \graphicspath{{assets/figures/}} % 设置默认图片路径,这样写\includegraphics{filename}即可 \usepackage{booktabs} % 绘制三线表,专业美观 \usepackage{multirow, multicol} % 表格合并行/列 \usepackage{longtable} % 跨页长表格 \usepackage{hyperref} % 生成超链接(目录、引用可点击) \hypersetup{ colorlinks=true, linkcolor=blue, filecolor=magenta, urlcolor=cyan, citecolor=blue, } \usepackage{listings} % 插入代码 \usepackage{xcolor} % 代码高亮颜色定义 \lstset{ basicstyle=\ttfamily\small, keywordstyle=\color{blue}, commentstyle=\color{green!60!black}, stringstyle=\color{red}, numbers=left, numberstyle=\tiny\color{gray}, frame=single, breaklines=true, captionpos=b, tabsize=4 } \usepackage{float} % 提供[H]等浮动体位置强制选项 \usepackage{caption} % 定制图表标题格式 \captionsetup{font=small, labelfont=bf} % 标题字体设置 \usepackage{enumitem} % 定制列表环境 \setlist{nosep} % 减少列表项间距,更紧凑 % !!! 自定义命令与环境(效率神器)!!! % 1. 定义常用的数学符号集 \newcommand{\R}{\mathbb{R}} % 实数集 \newcommand{\N}{\mathbb{N}} % 自然数集 \newcommand{\E}{\mathbb{E}} % 期望 \newcommand{\prob}{\mathbb{P}} % 概率 % 2. 定义定理类环境(如果论文需要) \newtheorem{definition}{定义}[section] \newtheorem{theorem}{定理}[section] \newtheorem{lemma}{引理}[section] \newtheorem{proof}{证明}[section] % 3. 定义一个用于输入模型假设的便捷环境 \newenvironment{assumptions} {\begin{itemize}[label={\textbf{假设 \arabic*.}}, leftmargin=*]} {\end{itemize}} % !!! 编译与调试提示 !!! % 如果编译报错,可以暂时注释掉hyperref宏包,它有时会干扰错误定位。 % 使用XeLaTeX编译以支持ctex宏包的中文。这份preamble.tex是一个功能完备的起点。在实际比赛中,你可能不需要所有宏包,但有了它,你可以随时按需启用或注释掉某些部分。
3. 数学建模论文各章节的LaTeX写作范式
有了骨架,我们来填充血肉。数学建模论文有固定的章节结构,每个部分都有其写作要点和对应的LaTeX实现技巧。
3.1 摘要与关键词
摘要虽然短,但至关重要。它需要独立成页,且严格控制在规定字数内(国赛通常一页以内)。
% chapters/01_abstract.tex 本文针对\textbf{“XXXX问题”},通过分析其内在规律与约束条件,建立了相应的数学模型,并设计了高效的求解算法,最终给出了具有参考价值的结论与建议。 首先,针对问题一(描述问题一),我们提出了基于\textbf{XXX理论}的\textbf{YYY模型}。该模型的核心思想是(用一两句话概括)。通过(具体方法,如拟合、优化、仿真等),我们得到了(关键结果1)。其(指标)达到了(数值),表明(结论1)。 其次,对于问题二(描述问题二),我们在问题一模型的基础上,引入了\textbf{ZZZ因素}进行拓展,构建了\textbf{AAA-BBB联合模型}。该模型考虑了(新考虑的条件)。利用(算法,如遗传算法、模拟退火等)进行求解,得到了(关键结果2)。分析显示(结论2)。 进一步地,针对问题三(描述问题三),我们综合前两问的结论,建立了\textbf{综合评价体系}。通过(评价方法,如熵权法、TOPSIS等)对(对象)进行评价/排序/预测,结果为(关键结果3)。敏感性分析表明,模型对(某个参数)的变化较为稳健/敏感。 最后,我们总结了模型的优点(如通用性强、求解效率高)与局限性(如对数据质量依赖大),并提出了若干改进方向与推广建议。 \textbf{关键词}应在 `main.tex` 的 `\keywords{}` 命令中填写,而不是在这里。这里只是摘要正文。摘要写作心得:
- 倒金字塔结构:先总述,再分问题阐述,最后总结。每个问题遵循“模型->方法->结果->结论”的逻辑链。
- 量化结果:尽可能给出具体的数值结果,如“误差降低15%”、“满意度达到92%”,这比模糊的“效果良好”更有力。
- 避免细节:不要出现公式、图表引用、参考文献引用。用文字描述模型和结果。
- 反复打磨:摘要通常是评委最先看且看得最仔细的部分,务必字斟句酌,写完初稿后,全文写完再回来修改摘要,确保它精准概括全文精华。
3.2 问题重述与分析
这一部分不是简单抄写赛题,而是展示你对问题的理解深度。
% chapters/02_introduction.tex \section{问题重述与分析} \subsection{问题背景与重述} % 用自己的话重新组织题目背景,突出问题的现实意义。 随着(某个领域)的发展,(某个问题)日益凸显。本题要求参赛者基于提供的(数据/信息),解决以下X个核心问题: \begin{enumerate} \item \textbf{问题一:}(精确、简洁地重述问题一,可拆分小点)。 \item \textbf{问题二:}(精确、简洁地重述问题二)。 \item \textbf{问题三:}(精确、简洁地重述问题三)。 \end{enumerate} \subsection{问题分析} % 这是展示你解题思路的窗口,多用流程图。 \textbf{3.2.1 问题一分析} 问题一的核心是(指出核心矛盾或目标)。其难点在于(例如,数据量大、约束复杂、目标多元)。我们初步认为,可以将其抽象为一个(优化/预测/分类)问题。解决思路如图\ref{fig:analysis1}所示。 \begin{figure}[H] % [H]强制图片就在当前位置,需要float宏包 \centering \includegraphics[width=0.8\textwidth]{problem1_analysis.pdf} % 使用矢量图PDF更清晰 \caption{问题一求解思路流程图} \label{fig:analysis1} \end{figure} \textbf{3.2.2 问题二分析} 问题二在问题一的基础上,增加了(新的条件或维度),这使得(原有模型的哪个部分不再适用)。因此,我们需要着重考虑(如何整合新条件),可能的途径是(构建耦合模型或引入新的决策变量)。 \textbf{3.2.3 问题三分析} 问题三要求(进行评价/预测/决策),这需要建立一个系统的评价体系。我们将综合考虑前两问的(结果/指标),利用(某种评价方法)进行量化评估。问题分析的心得:
- 图文并茂:一张清晰的思路流程图(可以用Visio、Draw.io甚至PPT画,导出为PDF)比大段文字更有说服力。
- 抓住核心:分析不是罗列所有可能,而是直奔主题,指出你认为最关键的一两个难点和突破口。
- 承上启下:分析的最后,要自然过渡到下一章“我们因此建立如下模型”。
3.3 模型建立
这是论文的理论核心,需要清晰地定义符号、阐述假设、建立数学模型。
% chapters/03_model_building.tex \section{模型的建立} \subsection{模型准备} \subsubsection{符号说明} 为保证表述清晰,本文使用的主要符号及其含义如表\ref{tab:symbols}所示。 \begin{table}[H] \centering \caption{主要符号说明} \label{tab:symbols} \begin{tabular}{ccl} \toprule \textbf{符号} & \textbf{类型} & \textbf{含义} \\ \midrule $N$ & 标量 & 客户总数量 \\ $x_{ij}$ & 0-1变量 & 表示客户$i$是否由配送中心$j$服务 \\ $d_{ij}$ & 标量 & 从点$i$到点$j$的距离 \\ $\mathbf{w}$ & 向量 & 神经网络权重向量 \\ $\mathcal{S}$ & 集合 & 所有可能的解空间 \\ \bottomrule \end{tabular} \end{table} \subsubsection{基本假设} 为简化问题,突出主要矛盾,本文作出如下合理假设: \begin{assumptions} % 使用preamble中自定义的环境 \item 假设数据来源真实可靠,无系统性误差。 \item 假设在短时间内,系统的外部环境参数保持稳定。 \item 假设每个客户的需求必须被且仅被一个配送中心满足。 \item (根据具体问题继续添加...) \end{assumptions} \subsection{问题一模型:基于XXX的YYY模型} \subsubsection{模型构建} 基于问题分析,我们将问题一建模为一个(线性/非线性/整数)规划模型。 \begin{itemize} \item \textbf{目标函数:} 目标是(最小化总成本/最大化总收益/最小化误差)。其数学表达式为: \begin{equation} \min Z = \sum_{i=1}^{N}\sum_{j=1}^{M} c_{ij} x_{ij} \label{eq:obj1} \end{equation} \item \textbf{约束条件:} \begin{align} &\sum_{j=1}^{M} x_{ij} = 1, \quad \forall i \in \{1,\dots,N\} \label{eq:con1} \\ &\sum_{i=1}^{N} d_i x_{ij} \le C_j, \quad \forall j \in \{1,\dots,M\} \label{eq:con2} \\ &x_{ij} \in \{0, 1\}, \quad \forall i,j \label{eq:con3} \end{align} 其中,式\eqref{eq:con1}保证了(每个客户只被服务一次),式\eqref{eq:con2}表示(容量约束),式\eqref{eq:con3}定义了决策变量的取值范围。 \end{itemize} \subsubsection{模型解释与创新点} (此处用文字解释模型的经济或物理意义,并可以简要说明模型的创新之处,例如“引入了模糊系数以处理不确定性”)。 % 如果有多个子模型,继续用\subsection, \subsubsection组织 \subsection{问题二模型:ZZZ拓展模型} (结构类似,注意引用问题一中的公式或变量,体现模型的递进关系)。模型建立的心得:
- 符号表先行:在写公式前先给出符号表,读者查阅方便,显得非常专业。
- 公式编号与引用:使用
\eqref{}引用公式编号,LaTeX会自动处理编号和更新。如果公式很长需要换行,使用\begin{align} ... \end{align}环境,&用于对齐,\\用于换行。 - 假设要合理且必要:每一条假设都应服务于简化模型,并且要在后面的“模型评价”部分讨论其合理性及放宽假设可能带来的影响。
- 模型阐述重于罗列:不要只扔出一堆公式。每个重要的公式下面,都应该有一两句解释,说明它代表了什么现实含义。
3.4 模型求解与结果分析
这部分展示你如何“算”出结果,以及结果说明了什么。
% chapters/04_model_solving.tex \section{模型的求解与结果分析} \subsection{求解算法设计} 对于\ref{sec:model1}节建立的模型(这是一个混合整数线性规划模型),我们选择使用\textbf{分支定界法},并调用\textbf{Gurobi}优化求解器进行求解。Gurobi是目前性能领先的商业优化求解器,能高效处理大规模整数规划问题。 \textbf{算法核心步骤简述如下:} \begin{enumerate} \item \textbf{松弛:} 首先忽略整数约束,求解线性规划松弛问题,得到下界。 \item \textbf{分支:} 选择一个分数变量 $x_{ij}$,创建两个子问题,分别固定 $x_{ij}=0$ 和 $x_{ij}=1$。 \item \textbf{定界与剪枝:} 求解子问题的松弛解。若子问题不可行或其目标值差于当前最优整数解,则剪枝该分支;若得到新的整数解,则更新当前最优解。 \item \textbf{迭代:} 重复分支、定界过程,直到所有分支被探查完毕。 \end{enumerate} 对于问题二的复杂非线性模型,我们设计了\textbf{模拟退火算法}。其关键参数设置如下:初始温度 $T_0 = 1000$,衰减系数 $\alpha = 0.95$,马尔可夫链长度 $L = 200$,终止温度 $T_{end} = 1e-6$。算法流程图如图\ref{fig:sa_flowchart}所示。 % 插入算法流程图 \subsection{数据处理与实验设置} 我们使用Python的Pandas库对提供的原始数据进行清洗,处理了缺失值与异常值。所有实验均在配置为(CPU: i7-12700H, RAM: 16GB)的计算机上运行,操作系统为Windows 11。编程环境为Python 3.9。 \subsection{求解结果与分析} \subsubsection{问题一结果} 运行模型求解后,得到最优目标函数值 $Z^* = 15432.7$(单位)。具体的配送方案如表\ref{tab:solution1}所示。 \begin{table}[H] \centering \caption{问题一最优配送方案(部分)} \label{tab:solution1} \begin{tabular}{cccc} \toprule \textbf{客户ID} & \textbf{配送中心} & \textbf{需求量} & \textbf{是否服务} \\ \midrule C001 & DC-A & 150 & 是 \\ C002 & DC-B & 200 & 是 \\ ... & ... & ... & ... \\ \bottomrule \end{tabular} \end{table} 为了更直观地展示结果,我们绘制了配送网络图(图\ref{fig:network1})。从图中可以看出,方案呈现出明显的“聚类”特征,符合预期。 % 插入结果图 \subsubsection{问题二结果} 在问题一基础上引入时间窗约束后,总成本上升至 $16895.3$,增幅约 $9.5\%$。这反映了服务质量(准时性)与成本之间的权衡。不同时间窗宽度下的成本变化曲线如图\ref{fig:cost_vs_window}所示,可见当时间窗宽于4小时后,成本增长趋于平缓。 % 插入敏感性分析图 \subsubsection{敏感性分析} 为检验模型的稳健性,我们对关键参数(如单位运输成本 $c_{ij}$)进行了 $\pm 10\%$ 的扰动。结果显示,最优目标值的变化范围在 $[-5.2\%, +6.1\%]$ 之间,表明模型对参数波动不敏感,具有较好的稳定性。求解与分析的心得:
- 算法要说人话:不要只写“我们用了遗传算法”,要简要说明为什么选它(适合离散搜索、全局优化能力强),以及关键参数是如何设定的(可以引用一般经验值或说明经过了简单测试)。
- 环境要交代:写明使用的软件、工具包、版本和硬件环境,这是可重复性的体现。
- 结果可视化:图表比表格更直观,表格比文字更精确。多用高质量的图表(建议使用矢量图格式如PDF、SVG,放大不失真)。每个图表都必须有自解释性的标题和编号,并在正文中引用。
- 分析要深入:不要只说“结果如表X所示”。要解读数据:这个结果说明了什么趋势?与你的预期是否一致?为什么会出现这个结果?结合模型本身和问题背景进行解释。
4. 高效协作与编译:团队如何玩转LaTeX
数学建模是团队作战,LaTeX项目的协作顺畅与否直接影响效率。
4.1 版本控制Git:避免“论文合并地狱”
强烈建议使用Git(配合GitHub、Gitee或GitLab)管理你们的LaTeX项目。
- 初始化:一人在项目根目录执行
git init,创建.gitignore文件忽略编译中间文件(如.aux,.log,.out,.bbl,.blg等)。 - 分工:每人负责1-2个章节文件(
chapters/下的.tex文件)。修改preamble.tex、main.tex或添加图片前,先在团队内沟通。 - 提交规范:每次完成一个逻辑完整的修改后(如写完一个小节),执行:
提交信息写清楚,方便回溯。git add chapters/03_model_building.tex git commit -m “feat: 完成3.1节符号说明与基本假设部分” - 解决冲突:如果两人同时修改了同一行,Git会标记冲突。此时需要面对面沟通,决定保留谁的版本,或手动合并。
4.2 编译脚本:一键生成最终PDF
手动执行xelatex -> bibtex -> xelatex -> xelatex太麻烦。创建一个脚本吧。
对于Linux/macOS或Windows的Git Bash,创建compile.sh:
#!/bin/bash # compile.sh echo "开始编译LaTeX文档..." # 1. 第一次编译,生成 .aux 等辅助文件 xelatex -synctex=1 -interaction=nonstopmode main.tex if [ $? -ne 0 ]; then echo "第一次xelatex编译失败,请检查错误。" exit 1 fi # 2. 编译参考文献 bibtex main.aux if [ $? -ne 0 ]; then echo "bibtex编译失败,请检查 .bib 文件。" exit 1 fi # 3. 第二次编译,插入参考文献引用 xelatex -synctex=1 -interaction=nonstopmode main.tex # 4. 第三次编译,确保交叉引用(目录、图表编号)正确 xelatex -synctex=1 -interaction=nonstopmode main.tex echo "编译完成!请查看 main.pdf 文件。"对于Windows,可以创建compile.bat:
@echo off REM compile.bat echo 开始编译LaTeX文档... xelatex -synctex=1 -interaction=nonstopmode main.tex if errorlevel 1 ( echo 第一次xelatex编译失败,请检查错误。 pause exit /b 1 ) bibtex main.aux if errorlevel 1 ( echo bibtex编译失败,请检查 .bib 文件。 pause exit /b 1 ) xelatex -synctex=1 -interaction=nonstopmode main.tex xelatex -synctex=1 -interaction=nonstopmode main.tex echo 编译完成!请查看 main.pdf 文件。 pause在终端中运行./compile.sh或双击compile.bat,即可一键得到最终的main.pdf。
4.3 图片管理:矢量图优先,规范命名
- 格式优先:流程图、示意图尽量用矢量图(
.pdf,.svg)。代码画图(Python的Matplotlib)保存时用plt.savefig('figure.pdf', bbox_inches='tight')。软件画图(Visio, Draw.io)导出为PDF。位图(.png,.jpg)只用于照片或屏幕截图,并确保分辨率足够(300 dpi以上)。 - 规范命名:图片文件名要有意义,如
problem1_analysis.pdf,result_comparison.png。避免使用1.png,aaa.jpg这种无法区分的名字。 - 统一尺寸:在LaTeX中,用
[width=0.8\textwidth]或[height=5cm]来控制图片大小,保持全文图表风格统一。
5. 实战中的高频“踩坑点”与解决方案
即使有了模板,在实际写作中你依然会遇到各种报错和奇葩问题。下面是一些我踩过的坑和填坑方法。
5.1 中文与字体问题:乱码与找不到字体
问题:使用ctex宏包后编译,中文显示为乱码,或报错“字体XXX找不到”。
根因与解决:
- 编译器选错:必须使用XeLaTeX或LuaLaTeX编译器,因为它们原生支持UTF-8编码和系统字体。在Overleaf上,菜单的“编译器”选项中选择“XeLaTeX”。在本地TeX发行版(如TeX Live, MiKTeX)的编辑器中(如TeXstudio, VS Code with LaTeX Workshop),也需要在设置里将默认编译器改为XeLaTeX。
- 文件编码错误:确保你的所有
.tex文件都以UTF-8 without BOM格式保存。这是现代编辑器的默认设置,但如果你用Windows记事本编辑过,可能会出问题。用VS Code、Sublime Text等编辑器重新保存。 - 字体缺失(本地编译):
ctex默认会尝试使用系统中文字体。如果报字体错误,可以在preamble.tex中显式指定字体:
将\usepackage{fontspec} \setmainfont{SimSun} % 设置宋体为主字体 \setsansfont{SimHei} % 设置黑体为无衬线字体 \setmonoffont{Consolas} % 设置等宽字体SimSun,SimHei替换成你系统里有的中文字体名(如“Microsoft YaHei”)。
5.2 参考文献管理:引用显示问号 [?]
问题:文中用\cite{key}引用的文献,在PDF里显示为 [?]。
根因与解决:这是LaTeX引用机制的问题。参考文献需要多轮编译才能正确显示。
- 确保编译流程正确:这就是为什么需要编译脚本。必须执行:
xelatex -> bibtex -> xelatex -> xelatex。 - 检查
.bib文件:- 确保
\bibliography{references}中的文件名(不包含后缀)与你的.bib文件(如references.bib)匹配。 - 确保
\cite{key}中的key在.bib文件中存在且拼写一致。 - 检查
.bib文件语法,常见条目如下:@article{greenwade93, author = "George Greenwade", title = "The {C}omprehensive {T}ex {A}rchive {N}etwork ({CTAN})", year = "1993", journal = "TUGBoat", volume = "14", number = "3", pages = "342--351" } @book{knuth84, author = "Donald E. Knuth", title = "The {TeX}book", year = "1984", publisher = "Addison-Wesley" }
- 确保
- 清理中间文件再重试:删除所有
.aux,.bbl,.blg,.log文件(除了.tex,.bib,.pdf和图片),然后重新执行完整编译流程。很多编辑器有“清理辅助文件”的功能。
5.3 浮动体排版:图表乱跑,不听话
问题:图表没有出现在我插入的代码附近,而是跑到了下一页或某一页的顶部/底部。
根因:LaTeX中,figure和table环境默认是“浮动体”,LaTeX会为了优化整体版面而调整它们的位置。这是特性,不是bug。
解决策略:
- 轻度控制:使用
[htbp]位置参数,表示“尽量放在这里(h),顶部(t),底部(b),单独一页(p)”。\begin{figure}[htbp]。 - 强制放置(慎用):加载
float宏包后,使用[H](大写H)选项,强制将浮动体放在当前代码位置。\begin{figure}[H]。缺点:可能导致当前页留下大片空白。 - 心理接受:对于大型文档,适当浮动是正常的。确保所有图表都有清晰的标题和标签(
\label),并在文中用图\ref{fig:xxx}正确引用,读者可以根据编号找到它,实际位置不重要。 - 使用
\caption和\label的顺序:\label必须放在\caption之后,因为\caption才会生成编号。\begin{figure} ... \caption{...} \label{...} ... \end{figure}。
5.4 复杂表格制作:三线表与合并单元格
问题:如何制作专业的三线表?如何合并行和列?
解决方案:使用booktabs宏包绘制三线表,用multirow和multicolumn宏包合并单元格。
\usepackage{booktabs, multirow, multicol} % 在preamble中 \begin{table}[H] \centering \caption{一个合并单元格的三线表示例} \label{tab:complex_table} \begin{tabular}{cccc} \toprule \multirow{2}{*}{\textbf{类别}} & \multicolumn{2}{c}{\textbf{指标}} & \multirow{2}{*}{\textbf{备注}} \\ \cmidrule(lr){2-3} % 2-3列的中线 & 指标A & 指标B & \\ \midrule 模型X & 0.95 & 0.87 & 表现优秀 \\ 模型Y & 0.89 & 0.92 & \multirow{2}{*}{需要调参} \\ 模型Z & 0.78 & 0.85 & \\ \bottomrule \end{tabular} \end{table}5.5 最后时刻的终极检查清单
在提交论文前,请对照此清单逐项检查:
格式合规性:
- [ ] 页边距、字体大小、行距是否符合竞赛要求?(国赛通常有官方模板或说明)
- [ ] 摘要是否单独一页?关键词格式是否正确?
- [ ] 图表标题、表头、公式编号格式是否全文统一?
- [ ] 参考文献格式是否符合要求(如国赛常用
plain或unsrt)?
内容完整性:
- [ ] 所有章节标题编号是否连续、正确?
- [ ] 文中所有
\ref{}和\cite{}引用是否都显示为正确编号,而非 [?]? - [ ] 目录、图表索引是否生成且页码正确?(编译足够次数)
- [ ] 是否已删除所有用于调试的注释(如
% TODO:)和无关代码?
文件与提交:
- [ ] 最终提交的PDF是否由脚本完整编译生成?(避免用“打印为PDF”功能,可能丢失超链接)
- [ ] 是否将整个项目文件夹(含
.tex,.bib, 图片文件夹)打包备份?这是你宝贵的原始资料。 - [ ] 如果要求提交源代码,是否整理了相关的算法代码文件(如
.py,.m)并放在指定位置?
LaTeX是一把利器,初学时会觉得繁琐,但一旦掌握,它带给你的效率提升和成果质量是质的飞跃。这份汇总不仅提供了代码模板,更希望传递一种“结构化、可管理”的写作思想。在三天高强度的国赛竞争中,一个稳定、高效的写作框架,能让你和你的团队更专注于建模与求解本身,而不是和格式纠缠。希望这套从骨架到细节,再到协作避坑的完整方案,能成为你冲击国赛奖项的坚实助力。