使用Perl脚本编译Latex

脚本能实现Latex文本的初级编译,并将生成的中间文件移动到同一个目录

调用方法


chmod +x xelatex2pdf.pl
xelatex2pdf.pl -n 2 -f test.tex # 将test.tex编译两次

Perl 代码


脚本名:xelatex2pdf.pl

#!/usr/bin/perl

use strict;
use warnings;
use File::Path;
use File::Copy;
use File::Find;
use Cwd; my $Has_Help = "";
my $comp_run = 1;
my $texfile = "";
my $def_timers = "";
my $def_tex = "";
my $run_path = getcwd;
my $log_path = "$run_path"."/log";
#print("$run_path\n");
#print("$log_path\n"); #------------------------------------------------
# 主函数
#------------------------------------------------
if( $#ARGV < 0 ) {
&print_usage;
exit;
}
my $filename ="";
&parse_argv; if( $Has_Help =~ /TRUE/ ) #显示帮助说明
{
&print_usage;
exit;
} &build; &clean; #------------------------------------------------
# 函数结束
#------------------------------------------------ #################################################
# 处理编译文件
#################################################
sub build{
for(my $i=0; $i<$comp_run; $i++) {
if($i==1){
my $bibfile = $texfile;
$bibfile =~ s/\.tex/.aux/;
system("bibtex $bibfile");
}
system("xelatex $texfile");
} my $pdf_name = $texfile;
$pdf_name =~ s/\.tex$/\.pdf/;
#print("$pdf_name\n");
system("evince $pdf_name &");
} #################################################
# 删除中间文件
#################################################
sub wanted {
my $findfile = $File::Find::name;
if($findfile =~ /log\//){
#print("Next...\n"); #跳过 log/ 否则移动会出错
}
elsif ( $findfile =~ /\.aux|\.lof|\.out|\.toc|\.log|\.lot|\.ilg|.\.bbl|.blg|\.gz/ ) { # 得到绝对路径
$findfile =~ s/^\.//;
$findfile = "$run_path"."$findfile";
print("move $findfile to log/\n"); #print("\nfindfile = $findfile\n");
#print("log_path = $log_path\n");
move("$findfile","$log_path")||warn "could not move files :$!" ; # 移动使用绝对路径,避免出错
}
} sub clean{
my $folder = "./log";
if(-e $folder){
rmtree("log/");
}
mkdir $folder; my $local_file = ".";
find(\&wanted, $local_file);
} #################################################
# Sub-routine: print_usage() 帮助说明
#################################################
sub print_usage {
print "\nUsage: $0 -n <compile timers> -f <tex file> \\\n";
print " [-n <compile timers> -f <tex file>] \\\n";
print " [-h] \n\n";
print "For example:\n";
print " $0 -n 2 -f main.tex\n";
print " $0 -h \n";
print "\n";
} #################################################
# Sub-routine : parse_argv() 参数读入
#################################################
sub parse_argv {
my $all_arg = "-h|-n|-f"; for(my $i=0; $i<=$#ARGV; $i++) {
if( $ARGV[$i] =~ /-n/ ) {
$i++;
if(!defined $ARGV[$i])
{
$Has_Help = "TRUE";
}
$def_timers = "TRUE";
$comp_run = $ARGV[$i];
}
elsif( $ARGV[$i] =~ /-f/ ) {
$i++;
if(!defined $ARGV[$i])
{
$Has_Help = "TRUE";
}
$def_tex = "TRUE";
$texfile = $ARGV[$i];
}
elsif( $ARGV[$i] =~ /-h/ ) {
$Has_Help = "TRUE";
}
else { ### other options
$Has_Help = "TRUE";
}
}
}

Latex测试代码


文件名: test.tex

\documentclass{ctexart}
\begin{document}
Hello \LaTeX! 你好,世界! \clearpage 这是一个测试
\section{章标题}
这是章的介绍
\subsection{节的标题}
这是节的介绍
\subsubsection{子节的标题}
这是子节的介绍 \\
数学公式的测试:\\
\Huge{$y=2^x+\frac{4}{6^z}$}
\footnote{这仍然是个测试,一个脚注} \newpage \end{document}

参考资料


[1].bash脚本编译Latex

[2].Perl 获得当前路径

[3].Perl遍历查找文件

