news 2026/10/4 22:07:44

【latex学习笔记】论文写作工具实用技巧:用 ifthenelse 宏包在 preamble.tex 中做条件编译

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【latex学习笔记】论文写作工具实用技巧:用 ifthenelse 宏包在 preamble.tex 中做条件编译

1. 论文写作里最烦的格式切换,其实一个宏包就能解决

写论文的人大概都经历过这种循环:投稿前把批注、TODO、高亮全部删掉,投出去被拒或者返修,又得把那些标记一个个加回来。更麻烦的是,同一篇稿子要投不同期刊,模板、引用格式、甚至章节标题样式都不一样,每次切换都像重新装修一遍房子。

我最近在整理自己的 LaTeX 工作流时,重新捡起了ifthenelse宏包。它做的事情很朴素:在preamble.tex里根据一个开关变量,决定哪些命令生效、哪些命令变成空操作。听起来简单,但用好了,你就能用同一份.tex源文件,在「写作模式」和「投稿模式」之间一键切换,不用再手动注释掉几十行标记命令。

这篇文章聚焦一个具体场景:你有一篇正在修改的论文,正文里散落着\todo{}、\fyi{}、\note{}这类自定义标记。你希望编译时能选择「带标记的审阅版」或「干净的投稿版」,同时还要适配不同期刊的模板参数。核心工具就是ifthenelse,配合preamble.tex做条件编译与参数化配置。

适合谁看?如果你已经在用 LaTeX 写论文,知道\newcommand是干什么的,但还没系统整理过自己的 preamble,那这篇就是写给你的。如果你刚接触 LaTeX,也没关系,我会把每个步骤拆开讲,你跟着复制粘贴就能跑起来。

先说清楚:ifthenelse不是 LaTeX 内核自带的,它属于ifthen宏包。你需要在preamble.tex里显式加载。它的语法是\ifthenelse{判断条件}{肯定结构}{否定结构},判断条件可以用\equal{}{}、\isodd{}、\boolean{}等。我们最常用的是\equal,比较两个字符串是否相等。

整个思路是这样的:在preamble.tex顶部定义一个开关变量,比如\COMMENTS,赋值为yes或no。然后用\ifthenelse{\equal{\COMMENTS}{yes}}{...}{...}把两套命令定义包起来。编译时改一个字母,整篇文档的标记行为就全变了。下面我会给出可直接复制的完整代码块,以及 VS Code 里的编译验证步骤。

2. TaoToken 前置:为什么写论文也需要一个稳定的 API 入口

你可能会问:写 LaTeX 论文和 API 有什么关系?关系在于,现在很多论文写作流程里,你会用到 AI 辅助做文献摘要、语法润色、公式检查,甚至用 Claude Code 或 Cline 这类工具帮你批量处理.bib文件、生成表格、检查交叉引用。这些工具背后都需要一个稳定的模型调用入口。

TaoToken 在这里扮演的角色,是提供一个统一的 API 接入点,让你在 VS Code 里配置一次,后续换模型、换工具都不用反复改配置。它的官网是 https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content= ,API 地址是 https://taotoken.net/api 。注意 API 地址后面不加 UTM 参数,直接写就行。

具体到 LaTeX 论文场景,你可能会用到这些能力:用模型对话快速解释一段看不懂的宏包文档,用 Coding Plan 让 Agent 帮你重构 preamble 里的重复定义,或者用 API Keys 把润色请求集成到自己的脚本里。如果你只是偶尔问几个问题,模型对话入口就够用;如果你打算长期用 Agent 辅助编码和文档处理,Coding Plan 更合适。

这里要强调一点:TaoToken 不是让你绕过什么,它就是一个正常的 API 服务入口。你在 VS Code 里配置 Base URL 和 Key,工具就能调用模型。对于 LaTeX 写作来说,最实用的场景是:当你写了一个复杂的\ifthenelse嵌套,不确定逻辑对不对,可以直接把代码贴给模型,让它帮你逐层拆解判断条件。或者你从期刊模板里复制了一段看不懂的\def,也可以让模型解释。

配置的时候记住三件套:Base URL、API Key、Model ID。这三个东西在任何一个支持自定义 API 的工具里都是必须的。Base URL 填https://taotoken.net/api,Key 在控制台生成,Model ID 根据你用的模型填。VS Code 里常用的 Cline、Continue、Claude Code 都支持这种配置方式。

