morerows & ltxtable

Nikolai Prokoschenko <[email protected]> Mon, 24 Jan 2005 22:18:33 +0100
Newsgroups gmane.text.docbook.db2latex.devel
Message-ID <[email protected]>
--BOKacYhQ+x31HxR3
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline

Hello, James, Ramon and whoever reads this on the list!

Let me introduce myself to you. My name is Nikolai Prokoschenko. I'm a
22-year-old computer science student from Germany, coming in the ex-USSR.

I have been doing some translation work for the Debian Installer project
and currently became involved into building a better manual - on the
technical side of the process, because I did not like the looks of its
russian translation.  Here comes DB2LaTeX, which I've chosen to do the
work on the manual, as Debian needs truly free software to rely on - thus
XSL:FO and FOP have never been an option.

However, I've noticed that the morerows option in tables has not been
supported, so I decided to implement that myself to have good looking
manuals ;) I'm a complete novice to XSLT, however I've managed to
accomplish this task! On the way, I've implemented LTXtable support, so
this one can now also be used.

I'm attaching my current patch to this mail. WARNING: it's not
production-ready! I've made it work, but it can fail without any
particular reason, no guarantees etc., you know the game. It's also
missing consistent naming, good algorithm, documentation and possible
interferes with other things. Please test it and tell me what you think.
I'd pleased if this patch would make it upstream.

I'd also like to know, where DB2LaTeX is heading right now. The project
seems kind of stalled -- is there any plan, todo-list or something like
it?

Thank you and I hope I can help the project to some extent. It would be a
shame if it would die, as documentation under linux would then become a
real mess, even worse than it is now.

PS. James and Ramon, sorry for CC:ing you, but I hope I can reach you this
way, don't know if you're still subscribed to the list.

-- 
Nikolai Prokoschenko 
[email protected] / Jabber: [email protected]

--BOKacYhQ+x31HxR3
Content-Type: text/plain; charset=utf-8
Content-Disposition: attachment; filename="db2latex-xsl.diff"
Content-Transfer-Encoding: quoted-printable

=D0=9E=D0=B1=D1=89=D0=B8=D0=B5 =D0=BF=D0=BE=D0=B4=D0=BA=D0=B0=D1=82=D0=B0=
=D0=BB=D0=BE=D0=B3=D0=B8: /home/nikolai/db2latex-xsl-0.8pre1+20050124/xsl=
/common =D0=B8 db2latex/common
=D0=9E=D0=B1=D1=89=D0=B8=D0=B5 =D0=BF=D0=BE=D0=B4=D0=BA=D0=B0=D1=82=D0=B0=
=D0=BB=D0=BE=D0=B3=D0=B8: /home/nikolai/db2latex-xsl-0.8pre1+20050124/xsl=
/figures =D0=B8 db2latex/figures
diff -u /home/nikolai/db2latex-xsl-0.8pre1+20050124/xsl/latex.mapping.xml=
 db2latex/latex.mapping.xml
--- /home/nikolai/db2latex-xsl-0.8pre1+20050124/xsl/latex.mapping.xml	200=
4-08-12 10:12:33 +0200
+++ db2latex/latex.mapping.xml	2005-01-24 21:44:02 +0100
@@ -143,7 +143,7 @@
 	<mapping key=3D"informaltable"	text=3D"">
 	    <line>&#10;</line>
 	    <line>% tabular ---------------------------------------------------=
---&#10;</line>
-	    <line>\begin{center}&#10;</line>
+<!--	    <line>\begin{center}&#10;</line> -->
 	    <line>\label{%id%}\hypertarget{%id%}{}%&#10;</line>
 	</mapping>
=20
@@ -430,7 +430,7 @@
 	</mapping>
=20
 	<mapping key=3D"informaltable" text=3D"">
-	    <line>\end{center}&#10;</line>
+<!--	    <line>\end{center}&#10;</line> -->
 	    <line>&#10;</line>
 	</mapping>=09
