# CALS 

# $Id: script,v 1.7 1998/10/13 08:11:26 tobotras Exp $

#  .    .
#
# 1.    .
# 2.     .
# 3.   --   .
#
# 1.    
#  1.1     :
#    1.1.1    = 1 .
#    1.1.2     . ,   , 
#            .     
#          .
#    1.1.3    --    ,  .1.1.2.
#
#  1.2   :
#    1.2.1  ""     .
#    1.2.2    = 0.
#    1.2.3     .      
#              ,     
#            .
#    1.2.4   --    .
# 
#  1.3     .
#    1.3.1   --    ,   
#          ,     ,  ,   
#            .
#
#
# 2.  .          
#    .
#   2.1   :      
#       .     ""  ,  , ,
#              
#       .
#   2.2      ,   (  ) . 
#   2.3      ,   (  ) .
#   2.4     TeX' .
#
#
# 3.     vbox'     longtable.
# 
# 4. thead  tbody     longtable.
#
# 
# 
#
#  :
#
# * ENTRYTBL;
#
require Simple.tcl
require TEItools.tcl

###
set MAX_BOX_COUNT 200

TEItoolsSetup "tex"

specification translate {
    {element "TABLE"} {
	startAction {
	    traverseTable
	}
	prefix		[latexHeader]
	suffix		[latexFooter]
    }
    {element "ROW"} {
	prefix		{}
	suffix		[rowEnd]
    }
    {element "ENTRY"} {
	prefix		[entryStart]
	suffix		[entryEnd]
    }
    {elements "THEAD TBODY TFOOT"} {
	startAction	{
	    newSegment
	}
	prefix		{}
    }
    {el} {
	prefix		[openUnknown]
    }
}

#        
proc traverseTable {} {
    foreachNode descendant element ENTRY {
	#FIXME:  spans
	#FIXME:  ?
    }
}

proc boxName { no } {
    return [format "box%c%c" [expr 97 + $no / 26] [expr 97 + $no % 26]]
}

proc latexHeader {} {
    set ret "
\\documentclass{article}
\\usepackage\[english,russian\]{babel}
\\usepackage{longtable}
\\begin{document}
\\begin{longtable}{p{\\textwidth}}
"
    global MAX_BOX_COUNT
    for {set i 0} {$i < $MAX_BOX_COUNT} {incr i} {
	append ret "\\newsavebox{\\[boxName $i]}\n"
    }
    return $ret
}

proc latexFooter {} {
    return "
\\end{longtable}
\\end{document}
"
}

proc rowEnd {} {
    #    , ,     .
    #   -- .
    global calsSegmentHeight
    set origSegmentHeight $calsSegmentHeight
    foreachNode child element ENTRY {
	set morerows [attVal MOREROWS]
	if { [isNumber $morerows] } {
	    incr calsSegmentHeight $morerows
	}
    }
    if { $origSegmentHeight != $calsSegmentHeight } {
	return
    } else {
	return [typeSetSegment]
    }
}

proc segmentStart {} {
    global calsSegmentHeight
    if { $calsSegmentHeight == 1 } {
	set segStart [query address]
    } else {
	set segHeight $calsSegmentHeight
	set segStart {}
	foreachNode prev element "ROW" {
	    if { $segHeight == 1 } {
		set segStart [query address]
	    } else {
		incr segHeight -1
	    }
	}
	if { "$segStart" == "" } {
	    error "***INTERNAL ERROR in segmentStart"
	}
    }
    return $segStart
}

proc typeSetSegment {} {
    set currentNode [query address]
    selectNode [segmentStart]

    
    
    selectNode $currentNode
    return "
% Segment!
"
}

proc entryStart {} {
    global calsEntryNumber

    if { ![info exist calsEntryNumber] } {
	set calsEntryNumber 0
    }
    global MAX_BOX_COUNT
    if { $calsEntryNumber > $MAX_BOX_COUNT } {
	error "***ERROR too many entries in table segment\n"
	return
    }
    set box [boxName $calsEntryNumber]

    incr calsEntryNumber
    
    return "\\savebox{\\$box}\[5cm\]\[t\]\{"
}

proc entryEnd {} {
    return "\}"
}

proc newSegment {} {
    global calsSegmentHeight
    set calsSegmentHeight 1
}

#Local variables:
#mode: tcl
#End:
