如何将多个 tex 文件合并为一个?

如何将多个 tex 文件合并为一个?

在我的论文中我有几个 tex 文件,主要是由一些其他工具生成(bibtex 的 .bbl、inkscape 的 .eps_tex 等)。

我想按照出版商的要求将它们合并为一个 tex 文件。

如果可能的话,我想实现自动化,这样即使我的任何图表参考发生变化,我仍然拥有最新版本的手稿。

是否可以在 LaTeX 中做到这一点,或者是否有任何第三方工具可以做到这一点?

答案1

如果您需要将参考书目与正文放在同一个文件中,则可以使用 filecontents 环境:

\begin{filecontents}{bibliography.bbl}
% <contents of bibliography.bbl>
\end{filecontents}
\documentclass{article} % or whatever
\begin{document}
...

当你运行latex此文件时,它会将bibliography.bbl文件写入与文件相同的文件tex夹。注意 filecontents 环境自带文档类。

这样,您只需向发布者发送一个文件即可。

至于图像,我会检查发布商对图片的要求:他们可能需要特定的格式,但我怀疑他们是否希望将它们全部嵌入实际文件中……

filecontents软件包允许更加灵活地使用filecontents环境。

答案2

@Werner 建议使用预处理器之一来合并文件。我尝试了一个latexexpandperl 脚本,结果如​​下:

  1. 它适用于普通\input宏。它要求宏位于自己的行中,因为整行将\input被删除。
  2. 它不支持更复杂的用例。例如,它不会扩展 bibtex 书目。

我修改了脚本,以便它能执行 (2)。不过,不能保证它能适用于我的文档以外的任何文档:

#!/usr/bin/perl
# - latexpand   D. Musliner University of Michigan
# Short program to expand out LaTeX \input and \include commands.
# Essentially a tiny part of 'go' hacked out.
# Removes comments as a side effect, does not deal with escaped %s.
#
# 15 Sept 1999  M. Lovell       Hewlett-Packard, Co
# Improved comment removal code.  Now handles escaped %'s.
#
#
$TEXINPUTS = $ENV{'TEXINPUTS'};
if (!$TEXINPUTS) { $TEXINPUTS = '.'; }

&scan_for_includes(shift);

#************************************************************
# - looks recursively for included & inputted files, expands.
# - note only primitive comment removal: cannot deal with escaped %s.

sub scan_for_includes
{
  local(*FILE); if (!open(FILE,$_[0]))
    { warn "WARNING: could not open input file [$_[0]]\n"; return; }
  while(<FILE>)
    {
    # comment removal
    s/^%.*\n//;
    s/([^\\])%.*\n/$1/;

    if (/\\include[{\s]+([^\001}]*)[\s}]/)
      {
        $full_filename = $1;
        if ($1 =~ m/\./)
          { $full_filename = &find_file($full_filename,$TEXINPUTS); }
        else
          { $full_filename = &find_file("$full_filename.tex",$TEXINPUTS); }
        warn "  Found include for file [$full_filename]\n";
        &scan_for_includes($full_filename);
      }
    elsif (/\\input[{\s]+([^\001}]*)[\s}]/)
      {
        $full_filename = $1;
        if ($1 =~ m/\./)
          { $full_filename = &find_file($full_filename,$TEXINPUTS); }
        else
          { $full_filename = &find_file("$full_filename.tex",$TEXINPUTS); }
        warn "  Found input for file [$full_filename]\n";
        &scan_for_includes($full_filename);
      }
    elsif (/\\bibliographystyle/) {}
    elsif (/\\bibliography/) {
        $bibfname = $_[0];
        $bibfname =~ s/.tex$//;
        $bibfname = "${bibfname}.bbl";
        &scan_for_includes($bibfname);
    }
    else { print; }
    }
}

#************************************************************
# given filename and path, return full name of file, or die if none found.

sub find_file
{
  foreach $dir (split(':',$_[1]))
    { if (-e "$dir/$_[0]") { return("$dir/$_[0]"); } }
  die "ERROR: Could not find file [$_[0]] in path [$_[1]]\n";
}

为了完整起见,这是我的 Makefile:

TEX = latex
INKSCAPE = inkscape
documentfile = manuscript_work
finalfile = manuscript
referencefile = bibliography
figures =   \
        figures/fig1.eps \
        figures/fig2.eps \


figures_tex = $(addsuffix .eps_tex,$(basename $(figures)))

all: document

document: $(finalfile).pdf

$(finalfile).pdf: $(finalfile).ps
    ps2pdf $(finalfile).ps

$(finalfile).ps: $(finalfile).dvi
    dvips $(finalfile).dvi

$(finalfile).dvi: $(finalfile).tex
    while ($(TEX) $(finalfile) ; \
        grep -q "Rerun to get cross" $(finalfile).log ) do true ; \
    done

$(finalfile).tex: $(documentfile).tex $(figures) $(figures_tex) $(documentfile).bbl
    ./latexexpand $(documentfile).tex > $(finalfile).tex #use modified latexexpand script

figures/%.eps: figures/%.svg
    $(INKSCAPE) $< -z -C --export-eps=$@ --export-latex

$(documentfile).bbl: $(referencefile).bib
    $(TEX) $(documentfile)
    bibtex $(documentfile)

答案3

这正是用例乳胶膨胀已经编写完成。它应该能够为您完成所有这些工作(如果不能,请报告错误)。

相关内容