in reply to combining lists, formatting and printing on windows

Easiest answer for Q1 probably is lcfirst, at least as long as none of your causes don't start out with a proper name, which lcfirst also would mercilessly "downsize" :-)

As for Q2, first thing that comes to my mind is fmt, but perhaps Text::Format suits your needs better. For a solution without CPAN, your function would look for the last spaces before your width, output that substring, and then work on the rest of the string.

The OS wouldn't make a difference, as long as you use a monospaced font. Otherwise, I'd preferredly output something like RTF (e.g. RTF::Writer), which can be shown/printed by even the older versions of Windows' text processors such as Write; or PDF, which you have heard of :-)

Update: I thought you'd run perl on the same system where you want the output - then you'd get the correct line endings by default (at least Strawberry does this for me).
Perhaps the :crlf Layer from PerlIO might help... Looks like the easiest way for you is to use "\r\n" in place of pure "\n" - see the thread hinted to by FreeBeerReekingMonk. But if by "printing" (in the subject) mean "sending to paper", RTF (which is to TeX what PHP is to Perl) is better, because every Windows can print that "out of the box".

Replies are listed 'Best First'.
Re^2: combining lists, formatting and printing on windows
by Aldebaran (Curate) on Apr 19, 2015 at 03:12 UTC

    Wow, you researched that well enough to have found my previous struggles with it. I went away from rtf before, but this time I thought I'd try it, getting farther in a day than expected. Caller and callee look like this now:

    #!/usr/bin/perl -w use strict; use 5.010; use lib "template_stuff"; use steps1; say "enter basename for file"; my $word = <>; chomp $word; # main data structure my %vars = ( fears => 'fears2.txt', causes => 'causes2.txt', width => 50, word => $word .'.rtf', ); my $rvars = \%vars; my $return = pop_texts( $rvars ); say "returned was \n $$return"; my $return2 = format_texts( $rvars, $return ); __END__
    sub format_texts { use strict; use 5.010; use RTF::Writer; my ( $rvars, $reftext1 ) = @_; my %vars = %$rvars; my $text1 = $$reftext1; my $rtf = RTF::Writer->new_to_file( $vars{word} ); $rtf->prolog( 'title' => "List of fears" ); $rtf->number_pages; $rtf->print($text1); $rtf->close; return 1; }

    Surprisingly, the rtf file printed out beautifully on windows, albeit without prolog, numbering, and with default margins. This will suffice for me to read it to someone else, so it is good enough for now. RTF Cookbook on CPAN is one of the better resources out there. What puzzles me specifically is how to brook the chasm between the method calls of RTF::Writer and the mark-up language itself. To blurt it out:

    Q1) Where do I put the backslash sequences to create a right margin of 4000 twips?

    Thanks for your comments and attention to detail.

      Where do I put the backslash sequences to create a right margin of 4000 twips?

      I seem to have figured this out by a lot of error and trial:

      sub format_texts { use strict; use 5.010; use RTF::Writer; my ( $rvars, $reftext1 ) = @_; my %vars = %$rvars; my $text1 = $$reftext1; my $rtf = RTF::Writer->new_to_file( $vars{word} ); $rtf->prolog( 'title' => "List of fears", ); $rtf->number_pages; $rtf->paragraph(\'\qc\f0\fs120\b ', "Fears"); $rtf->paragraph(\'\ri3000\li-500\f0\fs30\b0\ql',$text1); $rtf->close;

      This creates a centered, oversized headline and then sets a left indent of negative 500 twips (moving it left a centimeter or so), and a right indent of 3000 twips, which, with the rather large default margins creates the space on the right side of the page that I wanted. Screenshot of output on Tinypic

      I was wrong to expect the title to print out: it's not supposed to. I was also wrong that the page number didn't print out. The reference that got me over the hump on rtf syntax was Sean Burke's summary of rtf syntax . Also informative was MS specification of rtf on sourceforge

      Still puzzled why "Fear of" doesn't get inserted with this substitution:

      for (@fears) { s/\s+$/ /; $_ = lc($_); s/^(\d+\. )(.) /$1 Fear of $2/; }

        There is a space after the (.)> in s/^(\d+\. )(.)_/ (where I put the underscore).

        As for the right place for the margin settings, I would have supposed it should go into the prolog, but my experiments seem to indicate this particular setting is stored outside of the RTF file (perhaps in a stylesheet) (at least by WordPad) Aargh! reading the docs is better than experimenting (sometimes). A simple $rtf->print( \'\margl567\margr567' ); after the Prolog sets the left and right margin to 1cm.