自动将 \input{fileX} 替换为 fileX 的内容

自动将 \input{fileX} 替换为 fileX 的内容

假设我有一个包含多个包含或输入语句的文档

\input{fileA}
\input{fileB}

ETC。

有没有一种简单的方法来生成一个单独的.tex文件,其中\input{fileA}替换为fileA等的实际内容,而无需手动复制?

答案1

您可以使用以下工具来执行此操作。它们全部位于氯化三乙胺但并非所有这些软件都是 TeXLive 或 MikTeX 的一部分,因此你可能需要手动安装它们。它们需要Perl或已安装 C 编译器。在 Linux 下这两者都应该没有问题,但在 Windows 或 Mac 下可能存在问题。不过如果我没记错的话,TeXLive 会安装自己的 Perl 解释器。


latexpandPerl 脚本:

Latexand 是一个 Perl 脚本,它只是用文件 input/included 的内容替换\input命令\include。该脚本不处理\includeonly命令。

安装:

只需从以下位置下载即可http://mirrors.ctan.org/support/lateexpand/lateexpand并运行它。你需要Perl但是已安装。

用法:

    perl latexpand mainfile.tex > newfile.tex

flatex

这是一个将 LaTeX 文件拼合为单个文件的程序,通过明确包含\include\input命令包含的文件。此外,如果使用 BibTeX,则将 bbl 文件包含到结果文件中。因此,结果是一个独立的 LaTeX 文件,可以通过电子邮件发送给合作者。

安装:

获取单个 C 文件并编译它,例如使用cc flatex.c -o flatex

用法:

    flatex mainfile.tex > newfile.tex

flatten

\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.texfile2.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/)。

相关内容