=20
=D0=9E=D0=B1=D1=89=D0=B8=D0=B5 =D0=BF=D0=BE=D0=B4=D0=BA=D0=B0=D1=82=D0=B0=
=D0=BB=D0=BE=D0=B3=D0=B8: /home/nikolai/db2latex-xsl-0.8pre1+20050124/xsl=
/mathml =D0=B8 db2latex/mathml
diff -u /home/nikolai/db2latex-xsl-0.8pre1+20050124/xsl/param-direct.mod.=
xsl db2latex/param-direct.mod.xsl
--- /home/nikolai/db2latex-xsl-0.8pre1+20050124/xsl/param-direct.mod.xsl	=
2004-08-12 10:12:34 +0200
+++ db2latex/param-direct.mod.xsl	2005-01-08 19:46:48 +0100
@@ -169,16 +169,32 @@
 			<para> Undocumented. </para>
 		</doc:description>
 	</doc:template>
+
 	<xsl:template name=3D"latex.thead.row.entry">
 		<xsl:apply-templates/>
 	</xsl:template>
=20
+
+	<doc:template xmlns=3D"">
+		<refpurpose> Format the output of tabular row entries. </refpurpose>
+		<doc:description>
+			<para> Undocumented. </para>
+		</doc:description>
+	</doc:template>
+
+	<xsl:template name=3D"latex.tbody.row.entry">
+		<xsl:apply-templates/>
+	</xsl:template>
+
+
+
 	<doc:template xmlns=3D"">
 		<refpurpose> Format the output of tabular footers. </refpurpose>
 		<doc:description>
 			<para> Undocumented. </para>
 		</doc:description>
 	</doc:template>
+=09
 	<xsl:template name=3D"latex.tfoot.row.entry">
 		<xsl:apply-templates/>
 	</xsl:template>
diff -u /home/nikolai/db2latex-xsl-0.8pre1+20050124/xsl/preamble.mod.xsl =
db2latex/preamble.mod.xsl
--- /home/nikolai/db2latex-xsl-0.8pre1+20050124/xsl/preamble.mod.xsl	2004=
-01-31 13:45:13 +0100
+++ db2latex/preamble.mod.xsl	2005-01-24 14:17:47 +0100
@@ -523,7 +523,7 @@
 		<xsl:text>% ---------------------- &#10;</xsl:text>
 		<xsl:text>% Most Common Packages   &#10;</xsl:text>
 		<xsl:text>% ---------------------- &#10;</xsl:text>
-		<xsl:if test=3D"$latex.use.varioref=3D1">
+		<xsl:if test=3D"$latex.use.varioref=3D'1'">
 			<xsl:text>\usepackage[</xsl:text>
 			<xsl:value-of select=3D"$latex.varioref.options"/>
 			<xsl:text>]{varioref} &#10;</xsl:text>
@@ -555,6 +555,9 @@
 			<xsl:text>\usepackage{fancybox}      &#10;</xsl:text>
 		</xsl:if>
 		<xsl:text>\usepackage{float}       &#10;</xsl:text>
+		<xsl:text>\usepackage{moreverb}       &#10;</xsl:text>
+		<xsl:text>\usepackage{multirow}       &#10;</xsl:text>
+		<xsl:text>\usepackage{bigstrut}       &#10;</xsl:text>
 		<xsl:text>\usepackage{ragged2e}       &#10;</xsl:text>
 		<xsl:if test=3D"$latex.use.fancyvrb=3D1">
 			<!-- must be after \usepackage{fancybox} -->
@@ -588,7 +591,8 @@
 		<xsl:if test=3D"$latex.use.rotating=3D1"><xsl:text>\usepackage{rotatin=
g}         &#10;</xsl:text></xsl:if>
 		<xsl:if test=3D"$latex.use.subfigure=3D1"><xsl:text>\usepackage{subfig=
ure}         &#10;</xsl:text></xsl:if>
 		<xsl:if test=3D"$latex.use.tabularx=3D1"><xsl:text>\usepackage{tabular=
x}         &#10;</xsl:text></xsl:if>
-		<xsl:if test=3D"$latex.use.ltxtable=3D1 or $latex.use.longtable=3D1"><=
xsl:text>\usepackage{longtable}         &#10;</xsl:text></xsl:if>
+		<xsl:if test=3D"$latex.use.longtable=3D1"><xsl:text>\usepackage{longta=
ble}         &#10;</xsl:text></xsl:if>
+		<xsl:if test=3D"$latex.use.ltxtable=3D1"><xsl:text>\usepackage{ltxtabl=
e}         &#10;</xsl:text></xsl:if>
 		<xsl:if test=3D"$latex.use.umoline=3D1"><xsl:text>\usepackage{umoline}=
         &#10;</xsl:text></xsl:if>
 		<xsl:if test=3D"$latex.use.url=3D1"><xsl:text>\usepackage{url}        =
 &#10;</xsl:text></xsl:if>
 		<xsl:if test=3D"$latex.math.support=3D1"><xsl:value-of select=3D"$late=
