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

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");

Replies are listed 'Best First'.
Re^3: repetitive latex doc: in vim or perl?
by pc88mxer (Vicar) on Jul 13, 2008 at 01:37 UTC
    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.