[scribus] Get the width of a piece of text in a Scribus script?
gpittman at iglou.com
Sat Aug 10 00:58:20 UTC 2013
On 08/09/2013 06:43 PM, Adam wrote:
> Good day,
> I'm working on a script for laying out a song book that includes
> lyrics and chords. Chord names need to be placed above each line of
> lyrics, at the appropriate spot in the lyrics. I've explored a variety
> of approaches to this using typographic options to try to get the
> chord letters bumped up above the lyrics line using baseline shift and
> kerning adjustments, but so far these have not proved effective.
> My present approach is to put each chord in a small text box above the
> lyrics line. In order to do this, I need to be able to determine the
> horizontal position of that point in the lyrics, as rendered in the
> relevant font and type size. Does anyone know of a way to do this?
> Apparently the ImageFont python module (which is a subset of PIL, or
> the Python Imaging Library), can return the width of a text line as
> rendered, but I so far have not been able to get this module working
> properly (there's a C library involved, which is malfunctioning in my
> Does anyone know of any other way to programatically measure the
> rendered width of a line of text?
Here is a fragment from an old script* I wrote for importing pictures
from a directory, then creating text frames which contained the file
Lpiclen = int(5.3 * lenfilename)
# Lpic is the label for each picture, with position and length adjusted
# according to the text length, so if you change the font or its size,
# you may need to adjust this only approximate calculation.
Lpic = scribus.createText(x, y + 193, Lpiclen, 15)
After some experimenting, I came up with this simple formula of 5.3
times the number of characters to approximate the length in points
needed for the text frame -- here my constraint was that it had to be
long enough (too short was unacceptable, a little bit too long was Ok),
so I needed to err a bit on the long side. I considered something more
elegant, like considering each letter and allowing for relative sizes of
letters, but for this purpose it wasn't worth the work.
I think you're looking for something that works pretty well most of the
time, and then being left with a few scattered instances where you tweak
the results. You might even be surprised at how simple a method you can
come up with. Python of course has a number of commands for analyzing
and manipulating strings, and presumably you're dealing with what
amounts to lines of text.
More information about the scribus