x.math.preamble"/></xsl:if>
=D0=9E=D0=B1=D1=89=D0=B8=D0=B5 =D0=BF=D0=BE=D0=B4=D0=BA=D0=B0=D1=82=D0=B0=
=D0=BB=D0=BE=D0=B3=D0=B8: /home/nikolai/db2latex-xsl-0.8pre1+20050124/xsl=
/slides =D0=B8 db2latex/slides
=D0=A2=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE =D0=B2 db2latex/: .svn
diff -u /home/nikolai/db2latex-xsl-0.8pre1+20050124/xsl/table.mod.xsl db2=
latex/table.mod.xsl
--- /home/nikolai/db2latex-xsl-0.8pre1+20050124/xsl/table.mod.xsl	2004-12=
-05 13:45:06 +0100
+++ db2latex/table.mod.xsl	2005-01-24 17:40:53 +0100
@@ -629,9 +629,10 @@
 			</xsl:when>
 			<xsl:when test=3D"$latex.use.ltxtable=3D'1'">
 				<xsl:if test=3D"parent::informaltable">
-					<xsl:text>\addtocounter{table}{-1}</xsl:text>
+					<xsl:text>\addtocounter{table}{-1}&#10;</xsl:text>
 				</xsl:if>
-				<xsl:text>\begin{longtable}</xsl:text>
+				<xsl:text>\begin{verbatimwrite}{table.temp}&#10;</xsl:text>
+				<xsl:text>\begin{longtable}&#10;</xsl:text>
 			</xsl:when>
 			<xsl:otherwise>
 				<xsl:if test=3D"$useminipage=3D'1'"><xsl:text>\begin{minipage}{\line=
width}&#10;</xsl:text></xsl:if>
@@ -639,6 +640,7 @@
 			</xsl:otherwise>
 		</xsl:choose>
 		<xsl:choose>
