From: Jae-Joon L. <lee...@gm...> - 2008-08-28 19:57:59
|
Hello, AFAIK, current backends (I only tested agg, pdf, and ps) do not properly respect the text baseline when text is rendered using TeX. The get_text_width_height_descent() method in Agg and PS backends simply return 0 for the descent value. While PDF backend uses the dviread module to figure out correct descent values, there are cases this does not work well (e.g. $\frac{1}{2}\pi$). As an example, the attached figure shows the result for the Agg backend. In all cases, the texts are placed at (0,0) with baseline-alignment. Leftmost one is when usetex=False, which has a correct baseline. The middle one is when usetex=True. It is bottom aligned, which is not intended. The rightmost one is also when usetex=True but after the patch I describe below. First of all, I borrowed this idea from the PyX which is in GPL. Although there is little of copying, other than the basic idea, I'm not 100% sure if this could be BSD-compatible. Anyhow, the idea is that you can have LateX to print out the width, height, and descent (=depth) of a given text by enclosing the text in a box. For example, \newbox\MatplotlibBox% \setbox\MatplotlibBox=\hbox{$\frac{1}{2}\pi$}% \copy\MatplotlibBox \immediate\write16{MatplotlibBox:\the\wd\MatplotlibBox,\the\ht\MatplotlibBox,\the\dp\MatplotlibBox}% I define a newbox (called MatplotlibBox) which encloses $\frac{1}{2}\pi$. And then print out the width, height and depth of the box. Attached is a patch of a texmanager.py which utilize above method to figure out the dimension of the text. The template string to generate a ".tex" file is slightly modified. After latex is run, the dimensional information of the text is extracted and saved in ".baseline" file and get_text_width_height_descent() method is added under the TexManager class, which reads in the ".baseline" file and return its content. (you need to empty out the tex.cache directory for this work correctly). A backend can simply call the get_text_width_height_descent() of texmanager (a simple patch for the Agg backend is attached). I also tested this with PS and PDF backends and they worked out fine. So if the license issue is okay, I wonder if this patch can be reviewed and applied (after any necessary modifications) to improve the baseline handling in matploltib. Regards, -JJ |