Hello,
Having read a number of very interesting expert postings on the forum here I am hopeful that some of you might point me in the right direction with my little problem.
For a project I'd like to position shapes in MS Word as well aligned with the baseline of the words in a line of text as possible (I added the red lines and red text for illustration purposes to the Word screen shot below.).
Shapes and other objects floating above the main text are always anchored to a paragraph in Word and may be positioned relative to this paragraph (see dialogue box in the screen shot), i.e. relative to the top left corner of the anchoring paragraph. Now I'd like to retrieve or calculate the vertical distance between the anchoring point and the baseline of any line (or at least of the first line) in the paragraph with a Visual Basic for Applications (VBA) macro and place the value into the variable for the vertical offset of the shape position (in suitable units).
[ol][li]Retrieving the vertical distance from top of line to baseline
Ideally Word would expose the vertical distance from the top of a line objectto its baseline, but unfortunately I did not find any reference to a property or method on the web. I did find hints to some hidden properties however ([→] ._GethWnd). Maybe someone of you knows a [']secret['] and helpful property?[/li]
[li]Calculating the vertical distance from top of line to baseline
If Word doesn't tell, maybe it's possible to emulate what Word is doing? Apparently Word uses vertical metrics from tables inside font files to dimension text lines and position the baseline inside the text lines. Using VBA code I managed to read the Textmetric and the OutlineTextMetric structures with WinAPI calls ([→] gdi32). Some information in these structures if obviously essential, but unfortunately I have not found out which exactly. Some trial and error seems to suggest that Word 2010 uses hhea.Ascender (or OS/2.WinAscent?) + hhea.Descender (or OS/2.WinDescent?) + hhea.LineGap to calculate the line height of lines with single line spacing and puts the baseline at hhea.Ascender (or OS/2.WinAscent?) + hhea.LineGap from the top. But there are many more variables influencing vertical positioning: different fonts and/or font sizes in the same line, the presence of superscripts or vertically shifted characters, line spacing (1.5, 2, etc.; points before or after the paragraph; points after of the previous paragraph), the location of the paragraph inside a table cell or in normal text, etc.
So reliably emulating Word's calculations for the vertical placement of a baseline in all possible cases seems a difficult task, involving a lot of testing – except if one knows Word's placement algorithm! Does anybody here know? [/li][/ol]
Once the Word document is complete it will be converted to a PDF. So ultimately the baseline and the shape should be aligned (as well as possible) in the PDF – the alignment on the screen during editing the Word document is less important (WYSIWYG is not always perfect).
Thank you for your comments.
Having read a number of very interesting expert postings on the forum here I am hopeful that some of you might point me in the right direction with my little problem.
For a project I'd like to position shapes in MS Word as well aligned with the baseline of the words in a line of text as possible (I added the red lines and red text for illustration purposes to the Word screen shot below.).
Shapes and other objects floating above the main text are always anchored to a paragraph in Word and may be positioned relative to this paragraph (see dialogue box in the screen shot), i.e. relative to the top left corner of the anchoring paragraph. Now I'd like to retrieve or calculate the vertical distance between the anchoring point and the baseline of any line (or at least of the first line) in the paragraph with a Visual Basic for Applications (VBA) macro and place the value into the variable for the vertical offset of the shape position (in suitable units).
[ol][li]Retrieving the vertical distance from top of line to baseline
Ideally Word would expose the vertical distance from the top of a line objectto its baseline, but unfortunately I did not find any reference to a property or method on the web. I did find hints to some hidden properties however ([→] ._GethWnd). Maybe someone of you knows a [']secret['] and helpful property?[/li]
[li]Calculating the vertical distance from top of line to baseline
If Word doesn't tell, maybe it's possible to emulate what Word is doing? Apparently Word uses vertical metrics from tables inside font files to dimension text lines and position the baseline inside the text lines. Using VBA code I managed to read the Textmetric and the OutlineTextMetric structures with WinAPI calls ([→] gdi32). Some information in these structures if obviously essential, but unfortunately I have not found out which exactly. Some trial and error seems to suggest that Word 2010 uses hhea.Ascender (or OS/2.WinAscent?) + hhea.Descender (or OS/2.WinDescent?) + hhea.LineGap to calculate the line height of lines with single line spacing and puts the baseline at hhea.Ascender (or OS/2.WinAscent?) + hhea.LineGap from the top. But there are many more variables influencing vertical positioning: different fonts and/or font sizes in the same line, the presence of superscripts or vertically shifted characters, line spacing (1.5, 2, etc.; points before or after the paragraph; points after of the previous paragraph), the location of the paragraph inside a table cell or in normal text, etc.
So reliably emulating Word's calculations for the vertical placement of a baseline in all possible cases seems a difficult task, involving a lot of testing – except if one knows Word's placement algorithm! Does anybody here know? [/li][/ol]
Once the Word document is complete it will be converted to a PDF. So ultimately the baseline and the shape should be aligned (as well as possible) in the PDF – the alignment on the screen during editing the Word document is less important (WYSIWYG is not always perfect).
Thank you for your comments.