首页 > 其他分享 >latexmk+make+条件编译一键编译论文生成 明评版/盲评版 单面版/双面版

latexmk+make+条件编译一键编译论文生成 明评版/盲评版 单面版/双面版

时间:2023-10-19 19:36:05浏览次数:37  
标签:make 明评 tex 编译 FLAG thesis pdf REVIEW

用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 -norc
	latexmk -C -c
	trash *.thm *.synctex.gz *.bbl

view:
	nohup okular build/release/thesis.pdf >/dev/null 2>&1 &

总体还可以

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

稍微解释一下

  1. 第一部分/:FLAG_REVIEW:/匹配满足条件的行
  2. s/.*/ \\newcommand\{\\publicReview\}\{1\} %:FLAG_REVIEW:/g 明评
  3. s/.*/ % \\newcommand\{\\publicReview\}\{1\} %:FLAG_REVIEW:/g 盲评
  4. 对满足条件的行进行匹配然后替换的动作, 格式为 s/pattern1/pattern2/g
  5. 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/thesis_明评版_电子版.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 -norc
	latexmk -C -c
	trash *.thm *.synctex.gz *.bbl

view:
	nohup okular build/release/thesis.pdf >/dev/null 2>&1 &

在撰写过程中可以直接用make命令默认生成明评电子版, 然后没问题之后用make ALL一键生成所有版本

build/release
	thesis.pdf
	thesis_明评版_电子版.pdf
	硕士大论文题目_明评版_电子版.pdf
	硕士大论文题目_明评版_双面打印.pdf
	硕士大论文题目_盲评版_电子版.pdf
	硕士大论文题目_盲评版_双面打印.pdf

标签:make,明评,tex,编译,FLAG,thesis,pdf,REVIEW
From: https://www.cnblogs.com/lavateinn/p/17775367.html

相关文章

  • Makefile深入
    题目要求建立项目目录myutilxxxx(xxxx为学号后四位),子目录有:srcincludelibbin等源代码放入src,头文件放入include,生成的静态库,共享库放入lib,生成的中间文件,可执行文件放入bin编辑makefile放入mymath目录写出编译代码的makefile,编译出来的目标文件为testmyuti......
  • idea 编译时 找不到符号 变量 log
    idea进行项目编译的时候报找不到符号 变量log对lombok进行了各种配置后发现还是无效后,最后进行complier配置添加-Djps.track.ap.dependencies=false ......
  • RK3588开发笔记(二):基于方案商提供sdk搭建引入mpp和sdk的宿主机交叉编译Qt5.12.10环境
    前言  上一篇项目已经构建好了Qt,板子接入mipi屏幕也跑起来了,Qt也能正常运行了,现在需要接入定制开发的sdk,sdk中使用了硬解码等资源涉及到bsp的mpp,所以下一步就是引入mpp和sdk到Qt开发环境中,从而Qt中可以调用sdk接口进行进一步的应用结合开发了。 注意  本文公开了Q......
  • arthas在线编译
    #arthas命令:找到对应的全量类名1.sc*.类名输出com.cn.xxxx.类名反编译类:jad2.jad--source-only全类名>/tmp/类名.java3.修改类文件vim/tmp/类名.java找到要修改的方法,修改内容4.查找类加载器sc-d*类名|grepclassLoaderHash#输出:classLoaderHash1be6f5c35.热编译......
  • WPF 编译出现大量系统文件
    .net版本号:.netframework4.6.1WPF编译后为什么会出现如下的系统文件,本身自带的框架应该是包含这些文件。查看这些DLL的版本都是隶属于4.6.2版本的 详细排查插件,发现某个插件最小支持4.6.2版本,本身是4.6.1,这才出现了许多DLL的原因。解决方法很简单:1.降插件的版本2.......
  • Windows下VC++编译器32位memcpy、memmove函数汇编代码详解
    整理者:赤勇玄心行天道QQ号:280604597微信号:qq280604597QQ群:511046632博客:www.cnblogs.com/gaoyaguo  blog.csdn.net/cyz7758520?type=blog大家有什么不明白的地方,或者想要详细了解的地方可以联系我,我会认真回复的!你可以随意转载,无需注明出处!写文档实属不易,我希望大家能支......
  • 通过MATLAB自动产生Hamming编译码的verilog实现,包含testbench
    1.算法运行效果图预览 2.算法运行软件版本matlab2022a和vivado2019.2 3.算法理论概述       Hamming编码是一种用于纠错错误的线性分组码。它是由理查德·哈明(RichardHamming)在20世纪中期提出的,用于在数字通信和存储系统中检测和纠正传输过程中产生的错误。本......
  • CentOS 7编译Linux内核(6.5.7)详细步骤
    CentOS7编译Linux内核(6.5.7)详细步骤前言对于一件要完成的任务,如果已有现成的、完善的方法文档可供参考,则博文只需引用链接即可,无需重复写一遍。写博客是结合自身需求,总结之前网络上没有的方法。本文即基于CentOS764位,给出编译当前最新版Linux(6.5.7)的详细步骤。参考链接:......
  • mpif90 编译命令
    mpif90-I$()/include指定编译器在搜索头文件时要查找的目录。mpif90-L$()/lib指定编译器在搜索库文件时要查找的目录。mpif90-g用于可执行文件中包含的调试信息;非调试可以去掉,因为加上这个参数,得到的可执行文件包括调试信息,会很大,运行速度会慢。mpif90-o......
  • GraalVM进行spring boot的native编译报错 “returned non-zero result”解决方法
    使用GraalVM对springboot工程进行native编译:系统:CentosJDK:GraalVMJDK21报错:Ifyouareunabletoresolvethisproblem,pleasefileanissuewiththeerrorreportat:https://graalvm.org/support[INFO]---------------------------------------------------------......