ConTeXt:文字环绕具有复杂轮廓的图像

ConTeXt:文字环绕具有复杂轮廓的图像

我是 ConTeXt 的新手,之前用过 Scribus 和 InDesign。我想知道在 ConTeXt 上能否让文字围绕带有复杂/弯曲边框的图像流动,如下图所示?

它可以是自定义/手动绘制的轮廓,也可以是 PNG 图像透明部分上的文本。

示例:围绕弯曲边框流动的文本

示例:围绕弯曲边框流动的文本

我在文档和网络上除了图像方形边框周围的文字外什么也没找到。

谢谢!!

答案1

我认为这是一个复杂的问题,你需要大量的手动调整(如果你需要经常这样做,也许 Scribus 和 InDesign 是更好的工具)。你应该阅读有关parshapeTeX 的内容。使用 ConTeXt,你不能做更多的事情,但你可以通过使用 MetaFun 为你制作形状来获得一些帮助(这样你就不必自己输入数字了)。在元乐趣,第 10.6 节关于库的内容,您将找到txt带有示例的库。

我先给你举一个例子。它绝不是完整的,如果你玩一下它,你就会发现它有一些局限性。例如,我不能把一个部分标题放在里面,否则会破坏它。此外,里面显示的公式也弄乱了它。

有关不同参数的解释,请参阅 MetaFun 手册中提到的部分。

% Just some setups
\definepapersize[square][width=5in,height=5in]
\setuppapersize[square]

\setupbodyfont[libertinus,10pt]

\setuplayout[
    margin=0pt,
    backspace=0.75in,
    topspace=0.75in,
    width=3.5in,
    height=3.75in,
    footer=0in,
    header=0in,
    location=middle,
]

% Here the important things start
\useMPlibrary[txt]

\startuseMPgraphic{nododo1}
path p ;
numeric w, h ;
w := 3.5in ;
h := 3.75in ;
p := (0, h) -- (0, 0.5*h) -- (0.35*w, 0.5*h) -- (0.5*w, 0.25*h) -- (0.5*w, 0) -- (w, 0) -- (w, h) -- cycle ;
build_parshape(p, 0pt, 0, 0, \baselinedistance, \strutheight, \strutdepth, \strutheight) ;
\stopuseMPgraphic

\startuseMPgraphic{nododo2}
path p ;
numeric w, h ;
w := 3.5in ;
h := 0.8*3.5in ;
p := unitsquare xyscaled(w,h) ;
build_parshape(p, 0pt, 0, 0, \baselinedistance, \strutheight, \strutdepth, \strutheight) ;
\stopuseMPgraphic

\defineoverlay[nododo1][\useMPgraphic{nododo1}]
\defineoverlay[nododo2][\useMPgraphic{nododo2}]

\startshapetext[nododo1, nododo2]
\forgetall
\setupalign[verytolerant,stretch,normal]
\samplefile{knuth}\par
\samplefile{douglas}
\stopshapetext

\starttext
% This just place the figure
\setupbackgrounds[page][background=pagegraphics]
\definelayer[pagegraphics][
    width=\paperwidth,
    height=\paperheight,
    ]
\setlayer[pagegraphics][corner={left,bottom},location={right,top}]{\externalfigure[proofs][height=0.5\paperheight]}

% This is for the shaped paragraphs
\getshapetext
\getshapetext

This is some text after the whole thing. Back to normal. Not much to see.

\stoptext

注意这里我们使用了两张 MetaFun 图片,并且内容从第一张延续到第二张。

带有 parshape 的图片

这张漂亮的画是我的朋友索菲亚画的。

答案2

