Improved the latex preamble conversion to lyx

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@2299 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
José Matox 2001-07-23 00:53:52 +00:00
parent e08f44aa7e
commit 3b49ef85f7
2 changed files with 143 additions and 11 deletions

View File

@ -1,3 +1,10 @@
2001-07-22 José Matos <jamatos@fep.up.pt>
* reLyX/MakePreamble.pm (translate_preamble): add lots of options
to convert from latex to lyx preamble. That means support for language,
geometry, several \usepackages. Almost all the options that are present
in Layout->Document.
2001-07-20 Jean-Marc Lasgouttes <Jean-Marc.Lasgouttes@inria.fr>
* ui/default.ui: change 'hyphenation break' to 'ligature break'.

View File

@ -95,9 +95,12 @@ sub translate_preamble {
"letterpaper" => "\\papersize letterpaper",
"legalpaper" => "\\papersize legalpaper",
"executivepaper" => "\\papersize executivepaper",
"a3paper" => "\\papersize a3paper",
"a4paper" => "\\papersize a4paper",
"a5paper" => "\\papersize a5paper",
"b5paper" => "\\papersize b5paper",
"b3paper" => "\\papersize b3paper",
"b4paper" => "\\papersize b4paper",
"b5paper" => "\\papersize b5paper",
"twoside" => "\\papersides 2",
"oneside" => "\\papersides 1",
@ -108,6 +111,18 @@ sub translate_preamble {
"twocolumn" => "\\papercolumns 2",
);
# if the language file is available then added it to the options table
if(-e "$main::lyxdir/languages") {
open (LANGUAGES, "<$main::lyxdir/languages");
while(<LANGUAGES>) {
next if(/^\#/); #ignore comments
my @lang_field = split(/\s+/);
$Option_Trans_Table{$lang_field[1]} = "\\language $lang_field[1]";
}
close(LANGUAGES);
}
# This is the string in which we're concatenating everything we translate
my $LyX_Preamble = "";
@ -131,16 +146,8 @@ sub translate_preamble {
# }
#}
# Write first two lines of the lyx file
my ($nm, $dt);
# whoami is needed on Win32, because getlong/getpwuid aren't implemented
# I'd rather use internal Perl functions when possible, though
$nm = (eval {getlogin || getpwuid($<)}) || `whoami`;
chomp($nm); # whomai returns "foo\n"
$dt = localtime;
$LyX_Preamble .= "\#This file was created by <$nm> $dt\n";
$LyX_Preamble .= "\#LyX 1.0 (C) 1995-1999 Matthias Ettrich " .
"and the LyX Team\n";
# Write first line of the lyx file
$LyX_Preamble .= "\#LyX 1.2 created this file. For more info see http://www.lyx.org/\n";
# Print \lyxformat.
$LyX_Preamble .= "\\lyxformat $Format\n";
@ -214,6 +221,124 @@ sub translate_preamble {
$write_preamble ||= (! /^\s*$/ && ! /^\s*%/);
}
# Process $Latex_Preamble, and try to extarct as much as possible to
# $Lyx_Preamble (jamatos 2001/07/21)
# Deal with counters, for now just "tocdepth" and "secnumdepth"
my %Counter_Table = (
"secnumdepth" => "\\secnumdepth",
"tocdepth" => "\\tocdepth"
);
my $ct;
foreach $ct (keys %Counter_Table) {
$Latex_Preamble =~ s/\\setcounter\{$ct\}\{(.*)\}\s*// && do {
$LyX_Preamble .= "$Counter_Table{$ct} $1\n";
}
}
if($Latex_Preamble =~ s/\\pagestyle\{(.*)\}\s*//) {
$LyX_Preamble .= "\\paperpagestyle $1\n";
}
if($Latex_Preamble =~ s/\\usepackage\[(.*)\]\{inputenc\}\s*//) {
$LyX_Preamble .= "\\inputencoding $1\n";
}
## Deal with several \usepackage{} cases
my %Usepackage_Table = (
"amsmath" => "\\use_amsmath 1",
"amssymb" => "",
"geometry" => "\\use_geometry 1",
"babel" => "",
"pslatex" => "\\fontscheme pslatex",
"ae" => "\\fontscheme ae",
"aecompl" => "",
"times" => "\\fontscheme times",
"palatino" => "\\fontscheme palatino",
"helvet" => "\\fontscheme helvet",
"avant" => "\\fontscheme avant",
"newcent" => "\\fontscheme newcent",
"bookman" => "\\fontscheme bookman",
"a4wide" => "\\paperpackage widemarginsa4",
"a4" => "\\paperpackage a4wide",
"graphics" => "\\graphics default",
"rotating" => ""
);
my $up;
foreach $up (keys %Usepackage_Table) {
$Latex_Preamble =~ s/\\usepackage\{$up\}\s*// && do {
$LyX_Preamble .= "$Usepackage_Table{$up}";
$LyX_Preamble .= "\n" unless ($Usepackage_Table{$up} eq "");
}
}
## Handle geometry options
## The custom paper missing from the options list since it involves two parameters
my %Geometry_Options =(
'verbose' => sub { return "" },
"letterpaper" => sub { return "\\papersize letterpaper\n" },
"legalpaper" => sub { return "\\papersize legalpaper\n" },
"executivepaper"=> sub { return "\\papersize executivepaper\n" },
"a3paper" => sub { return "\\papersize a3paper\n" },
"a4paper" => sub { return "\\papersize a4paper\n" },
"a5paper" => sub { return "\\papersize a5paper\n" },
"b3paper" => sub { return "\\papersize b3paper\n" },
"b4paper" => sub { return "\\papersize b4paper\n" },
"b5paper" => sub { return "\\papersize b5paper\n" },
'tmargin=(\w*)' => sub { return "\\topmargin $1\n" },
'bmargin=(\w*)' => sub { return "\\bottommargin $1\n" },
'lmargin=(\w*)' => sub { return "\\leftmargin $1\n" },
'rmargin=(\w*)' => sub { return "\\rightmargin $1\n" },
'headsep=(\w*)' => sub { return "\\headsep $1\n" },
'footskip=(\w*)' => sub { return "\\footskip $1\n" },
'headheight=(\w*)' => sub { return "\\headheight $1\n" }
);
if( $Latex_Preamble =~ /\\geometry\{(.*)\}/) {
my $geom_options = $1;
my $op;
foreach $op (keys %Geometry_Options) {
$geom_options =~ s/$op// && do {
$LyX_Preamble .= $Geometry_Options{$op}();
print "Geometry option $op\n" if $debug_on;
}
}
$geom_options =~ s/^,+|,+(?=,)|,+$//g; # extra commas
if( $geom_options =~ /\s*/) {
$Latex_Preamble =~ s/\\geometry\{(.*)\}//;
}
else {
$Latex_Preamble =~ s/\\geometry\{(.*)\}/\\geometry\{$geom_options\}/;
}
}
## Paragraph skip or indentation
if ( $Latex_Preamble =~
s/\\setlength\\parskip\{\\(.*)amount\}\s*\\setlength\\parindent\{0pt\}//) {
$LyX_Preamble .= "\\paragraph_separation skip\n";
$LyX_Preamble .= "\\defskip $1\n";
}
## Paragraph spacing
if ( $Latex_Preamble =~ s/\\(\w*)spacing//) {
$LyX_Preamble .= "\\spacing $1\n";
}
## remove LyX specific stuff
$Latex_Preamble =~ s/\\IfFileExists\{url.sty\}\{\\usepackage\{url\}\}\s*\{\\newcommand\{\\url\}\{\\texttt\}\}\s*//;
## this two need probably a more fine grained control
$Latex_Preamble =~ s/\\makeatletter\s*//;
$Latex_Preamble =~ s/\\makeatother\s*//;
if ($write_preamble) {
$Latex_Preamble =~ s/^\s*//;
print "LaTeX preamble, consists of:\n$Latex_Preamble" if $debug_on;