+			<xsl:when test=3D"$latex.use.ltxtable=3D'1'" />
 			<xsl:when test=3D"$width!=3D''">
 				<xsl:text>{</xsl:text>
 				<xsl:value-of select=3D"$width"/>
@@ -666,7 +668,7 @@
 			</xsl:choose>
 		</xsl:variable>
 		<xsl:choose>
-			<xsl:when test=3D"$usex=3D1">
+			<xsl:when test=3D"$usex=3D1 or $latex.use.ltxtable=3D1">
 				<xsl:call-template name=3D"table.format.tabularx">
 					<xsl:with-param name=3D"cols" select=3D"$cols"/>
 					<xsl:with-param name=3D"colsep" select=3D"$colsep"/>
@@ -740,10 +742,10 @@
 						<xsl:apply-templates select=3D"tfoot">
 							<xsl:with-param name=3D"frame" select=3D"$tfoot.frame"/>
 						</xsl:apply-templates>
+						<xsl:apply-templates select=3D"tbody"/>
 						<xsl:if test=3D"$tfoot.frame=3D1 and not(tfoot)">
 							<xsl:text>\hline &#10;</xsl:text>
 						</xsl:if>
-						<xsl:apply-templates select=3D"tbody"/>
 					</xsl:when>
 					<xsl:otherwise>
 						<xsl:if test=3D"$thead.frame=3D1 and not(thead)">
@@ -771,6 +773,9 @@
 							</xsl:otherwise>
 						</xsl:choose>
 						<xsl:apply-templates select=3D"tbody"/>
+						<xsl:if test=3D"$tfoot.frame=3D1 and not(tfoot)">
+							<xsl:text>\hline &#10;</xsl:text>
+						</xsl:if>
 					</xsl:otherwise>
 				</xsl:choose>
 			</xsl:when>
@@ -786,7 +791,7 @@
 					<xsl:with-param name=3D"frame" select=3D"$tfoot.frame"/>
 				</xsl:apply-templates>
 				<xsl:if test=3D"$tfoot.frame=3D1 and not(tfoot)">
-					<xsl:text>\hline &#10;</xsl:text>
+					<xsl:text>\hline  &#10;</xsl:text>
 				</xsl:if>
 			</xsl:otherwise>
 		</xsl:choose>
@@ -797,6 +802,17 @@
 			</xsl:when>
 			<xsl:when test=3D"$latex.use.ltxtable=3D'1'">
 				<xsl:text>\end{longtable}&#10;</xsl:text>
+				<xsl:text>\end{verbatimwrite}&#10;</xsl:text>
+				<xsl:text>\LTXtable{</xsl:text>
+				<xsl:choose>
+				<xsl:when test=3D"$width!=3D''">
+				    <xsl:value-of select=3D"$width"/>
+        			</xsl:when>
+				<xsl:otherwise>
+				    <xsl:text>\linewidth</xsl:text>
+				</xsl:otherwise>
+				</xsl:choose>
+				<xsl:text>}{table.temp}</xsl:text>
 				<!-- catcode touchup ARGH -->
 				<xsl:call-template name=3D"generate.latex.cell.separator">
 					<xsl:with-param name=3D"which" select=3D"'post'"/>
@@ -1058,10 +1074,12 @@
 			&no_var;
 		</doc:variables>
 	</doc:template>
+
 	<xsl:template match=3D"tbody">
 		<xsl:apply-templates/>
 	</xsl:template>
=20
+
 	<doc:template basename=3D"row" xmlns=3D"">
 		<refpurpose>Process a <doc:db>tbody</doc:db>'s <doc:db>row</doc:db> el=
ements</refpurpose>
 		<doc:variables>
@@ -1070,8 +1088,11 @@
 	</doc:template>
 	<xsl:template match=3D"tbody/row">
 		<xsl:apply-templates/>
+		<!-- should be conditional for multirows -->
+		<xsl:text>\bigstrut</xsl:text>
 		<xsl:text> \tabularnewline&#10;</xsl:text>
-		<xsl:call-template name=3D"generate.table.row.separator"/>
+		<xsl:call-template name=3D"generate.table.row.separator">
+		</xsl:call-template>
 	</xsl:template>
=20
 	<doc:template basename=3D"row" xmlns=3D"">
@@ -1093,7 +1114,9 @@
 		</doc:variables>
 	</doc:template>
 	<xsl:template match=3D"tfoot/row">
-		<xsl:call-template name=3D"generate.table.row.separator"/>
+		<xsl:call-template name=3D"generate.table.row.separator">
+			<xsl:with-param name=3D"cline-string" select=3D"$cline-string" />
+		</xsl:call-template>
 		<xsl:apply-templates/>
 		<xsl:text> \tabularnewline&#10;</xsl:text>
 	</xsl:template>
@@ -1102,6 +1125,7 @@
 	Frame attribute of the enclosing Table or InformalTable and the RowSep=20
 	of the last row is ignored. If unspecified, this attribute is=20
 	inherited from enclosing elements, rowsep=3D1 by default. -->
+
     <xsl:template name=3D"generate.table.row.separator">
 		<xsl:param name=3D"rowsep">
 			<xsl:choose>
@@ -1117,17 +1141,185 @@
 		<xsl:variable name=3D"parent_position" select=3D"count(../preceding-si=
bling::node())+1"/>
 		<xsl:variable name=3D"grandparent_children" select=3D"count(../../chil=
d::node())"/>
 		<xsl:if test=3D"$rowsep=3D1 and (position() !=3D last() or $parent_pos=
