在 TikZ 中使用文本勾勒(填充)字形轮廓

在 TikZ 中使用文本勾勒(填充)字形轮廓

原始问题

在 TikZ 中,是否有任何自动或半自动的方法来追踪字母的最外层轮廓或整个路径?

我可以(例如通过使用定位节点)a使用a字母绘制字母,如下面我的 ascii-art 所示(同意,在这种情况下并不是真正的艺术):

   啊啊啊啊啊
  啊啊啊啊啊啊
 啊啊啊
            氨基酸
   啊啊啊啊啊啊
  啊啊啊啊啊啊啊
 啊啊啊啊
 啊啊啊啊啊啊啊啊
  啊啊啊啊啊啊啊

评论

马丁的注释让我确信了我已经怀疑的事情,即在 PGF/TikZ 中我无法跟踪任何字体中的任何字形。换句话说,以 TikZ 支持的格式获取字形轮廓是一个单独的问题,与 TeX 无关,但值得在此提及。

初步的

获取字形轮廓

让我总结一下已经提到的将其转换为 TikZ 的技术:

获取字形“填充”

这并不是我所问的问题,而是答案中提出的另一个有趣的想法:

  • 转变用于将字形导出为文本形式并sed进行清理(由杰克

修改后的问题

前面提到,追踪现在是初步过程的一部分,因为字形轮廓(可以是任何其他路径,但我将坚持这个特定的例子)被认为是已知的,所以问题应该重新表述。

TikZ 中有哪些技术可以用来用文本(比如一个字母)勾勒(填充)字形轮廓?

支持根据“密度”和路径内的“邻域”实现轮廓/填充样式的多样化(例如,在衬线、弯曲部分等情况下的样式改变将是一个很好的功能)。

我最感兴趣的是 TikZ,但如果您想分享非 TikZ 解决方案,请立即行动!

补充问题

如果您知道或刚刚想到了尚未描述的获取字形轮廓(或“填充”)的方法,并且您认为它很有趣或值得一提,请告诉我们。


后记,即关于我自己的一段话

也许我应该补充一点,我对 PGF/TikZ 还很陌生。尽管我已经使用 LaTeX 大约 8 年了(使用频率不一,所以我远非专家),但我从未真正接触过 TikZ。以前我使用过 PSTricks,但坦率地说,从那时起我就忘记了所有这些。几年前我看到了 TikZ 示例,并惊讶地发现 PGF/TikZ 可以为执行不同的绘图任务提供很好的抽象。最近我不得不接触 TikZ,同时我开始考虑以不太常见的方式使用它,即创建一些“艺术”绘图,而不是普通的图表、草图和它通常使用的任何内容。毫无疑问,PGF/TikZ 手册很棒,但您必须知道要查找什么,即使您知道,您的措辞可能与文档中使用的措辞不完全相同,这使得查找有时很困难(尤其是对于非英语母语人士,就像我的情况一样)。您可能会说:只需浏览它!当然,但 700 页左右已经够多了,所以你不太可能读懂出色地甚至在一个月内(如果我错了请纠正我)。抱歉,OT 段落太长了,但它应该可以澄清一些事情,因为我并不是不愿意自己查看手册,只是有时向专家请教更有成效,因为他们有手册中找不到的宝贵东西 -经验更好的直觉

答案1

更新 2012-04-10:有一个初步的方案TeX-SX 启动板tex网站。您需要在文件上运行pgflibraryshapes.letters.dtx以生成 TikZ/PGF 库。要生成字体文件本身,您需要x2svg.pe font(使用 fontforge)转换为 SVG 格式并将svgtopgf.pl font.svg prefix > <fontname>-<fontshape>-paths.texSVG 转换为 PDF 路径(prefix应为 格式letter@<fontname>@<fontshape>@)。请查看letter-shapes-test.tex示例。STIX 字体的正常和斜体形状已经转换。由于许可,它们被称为stikz


你想要这样的东西吗?

描摹字母

以下是源代码:

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{%
  svg.path,
  decorations.text,
}

\begin{document}

\begin{tikzpicture}[scale=.3]
\draw[decorate,decoration={text along path,text={AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA}}] svg "M707 0h-255v19c36 0 43 2 55 9c8 4 14 15 14 24c0 15 -7 42 -19 70l-41 94h-262l-46 -114c-5 -13 -9 -30 -9 -42c0 -31 22 -41 70 -41v-19h-199v19c58 6 67 27 126 167l206 488h20l246 -563c28 -65 42 -86 94 -92v-19zM447 257l-116 275l-115 -275h231z";
\draw[xshift=25cm,decorate,decoration={text along path,text={aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}}] svg "M442 66v-28c-30 -38 -56 -48 -90 -48c-37 0 -59 20 -64 73h-1c-53 -60 -102 -73 -145 -73c-62 0 -105 38 -105 104c0 52 31 91 70 117c30 20 67 39 180 81v54c0 62 -33 90 -78 90c-40 0 -70 -22 -70 -49c0 -18 6 -21 6 -42c0 -19 -20 -41 -46 -41c-21 0 -43 19 -43 46
c0 26 16 58 51 80c28 18 70 30 115 30c56 0 94 -16 118 -45s28 -50 28 -111v-191c0 -46 13 -66 31 -66c16 0 26 5 43 19zM287 127v141c-62 -22 -103 -43 -128 -66c-24 -22 -34 -46 -34 -77c0 -53 30 -77 69 -77c20 0 41 5 58 16c29 20 35 34 35 63z";
\end{tikzpicture}
\end{document}

制作这个的方法相当简单。我加载字体fontforge并将其导出为 SVG 字体。然后,字体以 SVG 路径的形式呈现给我。由于 TikZ 可以接受 SVG 格式,因此我可以将其剪切并粘贴到 TikZ 文档中。这可以事先完成,以便有一个已指定路径的文件。


编辑(2012-01-29):我曾想用相当随意的字母来做这件事,所以把它半自动化了。它还没有准备好投入生产,因为仍然需要一些零碎的东西才能让它真正可用,而无需额外的调整,但它处于可用阶段,如果你知道自己在做什么。

  1. 将字体转换为 SVG。您需要fontforge安装。然后,以下脚本(可执行)将调用 fontforge 并将命令行上指定的字体转换为 SVG 格式(输出保存在当前目录中)。例如,如果它保存为x2svg.pe(注意扩展名),则以 运行x2svg.pe /path/to/font/amazing-font.otf

    #! /usr/bin/fontforge -script
    
    Open($1)
    Generate($1:t:r + ".svg")
    
  2. 从生成的 XML 文件中提取字形路径。以下 Perl 脚本做得不错:它还应该修剪开头和结尾处的多余空格。此外,还可以使用更好的命名方案(我尝试过 unicode,但这样会造成混淆)。

    perl -MXML::Twig -e '
    $xml = XML::Twig->new(
    twig_handlers => {
    glyph => sub { $n = $_->{att}{"glyph-name"}; $n =~ s/_//g; print  %% "\\svgletter{" . $n  . "}{" . $_->{att}{d} . "}\n";}
    }
    );
    $xml->parsefile("amazing-font.svg");
    ' > amazing-font.letters.tex
    
  3. 然后在 TeX 文件中,我们只需要输入此文件并使用路径。以下是示例:

    \documentclass{article}
    \usepackage{tikz}
    \usetikzlibrary{svg.path}
    \newcommand\svgletter[2]{%
      \expandafter\def\csname svgglyph#1\endcsname{svg "#2"}
    }
    
    \input{TeXGyreSchola-Bold.letters}
    
    \def\STOP{stop}
    \def\NOTHING{}
    \def\empty{}
    \newcommand\outline[1]{%
    \outlinelet#1\STOP}
    
    \let\thisis\newpage
    
    \newcommand\vfillornewpage{%
      \ifx\thisis\vfill
      \let\thisis\newpage
      \else
      \let\thisis\vfill
      \fi
      \thisis}
    
    \newcommand\outlinelet[1]{%
      \let\next=\vfillornewpage
      \ifx#1\STOP
      \else
      \tikz[baseline=0pt] \draw[scale=0.09,ultra thick] \csname svgglyph#1\endcsname;
      \let\next=\outlinelet
      \fi
      \next}
    
    
    \begin{document}
    
    \outline{Outline}
    
    \end{document}
    

    结果:

    TikZ 中的轮廓字体

    显然,在实际使用路径时,人们可以更大胆一些。此外,最好有一种更系统的方式来获取正确的比例因子(也许测量“x”的高度)。不要指望字距调整!

答案2

由于您想用离散节点填充字母,因此实际上不需要轮廓的矢量形状:光栅就足够了。这里有一个一行脚本,它编译一个仅包含所需字母的 LaTeX 文档,使用 ImageMagick 将生成的 pdf 光栅化并以文本格式输出,最后使用命令清理它sed

pdflatex -jobname "letter" "\documentclass{standalone} \begin{document} a \end{document}" &&     convert -density 300 letter.pdf txt:- |     sed -e '1d' -e '/white/d' -e 's/:.*//' -e 's/,/ /g' > letter.txt;

letter.txt然后可以使用以下选项绘制生成的文件pgfplots(或者使用普通的 TikZ,但这需要一些循环)mark=text

\documentclass{article}

\usepackage{pgfplots}

\begin{document}
\raisebox{3mm}{\scalebox{24}{a}} %For comparison
\begin{tikzpicture}
\begin{axis}[y dir=reverse,
    only marks,
    width=7cm,
    axis equal,
    hide axis=true]
\addplot [mark=text,text mark=a] table {letter.txt};
\end{axis}
\end{tikzpicture}

\end{document}

使用乳胶的 ascii 艺术!

答案3

没有 TikZ,但有来自 texlive 的 pdf-trans.tex,但我不确定这个代码。这是我第一次尝试使用 pdf-trans

\documentclass[11pt]{article} 
\input pdf-trans
\font\f=qx-lmr10    at 60pt
\newbox\qbox

\def\outline#1{%
\setbox\qbox\hbox{\f #1}%
\boxgs{2 Tr 0.8 g}{}\copy\qbox
}%
\pagestyle{empty}
\parindent=0pt

\begin{document}

 \outline{Alter}

\end{document} 

在此处输入图片描述

答案4

我不知道 TikZ,但你可以pstricks使用以下方法获得轮廓Inkscape。输入文本,然后选择并复制到位图。您可以描摹位图(Inkscape 使用波特雷斯您可以使用 pstricks 宏在内部创建图形,然后将其导出到 Latex。

在此处输入图片描述


然后 pstricks 输出

在此处输入图片描述

相关内容