ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

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

【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_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_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/apiKey 在控制台生成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: [ -synctex1, -interactionnonstopmode, -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 编译。按CtrlAltB或点击左侧 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。如果你用latexdvips颜色可能不显示。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/apiKey 在控制台生成Model ID 按需选择。VS Code 里 Cline、Claude Code、Codex 都支持自定义 API填好三件套就能用。遇到 401 检查 Key遇到 local proxy failed 检查代理设置遇到 reading choices 检查输出格式。这些排查方法在写论文和写代码时都通用。条件编译这个技巧一旦用顺了就很难回去手动注释了。它把「格式切换」这件事从体力活变成了改一个字母。省下来的时间够你多读两篇参考文献。
返回列表