在我的论文中我有几个 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 建议使用预处理器之一来合并文件。我尝试了一个latexexpand
perl 脚本,结果如下:
- 它适用于普通
\input
宏。它要求宏位于自己的行中,因为整行将\input
被删除。 - 它不支持更复杂的用例。例如,它不会扩展 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
这正是用例乳胶膨胀已经编写完成。它应该能够为您完成所有这些工作(如果不能,请报告错误)。