我的目标是处理一个draft
启用了文档类选项的 LaTeX tex 文件,但从终端处理,无需编辑 tex 文件,甚至无需打开它来查看正在使用的类,因为我知道这是一个具有草稿选项的类。该选项pdflatex -draftmode
不是我想要的,因为它不会生成 pdf。
例如,假设main.tex
包含以下内容:
\documentclass{article}
\usepackage{graphicx}
\begin{document}
\includegraphics{myfig}
\end{document}
使用\documentclass[draft]{article}
应该会生成一个包含文本“myfig.xxx”的框。给出的答案是使用命令向类添加选项就足够了。我会用
pdflatex \PassOptionsToClass{draft}{article} \input{main}
但这并不令人满意,因为我必须知道类是article
什么而book
不是其他任何东西。
第二个问题可能影响答案;这个解决方案似乎甚至不能完全发挥作用article
,因为它正常地生成图像而不是带有标题的框。这让我很惊讶,因为12pt
以这种方式传递选项似乎可以正常工作。但我猜这个选项不会以graphicx
这种方式传递给其他包或全局传递给其他包。
答案1
文档类通过 执行许多“默认”选项\ExecuteOptions
。例如,article.cls
调用
\ExecuteOptions{letterpaper,10pt,oneside,onecolumn,final}
尽管book.cls
调用
\ExecuteOptions{letterpaper,10pt,twoside,onecolumn,final,openright}
您可以覆盖并始终传递draft
使用\ExecuteOptions
以下命令行“界面”:
pdflatex \let\oldExecuteOptions\ExecuteOptions \def\ExecuteOptions#1{\oldExecuteOptions{#1,draft}} \input{main}
上面的内容存储\ExecuteOptions
在\oldExecuteOptions
重新定义为总是以选项结束draft
。
答案2
这是一个 perl 脚本,它将复制你的main.tex
文件并创建一个formatted_main.tex
你可以使用的文件LaTeX
。它找到\documentclass
以下行并重写它:
#!/usr/bin/perl
my ($filehandle) = @ARGV;
open FILEHANDLE, "<$filehandle" or die "cannot open < $filehandle: $!";
my @file = <FILEHANDLE>;
close FILEHANDLE;
foreach my $line ( @file )
{
if ( $line =~ /^\s*\\documentclass\[/ )
{
$line =~ s/(\\documentclass)(\[)/$1$2draft,/;
}
if ( $line =~ /^\s*\\documentclass{/ )
{
$line =~ s/(\\documentclass)({)/$1\[draft\]$2/;
}
}
open FILE, ">formatted_$filehandle";
foreach my $line ( @file ){
print FILE $line;
}
close FILE;
更新
此脚本的一个问题是,它认为编写者main.tex
没有将\documentclass
宏与其参数分开。换句话说,如果main.tex
包含如下行,此脚本将无法帮助您
\documentclass
[12pt]{article}
如果您担心这可能是一种可能性,那么我肯定会采用@Werner 的解决方案。