有人能否给我一些建议,关于从文档中删除所有 LaTeX 代码的最有效方法?
我想到最好的方法(但我不知道该怎么做)是使用某种 latexmk_flat_file 命令来生成平面文本文件(没有代码)而不是 *.pdf。
在 *.pdf 上运行光学字符识别也会导致大量错误,并且需要大量的手动清理。
阻止和复制生成的 *.pdf 文件会产生不必要的换行符,并且通常不允许选择跨越多页的所有文本。
我使用了 Chikrii 的 Tex2Word 试用版,但它无法正确处理我当前使用的 LaTeX 商务信函类型。
catdvi
似乎最后一次更新是在 2002 年,并且kpathsea
TexLive 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