pdflatex 有 unlog.sh 脚本吗?

pdflatex 有 unlog.sh 脚本吗?

我厌倦了手动创建上传文章所需的 tarfile论文。该过程涉及创建所有(非标准)源文件的 tarfile。因此,它自然需要 .tex 文件、.pdf 文件、.bbl 文件,如果您有索引(也许是其他东西?),可能还需要 .idx。我通常将我的图表保存在 .tex 文件所在目录下的子目录中,因此 tar 文件必须保留该目录结构。我通常会使用 进行编译,\listfiles然后手动从输出中获取文件列表,将它们<filelist>与主 .tex 文件的名称粘贴在一起,然后运行tar c -T<filelist> -f<output.tar>​​。这不是一个很大的操作,但如果能自动化就好了,因为当我需要将另一篇文章上传到 arxiv 时,我通常会忘记所需的开关……

我在网上查了一下取消登录在 arxiv 本身上,但它明确指出它不是为 pdflatex 的输出而设计的。当我尝试修改它以使其适用于 pdflatex 的输出时,我确实没有成功,但这可能是由于我缺乏 perl 技能,而不是出于任何正当理由。

是否有人知道一个用于为 arxiv 创建所需 tarfiles 的好脚本,或者有兴趣修改 unlog.sh 以使其在 pdflatex 日志文件上正常工作?

答案1

和一些基本的测试,以下方法对我有用。将其复制到一个文件,例如unlog.pl,并将其保存在您的路径上的某个位置。要么使其可执行,要么通过调用它perl unlog.pl logfile tarfile

它通过日志文件寻找合适的文件(与原始脚本非常相似)。我修改了搜索模式以挑选包含的图形(这些图形似乎由日志文件中的尖括号表示)并添加.pdf到扩展中(可以轻松添加其他图形)。

它从以下文件中构建 tar 文件:以下用户的主目录,假设那些是不寻常的。那些低于当前的目录中添加了目录(相对于当前目录),未添加目录的目录将被删除前导目录。

这里的逻辑是,如果它位于当前目录下,那么它可能对该文件来说是特殊的,并且可能通过以下方式包含,\includegraphics{relative/path/to/file}因此相对路径很重要。如果它不在当前目录下,那么它可能通过以下方式包含,\usepackage{style}因此将它放入没有任何目录的地方应该可以工作。

#!/usr/bin/perl

use strict;
use Cwd qw/abs_path getcwd/;
use Archive::Tar;

die "unlog logfile output-file" unless $#ARGV == 1;

my ($logfile,$tarfile) = @ARGV;

if (!($logfile =~ /\.log$/)) {
    $logfile .= ".log";
}

open(LOGFILE,"$logfile") or
    die "cannot read $logfile";

my $tar = Archive::Tar->new();

my $cwd = getcwd();
my %tarfiles;

while (<LOGFILE>) {
    while (/[\(|<](\S*\.(bbl|tex|sty|cls|e?ps|tib|ttz|ttx|pdf))\b/g) {
    print "found $1: ";
    # Convert relative directories to absolute in the tar args:
    my $x=abs_path($1);
    if (exists($tarfiles{$x})){
        print "already in, skipping\n";
        next;
    } 
    $tarfiles{$x} = 1;
    if ($x =~ m/^$ENV{HOME}/) {
        # Only add files that are within our home directory
        if ($x =~ s#^$cwd/##) {
        # Subdirectories of _this_ one get preserved
        print "adding to tar, preserving directory\n";
        $tar->add_files($x);
        } else {
        # Probably within our own texmf tree, so add it to the list
        # but strip off any leading directories
        my ($dir,$name) = ($x =~ m/(.*\/)?([^\/]*)/);
        print "adding to tar, no leading directory\n";
        chdir($dir);
        $tar->add_files($name);
        chdir($cwd);
        }
    } else {
        # Otherwise, do nothing as it's probably in the global texmf tree
        print "omitting\n";
    }
    }
}

$tar->write($tarfile);

相关内容