将选项传递给未知类

将选项传递给未知类

我的目标是处理一个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 的解决方案。

相关内容