假设我有一个包含多个包含或输入语句的文档
\input{fileA}
\input{fileB}
ETC。
有没有一种简单的方法来生成一个单独的.tex
文件,其中\input{fileA}
替换为fileA
等的实际内容,而无需手动复制?
答案1
您可以使用以下工具来执行此操作。它们全部位于氯化三乙胺但并非所有这些软件都是 TeXLive 或 MikTeX 的一部分,因此你可能需要手动安装它们。它们需要Perl或已安装 C 编译器。在 Linux 下这两者都应该没有问题,但在 Windows 或 Mac 下可能存在问题。不过如果我没记错的话,TeXLive 会安装自己的 Perl 解释器。
latexpand
Perl 脚本:
Latexand 是一个 Perl 脚本,它只是用文件 input/included 的内容替换
\input
命令\include
。该脚本不处理\includeonly
命令。
安装:
只需从以下位置下载即可http://mirrors.ctan.org/support/lateexpand/lateexpand并运行它。你需要Perl但是已安装。
用法:
perl latexpand mainfile.tex > newfile.tex
这是一个将 LaTeX 文件拼合为单个文件的程序,通过明确包含
\include
和\input
命令包含的文件。此外,如果使用 BibTeX,则将 bbl 文件包含到结果文件中。因此,结果是一个独立的 LaTeX 文件,可以通过电子邮件发送给合作者。
安装:
获取单个 C 文件并编译它,例如使用cc flatex.c -o flatex
。
用法:
flatex mainfile.tex > newfile.tex
\input
通过将文件复制\include
到根文件中来扁平化 LaTeX 根文件的程序。
安装:
得到来自 CTAN 的 ZIP 文件,解压并运行,make
然后make install
。您需要一个 C 编译器,也许flex
可以。但是它似乎很旧,您可能会因此遇到麻烦。我编译失败了!
用法:
flatten mainfile.tex newfile.tex
答案2
您需要安装 Perl。将其另存为buildFile.pl
并使其可执行,或者使用以下命令运行它perl buildFile.pl
eval '(exit $?0)' && eval 'exec perl -S $0 ${1+"$@"}' && eval 'exec perl -S $0 $argv:q'
if 0;
#use strict;
#
# Usage:
# buildFile.pl < main-file.tex > main-file.tot
#
sub p_inc {
$DateiName = shift;
if ( open (my $datei, "$DateiName.tex") ) {
print "%%%---------- open: ", $DateiName, "\n";
while (<$datei>) {
if (/^\s*\\include{\s+(\S+)/i) {
my $include = $1;
chomp($include);chop($include);
print "%%%%%%%%% Springe nach ", $include, "\n";
p_inc($include);
} else { print unless /^\s*(#|$)/; }
}
print "%%%---------- close: ", $DateiName, "\n";
close $datei;
} else { print "%%%<===== Datei existiert nicht\n"; }
}
#
@zeilen = (<>);
for $zeile (@zeilen) {
next if $zeile =~ /^\s*(%)/;
if ($zeile =~ /^\s*\\include{\s*(\S+)/i) {
my $include = $1;
chomp($include);
chop($include);
print "%%%%%%%%%%% Springe nach ", $include, "\n";
p_inc($include);
} else { print $zeile; }
答案3
我最近发现特克斯汤,一个受 BeatifulSoup 启发的用于解析 Latex 文件的 Python 模块。它使以非常直接的方式处理 .tex 文件变得非常容易。例如,它允许\input{}
仅用几行代码即可定位特定的 Latex 命令。
假设main.tex
您的文件夹中有一个文件,其内容如下:
\documentclass[12pt]{article}
\begin{document}
% ..other commands here..
\section{First part}
\input{file1}
\section{Second part}
\input{file2}
% ..other commands here..
\end{document}
如果文件file1.tex
和file2.tex
位于同一文件夹中,只需将脚本保存在名为的文件中flatten.py
并执行以下命令:
python flatten.py main.tex expanded.tex
获取扩展文件。
#!/usr/bin/env python3
import sys
from TexSoup import TexSoup
def soupify(file):
"""
Load file in TexSoup object.
"""
with open(file, 'r') as file_to_read:
content = file_to_read.read()
soup = TexSoup(content)
return soup
def flatten(soup):
"""
Expand \input{} commands in a tex file.
"""
while soup.input:
soup.input.replace(flatten(soupify(soup.input.args[0]+'.tex')))
return soup
if __name__ == "__main__":
file = sys.argv[1]
expanded_tex = flatten(soupify(file))
if len(sys.argv) > 2:
output_file = sys.argv[2]
else:
output_file = 'output.tex'
with open(output_file, 'w') as output:
output.write(repr(expanded_tex))
pass
注意:此操作仅适用于 Python 3,并且您必须在 ( pip install TexSoup
) 之前安装 TexSoup。如果您在同一台计算机上同时安装了 Python 2 和 3,则可能需要使用python3
而不是python
作为第一个单词来启动命令。
答案4
我尝试了这篇文章中提到的所有选项,但原来的平板式对我来说效果最好。似乎有一个较新版本,但我无法编译它,因为我不熟悉多文件 C 源代码。如果有人可以尝试并告诉我结果,那就太好了。
原始 flatex 存在一个问题,因为它只创建 .flt(扁平化文档),即使您指定不同的 .tex 作为输出。但这并不是真正的问题。我创建了一个批处理文件来解决这个问题,并允许与 Subversion 集成(请参阅我网站上的这篇文章http://www.jwe.cc/2012/02/workflow-with-subversion-and-latex/)。