xsl-list
[Top] [All Lists]

Re: [xsl] FO: Alphabetical index layout problem with justified last line

2015-06-03 10:20:49
Hi Michael,
For this kind of styling, I've worked with several options before and there's 
not a "best case" for all. You are correct, I believe, that there's often a 
balance needed to get the right kind of display and that's really a design 
choice. You may need to keep the keyword line and reference line totally 
separate if the body of your keywords are generally lengthy, for example. If 
the formatting doesn't need to be pretty, then use a table or list to enforce 
strict wrapping and leader lengths.
I am going to assume you are generating your index using keys so that you have 
access to the position() each number entry is in. If you are not using keys, at 
least look at the fo:block and fo:inline combination to keep things on the same 
line. Speaking abstractly, something like this might work:
The context is an indexterm match.
<fo:block font-weight="normal"><xsl:value-of select="."/> <!-- your index term 
--><fo:inline><xsl:for-each select="$refs"> <!-- your key, with all the terms, 
used in your case to refer to the page number --><xsl:if 
test="position()=1"><fo:leader leader-pattern="dots" 
leader-pattern-width="3pt"/></xsl:if><!-- A template to determine the location 
of the reference, format it if necessary, and create the fo:basic-link 
--><xsl:call-template name="index_number"><xsl:with-param name="term" 
select="'primary'"/></xsl:call-template><xsl:if test="position() != 
last()"><xsl:text>, </xsl:text></xsl:if></xsl:for-each></fo:inline></fo:block>
You create an fo:block for each keyword, and then use an fo:inline leader for 
the first number reference. All other number references get the separating "," 
except for the last. This design, for the work I do, balances term / keyword 
length with a small or large number of citations and generally short keywords.
In this , you end up with:| keyword of short length .......... 42 |or| keyword 
of embarrassingly large || length and numbers ....... 42, 44  |or| keyword 
........ 42, 44, 46, 48, 99 |
You will have trouble when the two balance awkwardly, or you have a very long 
set of numbers to process:| keyword medium .... 42, 44, 46, |
|                                              48, 99  |
You could then use xpath to do some more number evaluations on the position(). 
For example, you could count the terms in your number references (10, for 
example), and check the position() when emitting and try to break them across 
lines to balance them out. You can also set minimum and maximum lengths on the 
leader. The block lets you control things like hanging-indents and margins to 
better format your output.
Hopefully this helps, some, at least abstractly.
Kind regards,Michael Friedman
From: xsl-list-service(_at_)lists(_dot_)mulberrytech(_dot_)com
Date: Wed, 3 Jun 2015 14:32:51 +0000
To: XSL-List(_at_)lists(_dot_)mulberrytech(_dot_)com
Subject: [xsl] FO: Alphabetical index layout problem with justified last line

Hello experts,

We are challenged with a layout for an alphabetical index that uses leader 
dots and forces page numbers to the right border of the current column, like 
this:

| keyword .......... 23 |
                                          
--~----------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
EasyUnsubscribe: http://lists.mulberrytech.com/unsub/xsl-list/1167547
or by email: xsl-list-unsub(_at_)lists(_dot_)mulberrytech(_dot_)com
--~--
<Prev in Thread] Current Thread [Next in Thread>