ition &lt; $grandparent_children)">
-		<xsl:call-template name=3D"table.row.separator"/>
+			<xsl:call-template name=3D"table.row.separator">
+				<xsl:with-param name=3D"start" select=3D"0"/>
+				<xsl:with-param name=3D"test">
+					<xsl:call-template name=3D"generate.row.description">
+						<xsl:with-param name=3D"start" select=3D"position()"/>
+					</xsl:call-template>
+				</xsl:with-param>
+			</xsl:call-template>
+		</xsl:if>
+		<xsl:text>&#10;</xsl:text>
+	</xsl:template>
+
+	<xsl:template name=3D"generate.row.description">
+		<xsl:variable name=3D"currow">
+				<xsl:for-each select=3D"./entry">
+					<xsl:choose>
+						<xsl:when test=3D"@morerows">
+							<xsl:value-of select=3D"@morerows"/>
+						</xsl:when>
+						<xsl:otherwise>
+							<xsl:value-of select=3D"0"/>
+						</xsl:otherwise>
+					</xsl:choose>
+					<xsl:text> </xsl:text>
+				</xsl:for-each>
+		</xsl:variable>
+		<xsl:if test=3D"count(preceding-sibling::row)=3D0">
+			<xsl:value-of select=3D"$currow"/>
+		</xsl:if>
+		<xsl:for-each select=3D"preceding-sibling::row[1]">
+			<xsl:call-template name=3D"combineTwoClines">
+				<xsl:with-param name=3D"start" select=3D"0"/>
+				<xsl:with-param name=3D"first">
+						<xsl:call-template name=3D"decreaseAll">
+							<xsl:with-param name=3D"start" select=3D"0"/>
+							<xsl:with-param name=3D"array">
+							<xsl:call-template name=3D"generate.row.description">
+								<xsl:with-param name=3D"start" select=3D"$start - 1"/>
+							</xsl:call-template>
+							</xsl:with-param>
+						</xsl:call-template>
+				</xsl:with-param>
+				<xsl:with-param name=3D"second" select=3D"$currow"/>
+			</xsl:call-template>
+		</xsl:for-each> =20
+	</xsl:template>
+=09
+
+
+
+	<xsl:template name=3D"combineTwoClines">
+		<xsl:if test=3D"$start &gt; 0">
+			<xsl:choose>
+				<xsl:when test=3D"$i &gt; 0">
+					<xsl:value-of select=3D"string($i)"/>
+				</xsl:when>
+				<xsl:when test=3D"$j &gt; 0">
+					<xsl:value-of select=3D"string($j)"/>
+				</xsl:when>
+				<xsl:otherwise>
+					<xsl:value-of select=3D"string($i)"/>
+				</xsl:otherwise>
+			</xsl:choose>
+			<xsl:text> </xsl:text>
+		</xsl:if>
+		<xsl:if test=3D"string-length($first) &gt; 0">
+			<xsl:choose>
+				<xsl:when test=3D"$start &gt; 0">
+					<xsl:choose>
+						<xsl:when test=3D"$i &gt; 0">
+							<xsl:call-template name=3D"combineTwoClines">
+								<xsl:with-param name=3D"start" select=3D"$start+1"/>
+								<xsl:with-param name=3D"i" select=3D"number(substring-before($fi=
rst, ' '))" />
+								<xsl:with-param name=3D"first" select=3D"substring-after($first,=
 ' ')" />
+								<xsl:with-param name=3D"j" select=3D"$j" />
+								<xsl:with-param name=3D"second" select=3D"$second" />
+							</xsl:call-template>
+						</xsl:when>
+						<xsl:otherwise>
+							<xsl:call-template name=3D"combineTwoClines">
+								<xsl:with-param name=3D"start" select=3D"$start+1"/>
+								<xsl:with-param name=3D"i" select=3D"number(substring-before($fi=
rst, ' '))" />
+								<xsl:with-param name=3D"first" select=3D"substring-after($first,=
 ' ')" />
+								<xsl:with-param name=3D"j" select=3D"number(substring-before($se=
cond, ' '))" />
+								<xsl:with-param name=3D"second" select=3D"substring-after($secon=
d, ' ')" />
+							</xsl:call-template>
+						</xsl:otherwise>
+					</xsl:choose>
+				</xsl:when>
+				<xsl:otherwise>
+					<xsl:call-template name=3D"combineTwoClines">
+						<xsl:with-param name=3D"start" select=3D"$start+1"/>
+						<xsl:with-param name=3D"i" select=3D"number(substring-before($firs=
t, ' '))" />
+						<xsl:with-param name=3D"first" select=3D"substring-after($first, '=
 ')" />
+						<xsl:with-param name=3D"j" select=3D"number(substring-before($seco=
nd, ' '))" />
+						<xsl:with-param name=3D"second" select=3D"substring-after($second,=
 ' ')" />