有一种方法可以创建图像的 SVG 轮廓并将其转换为 MetaFun 指令,而无需手动调整各种数字。如果您有原始图像,那么您可以跳过后面的许多步骤,因为大概您可以获得没有背景的原始图像。否则,使用GIMPInkscape,创建大纲如下:

  1. 打开图像。
  2. 删除文本。
  3. 单击魔术棒图标(模糊选择工具)。
  4. 临界点半径比如 5 和 5。
  5. 使用工具粗略地选择背景(例如,按住Shift并单击背景部分): 选择
  6. 使用矩形或椭圆选择工具以及ShiftCtrl单击来编辑选择(不是很重要,我们会立即修复任何问题)。
  7. 按下Del删除选择以查看结果。 大纲
  8. 点击选择 >> 反转
  9. 或者,单击选择>>增长并将值设置为 2。
  10. 点击窗口 >> 可停靠对话框 >> 路径打开路径对话框。
  11. 点击选择>>到路径复制路径。
  12. 右键单击选择路径对话框中的轮廓。
  13. 点击导出路径
  14. 设置文件名(例如outline.svg)。
  15. 点击节省
  16. 关闭 GIMP。
  17. 打开 Inkscape。
  18. 打开 SVG 文件(例如outline.svg)。 Inkscape 轮廓
  19. 修复异常:
    1. 单击以选择轮廓。
    2. 按下F2可编辑节点。
    3. 单击并将鼠标拖拽到不需要的节点上。
    4. 按下Del可删除节点。
  20. 点击文件>>另存为
  21. 选择普通 SVG
  22. 确认替换。

