From: Andre W. <wo...@us...> - 2005-04-14 08:09:01
|
Hi, On 13.04.05, Michael Schindler wrote: > But there is an enlighting example: 14.34 Oh, I missed that. Quite interesting! > > Any idea on how to get that in TeX as well? > > I enclose an example how to do your alignment example in plain TeX. Thanks for that. I made another monkey-patch agains 0.7.1 out of it. See below. > I disliked the text.mathmode all the time. But users want to align > simple things in a simple way -- so why should we not provide them > with the TeX/LaTeX solutions we have? Yeah, we provide some handy textattributes, which work well for simple and common cases. Beside that the user can always go down right into the depths of TeX/LaTeX programming. And thats a kind of a bottomline for me as well: I do not want to provide too specialized attributes, which make heavy use of LaTeX features (and are specific to LaTeX). Thus I want to prepare some simple stuff that way, which works on TeX and LaTeX at the same time. > There are some drawbacks of the simple solution: > > text.halign.center: There are two ways to center some lines: > they can be centered with respect to the reference x-coordinate and, > which is something totally different, with respect to each other. Right. In PyX we do not use such paragraph breaking tricks to alter the horizontal alignment of the whole box which we prepare for shipout. We just shift this final box to the left when needed. There is a PyXHAlign macro, which storres a alignment number as a float (0 to 1 for left to right) and its used later on. In general you're right, that we need to distinguish between the horizontal alignment of the whole box and of the content within the box. While the alignment *within* the box clearly is not related to what we currently call the horizontal alignment, this might be quite confusing to the regular user (especially those which aren't TeX users and are not familiar with the concept of boxes etc.). > text.valign.middle, however, makes sense _only_ when aligning with > respect to the reference y-coordinate. Right, and the text.halign.XXX does the same with the x-coordinate, but, at least by default, we could have it altering the paragraph alignment as well. I think, this would be quite natural (especially for the center alignment). The following example does that and it works in TeX and LaTeX: from pyx import * text._textattrspreamble += r"""\newdimen\PyXraggedskipplus \PyXraggedskipplus=80pt \def\PyXragged{\leftskip=0pt plus \PyXHAlign\PyXraggedskipplus \rightskip=0pt plus \PyXraggedskipplus \advance\rightskip0pt plus -\PyXHAlign\PyXraggedskipplus \parfillskip=0pt \spaceskip=0.333em \xspaceskip=0.5em \pretolerance=9999 \tolerance=9999 \parindent=0pt \hyphenpenalty=9999 \exhyphenpenalty=9999}""" text.halign.left = text.halign(0) text.halign.left.apply = lambda expr: r"\gdef\PyXHAlign{0}\PyXragged{}%s" % expr text.halign.center.apply = lambda expr: r"\gdef\PyXHAlign{0.5}\PyXragged{}%s" % expr text.halign.right.apply = lambda expr: r"\gdef\PyXHAlign{1}\PyXragged{}%s" % expr # you can use it in TeX and LaTeX ... # text.set(mode="latex") c = canvas.canvas() c.text(-5, 6, r"Hello, World!", [text.halign.left]) c.text(-5, 4, r"Hello,\par World!", [text.parbox(2), text.halign.left]) c.text(-5, 2, r"This is a long paragraph test.", [text.parbox(2), text.halign.left]) c.text(0, 6, r"Hello, World!", [text.halign.center]) c.text(0, 4, r"Hello,\par World!", [text.parbox(2), text.halign.center]) c.text(0, 2, r"This is a long paragraph test.", [text.parbox(2), text.halign.center]) c.text(5, 6, r"Hello, World!", [text.halign.right]) c.text(5, 4, r"Hello,\par World!", [text.parbox(2), text.halign.right]) c.text(5, 2, r"This is a long paragraph test.", [text.parbox(2), text.halign.right]) # a regular parbox test (parindent becomes visible) c.text(-5, 0, "This is a regular paragraph test. "*20, [text.parbox(10)]) c.writeEPSfile("center") Note that text.halign.left now becomes different from text.halign.clear! Can we start to discuss whether I should make that to be the default behaviour. I would propose to make two other sets of halign attributes, which separate the two tasks of aligning the box and the content within the box. We could name it text.halign.parleft, parcenter, parright and text.halign.boxleft, boxcenter, boxright. Still, all these technically different things should go into text.halign, because people searching for that feature will find it most easiest that way. At least I guess ... and we should discuss that now! > Therefore, we should find two different names for the different > alignments -- your solution with a \PyXcentering macro is also not bad, > because it will live in the (La)TeX world and not in the python world. > I think it should work without any necessary text.parbox() which at > least I forget quite often. Well, that last point is a general problem arising from the fact, that you do need a *width* to use paragraphs. It is absolutely natural, that PyX uses TeX in lr-mode by default. We should not be too fancy. André -- by _ _ _ Dr. André Wobst / \ \ / ) wo...@us..., http://www.wobsta.de/ / _ \ \/\/ / PyX - High quality PostScript figures with Python & TeX (_/ \_)_/\_/ visit http://pyx.sourceforge.net/ |