从文档中去除所有 LaTeX 代码的最有效方法是什么?

从文档中去除所有 LaTeX 代码的最有效方法是什么?

有人能否给我一些建议,关于从文档中删除所有 LaTeX 代码的最有效方法?

我想到最好的方法(但我不知道该怎么做)是使用某种 latexmk_flat_file 命令来生成平面文本文件(没有代码)而不是 *.pdf。

在 *.pdf 上运行光学字符识别也会导致大量错误,并且需要大量的手动清理。

阻止和复制生成的 *.pdf 文件会产生不必要的换行符,并且通常不允许选择跨越多页的所有文本。

我使用了 Chikrii 的 Tex2Word 试用版,但它无法正确处理我当前使用的 LaTeX 商务信函类型。

catdvi似乎最后一次更新是在 2002 年,并且kpathseaTexLive for Mac/OSX 当前使用的库没有安装通用分发版所需的内容catdvi-0.14- 即lkpathsea缺失(可能还有其他内容)。

我想保留制表符、空格和原始行尾。

这是一个我每个月需要完成几次的任务。

对于编写的 perl 脚本工作草稿cmhughes,这些是我的 LaTeX 文档中包含的最常用代码(针对 perl 脚本进行了修改):

s/\\begin{.*?}(\[.*?\])?({.*?})?//g;
s/\\end{.*?}//g;
s/\\hspace\*{.*?}//g;
s/\\vspace\*{.*?}//g;
s/\\tab //g;
s/\~\\\\//g;
s/\\\>//g;
s/\\\=//g;
s/\\textit{//g;
s/\\newpage//g;
s/\{\\bf \\underline{//g;
s/\{\\bsi{//g;
s/\\uuline{//g;
s/\\underline{//g;
s/\}//g;
s/\\//g;
s/\~//g;

答案1

以下是一个小perl脚本,可以帮助您入门。您可以将其用作

 perl removelatexcode.pl myfile.tex myfile1.tex

并且可以根据需要用任意数量的文件来调用它(或者您也可以通过管道将其输入到其中)。

它执行以下操作:

  • 复制你的输入文件,myfile.tex以防myfile.tex.bak万一出现问题
  • 循环遍历文件中的每一行,并且只有当遇到\begin{document}
  • 一旦它进入主文档,它就会匹配诸如\begin{<myenvironmentname>}、之类的模式\end{environmentname}\<name of command>您可以根据需要向其中添加内容。

代码不会覆盖原始文件。一旦你对它感到满意,已经测试过了根据你的喜好,随意使用该文件作为

 perl removelatexcode.pl -o myfile.tex

哪个将覆盖myfile.tex

使用此类脚本时务必小心- 这里没有恶意,但是在实时文件上使用它之前,你应该进行彻底的测试。

例如,如果您希望保留某些命令的参数,\underline{keep this argument}则只需填充

my %keeparguments=("textit"=>1,
                        "underline"=>1,
                        );

使用适当的命令。

removelatexcode.pl

#!/usr/bin/perl 

use strict;
use warnings;
use File::Copy;
use Getopt::Std;

# get the options
my %options=();
getopts("o", \%options);


my $inpreamble=1; # switch for in the preamble or not
my $filename;
my @lines=();     # @lines: stores the new lines without commands

# commands for which we want to keep the arguments- populate 
# as necessary
my %keeparguments=("textit"=>1,
                        "underline"=>1,
                        );

while (@ARGV)
{
      # get filename from arguments
      $filename = shift @ARGV; 

      # open the file
      open(INPUTFILE,$filename) or die "Can't open $filename";

      # reset the preamble switch
      $inpreamble=1;

      # reset the lines array
      @lines=();     

      # loop through the lines in the INPUT file
      while(<INPUTFILE>)
      {
          # check that the document has begun
          if($_ =~ m/\\begin{document.*/)
          {
              $inpreamble=0;   
          }
          # ignore the preamble, and make string substitutions in 
          # the main document
         if(!$inpreamble) 
         {
             # remove \begin{<stuff>}[<optional arguments>]
             s/\\begin{.*?}(\[.*?\])?({.*?})?//g;
             # remove \end{<stuff>}
             s/\\end{.*?}//g;
             # remove \<commandname>{with argument}
             while ($_ =~ m/\\(.*?){.*?}/)
             {
                if($keeparguments{$1})
                {
                  s/\\.*?{(.*?)}/$1/;
                }
                else
                {
                  s/\\.*?{.*?}//;
                }
             }
             # print the current line (if we're not overwritting the current file)
             print $_ if(!$options{o});
             push(@lines,$_);
         }
     }

     # close the file
     close(INPUTFILE);

     # if we want to over write the current file
     if ($options{o})
     {
         # make a backup of each file
         my $backupfile= "$filename.bak";
         copy($filename,$backupfile);

         # reopen the input file to overwrite it
         open(INPUTFILE,">",$filename) or die "Can't open $filename";
         print INPUTFILE @lines;
         close(INPUTFILE);

         # output to terminal
         print "Backed up original file to $filename.bak\n";
         print "Overwritten original file without commands";
     }
}

exit 

这是一个小测试用例:

myfile.tex

\documentclass{article}
% in the preamble
% in the preamble
% in the preamble
\begin{document}

\begin{myenvironment}
  text text text text text text text text text text 
  text text text text text text text text text text 
  text text text text text text text text text text 
  text text text text text text text text text text 
\end{myenvironment}

\mycommand{argument} more text after it \anothercommand{another argument}

\textit{keep this argument} more text after it \anothercommand{another argument} yet more text

\anothercommand{another argument} yet more text \textit{keep this argument} more text after it 

\begin{anotherenvironment}[optional arguments] could have text here
  other other other other other other other other other other 
  other other other other other other other other other other 
  other other other other other other other other other other 
  other other other other other other other other other other 
\end{anotherenvironment}

\begin{anotherenvironment}[optional arguments]{mandatory args} could have text here
  another another another another another another 
  another another another another another another 
  another another another another another another 
  another another another another another another 
\end{anotherenvironment} can have text here

\end{document}

以及输出

perl removelatexcode.pl myfile.tex

输出

  text text text text text text text text text text 
  text text text text text text text text text text 
  text text text text text text text text text text 
  text text text text text text text text text text 


 more text after it 

keep this argument more text after it  yet more text

 yet more text keep this argument more text after it 

 could have text here
  other other other other other other other other other other 
  other other other other other other other other other other 
  other other other other other other other other other other 
  other other other other other other other other other other 


 could have text here
  another another another another another another 
  another another another another another another 
  another another another another another another 
  another another another another another another 
 can have text here

关于正则表达式

你会注意到脚本使用了如下代码

s/\\begin{.*?}(\[.*?\])?({.*?})?//g;

这匹配

  • \begin{<environmentname>}
  • \begin{<environmentname>}[<optional arguments>]
  • \begin{<environmentname>}[<optional arguments>]{<mandatory arguments>}

但它这样做非贪婪方式。 使它.*?不贪婪,而?分组后的()使它们可选。如果这些匹配是贪婪的(如果没有 ,它们将是贪婪的?),那么您将得到很多潜在的不想要的结果。

答案2

潘多克接受多种不同的输入格式,包括 LaTeX,并可以生成各种输出,包括纯文本。尝试潘多克在线访问尝试一下 pandoc!地点。

正如潘多克网站:

如果您需要将文件从一种标记格式转换为另一种标记格式,pandoc 就是您的瑞士军刀。Pandoc 可以将 markdown、reStructuredText、textile、HTML、DocBook、LaTeX 或 MediaWiki 标记格式的文档转换为

  • HTML 格式:使用 Slidy、Slideous、S5 或 DZSlides 的 XHTML、HTML5 和 HTML 幻灯片。
  • 文字处理器格式:Microsoft Word docx、OpenOffice/LibreOffice ODT、OpenDocument XML
  • 电子书:EPUB 版本 2 或 3、FictionBook2
  • 文档格式:DocBook、GNU TexInfo、Groff 手册页
  • TeX 格式:LaTeX、ConTeXt、LaTeX Beamer 幻灯片
  • 通过 LaTeX 提供 PDF
  • 轻量级标记格式:Markdown、reStructuredText、AsciiDoc、MediaWiki 标记、Emacs Org-Mode、Textile

答案3

本着Pandoc 答案,我想建议优秀的Org 模式为了Emacs编辑器。一旦你熟悉了 Emacs(这可能需要几天时间,但如果你想高效地编辑大量文本文件,这是一项明智的投资),Org-mode 非常容易上手,不仅包含强大的导出选项(包括 LaTeX、ODT、HTML 等),还完全基于纯文本文件,并配有任务和时间管理系统等等。

免责声明:Org-mode 是一个免费工具,我与它没有任何关联;)。

答案4

命令detex(在加拿大运输安全局符合要求(包含在 TeXlive 中),但它被标记为“过时”,并建议安特克斯以及其他一些(据我所知,TeXlive/MikTeX 中没有包含任何机器人)。

相关内容