+					</xsl:call-template>
+				</xsl:otherwise>
+			</xsl:choose>
+		</xsl:if>
+=09
+	</xsl:template>
+=09
+	<xsl:template name=3D"initializeArray">
+			<xsl:if test=3D"$number &gt; 0">
+				<xsl:text>0 </xsl:text>
+				<xsl:call-template name=3D"initializeArray">
+					<xsl:with-param name=3D"number" select=3D"$number - 1"/>
+				</xsl:call-template>
+			</xsl:if>
+	</xsl:template>
+
+	<xsl:template name=3D"increaseOne">
+		<xsl:if test=3D"$start &gt; 0">
+			<xsl:choose>
+			<xsl:when test=3D"$start =3D $pos">
+				<xsl:value-of select=3D"string($i + $by)"/>
+			</xsl:when>
+			<xsl:otherwise>
+				<xsl:value-of select=3D"string($i)"/>
+			</xsl:otherwise>
+			</xsl:choose>
+			<xsl:text> </xsl:text>
+		</xsl:if>
+		<xsl:if test=3D"string-length($array) &gt; 0">
+			<xsl:call-template name=3D"increaseOne">
+			<xsl:with-param name=3D"start" select=3D"$start+1"/>
+			<xsl:with-param name=3D"i" select=3D"number(substring-before($array, =
' '))" />
+			<xsl:with-param name=3D"array" select=3D"substring-after($array, ' ')=
" />
+			<xsl:with-param name=3D"pos" select=3D"$pos"/>
+			<xsl:with-param name=3D"by" select=3D"$by"/>
+			</xsl:call-template>
+		</xsl:if>
+	</xsl:template>
+
+	<xsl:template name=3D"decreaseAll">
+		<xsl:variable name=3D"by" select=3D"-1"/>
+		<xsl:if test=3D"$start &gt; 0">
+			<xsl:choose>
+				<xsl:when test=3D"$i &gt; 0">
+				<xsl:value-of select=3D"string($i + $by)"/>
+				</xsl:when>
+				<xsl:otherwise>
+					<xsl:value-of select=3D"string($i)"/>
+				</xsl:otherwise>
+			</xsl:choose>
+			<xsl:text> </xsl:text>
+		</xsl:if>
+		<xsl:if test=3D"string-length($array) &gt; 0">
+			<xsl:call-template name=3D"decreaseAll">
+			<xsl:with-param name=3D"start" select=3D"$start+1"/>
+			<xsl:with-param name=3D"i" select=3D"number(substring-before($array, =
' '))" />
+			<xsl:with-param name=3D"array" select=3D"substring-after($array, ' ')=
" />
+			</xsl:call-template>
 		</xsl:if>
 	</xsl:template>
=20
 	<xsl:template name=3D"table.row.separator">
-		<xsl:text> \hline &#10;</xsl:text>
+		<xsl:if test=3D"$start &gt; 0">
+			<xsl:if test=3D"$i =3D 0">
+				<xsl:text>\cline{</xsl:text>
+				<xsl:value-of select=3D"$start"/>
+				<xsl:text>-</xsl:text>
+				<xsl:value-of select=3D"$start"/>
+				<xsl:text>}</xsl:text>
+			</xsl:if>
+		</xsl:if>
+		<xsl:if test=3D"string-length($test) &gt; 0">
+			<xsl:call-template name=3D"table.row.separator">
+			<xsl:with-param name=3D"start" select=3D"$start+1"/>
+			<xsl:with-param name=3D"i" select=3D"number(substring-before($test, '=
 '))" />
+			<xsl:with-param name=3D"test" select=3D"substring-after($test, ' ')" =
/>
+			</xsl:call-template>
+		</xsl:if>
 	</xsl:template>
=20
     <xsl:template match=3D"tbody/row/entry">
 	<xsl:call-template name=3D"latex.entry.prealign"/>
-	<xsl:apply-templates/>
+	<xsl:call-template name=3D"latex.tbody.row.entry"/>
 	<xsl:call-template name=3D"latex.entry.postalign"/>
 	<xsl:if test=3D"position()&lt;last()">
 		<xsl:call-template name=3D"generate.latex.cell.separator">
@@ -1136,6 +1328,68 @@
 	</xsl:if>=20
     </xsl:template>
