Knuth linebreaking questions
Hi Luca (and others), I've been trying to get my head around the line breaking code and during that process some questions has come up. I urge you *not* to take anything I ask as a sign of criticism or as a request for changes. I don't have the Knuth paper where the algorithm is described so perhaps the answers would be obvious if I read it. 1) What is the purpose of 2 glues for a normal space in END and START alignment: new KnuthGlue(0, 3 * wordSpaceIPD.opt, 0, , false)); new KnuthPenalty(0, 0, false, , true)); new KnuthGlue(wordSpaceIPD.opt, - 3 * wordSpaceIPD.opt, 0, , true)); and why isn't the min and max of wordspaceIPD used. 2) What does the threshold parameter to findBreakingPoints controll? It seems to be a performance parameter which control the number of active nodes, rather than a quality parameter. Or to frame my question differently, if threshold=1 finds a set of breaks, will threshold=5 always pick the same set of breaks? Or can threshold=5 find a better set of breaks? 3) What is the reasoning for doing hyphenation only after threshold=1 fails. Naive common sense tells me that if the user specify hyphenation we should do hyphenation before finding line breaks. 4) I've compared your code to tex_wrap http://oedipus.sourceforge.net/texlib/ and the main difference is in the way new KnuthNodes are added to the active list. Is the BestRecords part of Knuth or is it your own invention? Why is it only fitness_class'es in BestRecord that is higher then minDemerits + incompatibleFitnessDemerit that is added to activeList? Why not all fitness_class'es in BestRecords? regards, finn
Printing PDF on the client default printer.
Just wanted everyone to know that I have successfully implemented client side printing using FOPEg: If the XML file gets created on the webserver which is located in Los Angeles and the user in London, then the XML is converted to PDF and the PDF file is printed on the clients default printer in London.ThanksManoj-Forwarded by Manoj Nair/LA/SPE on 11/30/2004 09:00AM -To: [EMAIL PROTECTED]From: [EMAIL PROTECTED]Date: 10/21/2004 10:13AMSubject: Printing PDF on the client default printer.**Ihadpostedthisinthefop-usergroupandtheresponsesindicatedthatthereisnowaythiscanbeimplementedcurrently.Justwantedanopinionfromthefop-devcrowd.Thanks**MyrequirementistorenderanXMLasaPDFandthenprintthePDFontheclientsdefaultprinter.IdontwantthePDFtopromptusertoopentheacrobatreader.IalreadyhaveanappletontheclientsidewhichusesPrinterJobclasstopopuptheprinterselectionboxonclientside.NowhowdoIredirectthecontentfromservertothisprinter?ShouldIuseDriver.RENDER_PRINT/Driver.RENDER_PCLsetinthefopdriverrenderer?andwhatcontenttypeshouldtheresponseobjectreturn?ThanksManojPS:IhavesuccessfullyusetheFopPrinterexample(FopPrintServlet)toprintpdfsontheappserversdefaultprinterbutwhatIneedistobeabletoprintontheclientsdefaultprinterandnotonserversprinter.
Re: Printing PDF on the client default printer.
wow!!! sounds great... Where can we get that ??? Thanx. - Original Message - From: [EMAIL PROTECTED] To: [EMAIL PROTECTED] Cc: [EMAIL PROTECTED] Sent: Tuesday, November 30, 2004 9:02 AM Subject: Printing PDF on the client default printer. Just wanted everyone to know that I have successfully implemented client side printing using FOP Eg: If the XML file gets created on the webserver which is located in Los Angeles and the user in London, then the XML is converted to PDF and the PDF file is printed on the clients default printer in London. Thanks Manoj -Forwarded by Manoj Nair/LA/SPE on 11/30/2004 09:00AM -To: [EMAIL PROTECTED]From: [EMAIL PROTECTED]Date: 10/21/2004 10:13AMSubject: Printing PDF on the client default printer.**Ihadpostedthisinthefop-usergroupandtheresponsesindicatedthatthereisnowaythiscanbeimplementedcurrently.Justwantedanopinionfromthefop-devcrowd.Thanks**MyrequirementistorenderanXMLasaPDFandthenprintthePDFontheclientsdefaultprinter.IdontwantthePDFtopromptusertoopentheacrobatreader.IalreadyhaveanappletontheclientsidewhichusesPrinterJobclasstopopuptheprinterselectionboxonclientside.NowhowdoIredirectthecontentfromservertothisprinter?ShouldIuseDriver.RENDER_PRINT/Driver.RENDER_PCLsetinthefopdriverrenderer?andwhatcontenttypeshouldtheresponseobjectreturn?ThanksManojPS:IhavesuccessfullyusetheFopPrinterexample(FopPrintServlet)toprintpdfsontheappserversdefaultprinterbutwhatIneedistobeabletoprintontheclientsdefaultprinterandnotonserversprinter.
Re: Knuth linebreaking questions
Finn Bock wrote: 1) What is the purpose of 2 glues for a normal space in END and START alignment: new KnuthGlue(0, 3 * wordSpaceIPD.opt, 0, , false)); new KnuthPenalty(0, 0, false, , true)); new KnuthGlue(wordSpaceIPD.opt, - 3 * wordSpaceIPD.opt, 0, , true)); The purpose is to give each line (but the last one) the same stretchability, regardless of the number of spaces in it. If the penalty is not used (there is no line ending there) the overall effect of the 2 glues is a 0 stretchability and does not modify the line total; if the penalty is used (a line ends there) then the stretchability of the previous glue is added to the line total, which becomes 3 * wordSpaceIPD.opt because the previous space, as said before, added 0 (the following glue is suppressed). In justified text, a line with many spaces can be adjusted in order to be much shorter, or much longer. If left-aligned text used the same elements, the algorithm would find the same breaking points; but this time adjustment ratios are not used, so a line with many spaces would be too much longer, or too much shorter, than the other lines. Using these elements, the algorithm creates lines whose unadjusted width is quite the same. and why isn't the min and max of wordspaceIPD used. Well, you just made me notice there is a little bug, LineLayoutManager.DEFAULT_SPACE_WIDTH should be used insted! :-) It's just a magic number: the point is that every TextLM should use the same value. 2) What does the threshold parameter to findBreakingPoints controll? It seems to be a performance parameter which control the number of active nodes, rather than a quality parameter. Or to frame my question differently, if threshold=1 finds a set of breaks, will threshold=5 always pick the same set of breaks? Or can threshold=5 find a better set of breaks? It controls both performance and quality: minimum quality. If threshold = 1 finds a set of breaks, it is the best possible set of breaks, because the adjustment ratio of each break is = 1 which means that spaces and other adjustable objects will not need to be longer than their .max width. But with this optimal threshold the algorithm could fail, and find no set of breaking points; so, a try with a higher threshold must be done. If with threshold = 1 a set is found, with threshold = 5 the same set would be found, but it would take more time, because a greater number of active nodes are used. 3) What is the reasoning for doing hyphenation only after threshold=1 fails. Naive common sense tells me that if the user specify hyphenation we should do hyphenation before finding line breaks. Finding hyphenation points is time-expansive (all words must be hyphenated, not only the ones near a line's end), the sequence of elements becomes longer, there are more feasible breaking points, and a line ending with a - is less beautiful; so I thought that if a set of breaking points could be find without hyphenation. I just took the hyphenate property as a suggestion instead of an order! :-) Note that the same algorithm with the same threshold could find a different set of breaking points with and without hyphenation, because the elements are different. Without hyphenation, spaces could need a little higher adjustment, for example. 4) I've compared your code to tex_wrap http://oedipus.sourceforge.net/texlib/ and the main difference is in the way new KnuthNodes are added to the active list. Is the BestRecords part of Knuth or is it your own invention? Why is it only fitness_class'es in BestRecord that is higher then minDemerits + incompatibleFitnessDemerit that is added to activeList? Why not all fitness_class'es in BestRecords? At the moment I don't have the book at hand, but I am quite sure it's *not* an invention of mine! :-) As far as I can remember, the Knuth book uses 4 different variables, named C1, ... C4 :-( (or maybe D or A, anyway not a very self-documenting name!) and I just created this structure to store them. I'll try and find some time to look at this ... Thanks for your interest and your comments, they are most welcome! Regards Luca
DO NOT REPLY [Bug 32253] - Marker bugs
DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUGĀ· RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT http://issues.apache.org/bugzilla/show_bug.cgi?id=32253. ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED ANDĀ· INSERTED IN THE BUG DATABASE. http://issues.apache.org/bugzilla/show_bug.cgi?id=32253 --- Additional Comments From [EMAIL PROTECTED] 2004-11-30 21:23 --- Committed a fix in Marker, which cures the ClassCastException in Marker.rebind(). Now all markers lead to a ClassCastException in RetrieveMarkerLM.getNextKnuthElements(), line 81. This should be cured by removing the LMs for fo:marker and for fo:retrieve-marker: at the moment, RetrieveMarkerLM tries to achieve this (in the LM tree): ... | parentLM | RetrieveMarkerLM | InlineStackingLM ---+--- | | chldLM1 chldLM2 but, as a marker can only have children which could replace its retrieve-marker, wouldn't it be better to have just: ... | parentLM ---+--- | | chldLM1 chldLM2 (Luca Furini at fop-dev) -- Configure bugmail: http://issues.apache.org/bugzilla/userprefs.cgi?tab=email --- You are receiving this mail because: --- You are the assignee for the bug, or are watching the assignee.
Re: cvs commit: xml-fop/src/java/org/apache/fop/fo/flow Marker.java
Finn (or anyone else), given that FOText nodes (and possibly other non-formatting object nodes in the future) also have properties, any objections if we move FObj.bind() to FONode.bind()? That would simplify the below code a bit. Thanks, Glen [EMAIL PROTECTED] schrieb: spepping2004/11/30 12:20:59 Modified:src/java/org/apache/fop/fo/flow Marker.java Log: Fixed a ClassCastException in rebind Revision ChangesPath 1.20 +7 -2 xml-fop/src/java/org/apache/fop/fo/flow/Marker.java Index: Marker.java === RCS file: /home/cvs/xml-fop/src/java/org/apache/fop/fo/flow/Marker.java,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- Marker.java 28 Oct 2004 10:00:21 - 1.19 +++ Marker.java 30 Nov 2004 20:20:59 - 1.20 @@ -26,6 +26,7 @@ import org.apache.fop.apps.FOPException; import org.apache.fop.fo.FOEventHandler; import org.apache.fop.fo.FONode; +import org.apache.fop.fo.FOText; import org.apache.fop.fo.FObj; import org.apache.fop.fo.FObjMixed; import org.apache.fop.fo.PropertyList; @@ -69,9 +70,13 @@ // Set a new parent property list and bind all the children again. propertyList.setParentPropertyList(parentPropertyList); for (Iterator i = children.keySet().iterator(); i.hasNext(); ) { -FObj child = (FObj) i.next(); +Object child = i.next(); PropertyList childList = (PropertyList) children.get(child); -child.bind(childList); +if (child instanceof FObj) { +((FObj) child).bind(childList); +} else if (child instanceof FOText) { +((FOText) child).bind(childList); +} } } - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
Re: Knuth linebreaking questions
[Finn] 3) What is the reasoning for doing hyphenation only after threshold=1 fails. Naive common sense tells me that if the user specify hyphenation we should do hyphenation before finding line breaks. [Luca] Finding hyphenation points is time-expansive (all words must be hyphenated, not only the ones near a line's end), the sequence of elements becomes longer, there are more feasible breaking points, and a line ending with a - is less beautiful; so I thought that if a set of breaking points could be find without hyphenation. I've just started to read Knuth's chapter on breaking paragraphs into lines, and from what I've read, he considers excessive hyphenation a bad form. The main benefits he gives for taking the entire paragraph into account when deciding where to break lines (as opposed to the more traditional just-look-at-the-current-line analysis) are a reduced need for hyphenation and a reduced number of over-spaced lines (i.e., too few words on a line requiring large spaces between them for the line to be justified.) Glen