diff options
| author | Johan B. C. Engelen <jbc.engelen@swissonline.ch> | 2010-02-24 23:02:25 +0000 |
|---|---|---|
| committer | Johan Engelen <goejendaagh@zonnet.nl> | 2010-02-24 23:02:25 +0000 |
| commit | ce260704f96c6aad4042fb141e778fe7fe351a31 (patch) | |
| tree | eaf60dc0f0f79ab1ab2bc316784a92fefdb776e9 /src | |
| parent | fix bug: don't output scientific notation numbers to latex (diff) | |
| download | inkscape-ce260704f96c6aad4042fb141e778fe7fe351a31.tar.gz inkscape-ce260704f96c6aad4042fb141e778fe7fe351a31.zip | |
- align on text anchor
- provide better scaling option. default, the image is not scaled. image can be scaled by \def\svgwidth{...}
(bzr r9101.1.20)
Diffstat (limited to 'src')
| -rw-r--r-- | src/extension/internal/latex-text-renderer.cpp | 49 |
1 files changed, 31 insertions, 18 deletions
diff --git a/src/extension/internal/latex-text-renderer.cpp b/src/extension/internal/latex-text-renderer.cpp index 7e7e94801..d44652419 100644 --- a/src/extension/internal/latex-text-renderer.cpp +++ b/src/extension/internal/latex-text-renderer.cpp @@ -151,7 +151,7 @@ LaTeXTextRenderer::setTargetFile(gchar const *filename) { fprintf(_stream, "%%%% Creator: Inkscape %s, www.inkscape.org\n", PACKAGE_STRING); fprintf(_stream, "%%%% PDF/EPS/PS + LaTeX output extension by Johan Engelen, 2010\n"); fprintf(_stream, "%%%% Accompanies image file '%s' (pdf, eps, ps)\n", _filename); - fprintf(_stream, "%%%%"); + fprintf(_stream, "%%%%\n"); /* flush this to test output stream as early as possible */ if (fflush(_stream)) { if (ferror(_stream)) { @@ -173,9 +173,13 @@ LaTeXTextRenderer::setTargetFile(gchar const *filename) { static char const preamble[] = "%% To include the image in your LaTeX document, write\n" -"%% \\setlength{\\unitlength}{<desired width>}\n" "%% \\input{<filename>.tex}\n" -"%% instead of\n" +"%% instead of\n" +"%% \\includegraphics{<filename>.pdf}\n" +"%% To scale the image, write\n" +"%% \\def{\\svgwidth}{<desired width>}\n" +"%% \\input{<filename>.tex}\n" +"%% instead of\n" "%% \\includegraphics[width=<desired width>]{<filename>.pdf}\n" "\n" "\\begingroup \n" @@ -187,8 +191,7 @@ static char const preamble[] = " color.sty in LaTeX.}% \n" " \\renewcommand\\color[2][]{}% \n" " }%% \n" -" \\providecommand\\rotatebox[2]{#2}% \n" -" \\makeatother \n"; +" \\providecommand\\rotatebox[2]{#2}% \n"; static char const postamble[] = " \\end{picture}% \n" @@ -250,26 +253,30 @@ LaTeXTextRenderer::sp_text_render(SPItem *item) gchar *str = sp_te_get_string_multiline(item); // get position and alignment - Geom::Point pos; + // Align vertically on the baseline of the font (retreived from the anchor point) + // Align horizontally on boundingbox + Geom::Coord pos_x; gchar *alignment = NULL; Geom::OptRect bbox = item->getBounds(transform()); Geom::Interval bbox_x = (*bbox)[Geom::X]; - Geom::Interval bbox_y = (*bbox)[Geom::Y]; switch (style->text_anchor.computed) { case SP_CSS_TEXT_ANCHOR_START: - pos = Geom::Point( bbox_x.min() , bbox_y.middle() ); - alignment = "[l]"; + pos_x = bbox_x.min(); + alignment = "[lb]"; break; case SP_CSS_TEXT_ANCHOR_END: - pos = Geom::Point( bbox_x.max() , bbox_y.middle() ); - alignment = "[r]"; + pos_x = bbox_x.max(); + alignment = "[rb]"; break; case SP_CSS_TEXT_ANCHOR_MIDDLE: default: - pos = bbox->midpoint(); - alignment = ""; + pos_x = bbox_x.middle(); + alignment = "[b]"; break; } + Geom::Point anchor = textobj->attributes.firstXY() * transform(); + // If we want to align horizontally on bbox: Geom::Point pos(pos_x, anchor[Geom::Y]); + Geom::Point pos(anchor[Geom::X], anchor[Geom::Y]); // determine color (for now, use rgb color model as it is most native to Inkscape) bool has_color = false; // if the item has no color set, don't force black color @@ -299,11 +306,11 @@ LaTeXTextRenderer::sp_text_render(SPItem *item) if (has_color) { os << "\\color[rgb]{" << SP_RGBA32_R_F(rgba) << "," << SP_RGBA32_G_F(rgba) << "," << SP_RGBA32_B_F(rgba) << "}"; } - os << "\\makebox(0,0)" << alignment << "{"; if (has_rotation) { os << "\\rotatebox{" << degrees << "}{"; } - os << str; + os << "\\makebox(0,0)" << alignment << "{"; + os << "\\smash{" << str << "}"; // smash the text, to be able to put the makebox coordinates at the baseline if (has_rotation) { os << "}"; // rotatebox end } @@ -407,9 +414,15 @@ LaTeXTextRenderer::setupDocument(SPDocument *doc, bool pageBoundingBox, SPItem * Inkscape::SVGOStringStream os; os.setf(std::ios::fixed); // no scientific notation - // also write original width to LaTeX - // TODO: add \ifdef statements to be able to choose between specifying width or not to specify it! - os << " %\\setlength{\\unitlength}{" << d->width() * PT_PER_PX << "pt}\n"; + // scaling of the image when including it in LaTeX + + os << " \\ifx \\svgwidth \\@empty\n"; + os << " \\setlength{\\unitlength}{" << d->width() * PT_PER_PX << "pt}\n"; + os << " \\else\n"; + os << " \\setlength{\\unitlength}{\\svgwidth}\n"; + os << " \\fi\n"; + os << " \\global\\let\\svgwidth\\@empty\n"; + os << " \\makeatother\n"; os << " \\begin{picture}(" << _width << "," << _height << ")%\n"; // strip pathname, as it is probably desired. Having a specific path in the TeX file is not convenient. |
