通过合并不同的 TeX 文件生成单个 TeX 文件

通过合并不同的 TeX 文件生成单个 TeX 文件

我有一个主 TeX 文件,它输入许多其他 TeX 文件,例如

\documentclass{article}
\begin{document}
\input{input1.tex}
\input{input2.tex}
\input{input3.tex}
\end{document}

假设上面的文件我想要一个从、和main.tex导入内容的单个 TeX 文件,这样我就只有一个 TeX 文件,而不是上面的四个 TeX 文件。input1.texinput2.texinput3.tex

答案1

我不确定 Herbert 的脚本是否“在一次递归调用中工作”。在我对递归的解释中,我假设如果其中一个文件input*.tex本身包含\input{}请求,我们希望它在一次调用中工作。

我本来想在上面发表评论来询问此事,但我没有声誉。

我使用相同的执行语法通过 gawk 创建了一个脚本:

#! /bin/gawk -f


BEGIN{
  FS="\\input{|}"
}{
  regex="(%*)(.*)\\input{(.*)}";
  if(match($0,regex,a)){
    file = a[3];
    if(a[1]==""){
      match(file,".tex",b);
      if(RLENGTH<0){
          system("./recursiveInput.awk "file".tex");
      }
      else{
          system("./recursiveInput.awk "file);
      }
    }

  }
  else{
    print $0
  }
}

这有优点那:

  • 它确实是一次性递归的(在我的解释中)
  • 它避免使用 perl chomp(),但chop()会产生不良影响(就我而言),即不能忠实地再现空白行(有时在 TeX 中用于段落划分)
  • %它会忽略语句前带有 的行\input{},这些行是\input{}命令被注释掉的行。

这有缺点那:

  • 我只为\input{}和实现了它不是声明\include{}

答案2

这是一个可以实现这一点的 Perl 脚本。它替换了所有包含的文件通过 \input\include语句及其内容。要使用它,请运行:

./buildFile.pl < main.tex > main_all.tex

脚本如下(buildFile.pl):

 #!/usr/bin/env perl

 sub p_inc {
   $DateiName = shift;
     if ( open (my $datei, "$DateiName.tex") ) {
       print "%%%---------- open: ", $DateiName, "\n";
       while (<$datei>) {
         if ((/^\s*\\include\{\s*(\S+)/i) or (/^\s*\\input\{\s*(\S+)/i)) {
           my $include = $1;
           chomp($include);
          chop($include);
           print "%%%%%%%%% jump to ", $include, "\n";
           p_inc($include);
         } else { print; }
       }
       print "%%%---------- close: ", $DateiName, "\n";
       close $datei;
     } else { print "%%%<===== file doesn't exist\n"; }
 }

 @zeilen = (<>);
 for $zeile (@zeilen) {
   next if $zeile =~ /^\s*(%)/;
   if (($zeile =~ /^\s*\\include\{\s*(\S+)/i) or ($zeile =~ /^\s*\\input\{\s*(\S+)/i)) {
     my $include = $1;
     chomp($include); # remove trailing whitespace
     chop($include);  # remove '}' from the matched string
     print "%%%%%%%%%%% jump to ", $include, "\n";
     p_inc($include);
   } else { print $zeile; }
 }

答案3

虽然我从来没有用过它,bundledoc包裹似乎提供了此功能。从软件包描述来看:

bundledoc包是snapshot包裹它将构建给定 LaTeX 文档所需的所有类、包和文件捆绑在一起。它读取生成的.dep文件snapshot,找到其中提到的每个文件,并将它们存档为单个.tar.gz(或.zip,或任何其他)文件,适合跨系统移动、传输给同事等。

脚本arlatex提供了一种替代的“归档”机制,使用环境创建一个包含 LaTeX 文档的所有辅助文件以及文档本身的单个 LaTeX 文件filecontents*

相关内容