version 1.304, 2005/12/20 23:12:03
|
version 1.312, 2006/01/11 11:58:06
|
Line 68 BEGIN {
|
Line 68 BEGIN {
|
# for ($row =0; $row <= $lastrow; $row++ ) { |
# for ($row =0; $row <= $lastrow; $row++ ) { |
# my $text = Dumper($Apache::londefdef::table[$row]); |
# my $text = Dumper($Apache::londefdef::table[$row]); |
# &Apache::lonnet::logthis("table [ $row ]".$text); |
# &Apache::lonnet::logthis("table [ $row ]".$text); |
# |
|
# } |
# } |
#} |
#} |
sub initialize_londefdef { |
sub initialize_londefdef { |
Line 174 sub start_html {
|
Line 173 sub start_html {
|
if ($target eq 'web' || $target eq 'edit' || $target eq 'webgrade' ) { |
if ($target eq 'web' || $target eq 'edit' || $target eq 'webgrade' ) { |
$currentstring = &Apache::lonxml::xmlbegin(); |
$currentstring = &Apache::lonxml::xmlbegin(); |
} elsif ($target eq 'tex') { |
} elsif ($target eq 'tex') { |
$currentstring .= '\documentclass[letterpaper]{article}'; |
$currentstring .= '\documentclass[letterpaper,twoside]{article}'; |
if (($env{'form.latex_type'}=~'batchmode') || |
if (($env{'form.latex_type'}=~'batchmode') || |
(!$env{'request.role.adv'})) {$currentstring .='\batchmode';} |
(!$env{'request.role.adv'})) {$currentstring .='\batchmode';} |
$currentstring .= '\newcommand{\keephidden}[1]{}'. |
$currentstring .= '\newcommand{\keephidden}[1]{}'. |
'\renewcommand{\deg}{$^{\circ}$}'. |
'\renewcommand{\deg}{$^{\circ}$}'. |
|
'\usepackage{multirow}'. |
'\usepackage{longtable}'. |
'\usepackage{longtable}'. |
'\usepackage{textcomp}'. |
'\usepackage{textcomp}'. |
'\usepackage{makeidx}'. |
'\usepackage{makeidx}'. |
Line 594 sub end_body {
|
Line 594 sub end_body {
|
return $currentstring; |
return $currentstring; |
} |
} |
|
|
|
# \begin{center} causes a new paragprah spacing that looks odd inside |
|
# of a table cell |
|
sub center_correction { return '\vspace*{-6 mm}'; } |
#-- <center> tag (end tag required) |
#-- <center> tag (end tag required) |
sub start_center { |
sub start_center { |
my ($target,$token) = @_; |
my ($target,$token,$tagstack) = @_; |
my $currentstring = &end_p(); # Close off any prior para. |
my $currentstring = &end_p(); # Close off any prior para. |
if ($target eq 'web') { |
if ($target eq 'web') { |
$currentstring .= $token->[4]; |
$currentstring .= $token->[4]; |
} elsif ($target eq 'tex') { |
} elsif ($target eq 'tex') { |
|
if (&is_inside_of($tagstack, "table")) { |
|
$currentstring .= ¢er_correction(); |
|
} |
$currentstring .= '\begin{center}'; |
$currentstring .= '\begin{center}'; |
} |
} |
return $currentstring; |
return $currentstring; |
} |
} |
|
|
sub end_center { |
sub end_center { |
my ($target,$token) = @_; |
my ($target,$token,$tagstack) = @_; |
my $currentstring = ''; |
my $currentstring = ''; |
if ($target eq 'web') { |
if ($target eq 'web') { |
$currentstring = $token->[2]; |
$currentstring = $token->[2]; |
} elsif ($target eq 'tex') { |
} elsif ($target eq 'tex') { |
$currentstring = '\end{center}'; |
$currentstring = '\end{center}'; |
|
if (&is_inside_of($tagstack, "table")) { |
|
$currentstring .= ¢er_correction(); |
|
} |
} |
} |
return $currentstring; |
return $currentstring; |
} |
} |
Line 1183 sub start_p {
|
Line 1192 sub start_p {
|
if ($align eq 'center') { |
if ($align eq 'center') { |
$currentstring .='\begin{center}\par'; |
$currentstring .='\begin{center}\par'; |
$closing_string = '\end{center}'; |
$closing_string = '\end{center}'; |
|
if (&is_inside_of($tagstack, "table")) { |
|
$currentstring = ¢er_correction().$currentstring; |
|
$closing_string .= ¢er_correction(); |
|
} |
} elsif ($align eq 'right') { |
} elsif ($align eq 'right') { |
$currentstring.='\makebox['.$env{'form.textwidth'}.']{\hfill\llap{'; |
$currentstring.='\makebox['.$env{'form.textwidth'}.']{\hfill\llap{'; |
$closing_string= '}}'; |
$closing_string= '}}'; |
Line 1524 sub start_div {
|
Line 1537 sub start_div {
|
if ($align eq 'center') { |
if ($align eq 'center') { |
$currentstring .= '\begin{center}'; |
$currentstring .= '\begin{center}'; |
$endstring = '\end{center}'; |
$endstring = '\end{center}'; |
|
if (&is_inside_of($tagstack, "table")) { |
|
$currentstring = ¢er_correction().$currentstring; |
|
$endstring .= ¢er_correction(); |
|
} |
} |
} |
elsif ($align eq 'right') { |
elsif ($align eq 'right') { |
$currentstring .= '\begin{flushright}'; |
$currentstring .= '\begin{flushright}'; |
Line 1944 sub start_table {
|
Line 1961 sub start_table {
|
|
|
# width either comes forced from the TeXwidth or the width parameters. |
# width either comes forced from the TeXwidth or the width parameters. |
# in either case it can be a percentage or absolute width. |
# in either case it can be a percentage or absolute width. |
|
# in the width case we ignore absolute width |
my $TeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0); |
my $TeXwidth = &Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0); |
if (not defined $TeXwidth) { |
if (!defined($TeXwidth)) { |
$TeXwidth = &Apache::lonxml::get_param('width',$parstack,$safeeval,undef,1); |
my $htmlwidth = &Apache::lonxml::get_param('width',$parstack, |
|
$safeeval,undef,1); |
|
if ($htmlwidth =~ /%/) { |
|
$TeXwidth = $htmlwidth; |
|
} else { |
|
$TeXwidth = $textwidth; |
|
} |
} else { |
} else { |
$Apache::londefdef::table[-1]{'forcedtablewidth'} = 1; |
$Apache::londefdef::table[-1]{'forcedtablewidth'} = 1; |
} |
} |
Line 2002 sub end_table {
|
Line 2024 sub end_table {
|
my $inmemory = ''; |
my $inmemory = ''; |
my $output = ''; |
my $output = ''; |
my $WARNING=''; |
my $WARNING=''; |
|
# &debug_dump_table($Apache::londefdef::table[-1]); |
#width of columns from TeXwidth attributes |
#width of columns from TeXwidth attributes |
|
|
for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { |
for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { |
Line 2186 sub end_table {
|
Line 2209 sub end_table {
|
$header_of_table .= '}'; |
$header_of_table .= '}'; |
#fill the table |
#fill the table |
for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { |
for (my $in=0;$in<=$Apache::londefdef::table[-1]{'row_number'};$in++) { |
|
my $have_rowspan = 0; |
for (my $jn=0;$jn<=$#fwidth;$jn++) { |
for (my $jn=0;$jn<=$#fwidth;$jn++) { |
# |
# |
# Do the appropriate magic if this has a colspan |
# Do the appropriate magic if this has a colspan |
Line 2196 sub end_table {
|
Line 2220 sub end_table {
|
$colspan |
$colspan |
.'}{|l|}{'; |
.'}{|l|}{'; |
} |
} |
|
my $rowspan = $Apache::londefdef::table[-1]{'rowspan'}[$in][$jn]; |
|
|
|
# Start a rowspan if necessary: |
|
|
|
if ($rowspan > 1) { |
|
$have_rowspan++; |
|
$output .= '\multirow{'.$rowspan.'}[0]{'.$fwidth[$jn].'mm}{'; |
|
} |
|
if (($rowspan eq '^') || ($rowspan eq '_')) { |
|
$have_rowspan++; |
|
} |
|
|
if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') { |
if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') { |
# $output.='\vspace*{-6 mm}\begin{center}'; |
$output.=¢er_correction().'\begin{center}'; |
$output.='\begin{center}'; |
|
} elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') { |
} elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') { |
$output.=' \hfill \llap{' |
$output.=' \hfill \llap{' |
} |
} |
$output.=$Apache::londefdef::table[-1]{'content'}[$in][$jn]; |
$output.=$Apache::londefdef::table[-1]{'content'}[$in][$jn]; |
if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') { |
if ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'c') { |
# $output.='\end{center}\vspace*{-6 mm}'; |
$output.='\end{center}'.¢er_correction(); |
$output.='\end{center}'; |
|
} elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') { |
} elsif ($Apache::londefdef::table[-1]{'align'}[$in][$jn] eq 'r') { |
$output.='} '; |
$output.='} '; |
} |
} |
|
# Close off any open multirow: |
|
|
|
if ($rowspan > 1) { |
|
$output .= '}'; |
|
} |
# Close off the colspan... |
# Close off the colspan... |
# |
# |
if ($colspan > 1) { |
if ($colspan > 1) { |
Line 2217 sub end_table {
|
Line 2256 sub end_table {
|
} |
} |
if ($jn!=$#fwidth) {$output.=' '.$Apache::londefdef::table[-1]{'vinc'};} |
if ($jn!=$#fwidth) {$output.=' '.$Apache::londefdef::table[-1]{'vinc'};} |
} |
} |
$output.=' \\\\ '.$Apache::londefdef::table[-1]{'hinc'}.' '; |
# If have_rowspan > 0, and borders are on, then |
|
# we need to do more than put an \hline at the bottom of row. |
|
# we need to do the appropriate \cline to ensure that |
|
# the spanned rows don't have \hlines through them. |
|
|
|
if (($Apache::londefdef::table[-1]{'hinc'} =~ /\\hline/) && $have_rowspan) { |
|
$output .= ' \\\\ '; |
|
for (my $jn=0; $jn<=$#fwidth;$jn++) { |
|
my $rowspan = $Apache::londefdef::table[-1]{'rowspan'}[$in][$jn]; |
|
if (($rowspan <= 1) || ($rowspan eq '_')) { |
|
my $column = $jn+1; |
|
$output .= '\cline{'.$column.'-'.$column.'} '; |
|
} |
|
} |
|
|
|
} else { |
|
$output.=' \\\\ '.$Apache::londefdef::table[-1]{'hinc'}.' '; |
|
} |
} |
} |
# Note that \newline destroys alignment env's produced by e.g. <div> |
# Note that \newline destroys alignment env's produced by e.g. <div> |
# $Apache::londefdef::table[-1]{'output'} .= $header_of_table.$Apache::londefdef::table[-1]{'hinc'}.$output.'\end{tabular}\strut\newline\strut '; |
# $Apache::londefdef::table[-1]{'output'} .= $header_of_table.$Apache::londefdef::table[-1]{'hinc'}.$output.'\end{tabular}\strut\newline\strut '; |
Line 2365 sub end_td_tex {
|
Line 2421 sub end_td_tex {
|
my $current_column = $Apache::londefdef::table[-1]{'counter_columns'}; |
my $current_column = $Apache::londefdef::table[-1]{'counter_columns'}; |
my $data = &Apache::lonxml::endredirection(); |
my $data = &Apache::lonxml::endredirection(); |
|
|
|
# The rowspan array of the table indicates which cells are part of a span. |
|
# n indicates the start of a span set of n rows. |
|
# ^ indicates a cell that continues a span set. |
|
# _ indicates the cell is at the bottom of a span set. |
|
# If this and subsequent cells are part of a rowspan, we must |
|
# push along the row until we find one that is not. |
|
|
|
while ((defined $Apache::londefdef::table[-1]{'rowspan'}[$current_row] [$current_column]) |
|
&& ($Apache::londefdef::table[-1]{'rowspan'}[$current_row][$current_column] =~ /[\^\_]/)) { |
|
# Part of a span. |
|
push @ {$Apache::londefdef::table[-1]{'content'}[-1]}, ''; |
|
$current_column++; |
|
} |
|
$Apache::londefdef::table[-1]{'counter_columns'} = $current_column; |
|
|
|
|
|
|
|
my $rowspan = &Apache::lonxml::get_param('rowspan', $parstack, $safeeval, undef, 0); |
|
if (!$rowspan) { |
|
$rowspan = 1; |
|
} |
|
|
|
|
|
|
|
$Apache::londefdef::table[-1]{'rowspan'}[$current_row][$current_column] = $rowspan; |
|
for (my $i = 1; $i < $rowspan; $i++) { |
|
$Apache::londefdef::table[-1]{'rowspan'}[$current_row+$i][$current_column] = '^'; |
|
if ($i == ($rowspan-1)) { |
|
$Apache::londefdef::table[-1]{'rowspan'}[$current_row+$i][$current_column] = '_'; |
|
} |
|
} |
|
|
my $TeXwidth=&Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0); |
my $TeXwidth=&Apache::lonxml::get_param('TeXwidth',$parstack,$safeeval,undef,0); |
if (defined $TeXwidth) { |
if (defined $TeXwidth) { |
Line 2456 sub end_td_tex {
|
Line 2541 sub end_td_tex {
|
|
|
} |
} |
# Should be be killing off the 'include' elements as they're used up? |
# Should be be killing off the 'include' elements as they're used up? |
|
|
push @ {$Apache::londefdef::table[-1]{'content'}[-1] },$data; |
push @ {$Apache::londefdef::table[-1]{'content'}[-1] },$data; |
|
|
# Get the column and row spans. |
# Get the column and row spans. |
# Colspan can be done via \multicolumn if I can figure out the data structs. |
# Colspan can be done via \multicolumn if I can figure out the data structs. |
# Rowspan, can be done using the multirow package which adds similar stuff to rowspanning. |
|
|
|
my $colspan = &Apache::lonxml::get_param('colspan', $parstack, $safeeval, undef, 0); |
my $colspan = &Apache::lonxml::get_param('colspan', $parstack, $safeeval, undef, 0); |
if (!$colspan) { |
if (!$colspan) { |
$colspan = 1; |
$colspan = 1; |
} |
} |
my $rowspan = &Apache::lonxml::get_param('rowspan', $parstack, $safeeval, undef, 0); |
|
|
|
|
|
# the colspan array will indicate how many columns will be spanned by this |
# the colspan array will indicate how many columns will be spanned by this |
Line 2680 sub start_img {
|
Line 2765 sub start_img {
|
$safeeval, |
$safeeval, |
undef,1)); |
undef,1)); |
if(!$align) { |
if(!$align) { |
if (&is_inside_of($tagstack, "table")) { |
|
$align = "right"; # Force wraptext use. |
|
} else { |
|
$align = "bottom"; # This is html's default so it's ours too. |
$align = "bottom"; # This is html's default so it's ours too. |
} |
|
} |
} |
# |
# |
&Apache::lonxml::debug("Alignemnt = $align"); |
&Apache::lonxml::debug("Alignemnt = $align"); |
Line 2699 sub start_img {
|
Line 2780 sub start_img {
|
$parstack, |
$parstack, |
$safeeval, |
$safeeval, |
undef,0); |
undef,0); |
&Apache::lonxml::debug("LaTeX rendering = $latex_rendering"); |
# &Apache::lonxml::debug("LaTeX rendering = $latex_rendering"); |
if(!$latex_rendering) { |
if(!$latex_rendering) { |
$latex_rendering = "texwrap"; |
$latex_rendering = "texwrap"; |
|
} |
|
# using texwrap inside a table does not work. So, if after all of this, |
|
# texwrap is on, we turn it off if we detect we're in a table: |
|
# |
|
if (($latex_rendering eq 'texwrap') && &is_inside_of($tagstack, "table")) { |
|
$latex_rendering = 'parpic'; |
} |
} |
&Apache::lonxml::debug("LaTeX rendering = $latex_rendering image file: $src"); |
# &Apache::lonxml::debug("LaTeX rendering = $latex_rendering image file: $src"); |
|
|
#if original gif/jpg/png file exist do following: |
#if original gif/jpg/png file exist do following: |
my $origsrc=$src; |
my $origsrc=$src; |