in reply to repetitive latex doc: in vim or perl?

Not a difficult problem for Perl and probably don't need to do anything special with LaTeX if you have a good template (ie, example file with proper LaTeX included).

Show what you've got and you could get some help.

  • Comment on Re: repetitive latex doc: in vim or perl?

Replies are listed 'Best First'.
Re^2: repetitive latex doc: in vim or perl?
by stabu (Scribe) on Jul 12, 2008 at 20:03 UTC
    Ooops, sorry, I just haven't used perl in a while ... and I realised that this task is easy as pie in perl.

    I cannot believe I was doing this semi-manually in vim the other day. I wasted hours of repetitive keying. I've been too long away from perl-land.

    I include it for anybody stumbling in (still a bit messy, mind you, only the essentials...)
    #!/usr/bin/perl $fname = shift @ARGV; open(fi,"<$fname"); @text = <fi>; close fi; # First, the header of the latex print(" \\documentclass{article} \\usepackage{graphicx} \\usepackage{fullpage} \\begin{document} "); while (@text) { $imfile = shift @text; chop($imfile); print(" \\section{$imfile} \\begin{figure}[!hbp] \\centerline{\\includegraphics[width=9cm, height=9cm]{ims/$imf +ile"."_gd.png}} \\end{figure} \\begin{figure}[!hbp] \\centerline{\\includegraphics[width=12cm, height=9cm]{$imfile +"."mfm.png}} \\end{figure} \\newpage \n"); } # And now the tail print(" \\end{document} \n");
      I'm glad you found a solution for this problem, especially since it uses perl. Here are just a few suggestions:

      1) Since LaTeX has uses backslashes a lot, you can make it easier on yourself by using a 'here'-document with single quotes:

      print <<'END'; \documentclass{article} \usepackage{graphicx} \usepackage{fullpage} \begin{document} END
      2) Unfortunately, perl's own variable interpolation syntax is disabled when using here-documents within single quotes. On the other hand, writing your own mini-templating system is just a few lines in perl:
      sub substitute_vars { my ($template, $hash) = @_; (my $out = $template) =~ s/\${([^}]+)}/$$hash{$1}/ge; $out; }
      and here's how you could use it (write ${imfile} whenever you want to insert the value of imfile, etc.):
      my $template = <<'TEMPLATE_END'; \section{${imfile}} \begin{figure}[!hbp] \centerline{\includegraphics[width=9cm, height=9cm]{ims/${imfile}_gd.p +ng}} \end{figure} \begin{figure}[!hbp] \centerline{\includegraphics[width=12cm, height=9cm]{${imfile}mfm.png} +} \end{figure} \newpage TEMPLATE_END for (@text) { chomp; print substitute_vars($template, { imfile => $_ } ); }
      Of course, once your needs started to get more demanding, I'd consider using an existing templating system.

      3) Finally, you can define your own macros in LaTeX with \newcommand. You might try something along the lines of this:

      \newcommand{\insert_figures}[1]{ \section{#1} ... \centerline{\includegraphics[width=9cm, height=9cm]{ims/#1_gd.png}} ... \centerline{\includegraphics[width=12cm, height=9cm]{#1mfm.png}} ... \newpage }
      However, if you have to manipulate the macro arguments, you might find using something you are familiar with (like perl) easier.