# ListLayouts may have standard paragraphs nested inside them.
my $ListLayouts = "Itemize|Enumerate|Description";
-# Striaght translation of LaTeX lengths to LyX ones.
-my %lengthAsLyXString = ('\textwidth' => 'text%',
- '\columnwidth' => 'col%',
- '\paperwidth' => 'page%',
- '\linewidth' => 'line%',
- '\paperheight' => 'pheight%',
- '\textheight' => 'theight%');
-
# passed a string and an array
# returns true if the string is an element of the array.
sub foundIn {
return 0;
}
+
+sub regularizeLatexLength {
+ my $LatexLength = shift;
+
+ # Remove any whitespace
+ $LatexLength =~ s/\s//g;
+ # Remove a leading '+' as unnecessary
+ $LatexLength =~ s/^\+?(\d)/$1/;
+ # Split into value and unit parts
+ my $val;
+ my $unit;
+ if ($LatexLength =~ /(-?\d+[.,]?\d*)(\\?[a-zA-Z]*)$/) {
+ $val = $1;
+ $unit = $2;
+ }
+ # If the input is invalid, return what we have.
+ return $LatexLength if ($val eq '' || $unit eq '');
+
+ # '4,5' is a valid LaTeX number. Change it to '4.5'
+ $val =~ s/,/./;
+ # If the unit is not a LaTeX macro, then ensure it is lower case
+ if (!($unit =~ /^\\/)) {
+ $unit =~ s/([a-z]*)/\L$1/i;
+ }
+
+ $LatexLength = $val . $unit;
+ return $LatexLength;
+}
+
+
+sub getAsLyXLength {
+ # Straight translation of LaTeX lengths to LyX ones.
+ my %lengthAsLyXString = ('\textwidth' => 'text%',
+ '\columnwidth' => 'col%',
+ '\paperwidth' => 'page%',
+ '\linewidth' => 'line%',
+ '\paperheight' => 'pheight%',
+ '\textheight' => 'theight%');
+
+ my $LatexLength = shift;
+ $LatexLength = regularizeLatexLength($LatexLength);
+
+ my $LyXLength = $LatexLength;
+ # If $LatexLength is something like '4.5\columnwidth', translate into
+ # LyXese.
+ if ($LatexLength =~ /([+-]?\d+\.?\d*)(\\[a-z]*)/) {
+ if (defined($lengthAsLyXString{$2})) {
+ $LyXLength = ($1 * 100) . $lengthAsLyXString{$2};
+ }
+ }
+
+ return $LyXLength;
+}
+
########################## MAIN TRANSLATOR SUBROUTINE #####################
sub basic_lyx {
# This subroutine is called by Text::TeX::process each time subroutine
# The minipage environment is defined as:
# \begin{minipage}[pos][height][inner-pos]{width} <text>
# \end{minipage}
- my $pos = foo bar....
- # Read any optional argument.
+ # Read the position optional argument, if it exists
$tok = $fileobject->eatOptionalArgument;
- my $arg = $tok->print if defined($tok->print);
+ my $pos = $tok->print if defined($tok->print);
my %map = ('t' => '0', 'c' => '1', 'b' => '2');
- if ($debug_on && $arg ne '' && !defined($map{$arg})) {
- print "\nIgnoring unknown positioning arg '$arg'\n";
+ if ($debug_on && $pos ne '' && !defined($map{$pos})) {
+ print "\nIgnoring unknown positioning arg '$pos'\n";
}
# The minipage is centred by default.
- $arg = '1' if (!defined($map{$arg}) ||
- ($arg = $map{$arg}) eq '');
+ $pos = '1' if (!defined($map{$pos}) ||
+ ($pos = $map{$pos}) eq '');
+
+ # Read the height optional argument, if it exists
+ my $height = '0pt';
+ $tok = $fileobject->eatOptionalArgument;
+ if (defined($tok->print)) {
+ $height = getAsLyXLength($tok->print);
+ }
+
+ # Read the inner-pos optional argument, if it exists
+ my $innerpos = $pos;
+ $tok = $fileobject->eatOptionalArgument;
+ if (defined($tok->print)) {
+ my $arg = $tok->print;
+ print("\nMinipage inner-pos argument, $arg, is ",
+ "currently ignored\n");
+ }
# Read the width as (a reference to) an array of tokens.
$tok = $fileobject->eatBalanced;
- # $arg is Something like either '4.5cm' or '\columnwidth'.
- $arg = pop(@{$tok})->print;
- # If $arg is something like '\columnwidth', then manipulate
- # it into LyX format and also extract the length itself.
- if (defined($lengthAsLyXString{$arg})) {
- $arg = $lengthAsLyXString{$arg};
- my $val = pop(@{$tok});
- $val = (defined($val)) ? $val->print : '0';
- $arg = ($val * 100) . $arg;
- }
+ my $width = getAsLyXLength($tok->exact_print);
- print OUTFILE "position $arg\n";
- print OUTFILE "inner_position 0\n";
- print OUTFILE "height \"0pt\"\n";
- print OUTFILE "width \"$arg\"\n";
+ print OUTFILE "position $pos\n";
+ print OUTFILE "inner_position $innerpos\n";
+ print OUTFILE "height \"$height\"\n";
+ print OUTFILE "width \"$width\"\n";
print OUTFILE "collapsed false\n";
# \begin document