使用Perl脚本编译Latex的更多相关文章

  1. 把perl脚本编译成exe

    来源:http://www.veryhuo.com/a/view/38338.html 今天想把 perl 脚本编译成 exe 以便脱离 perl 解释器独立运行.都可以生成PERL的PE文件,在PE ...

  2. 【转】FTP自动上传文件的perl脚本以及配置文件

    这个perl文件将执行的任务是, 按照指定的文件夹目录,自动将该文件夹下的所有文件上传到指定ftp站点的指定目录下 本应用程序设计的几个基本理念是:工具箱再利用:尽可能利用已有的工具:简化运行步骤:不 ...

  3. perl 脚本测试

      原文地址:  http://blog.csdn.net/johnny710vip/article/details/8905239   这是一篇关于perl脚本测试的总结性文章,其中提到了很多实用的 ...

  4. perl静态编译DBD

    编译DBD 项目中经常使用perl,但perl在连接数据库时,需要依赖DBI,DBD驱动,但默认安装DBD驱动时,需要依赖数据库的lib库. 比如perl连接MySQL,需要安装MySQL clien ...

  5. C#怎么在生成解决方案的过程中执行perl脚本(C#早期绑定)

    转载 怎么在生成解决方案的过程中执行perl脚本 早期绑定在编译期间识别并检查方法.属性.函数,并在应用程序执行之前执行其他优化.在这个绑定中,编译器已经知道它是什么类型的对象以及它拥有的方法或属性. ...

  6. crontab不执行perl脚本分析

    在新装的Linux服务器上部署了一个作业监控磁盘空间并提前告警,在shell脚本里面调用了一个perl脚本发送告警邮件.结果出现了一个很奇怪的现象:如果手工执行该脚本/home/oracle/scri ...

  7. unity3d 特殊文件夹和脚本编译顺序

    unity3d 特殊文件夹和脚本编译顺序 转自http://blog.csdn.net/u010019717/article/details/40474631 大多数情况下,您可以选择任何你喜欢的文件 ...

  8. 转:Android开发实践:用脚本编译Android工程

    转自: http://ticktick.blog.51cto.com/823160/1365947 一般情况下,我们都是使用Eclipse+ADT插件或者Android studio软件来编译Andr ...

  9. linux 全自动提权 exp perl脚本

    linux 全自动提权 exp perl脚本 作者: admin 日期: 2013/01/19发表评论 (0) 查看评论   国外流传过来的 地址 http://dl.packetstormsecur ...

随机推荐

  1. spark ml阅读笔记

    参考文档:http://www.cnblogs.com/huliangwen/p/7491797.html

  2. Linux 交换分区swap

    Linux 交换分区swap 一.创建和启用swap交换区 如果你的服务器的总是报告内存不足,并且时常因为内存不足而引发服务被强制kill的话,在不增加物理内存的情况下,启用swap交换区作为虚拟内存 ...

  3. 50行python代码实现个代理server(你懂的)

    之前遇到一个场景是这种: 我在自己的电脑上须要用mongodb图形client,可是mongodb的server地址没有对外网开放,仅仅能通过先登录主机A,然后再从A连接mongodbserverB. ...

  4. HBase高速导入数据--BulkLoad

    Apache HBase是一个分布式的.面向列的开源数据库.它能够让我们随机的.实时的訪问大数据.可是如何有效的将数据导入到HBase呢?HBase有多种导入数据的方法.最直接的方法就是在MapRed ...

  5. Atcoder At Beginner Contest 068 C - Cat Snuke and a Voyage

    C - Cat Snuke and a Voyage Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem State ...

  6. vuex-store模块化配置

    一.目录结构: src -> js -> modules 1. 在modules下新建文件夹,文件夹名称按模块功能命名 如: modules ---- home -> homeMod ...

  7. IIS发布asp.net mvc项目(asp.net core也是一样)

    因为之前都是利用其他的工具在linux上面进行发布,导致现在忘记了在IIS上面怎么发布,现在就记录下来,以防不时之需吧 第一步: 在vs里面进行项目发布:指定好发布的位置,点击发布就好了 第二步:右击 ...

  8. 在window编写好的网站往linux上发布

    得知ASP.NET CORE可以跨平台,我内心很躁动,毕竟自己喜欢的,之前没有学过linux导致一开始上手linux有点困难,按照https://www.microsoft.com/net/core# ...

  9. (转)Linux下查看Nginx Apache MySQL的并发连接数和连接状态

    转自: http://www.ha97.com/4106.html 1.查看Web服务器(Nginx Apache)的并发请求数及其TCP连接状态:netstat -n | awk '/^tcp/ { ...

  10. 【习题 7-3 UVA - 211】The Domino Effect

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 每次搜素要往下还是要往右摆. 然后维护一下让每个下标只出现一次就可以了. =>作为剪枝条件 [代码] /* 1.Shoud i ...