如果你用的是 Claude Code,它的配置文件通常在~/.claude/settings.json或项目根目录的.claude/settings.json。你需要把 API 地址和 Key 写进去。如果是 Cline,在 VS Code 设置里找到 Cline 的 API Provider 配置,选 OpenAI Compatible,然后填 Base URL 和 Key。Codex 的话,看auth.json里的配置项。不管哪个工具,核心就是那三件套,填对了就能通。

我自己的习惯是:把 API 配置和 LaTeX 项目分开管理。API 配置放在全局设置里,LaTeX 项目里只放preamble.tex和正文。这样换项目不用重新配 API,换 API 也不影响论文源文件。下面进入正题,先看preamble.tex里怎么用ifthenelse做条件编译。

3. 可复制配置:preamble.tex 里的条件编译块与参数化设置

这一节是核心。我会给出一个完整的preamble.tex片段,你可以直接复制到自己的项目里。先讲结构,再讲每个部分的作用。

首先,在文件最顶部定义开关变量和期刊参数。我习惯用\newcommand定义,因为这样可以在编译时通过\def覆盖,也可以在文档类选项里传参。代码如下:

% ============================================================ % preamble.tex - 条件编译与参数化配置 % ============================================================ % 1. 加载必要宏包 \usepackage{ifthen} \usepackage{xcolor} \usepackage{soul} % 提供 \sout, \hl \usepackage{xspace} % 提供 \xspace % 2. 定义开关变量 % COMMENTS = yes -> 写作模式(带标记) % COMMENTS = no -> 投稿模式(干净版) \newcommand{\COMMENTS}{yes} % 3. 定义期刊参数(可按需扩展) \newcommand{\JOURNAL}{JMLR} % 可选:JMLR, NeurIPS, ICML, IEEE \newcommand{\PAPERMODE}{review} % 可选:review, submission, camera-ready

接下来是条件编译的主体。用\ifthenelse{\equal{\COMMENTS}{yes}}{...}{...}把两套命令定义包起来。肯定结构里定义带颜色的标记命令,否定结构里把同样的命令名定义为空操作或直接输出内容。这样正文里写的\todo{...}在两种模式下都能编译通过,只是表现不同。