=20
+	<xsl:template name=3D"get.multirow.description.pos">
+		<xsl:if test=3D"$pos =3D 0">
+			<xsl:value-of select=3D"$i"/>
+		</xsl:if>
+		<xsl:if test=3D"string-length($array) &gt; 0">
+			<xsl:call-template name=3D"get.multirow.description.pos">
+			<xsl:with-param name=3D"pos" select=3D"$pos - 1"/>
+			<xsl:with-param name=3D"i" select=3D"number(substring-before($array, =
' '))" />
+			<xsl:with-param name=3D"array" select=3D"substring-after($array, ' ')=
" />
+			</xsl:call-template>
+		</xsl:if>
+		<xsl:if test=3D"string-length($array) &lt;=3D 0 and $pos &gt; 0">
+			<xsl:value-of select=3D"-2"/>
+		</xsl:if>
+	</xsl:template>
+
+	<xsl:template name=3D"generate.ampersands">
+		<xsl:if test=3D"$number &gt; 0">
+			<xsl:text>&amp;</xsl:text>
+			<xsl:call-template name=3D"generate.ampersands">
+				<xsl:with-param name=3D"number" select=3D"$number - 1"/>
+			</xsl:call-template>
+		</xsl:if>
+	</xsl:template>
+
+	<xsl:template name=3D"CountToZero">
+		<xsl:variable name=3D"current">
+			<xsl:call-template name=3D"get.multirow.description.pos">
+			<xsl:with-param name=3D"pos" select=3D"$pos"/>
+			<xsl:with-param name=3D"i" select=3D"-1" />
+			<xsl:with-param name=3D"array" select=3D"$desc" />
+			</xsl:call-template>
+		</xsl:variable>
+		<xsl:if test=3D"$current =3D 0">
+			<xsl:choose>
+				<xsl:when test=3D"$count =3D 0">
+					<xsl:value-of select=3D"$pos"/>
+				</xsl:when>
+				<xsl:otherwise>
+					<xsl:call-template name=3D"CountToZero">
+						<xsl:with-param name=3D"desc" select=3D"$desc"/>
+						<xsl:with-param name=3D"pos" select=3D"$pos + 1"/>
+						<xsl:with-param name=3D"count" select=3D"$count -1"/>
+					</xsl:call-template>
+				</xsl:otherwise>
+			</xsl:choose>
+		</xsl:if>
+		<xsl:if test=3D"$current &gt; 0">
+			<xsl:call-template name=3D"CountToZero">
+				<xsl:with-param name=3D"desc" select=3D"$desc"/>
+				<xsl:with-param name=3D"pos" select=3D"$pos + 1"/>
+				<xsl:with-param name=3D"count" select=3D"$count"/>
+			</xsl:call-template>
+		</xsl:if>
+		<xsl:if test=3D"$current =3D -1">
+			<xsl:text>-1</xsl:text>
+		</xsl:if>
+		<xsl:if test=3D"$current =3D -2">
+			<xsl:value-of select=3D"$pos"/>
+		</xsl:if>
+	</xsl:template>
+
 	<xsl:template name=3D"latex.entry.prealign">
 	<xsl:variable name=3D"span">
 		<xsl:choose>
@@ -1152,6 +1406,27 @@
 			<xsl:otherwise>-1</xsl:otherwise>
 		</xsl:choose>
 	</xsl:variable>
+	<!-- MultiRow -->
+	<xsl:variable name=3D"desc">
+		<xsl:for-each select=3D"parent::*/preceding-sibling::row[1]">
+			<xsl:call-template name=3D"generate.row.description">
+				<xsl:with-param name=3D"start" select=3D"position()"/>
+			</xsl:call-template>
+		</xsl:for-each>
+	</xsl:variable>
+	<xsl:variable name=3D"FirstZero">
+		<xsl:call-template name=3D"CountToZero">
+			<xsl:with-param name=3D"desc" select=3D"$desc"/>
+			<xsl:with-param name=3D"pos" select=3D"1"/>
+			<xsl:with-param name=3D"count" select=3D"0"/>
+		</xsl:call-template>
+	</xsl:variable>
+	<xsl:if test=3D"position()=3D1">
+	<xsl:call-template name=3D"generate.ampersands">
+		<xsl:with-param name=3D"number" select=3D"$FirstZero - 1"/>
+	</xsl:call-template>
+	</xsl:if>
+=09
 	<!-- Remember: if multicolumn is present, generate.latex.cell.separator=
 post needs to occur within multicolumn -->
 	<xsl:if test=3D"$span &gt; 1">
 		<xsl:text>\multicolumn{</xsl:text>
@@ -1186,11 +1461,42 @@
 	</xsl:if>
 	<xsl:text>{</xsl:text>
 	<!-- use this as a hook for some general warnings -->
-	<xsl:if test=3D"@morerows!=3D''"><xsl:message>The morerows attribute is=
 not supported.</xsl:message></xsl:if>
+	<xsl:if test=3D"@morerows!=3D''">
+		<xsl:text>\multirow{</xsl:text>
+		<xsl:value-of select=3D"@morerows+1"/>
+		<xsl:text>}*{</xsl:text>
+	</xsl:if>
 	</xsl:template>
=20
 	<xsl:template name=3D"latex.entry.postalign">
+	<xsl:if test=3D"@morerows!=3D''">}</xsl:if>
 	<xsl:text>}}</xsl:text>
