
1. 为什么\cline和\cmidrule在同一行总是“粘”在一起如果你正在写学术论文、课程报告或者任何需要复杂表头的文档大概率遇到过这个场景一张表需要把某一行拆成好几段横线比如第 3 到第 4 列画一段、第 5 到第 6 列再画一段中间留出空隙。你写了\cline{3-4}\cline{5-6}编译出来却发现两段线几乎连成一条视觉上完全分不开。换成\cmidrule也一样\cmidrule{3-4}\cmidrule{5-6}默认会首尾相接看起来就是一条完整的横线。这个问题的本质在于\cline和\cmidrule都是“按列区间画线”的命令它们默认从区间起始列的左边界一直画到结束列的右边界相邻区间的边界正好重合所以两段线之间没有任何缝隙。\cmidrule比\cline多了一个能力——它支持在左端或右端做“修剪”也就是\cmidrule(l)、\cmidrule(r)以及\cmidrule(lr)通过裁掉线头来制造间距。而\cline本身没有这个参数只能靠列间距或者额外手段来分开。我试过在表头里混用这两个命令一开始以为随便加个空格就行结果编译出来该连的还是连。后来才明白要真正把一行内的划线分开核心是控制“线的起止位置”和“列之间的水平间距”这两件事。\cmidrule的(l)(r)参数就是干这个的它会把线的左端或右端往内缩一小段缩进量由\cmidrulewidth和列间距共同决定。而\cline没有这个机制所以当你在同一行既要分段又要留缝时优先用\cmidrule而不是\cline。还有一个容易被忽略的点\cmidrule的修剪参数必须紧跟在命令名后面写成\cmidrule(r){3-4}而不是\cmidrule{3-4}(r)顺序错了要么报错要么参数被忽略。另外如果你用的是booktabs宏包\cmidrule的行为会更规范线宽和间距都更符合学术排版习惯。下面这张对照表可以先帮你理清两个命令的差异特性\cline\cmidrule所属宏包LaTeX 内核booktabs支持左端修剪否是(l)支持右端修剪否是(r)支持两端修剪否是(lr)默认线宽较粗较细可调相邻区间默认行为首尾相接首尾相接但可修剪分开所以当你看到“一行的划线如何分开”这个问题时答案基本就落在\cmidrule的修剪参数上。接下来我会先讲清楚前置准备再给可直接复制的配置片段然后带你编译验证最后把常见报错逐个拆开。2. TaoToken 前置准备把 API Key 和接入信息配好在动手改表格之前先花两分钟把 TaoToken 的接入信息准备好。TaoToken 是一个面向开发者和技术写作者的模型调用入口你可以用它来跑代码补全、文档润色或者自动化生成 LaTeX 片段。官网地址是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 根地址是 https://taotoken.net/api 注意 API 地址后面不加任何查询参数。你需要拿到三样东西Base URL、API Key、Model ID。Base URL 就是上面那个 API 根地址API Key 要到控制台里创建入口在 https://taotoken.net/console/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite Model ID 则根据你用的模型来填比如做代码补全可以选对应的编码模型。如果你只是想让模型帮你检查 LaTeX 表格代码用模型对话页面就够了https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。如果你打算长期用模型辅助写论文、跑 Agent 或者做批量文档处理可以看一下 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面写了不同客户端的配置方式。用 Claude Code 的话Anthropic 兼容入口是 https://taotoken.net/claudecode-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecode-anthropicutm_campaignrewrite 。这里要提醒一句不管你在哪个客户端里配置Base URL、Key、Model ID 这三件套必须同时写对缺一个就会报 401 或者 model not found。下面给一个通用的 JSON 配置片段你可以直接改 Key 和 Model ID 后使用{ base_url: https://taotoken.net/api, api_key: sk-你的实际Key, model: 你的ModelID, timeout: 60 }如果你用的是 Cline 或者带 MCP 的编辑器插件配置项名称可能略有不同但核心字段就是 base_url、api_key、model 这三个。把这段配置放到你的客户端设置里保存后先发一条最简单的请求测试连通性确认返回正常再继续下面的 LaTeX 部分。这样万一后面编译报错你能快速判断是表格代码的问题还是接入配置的问题。3. 可复制配置\cmidrule修剪参数与booktabs设置现在进入正题。要把一行内的划线分开最稳的做法是使用booktabs宏包提供的\cmidrule并配合(l)(r)(lr)修剪参数。先在你的导言区加上\usepackage{booktabs}然后看一个最小可编译的例子。假设你要在一行里画三段线分别覆盖第 3-4 列、第 5-6 列、第 7-8 列并且每段之间留出缝隙\begin{tabular}{cccccccc} \toprule A B C D E F G H \\ \cmidrule(r){3-4} \cmidrule(lr){5-6} \cmidrule(l){7-8} 1 2 3 4 5 6 7 8 \\ \bottomrule \end{tabular}这里的关键是第一段用(r)把右端往里缩第二段用(lr)两端都缩第三段用(l)把左端往里缩。这样相邻两段之间就会自然出现空隙。缩进的幅度由\cmidrulewidth和列间距共同决定默认值在大多数学术模板里已经够用。如果你觉得缝隙太小可以在导言区调整\setlength{\cmidrulewidth}{0.03em}或者更直接地在\cmidrule后面手动加\hspace是不行的因为\cmidrule不是水平盒子。真正有效的做法是调整列间距\tabcolsep但那个会影响整张表。所以推荐还是用修剪参数配合booktabs的默认间距。如果你必须用\cline而不是\cmidrule那就要换思路把相邻区间的边界列拆开比如不要写\cline{3-4}\cline{5-6}而是写成\cline{3-4}\cline{6-7}中间空出第 5 列不画线。但这样会改变线的覆盖范围不一定符合你的表头设计。所以只要条件允许优先用\cmidrule。再给一个更贴近论文表头的配置片段包含\cmidrule和\cline混用的情况\begin{tabular}{lcccccc} \toprule \multirow{2}{*}{Model} \multicolumn{2}{c}{Task A} \multicolumn{2}{c}{Task B} \multicolumn{2}{c}{Task C} \\ \cmidrule(lr){2-3} \cmidrule(lr){4-5} \cmidrule(lr){6-7} P R P R P R \\ \midrule Baseline 0.81 0.79 0.83 0.80 0.78 0.76 \\ Ours 0.88 0.86 0.89 0.87 0.85 0.83 \\ \bottomrule \end{tabular}注意\cmidrule(lr){2-3}和\cmidrule(lr){4-5}之间我加了空格这个空格在源码里只是分隔命令不影响输出。真正让线分开的是(lr)参数。如果你把(lr)去掉三段线就会首尾相接变成一条长线。还有一个细节\cmidrule的修剪参数对线宽也有影响。当线被修剪后线头会稍微变细这是booktabs的设计为了让分段更自然。如果你不喜欢这个效果可以改用\cline并手动调整列间距但那样代码会更复杂。实测下来\cmidrule(lr)是性价比最高的方案。4. 验证请求与编译结果确认线真的分开了配置写好后不要直接扔进论文里编译先建一个最小测试文件单独验证。新建test-cmidrule.tex内容如下\documentclass{article} \usepackage{booktabs} \usepackage{multirow} \begin{document} \begin{table}[h] \centering \begin{tabular}{lcccccc} \toprule \multirow{2}{*}{Model} \multicolumn{2}{c}{Task A} \multicolumn{2}{c}{Task B} \multicolumn{2}{c}{Task C} \\ \cmidrule(lr){2-3} \cmidrule(lr){4-5} \cmidrule(lr){6-7} P R P R P R \\ \midrule Baseline 0.81 0.79 0.83 0.80 0.78 0.76 \\ Ours 0.88 0.86 0.89 0.87 0.85 0.83 \\ \bottomrule \end{tabular} \end{table} \end{document}用pdflatex test-cmidrule.tex编译然后打开生成的 PDF。你应该看到 Task A、Task B、Task C 三组表头下面的横线是分开的每段线之间有明显空隙。如果线还是连在一起先检查三件事第一booktabs是否真的加载了第二\cmidrule的修剪参数是否写在了正确位置第三是否有其他宏包覆盖了\cmidrule的定义。如果你用的是 XeLaTeX 或 LuaLaTeX编译命令换成xelatex test-cmidrule.tex或lualatex test-cmidrule.tex效果应该一致。如果编译报错Undefined control sequence \cmidrule说明booktabs没加载或者拼写错了。如果报错Missing number, treated as zero通常是修剪参数写成了\cmidrule{lr}{2-3}这种错误顺序。验证通过后你可以把这段代码直接复制到你的论文模板里。但要注意有些期刊模板会自己重定义\cmidrule或者用\cline替代。这时候你需要看模板的文档确认它是否支持booktabs。如果不支持就只能退回\cline并用列间距来制造缝隙但那样效果会差一些。另外如果你想让模型帮你检查这段 LaTeX 代码可以把代码贴到模型对话页面 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 让它帮你找语法错误或者优化表头结构。我试过用模型检查\cmidrule的修剪参数它能准确指出(l)(r)的位置问题比手动翻文档快很多。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth这一节把你在配置和编译过程中可能遇到的报错逐个拆开。先说明下面这些报错有的来自 TaoToken 接入有的来自 LaTeX 编译我会分别标注。401 Unauthorized这个报错通常出现在你调用 TaoToken API 的时候说明 API Key 不对或者没传。检查你的 JSON 配置里api_key字段是否填了真实 Key有没有多余空格。如果你用的是环境变量确认变量名和客户端要求的一致。另外Base URL 如果写成了https://taotoken.net/api/带尾斜杠有些客户端会拼出双斜杠导致鉴权失败建议去掉尾斜杠。local proxy failed这个报错说明客户端在尝试走本地代理但没连上。如果你没有开代理检查客户端设置里是否误开了代理选项。TaoToken 的 API 地址是直连的不需要额外代理配置。把代理开关关掉或者把 Base URL 直接写成https://taotoken.net/api再试。reading choices 相关报错如果你在调用模型时看到类似reading choices或cannot read property choices of undefined说明返回体结构和你客户端预期的格式不一致。先确认你用的 Model ID 是否正确有些模型返回的是流式格式客户端需要开启 stream 模式。另外检查请求是否真的成功了可以先用 curl 发一条最简单的请求curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的Key \ -H Content-Type: application/json \ -d {model:你的ModelID,messages:[{role:user,content:hi}]}如果这条命令返回正常说明接入没问题报错出在客户端配置上。OAuth 相关报错如果你用的是 Claude Code 或者类似需要 OAuth 的客户端报错可能提示 token 过期或授权失败。这时候不要反复重试先到控制台重新生成 API Key然后更新客户端配置。Claude Code 的 Anthropic 兼容入口是 https://taotoken.net/claudecode-anthropic?utm_sourcetaotoken_aicg_blog_endutm_contentclaudecode-anthropicutm_campaignrewrite 按文档里的步骤重新授权即可。LaTeX 编译报错Undefined control sequence \cmidrule这是 LaTeX 侧的报错说明booktabs没加载。在导言区加\usepackage{booktabs}即可。如果加了还报错检查是否有其他宏包冲突比如arydshln会重定义表格线命令可能需要调整加载顺序。\cmidrule修剪无效线还是连着检查参数顺序必须是\cmidrule(lr){2-3}不能写成\cmidrule{2-3}(lr)。另外确认你用的是\cmidrule而不是\cline\cline不支持修剪参数。表格线超出列宽或缩进太多调整\cmidrulewidth或\tabcolsep。如果只是个别线有问题可以在\cmidrule后面加\hspace是不行的正确做法是调整修剪参数或者列定义。把上面这些报错对照一遍基本能覆盖 90% 的常见问题。如果还有奇怪的报错先把最小测试文件跑通再逐步加回你的论文模板这样能快速定位是模板冲突还是代码本身的问题。6. 继续用 TaoToken 辅助 LaTeX 排版与文档自动化表格线分开只是 LaTeX 排版里的一个小问题但背后涉及的“精确控制线起止位置”的思路在复杂表头、多级表头、跨页表格里都会反复用到。掌握\cmidrule的修剪参数后你可以进一步尝试\cmidrule与\multicolumn的配合做出更复杂的表头结构。如果你经常写论文或者技术文档可以把 TaoToken 接入到你的写作流程里。比如用模型对话页面快速检查 LaTeX 语法或者用 Coding Plan 跑批量文档生成任务。接入文档里写了不同客户端的配置方式API Key 在控制台创建。记住三件套Base URL 用https://taotoken.net/apiKey 用你创建的Model ID 按需选择。最后给一个实用技巧在论文模板里把\cmidrule的修剪参数封装成一个自定义命令比如\newcommand{\myrule}[1]{\cmidrule(lr){#1}}这样每次写表头时直接调\myrule{2-3}既省事又不容易写错参数顺序。这个命令可以放在导言区配合booktabs一起用。编译验证通过后你的表格线就能精准分段再也不会粘成一条了。