% 4. 条件编译:根据 COMMENTS 切换命令行为 \ifthenelse{\equal{\COMMENTS}{yes}}{% % ---------- 写作模式 ---------- \newcommand{\todo}[1]{\textcolor{red}{\textbf{[TODO:} #1]}\xspace} \newcommand{\fyi}[1]{\textcolor{blue}{#1}} \newcommand{\fye}[1]{\textcolor{red}{#1}} \newcommand{\remind}[1]{\footnote{\textit{\textcolor{red}{\textbf{Remind:} #1}}}} \newcommand{\repl}[2]{\textcolor{red}{#1}\textcolor{blue}{\sout{#2}}} \newcommand{\add}[1]{\textcolor{red}{#1}} \newcommand{\del}[1]{\textcolor{blue}{\sout{#1}}} \newcommand{\p}[1]{\vskip 1ex \noindent\colorbox{yellow}{\parbox{\columnwidth}{#1}}\vskip 4pt} \newcommand{\note}[1]{\vskip 4ex \noindent\colorbox{yellow}{\parbox{\columnwidth}{#1}}\vskip 6ex} \newcommand{\dc}[1]{\textcolor{red}{\underline{#1}}} \newcommand{\q}[1]{\vskip 1ex \noindent\colorbox{magenta}{\parbox{\columnwidth}{\textbf{Question:} #1}}\vskip 4pt} \newcommand{\qa}[1]{\hl{\textbf{Answer:} #1}} }{% % ---------- 投稿模式 ---------- \newcommand{\todo}[1]{} \newcommand{\fyi}[1]{#1} \newcommand{\fye}[1]{} \newcommand{\remind}[1]{} \newcommand{\repl}[2]{#1} \newcommand{\add}[1]{#1} \newcommand{\del}[1]{} \newcommand{\p}[1]{} \newcommand{\note}[1]{} \newcommand{\dc}[1]{#1} \newcommand{\q}[1]{} \newcommand{\qa}[1]{} }

注意几个细节。\fyi在写作模式是蓝色文字,在投稿模式直接输出内容,因为「有争议的部分」最终可能保留,只是去掉颜色。\fye在写作模式是红色,投稿模式直接消失,因为它是「要排除的内容」。\repl{新}{旧}在写作模式显示新内容加删除线旧内容,投稿模式只显示新内容。\del在投稿模式完全消失。这些行为都是根据论文修改的实际需求设计的。

然后是期刊参数化。不同期刊对页面、字体、引用格式要求不同,但很多参数可以在preamble.tex里统一管理。比如:

% 5. 期刊参数化配置 \ifthenelse{\equal{\JOURNAL}{JMLR}}{% \newcommand{\journalfontsize}{10pt} \newcommand{\journalcolumns}{twocolumn} }{} \ifthenelse{\equal{\JOURNAL}{NeurIPS}}{% \newcommand{\journalfontsize}{10pt} \newcommand{\journalcolumns}{twocolumn} }{} \ifthenelse{\equal{\JOURNAL}{IEEE}}{% \newcommand{\journalfontsize}{10pt} \newcommand{\journalcolumns}{twocolumn} }{}

实际使用时,这些参数可以传给文档类或者用于条件加载宏包。比如:

% 6. 根据 PAPERMODE 决定是否显示行号 \ifthenelse{\equal{\PAPERMODE}{review}}{% \usepackage{lineno} \linenumbers }{}

这样你在main.tex里只需要\input{preamble.tex},所有条件逻辑都集中在 preamble 里。切换模式时,改\COMMENTS和\PAPERMODE两个变量就行。

如果你用 VS Code 的 LaTeX Workshop,可以在settings.json里配置多个编译配方,每个配方对应不同的\def覆盖。比如:

{ "latex-workshop.latex.recipes": [ { "name": "pdflatex (review mode)", "tools": ["pdflatex", "bibtex", "pdflatex", "pdflatex"] } ], "latex-workshop.latex.tools": [ { "name": "pdflatex", "command": "pdflatex", "args": [ "-synctex=1", "-interaction=nonstopmode", "-file-line-error", "-jobname=%DOCFILE%", "%DOC%" ], "env": {} } ] }

更灵活的做法是用latexmk配合-usepretex参数,在编译时注入\def\COMMENTS{no}。这样不用改源文件就能切换模式。命令如下:

latexmk -pdf -usepretex="\def\COMMENTS{no}" main.tex

这条命令会覆盖preamble.tex里的\newcommand{\COMMENTS}{yes},因为\def在\newcommand之前执行。注意顺序:-usepretex注入的代码在文档类加载前执行,所以能覆盖后续的\newcommand。如果你在preamble.tex里用的是\renewcommand,那覆盖会报错,所以坚持用\newcommand定义开关变量。

4. 验证请求与成功结果:VS Code 编译步骤与输出对照

配置写好了,怎么验证它真的生效?这一节给出完整的 VS Code 操作步骤和预期结果。

第一步,创建项目结构。在 VS Code 里新建一个文件夹,比如latex-conditional-demo,里面放三个文件:main.tex、preamble.tex、refs.bib。main.tex内容如下:

\documentclass[10pt,twocolumn]{article} \input{preamble.tex} \begin{document} \title{Conditional Compilation Demo} \author{Your Name} \maketitle \section{Introduction} This is a normal paragraph. \fyi{This part is under discussion.} \todo{Add a citation here.} \fye{This paragraph should be removed in submission mode.} \repl{The new result is 95\%.}{The old result was 90\%.} \note{Remember to check the reference format.} \q{Why does the loss increase?} \qa{Because the learning rate is too high.} \end{document}

第二步,确认preamble.tex和上面第 3 节的内容一致。特别注意\COMMENTS初始值是yes。

第三步,在 VS Code 里用 LaTeX Workshop 编译。按Ctrl+Alt+B或点击左侧 TeX 图标选择Build LaTeX project。编译成功后打开 PDF,你应该看到:

  • \fyi的内容是蓝色
  • \todo显示红色[TODO: Add a citation here.]
  • \fye显示红色文字
  • \repl显示红色新内容加蓝色删除线旧内容
  • \note显示黄色背景框
  • \q显示品红色背景框
  • \qa显示黄色高亮

这就是写作模式的效果。所有标记都可见,方便你审阅和修改。

第四步,切换到投稿模式。打开preamble.tex,把\newcommand{\COMMENTS}{yes}改成\newcommand{\COMMENTS}{no}。保存后重新编译。这次 PDF 里:

  • \fyi的内容变成普通黑色文字,没有蓝色
  • \todo完全消失
  • \fye完全消失
  • \repl只显示新内容,没有删除线和旧内容
  • \note完全消失
  • \q完全消失
  • \qa完全消失

这就是投稿模式。整篇文档干净,没有任何批注痕迹。你不需要手动删除任何标记命令,源文件保持完整。

第五步,用命令行验证-usepretex覆盖。在终端里执行:

latexmk -pdf -usepretex="\def\COMMENTS{no}" main.tex

编译完成后打开 PDF,效果应该和手动改\COMMENTS为no一样。这说明你可以在不改源文件的情况下切换模式。如果你用 VS Code 的 tasks.json,可以配置两个任务,一个带-usepretex,一个不带,用快捷键切换。

第六步,验证期刊参数。把\JOURNAL改成NeurIPS,重新编译。如果你在preamble.tex里加了根据\JOURNAL加载不同宏包的逻辑,比如 NeurIPS 需要\usepackage{neurips_2024},那编译时会自动加载对应样式。这一步的具体效果取决于你用的期刊模板,但逻辑是通的:一个变量控制一套配置。

成功的结果是:你有一份main.tex,里面写满了\todo、\fyi、\note等标记,但通过改preamble.tex` 里的两个变量,就能生成审阅版和投稿版两个 PDF。源文件不用动,标记不用删,切换成本几乎为零。

如果你在 VS Code 里遇到编译顺序问题,比如引用显示为??,先清理中间文件再编译。LaTeX Workshop 的Clean up auxiliary files命令可以帮你删掉.aux、.bbl、.log等文件。有时候preamble.tex的修改不会立即生效,是因为.aux文件缓存了旧的定义。清理后重新编译通常能解决。

5. 本篇常见错排查:401、local proxy failed、reading choices、OAuth 与编译报错

这一节汇总你在配置过程中可能遇到的真实报错,以及对应的排查方法。分两类:API 配置类和 LaTeX 编译类。

先看 API 配置类。如果你在用 Cline、Claude Code 或 Codex 辅助写论文,可能会遇到这些错误:

401 Unauthorized:最常见的原因是 API Key 填错或过期。检查settings.json或auth.json里的 Key 是否和 TaoToken 控制台生成的一致。注意 Key 通常以sk-开头,复制时不要带空格。如果 Key 正确但还是 401,检查 Base URL 是否写成了https://taotoken.net/api,不要多加斜杠或路径。

local proxy failed:这个报错通常出现在工具尝试通过本地代理转发请求时。如果你没有配置代理,检查工具设置里是否误开了 proxy 选项。Cline 的设置里有Proxy字段,留空即可。Claude Code 的话,检查环境变量HTTP_PROXY和HTTPS_PROXY是否被设置,如果不需要就取消。

reading choices 相关报错:这通常出现在模型返回格式不符合预期时。比如你让模型返回 JSON,但它返回了纯文本,工具解析失败。解决方法是检查你的 prompt 是否明确要求了输出格式,或者在工具设置里调整response format。如果是 Cline,可以在 System Prompt 里加一句「Always return valid JSON」。

OAuth 相关报错:如果你用的是需要 OAuth 登录的工具,比如某些 Claude Code 版本,报错可能是 token 过期。重新执行登录流程即可。如果工具支持 API Key 模式,优先用 API Key,比 OAuth 稳定。

Codex auth.json 配置:Codex 的auth.json通常在~/.codex/auth.json。你需要填入api_key和base_url。格式如下:

{ "api_key": "sk-your-key-here", "base_url": "https://taotoken.net/api" }

注意base_url不要带/v1后缀,除非工具文档明确要求。Model ID 在工具的模型选择里填,比如claude-3-5-sonnet或gpt-4o。

再看 LaTeX 编译类报错:

\todoalready defined:如果你在preamble.tex里重复定义了\todo,或者加载了其他也定义\todo的宏包(比如todonotes),会报这个错。解决方法是把\newcommand改成\renewcommand,或者换个命令名比如\mytodo。我建议换名,避免冲突。

\equalundefined:说明你没有加载ifthen宏包。在preamble.tex顶部加\usepackage{ifthen}。

\soutundefined:需要ulem或soul宏包。加\usepackage{soul}即可。注意soul和ulem可能有冲突,选一个就行。

\xspaceundefined:需要xspace宏包。加\usepackage{xspace}。

编译后标记没变化:最常见的原因是.aux文件缓存。执行latexmk -C清理所有中间文件,然后重新编译。如果还不行,检查\COMMENTS是否真的被改了,或者-usepretex的\def是否在\newcommand之前执行。

VS Code 里编译顺序混乱:LaTeX Workshop 默认的编译配方可能不适合你的项目。在settings.json里自定义 recipe,确保pdflatex->bibtex->pdflatex->pdflatex的顺序。如果引用还是??,手动跑一遍bibtex main再pdflatex main。

preamble.tex修改后不生效:有时候 VS Code 的 LaTeX Workshop 会缓存 preamble。尝试关闭 PDF 预览,清理辅助文件,重新编译。如果用的是\input{preamble.tex},确保路径正确。如果用的是\include,注意\include会分页,不适合 preamble。

\repl在投稿模式显示异常:检查否定结构里\renewcommand{\repl}[2]{#1}是否写对。如果写成\newcommand会报重复定义。坚持用\renewcommand在否定结构里覆盖。

颜色不显示:需要xcolor宏包,且编译引擎要用pdflatex或xelatex。如果你用latex+dvips,颜色可能不显示。VS Code 里默认用pdflatex,一般没问题。

排查顺序建议:先看.log文件里的第一个错误,通常后面的错误都是连锁反应。然后检查宏包是否加载完整。最后检查变量覆盖是否生效。如果你用 API 工具辅助排查,可以把.log里的错误信息贴给模型,让它帮你定位。模型对话入口适合快速问几个问题,Coding Plan 适合让 Agent 直接改你的preamble.tex。

6. 把条件编译用顺手之后,我的论文工作流变成了这样

回到最开始的问题:论文格式切换烦,标记管理乱。用ifthenelse在preamble.tex里做条件编译之后,我的工作流简化成了三步。

第一步,写作阶段。\COMMENTS设为yes,所有\todo、\fyi、\note正常显示。我边写边标记,不用担心投稿时忘了删。第二步,投稿前。\COMMENTS改成no,重新编译,所有标记自动消失,生成干净 PDF。第三步,返修阶段。改回yes`,标记全部回来,继续修改。

期刊切换也是同理。\JOURNAL变量控制模板参数,\PAPERMODE控制行号和审阅选项。一份源文件,多套输出。VS Code 里配置两个编译任务,一个 review 模式,一个 submission 模式,用快捷键切换。

如果你还没用过ifthenelse,建议从最简单的\todo开始。先定义开关变量,再包一层条件判断,编译两次看效果。跑通之后,再逐步加入\fyi、\repl、\note` 这些命令。不要一次性把所有命令都加上,容易出错。

最后提醒一点:preamble.tex里的条件块尽量保持结构清晰。肯定结构和否定结构的命令名要一一对应,顺序也尽量一致。这样以后加新命令时,不容易漏掉某一边。如果你用 AI 辅助生成 preamble,记得让它同时输出两套定义,并检查命令名是否匹配。

API 配置方面,Base URL 用https://taotoken.net/api,Key 在控制台生成,Model ID 按需选择。VS Code 里 Cline、Claude Code、Codex 都支持自定义 API,填好三件套就能用。遇到 401 检查 Key,遇到 local proxy failed 检查代理设置,遇到 reading choices 检查输出格式。这些排查方法在写论文和写代码时都通用。

条件编译这个技巧,一旦用顺了,就很难回去手动注释了。它把「格式切换」这件事从体力活变成了改一个字母。省下来的时间,够你多读两篇参考文献。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 19:42:09

国产电池管理芯片替代实战:从BMS/BMIC选型到硬件设计避坑

这两年做电池相关产品的工程师,应该都有同一个感受:BMS和BMIC这两个缩写出现的频率越来越高,选型表里不再是几个海外老面孔说了算,国内芯片公司的型号一辆接一辆挤了进来,而且不是那种“价格便宜但不敢用”的状态&…

作者头像 李华
网站建设 2026/10/3 19:36:04

告别本地环境!20款在线ESP开发工具与Web Serial烧录实战

1. 为什么我彻底放弃了本地搭建 ESP 开发环境 三年前我第一次接触 ESP32 的时候,光是装开发环境就折腾了整整两天。Arduino IDE 下载卡在 30% 不动,换了国内源之后又遇到版本不匹配,好不容易装完了,编译一个最简单的点灯程序报了一…

作者头像 李华
网站建设 2026/10/3 19:33:27

RJ45温湿度变送器+SNMP协议:车间环境监控的实用方案

开场:一个小车间改造引发的思考做过设备运维或者工厂信息化改造的朋友应该都有体会——车间里的温湿度数据,看着是小问题,真正做起来全是坑。前阵子帮一个元器件车间做环境监控改造,客户提了个很具体的需求:现有设备都…

作者头像 李华