答案1
我认为这是一个复杂的问题,你需要大量的手动调整(如果你需要经常这样做,也许 Scribus 和 InDesign 是更好的工具)。你应该阅读有关parshape
TeX 的内容。使用 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 图片,并且内容从第一张延续到第二张。
这张漂亮的画是我的朋友索菲亚画的。
答案2
有一种方法可以创建图像的 SVG 轮廓并将其转换为 MetaFun 指令,而无需手动调整各种数字。如果您有原始图像,那么您可以跳过后面的许多步骤,因为大概您可以获得没有背景的原始图像。否则,使用GIMP和Inkscape,创建大纲如下:
- 打开图像。
- 删除文本。
- 单击魔术棒图标(模糊选择工具)。
- 放临界点和半径比如 5 和 5。
- 使用工具粗略地选择背景(例如,按住Shift并单击背景部分):
- 使用矩形或椭圆选择工具以及Shift或Ctrl单击来编辑选择(不是很重要,我们会立即修复任何问题)。
- 按下Del删除选择以查看结果。
- 点击选择 >> 反转。
- 或者,单击选择>>增长并将值设置为 2。
- 点击窗口 >> 可停靠对话框 >> 路径打开路径对话框。
- 点击选择>>到路径复制路径。
- 右键单击选择路径对话框中的轮廓。
- 点击导出路径。
- 设置文件名(例如
outline.svg
)。 - 点击节省。
- 关闭 GIMP。
- 打开 Inkscape。
- 打开 SVG 文件(例如
outline.svg
)。 - 修复异常:
- 单击以选择轮廓。
- 按下F2可编辑节点。
- 单击并将鼠标拖拽到不需要的节点上。
- 按下Del可删除节点。
- 点击文件>>另存为。
- 选择普通 SVG。
- 确认替换。
此时,您将获得轮廓的 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>
从那里:
运行
rsvg-convert
将 SVG 转换为 PDFrsvg-convert -f pdf -o outline.pdf outline.svg
运行
pdftops
将 PDF 转换为 PSpdftops outline.pdf outline.ps
运行
pstoedit
将 PostScript 转换为 MetaPostpstoedit 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)