Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.
I've a LaTeX source.
I'm ready %for submission
%But first I would like
to strip its comments.

So I hope there are
100\% auto
ways to get this done.

\begin{comment}
   Because there are subtle ways to mess it up.
\end{comment}

Is there a utility which will eliminate all these comments?

Yes, I could do it by hand, but that seems needlessly laborious, has the potential for mistakes, and makes maintenance difficult. I could also use sed, but there's a potential for mistakes. Besides, it is an axiom of the whole GNU/Linux thing that if you can think of it, someone's probably already made a utility for it.

share|improve this question
    
should the text "Because there ..." be printed? –  Herbert Nov 21 '12 at 12:20
    
No, it's in a comment environment from the verbatim package. –  Richard Nov 21 '12 at 12:29
    
ah, I see, you want to delete the %blabla .. –  Herbert Nov 21 '12 at 12:32
    
you might want to try tex.stackexchange.com/questions/82972/… but it would need extending for your examples:-) –  David Carlisle Nov 21 '12 at 12:59
    
Thanks @DavidCarlisle, alas, I am using the verbatim package, which is not covered by that answer and am not using emacs, so the script doesn't seem to be of direct benefit. –  Richard Nov 21 '12 at 13:01
show 2 more comments

2 Answers

I'm not sure how to do this. So, I'm posting a new solution. The code I posted yesterday will eat comments from within a verbatim environment.

Here's a new example file to be cleaned:

I've a LaTeX source.
I'm ready %for submission
%But first I would like
to strip its comments.

So I hope there are
100\% auto
ways to get this done.

\begin{comment}
   Because there are subtle ways to mess it up.
\end{comment}

\begin{verbatim}
        next two lines should not be lost
        % don't lose this line
% this line should stay too
\end{verbatim}

According to the verbatim package documentation verbatim and comment environments should not be nested. The following code (similar to what I posted yesterday) will not eat commented lines that appear within a verbatim environment.

Here is the corrected Perl code:

#!/usr/bin/perl
use strict 'vars';
&MAIN(@ARGV);
sub MAIN {
   my ($filehandle) = @_;

   open FILE, "<$filehandle";
   my @doc = <FILE>;
   close FILE;

   &removeComments(\@doc);

   foreach my $line ( @doc ){
      print $line;
    }

   return 1;
}

sub removeComments {
   my ($docarray) = @_;

   my $isCommentEnvironment  = "no";
   my $isVerbatimEnvironment = "no";

   my @newdoc;

   foreach my $line ( @{$docarray} ){
      $isVerbatimEnvironment = "yes" if ( $line =~ /^\\begin{verbatim}/ );
      $isCommentEnvironment  = "yes" if ( $line =~ /^\\begin{comment}/ );
      if ( ($isVerbatimEnvironment eq "no") && ($isCommentEnvironment eq "no") ){
     next if ($line =~ /^%/);
     ## Temporarily replace "%" that you want to keep with a dummy string
     ## that does not appear elsewhere in your document.  Then, remove remainder
     ## of lines that still contain "%".
     if ( $line =~ /\\%/){
        $line =~ s/\\%/TMP::PERCENT/g;
        $line =~ s/%.*//;
        $line =~ s/TMP::PERCENT/\\%/g;
      } else {
         $line =~ s/%.*//;
       }
     push @newdoc, $line;
       }
      push @newdoc, $line if ( $isVerbatimEnvironment eq "yes" );

      $isVerbatimEnvironment = "no" if ( $line =~ /^\\end{verbatim}/ );
      $isCommentEnvironment  = "no" if ( $line =~ /^\\end{comment}/ );
    }

   @{$docarray} = @newdoc;
   return 1;
 }  
share|improve this answer
1  
I think the standard convention here on TeX.SX would be to add this as an alternative in the first solution you provide, by using the edit button. –  Andrew Swann Nov 22 '12 at 16:26
    
How can I output the code shown in the console to a file? –  Jörg Dec 3 '12 at 13:45
    
Save the script to a file, let's call it stripcomments.pl. And let's say the file you want to remove comments called is mytext.tex. Then on the command line write, perl stripcomments.pl mytext.tex > no_comment.tex. Just be careful. Redirecting output this way will not warn you about overwriting an already existing file. –  A.Ellett Dec 3 '12 at 14:00
    
The code provided by A.Ellett worked great for me, with a notable exception: the '%' sign at the end of the line should not be removed, as they have the side-effect of "eating" the white space represented by the newline. As a consequence, I used a different regex for the substitution: s/\s*%.+//. –  user1366204 Jul 5 '13 at 22:41
add comment

The following Perl script should do the trick: it expects to receive the name of the file you want stripped of comments and prints to console the modified document.

#!/usr/bin/perl
use strict 'vars';
&MAIN(@ARGV);
sub MAIN {
   my ($filehandle) = @_;
   open FILE, "<$filehandle";
   my @doc = <FILE>;
   close FILE;
   &removeComments(\@doc);

   foreach my $line ( @doc ){
      print $line;
    }
   return 1;
}
sub removeComments {
   my ($docarray) = @_;
   my $isCommentEnvironment = "no";
   my @newdoc;

   foreach my $line ( @{$docarray} ){
      $isCommentEnvironment = "yes" if ( $line =~ /^\\begin{comment}/ );
      if ( $isCommentEnvironment eq "no" ){
     next if ($line =~ /^%/);
     ## Temporarily replace "%" that you want to keep with a dummy string
     ## that does not appear elsewhere in your document.  Then, remove remainder
     ## of lines that still contain "%".
     if ( $line =~ /\\%/){
        $line =~ s/\\%/TMP::PERCENT/g;
        $line =~ s/%.*//;
        $line =~ s/TMP::PERCENT/\\%/g;
      } else {
         $line =~ s/%.*//;
       }
     push @newdoc, $line;
       }
      $isCommentEnvironment = "no" if ( $line =~ /^\\end{comment}/ );
    }

   @{$docarray} = @newdoc;
   return 1;
 }  

The only thing I'm uncertain about is any contraints on using \begin{comment} and \end{comment}. For example, I don't know whether---like with the verbatim environment---you are restricted on what else may appear on those lines.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.