此时,您将获得轮廓的 SVG 文件,但它无法干净地转换为 MetaPost。要解决此问题,请使用以下工具SVGOMG最小化并规范化路径坐标。您将得到类似以下内容的结果:

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 316 441"><path fill="none" stroke="#000" d="M125 119c-2.87 10.67-8.65 3.55-10.39-3-2.65-9.98 1.32-10.67 4.98-17.04L128.43 80c1.65-3.76 3.45-10.98 7.62-12.36 4.65-1.54 8.56 3.55 11.67 4.69H158c13.93.23 9.4-1.38 14.96-1.85H187c4.92-.74 6.72-4.21 10 1.52 3.69-1.53 7.93-5 11.95-2.96 4.39 2.22 4.56 6.81 5.55 10.96l2.6 9 2.1 11c.3 2.61 1.44 8.27 0 10.67-1.4 3.09-4.37.58-6.2-.67-1.6 4.17-3.15 9.17-3.91 13.58l-.7 5.43c-.56 1.75-1.72 3.47-2.74 4.99-3.86 5.78-5.73 7.59-12.65 6-.32 7.41 4.49 10.68 11 12.9 10.37 3.53 22.04 3.04 28.35 14.14l3.62 8.96c1.83 3.46 3.97 4.66 5.61 9l3.58 12c2.17 4.09 5.7 5.61 7.1 9.09 1.27 3.15-.12 5.61 1.47 10.91 1.73 5.75 9.96 22.75 14.17 26.54 1.91 1.72 3.5 1.61 4.54 2.52 2.77 2.42.46 10.03 4.32 11.39 2.58.91 5-4.05 8.2-5.28 2.44-.94 3.61.51 3.26 2.89-.47 3.2-4.32 7.98-5 10.51-1.78 6.71 5.65 11.73 9.37 15.8 2.57 2.82 4.23 8.91 5.77 12.63l3.78 8c1.98 5.36 4.76 20.16 4.86 26 .08 4.95 2.25 11.73-2.23 15.14-3.3 2.26-7.29 2.12-10.73 0-1.52-.72-3.36-2.72-5.24-2.4-2.15.38-3.91 3.83-6.84 4.44-2.72.57-4.91-1.55-7.96-1.7-2.65-.13-4.58 1.29-8 1.12l-21-5.06c-7.55-2.58-11.59-8.37-20-9.54l2.08 26 2.58 30-.58 7 .58 7-1.62 14 .69 8-1.69 10-1.78 8.01-7.26.99H109c-3.23-5.91-6.49-4.09-9.55-10.02-2.93-5.68-1.29-17.26 1.18-22.98 1.96-4.55 2.81-3.85 5.37-11-4.19 1.02-5.71 1.14-10 .58-4.66-.61-10.22.17-13.45-3.73-4.13-4.66-1.08-14.16 0-19.85 1.88-8.43 8.72-31.92 7.89-39-.26-2.23-1.56-4.9-2.44-7-2.48.75-4.79 1.3-7 2.72-10.25 6.63-16.25 21.51-16.91 33.28-.25 4.49.38 7.29 3.02 10.99 3.24 4.54 8.78 8.42 7.49 14.91-.77 3.83-5.2 5.27-8.6 4.17-4.6-1.49-9.78-7.83-11.86-12.07l-3.86-8.95c-1.85-2.65-6.55-5.67-9.28-8.05l-.55 11 3.43 16.71L41 395c1.76 3.37 3.17 6.94 5.53 9.96 2.29 2.95 4.7 4.17 5.32 8.08.41 2.51.37 9.56-1.02 11.55-2.56 3.93-10.35 2.5-13.32 0L21.04 401l-4.12-8.83C13.82 387.35 5.39 381.06 0 379V163c.01-5.57 1.87-14.35 9.02-14.75 4.1-.23 6.62 2.58 9.26 3.84L37 159c2.34-6.65 9.1-2.14 13.24-9.18 1.5-2.6.17-5.07 0-7.82-.35-4.85 1.88-7.1 0-11-1.22-2.64-4.29-4.99-4.95-9-.37-2.28.76-7.64 4.17-5.83 1.69.89 2.2 4.19 4.76 6.6 2.94 2.75 12.34 2.45 15.56.93 7.18-3.4-.38-9.59-1.33-13.7-.78-3.33.77-6.03 3.22-4.83 1.48.72 2.85 3.32 3.96 4.63 1.47 1.74 3.98 3.4 4.76 5.41 1.58 4.08-2.18 8.33-2.3 12.79-.09 3.11 1.8 6.61 2.44 10l.61 9.32c.76 2.34 13.46 11.92 15.86 12.54 2.58.66 4.67-1.18 7-1.98 2.97-1.02 5.91-.87 9-.88 1.65-4.66 3.56-3.53 8-3 .88-4.61 1.33-6.47 6-8-1.53-1.65-5.41-4.87-5.38-7.11.06-4 5.41-5.17 8.07-8.11 2.19-2.43 2.53-5.73 3.31-8.78l-8-3zm-71.74-15.83c4.69-.55 3.29 3.71 1.48 4.66-1.91 1.01-5.02-.93-1.48-4.66zM45 343h-2c-.84 5.99-3.34 12.1-1 18 4.72-10.29 3.48-7.42 3-18zm-18 98c1.23-6.97 5.45-4.96 8 0h-8z"/></svg>

从那里:

  1. 运行rsvg-convert将 SVG 转换为 PDF

    rsvg-convert -f pdf -o outline.pdf outline.svg
    
  2. 运行pdftops将 PDF 转换为 PS

    pdftops outline.pdf outline.ps
    
  3. 运行pstoedit将 PostScript 转换为 MetaPost

    pstoedit outline.ps outline.mp
    

现在您可以关注mickep 的回答无需手动调整数字。也就是说,从中获取输出outline.mp并将draw命令分配给path p变量。例如:

draw (93.750000,241.500000)..controls (91.597702,233.496002) and (87.261703,238.835999)..(85.957001,243.750000)
..controls (83.968803,251.233994) and (86.949203,251.753998)..(89.691399,256.531006) 

变成:

path p;
p := (93.750000,241.500000)..controls (91.597702,233.496002) and (87.261703,238.835999)..(85.957001,243.750000)
..controls (83.968803,251.233994) and (86.949203,251.753998)..(89.691399,256.531006)

相关内容