latexmk+make+条件编译一键编译论文生成 明评版/盲评版 单面版/双面版
用latexmk+make编译latex项目
假设latex项目的目录结构如下:
. ├── build │ ├── aux │ ├── 各种临时文件 │ └── release │ ├── thesis.pdf │ └── thesis.synctex.gz ├── data │ ├── abstract.tex │ ├── chap01.tex │ ├── chap02.tex │ ├── resume.tex ├── Figures / 图片 ├── latexmkrc ├── Makefile ├── readme.md ├── ref/参考文献 ├── thesis.tex
首先是latexmkrc
# 默认值为1, 即使用pdflatex # pdflatex 1 # xelatex 5 $pdf_mode = 5; $pdflatex = "pdflatex -file-line-error -halt-on-error -interaction=nonstopmode -synctex=1 %O %S"; $xelatex = "xelatex -file-line-error -halt-on-error -interaction=nonstopmode -synctex=1 %O %S"; $bibtex_use = 1.5; $out_dir = "build/release"; $aux_dir = "build/aux"; $clean_ext = "hd nav snm synctex.gz xdv thm";
假设latex的项目根文件是thesis.tex
, 使用latexmk编译的条件是文件头有如下的注释
% !TEX TS-program = xelatex % !TEX encoding = UTF-8 Unicode
注: 在这里中文论文使用xelatex
, 英文论文使用pdflatex
, 都使用latexmk
命令编译
我在使用vimtex+vim/neovim编写latex文档的过程中, 发觉连续编译不好好用, 保存后自动编译太频繁了, 加上想尝试下make, 就写了个Makefile, 每次写一大段之后再编译, 避免自动保存后编译造成卡顿
all: latexmk clean: latexmk -C -c view: nohup okular build/release/thesis.pdf >/dev/null 2>&1 &
使用make
命令, 默认等效于make all
, 可以执行latexmk
进行编译
latex条件编译
这个需求主要是出现在撰写毕业论文的时候, 需要提交的论文可能分为明评版/盲评版, 而盲评版在已发表成果一节又需要隐去自己成果, 而且还可能分为电子版和双面打印版(双面打印版需要保证奇数页在右侧)
为此学习了一下条件编译, 用的是ifthen
这个包, 首先在thesis.tex
导言区引用这个包
\documentclass[master,ttf]{paper} % ... \usepackage{ifthen} % ...
使用的基本格式如下:
\ifthenelse{condition}{ % if true }{ % if false }
在data/resume.tex
这个文件中设置条件编译生成明评版论文和盲评版论文
这个condition
可以用是否定义了一个宏来控制, 比如我定义了一个宏publicReview
(明评)
% data/resume.tex \newcommand{\publicReview}{1} \ifthenelse{\isundefined{\publicReview}}{ % 未定义, 盲评 该论文作者在学期间取得的阶段性成果(学术论文等)已满足我校硕士学位评阅相关要求。 为避免阶段性成果信息对专家评价学位论文本身造成干扰,特将论文作者的阶段性成果信息隐去。 }{ % 定义了, 明评 列举论文... }
控制明评与否的关键就是是否注释\newcommand{\publicReview}{1}
这一句, 我又不想每次手动改, 怎么进一步自动话呢?
可以用sed
这个命令行工具来修改这一行, 首先在这行末尾加上一个注释标志%:FLAG_REVIEW:
, sed就知道是这一行了
% \newcommand{\publicReview}{1} %:FLAG_REVIEW:
sed命令如下:
# 明评, 取消注释 sed -i '/:FLAG_REVIEW:/ s/.*/ \\newcommand\{\\publicReview\}\{1\} %:FLAG_REVIEW:/g' data/resume.tex # 盲评, 加上注释 sed -i '/:FLAG_REVIEW:/ s/.*/ % \\newcommand\{\\publicReview\}\{1\} %:FLAG_REVIEW:/g' data/resume.tex
稍微解释一下
- 第一部分
/:FLAG_REVIEW:/
匹配满足条件的行 s/.*/ \\newcommand\{\\publicReview\}\{1\} %:FLAG_REVIEW:/g
明评s/.*/ % \\newcommand\{\\publicReview\}\{1\} %:FLAG_REVIEW:/g
盲评- 对满足条件的行进行匹配然后替换的动作, 格式为
s/pattern1/pattern2/g
- 3.4区别只是在于是否有注释符号
%
类似的, 可以控制论文是电子版还是打印版, 我的论文模板控制这一项是在\documentclass
这里, 传递twoside
参数即可. 这里可以不用额外添加FLAG, 可以用匹配行首的\documentclass
的方式, 得到
sed -i '/^\\documentclass/ s/\[.*\]/\[指定的参数\]/g' ./thesis.tex
\documentclass[当前参数]{paper} % 结果 \documentclass[指定的参数]{paper}
将这些操作放进makefile中, 排列组合出来四种情况, 最终的makefile如下:
title = 硕士大论文题目 all: # 明评版,电子版 sed -i '/^\\documentclass/ s/\[.*\]/\[master,ttf\]/g' ./thesis.tex sed -i '/:FLAG_REVIEW:/ s/.*/ \\newcommand\{\\publicReview\}\{1\} %:FLAG_REVIEW:/g' data/resume.tex latexmk cp ./build/release/thesis.pdf ./build/release/$(title)_明评版_电子版.pdf ALL: # 明评版,电子版 sed -i '/^\\documentclass/ s/\[.*\]/\[master,ttf\]/g' ./thesis.tex sed -i '/:FLAG_REVIEW:/ s/.*/ \\newcommand\{\\publicReview\}\{1\} %:FLAG_REVIEW:/g' data/resume.tex latexmk cp ./build/release/thesis.pdf ./build/release/$(title)_明评版_电子版.pdf # 明评版,双面打印版 sed -i '/^\\documentclass/ s/\[.*\]/\[master,ttf,twoside\]/g' ./thesis.tex sed -i '/:FLAG_REVIEW:/ s/.*/ \\newcommand\{\\publicReview\}\{1\} %:FLAG_REVIEW:/g' data/resume.tex latexmk cp ./build/release/thesis.pdf ./build/release/$(title)_明评版_双面打印版.pdf # 盲评版,电子版 sed -i '/^\\documentclass/ s/\[.*\]/\[master,ttf,anon\]/g' ./thesis.tex sed -i '/:FLAG_REVIEW:/ s/.*/ % \\newcommand\{\\publicReview\}\{1\} %:FLAG_REVIEW:/g' data/resume.tex latexmk cp ./build/release/thesis.pdf ./build/release/$(title)_盲评版_电子版.pdf # 盲评版,双面打印版 sed -i '/^\\documentclass/ s/\[.*\]/\[master,ttf,twoside,anon\]/g' ./thesis.tex sed -i '/:FLAG_REVIEW:/ s/.*/ % \\newcommand\{\\publicReview\}\{1\} %:FLAG_REVIEW:/g' data/resume.tex latexmk cp ./build/release/thesis.pdf ./build/release/$(title)_盲评版_双面打印版.pdf clean: latexmk -C -c view: nohup okular build/release/thesis.pdf >/dev/null 2>&1 &
在撰写过程中可以直接用make
命令默认生成明评电子版, 然后没问题之后用make ALL
一键生成所有版本
build/release thesis.pdf 硕士大论文题目_明评版_电子版.pdf 硕士大论文题目_明评版_双面打印.pdf 硕士大论文题目_盲评版_电子版.pdf 硕士大论文题目_盲评版_双面打印.pdf
作者:lavateinn
出处:https://www.cnblogs.com/lavateinn/p/17775367.html
本文版权归作者和博客园共有,商业转载请联系作者获得授权,非商业转载请注明出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通