+	<!-- multirow stuff -->
+	<xsl:variable name=3D"desc">
+		<xsl:for-each select=3D"parent::*/preceding-sibling::row[1]">
+			<xsl:call-template name=3D"generate.row.description">
+				<xsl:with-param name=3D"start" select=3D"position()"/>
+			</xsl:call-template>
+		</xsl:for-each>
+	</xsl:variable>
+		<xsl:variable name=3D"NewCount">
+		<xsl:call-template name=3D"CountToZero">
+			<xsl:with-param name=3D"desc" select=3D"$desc"/>
+			<xsl:with-param name=3D"pos" select=3D"1"/>
+			<xsl:with-param name=3D"count" select=3D"position()"/>
+		</xsl:call-template>
+		</xsl:variable>
+		<xsl:variable name=3D"OldCount">
+		<xsl:call-template name=3D"CountToZero">
+			<xsl:with-param name=3D"desc" select=3D"$desc"/>
+			<xsl:with-param name=3D"pos" select=3D"1"/>
+			<xsl:with-param name=3D"count" select=3D"position() -1"/>
+		</xsl:call-template>
+		</xsl:variable>
+	<xsl:variable name=3D"PostAmper" select=3D"number($NewCount) - number($=
OldCount)"/>
+	<xsl:call-template name=3D"generate.ampersands">
+		<xsl:with-param name=3D"number" select=3D"$PostAmper -1 "/>
+	</xsl:call-template>
 	<!-- this is used when the entry's align spec wants to override the col=
umn default -->
 	<xsl:if test=3D"@namest=3D'' and @spanspec=3D''"><!-- TODO improve -->
 		<xsl:choose>
diff -u /home/nikolai/db2latex-xsl-0.8pre1+20050124/xsl/VERSION.xml db2la=
tex/VERSION.xml
--- /home/nikolai/db2latex-xsl-0.8pre1+20050124/xsl/VERSION.xml	2005-01-2=
4 14:24:04 +0100
+++ db2latex/VERSION.xml	2005-01-08 10:44:40 +0100
@@ -8,7 +8,7 @@
  + #####################################################################=
######### -->
=20
 <xsl:stylesheet xmlns:xsl=3D"http://www.w3.org/1999/XSL/Transform" versi=
on=3D'1.0'>
-<xsl:variable name=3D"VERSION">0.8pre1+20050124</xsl:variable>
+<xsl:variable name=3D"VERSION">0.8pre1+20050108</xsl:variable>
 <xsl:variable name=3D"LASTRELEASE">0.8pre1</xsl:variable>
 <xsl:variable name=3D"TAG">
   <xsl:variable name=3D"RCSTAG" select=3D"substring-before(substring-aft=
er('$Name:  $',concat('$','Name: ')),'$')"/>
=D0=A2=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE =D0=B2 /home/nikolai/db2latex-xsl-0.=
8pre1+20050124/xsl/: .#VERSION.xml.1.5

--BOKacYhQ+x31HxR3--


-------------------------------------------------------
This SF.Net email is sponsored by: IntelliVIEW -- Interactive Reporting
Tool for open source databases. Create drag-&-drop reports. Save time
by over 75%! Publish reports on the web. Export to DOC, XLS, RTF, etc.
Download a FREE copy at http://www.intelliview.com/go/osdn_nl