🏠

tikzducks

Table of Contents

1. 简介

橡皮鸭可以用乳胶(latex)制成,但也能用 \LaTeX{} 制成吗?能!TikZducks 是一个 LaTeX 宏包,用于在 TikZ 图片中绘制橡皮鸭。本项目是“How can we draw a duck? 1”的延续。

没有 TeX 用户友好而乐于助人的社区,这个宏包就不会存在。向本宏包的所有用户和贡献者致以衷心的感谢!

本宏包仍在开发中,因此我很乐意听到你的反馈和改进建议。开发版源代码见 https://github.com/samcarter/tikzducks ,其中包含 issue 跟踪器。更稳定的版本可在 CTAN( https://ctan.org/pkg/tikzducks )找到,并作为 tikzducks 收录于 TeXLive 和 MikTeX。如果你需要其他帮助(不是 bug 报告/ 功能请求),我建议到 https://topanswers.xyz/tex 提问。

版权所有© samcarter。在 LaTeX Project Public License 1.3c 或更高版本( https://www.latex-project.org/lppl.txt )的条款下,允许复制、分发和 /或修改本软件。

文中展示的示例鸭均为虚构角色,如与真实鸭子或人物雷同,纯属巧合,无意侵犯任何版权。

2. 用法

基本用法相当简单。在 tikzpicture 内,可以这样画一只鸭子:

basic-duck.png

要定制这只基本鸭,宏包使用 pgf 键。几乎所有的部件都可以用 <形状名>=<颜色名> 来改变颜色。例如,改变鸭子的颜色:

blue-duck.png

如果关键字由多个单词组成,带空格与不带空格均可。下文通常给出不带空格的写法。

除了本宏包定义的键,所有常用的 TikZ 和 pgf 键也都可以使用。例如,如果要缩放或平移鸭子:

scaled-duck-and-the-ugly-duckling.png

为了让熟悉 TikZ 的用户用起来更顺手,Andrew Stacey 贡献了一个 TikZ 库,可用 \usetikzlibrary{ducks} 加载。除了 TikZducks 宏包的常规功能外,鸭子现在还可以作为 pic 使用。一个简短的例子:

\tcbset{width=15cm,
  righthand width=8cm, 
  lower separated=false}
\begin{tcblisting}{title={TikZ 里用 ducks }}
  \begin{tikzpicture}[
      duck/.pic={\duck}, 
      duck/.search also={,/tikz,/pgf}]
    \draw (0,0) pic[duck/water=blue, duck/alien] {duck};
    \draw (4,0) pic[scale=1.4] {duck};
  \end{tikzpicture}
\end{tcblisting}

tikz-library-ducks.png

为所有患恐鸭症(anatidaephobia)的人着想,还有一个不画鸭子的选项:

\tcbset{lower separated=true}
\begin{tcblisting}{title={隐形鸭}}
  \duck[
    invisible
  ]
\end{tcblisting}

invisible-duck.png

这也可用于复用 2.4 节中介绍的一些配饰。

对于纯粹主义者,还有一个 picture 模式的版本:

picture-mode-duck.png

2.1. 2.1 身体部件

鸭子的各个部件也可以分别着色,即身体、头和喙:

crazy-colour-duck.png

此外,使用关键字 grumpy 、 laughing 或 parrot 可以改变喙的形状:

grumpy-duck.png

laughing-duck.png

parrot-duck.png

2.2. 2.2 发型

有些鸭子也喜欢漂亮的发型,宏包提供若干不同的发型:

long-hair-duck.png

short-hair-duck.png

parting-hair-duck.png

crazy-hair-duck.png

receding-hair-duck.png

mohican-duck.png

mullet-duck.png

当然,每种发型的颜色也可以调整:

coloured-hair-duck.png

眉毛和胡子也是宏包的一部分。它们选颜色更棘手——如果显式指定了颜色(eyebrow=<颜色名> 或 beard=<颜色名>),当然就用这个颜色;但如果没有给出颜色,它会先回退到发色,只有在鸭子没有任何头发时,才应用默认颜色。2

eye-brow-duck.png

beard-duck.png

请注意,下文展示的并非所有配饰(尤其是帽子)都适合每种发型。如果想要的发型与帽子组合效果不佳,你随时可以在 tikzducks 源代码中查找该帽子的原始定义,并以更合适的位置或尺寸重新创建它。

2.3. 2.3 服装

一只体面的鸭子需要合适的衣橱。它可以从若干不同的服装中选择。在它无限的衣橱里,这些单品可用当前颜色模型中可定义的所有颜色。

tshirt-duck.png

jacket-duck.png

tie-duck.png

bowtie-duck.png

ao-dai-duck.png

cape-duck.png

要了解更多定制服装的方法,也请看看第 5 节的足球鸭。

2.4. 2.4 配饰

鸭子可能需要的东西五花八门。下面所有例子在不指定颜色时也都能用,但每个都给出带颜色和不带颜色两个版本会让这个概览冗长得没必要,所以只给一个。

swimming-duck.png

alien-duck.png

hat-duck.png

tophat-duck.png

strawhat-duck.png

basecap-duck.png

conical-hat-duck.png

santa-duck.png

graduate-duck.png

beret-duck.png

peaked-cap-duck.png

harlequin-duck.png

sailor-duck.png

bobble-hat-duck.png

crown-duck.png

knight-duck.png

viking-duck.png

devil-duck.png

unicorn-duck.png

bunny-duck.png

dinner-jacket-duck.png

book-duck.png

cricket-duck.png

football-duck.png

chef-duck.png

cake-duck.png

pizza-duck.png

baguette-duck.png

cheese-duck.png

milkshake-duck.png

wine-duck.png

cocktail-duck.png

banana-duck.png

stick-duck.png

basket-duck.png

easter-duck.png

wing-duck.png

doctor-duck.png

neckerchief-duck.png

winter-duck.png

snow-duck.png

shovelling-duck.png

pickaxe-duck.png

sweeping-duck.png

umbrella-duck.png

3. 3 随机鸭

有了这么多可用的配饰,可能很难决定选哪个,但别担心——TikZducks 为这个两难问题提供了解决方案:随机鸭,简称 \randuck,它会自动创建一只随机配饰、头顶随机(头发、帽子、耳朵、外星触角……)的鸭子。

random-duck.png

如果鸭子不应完全随机,而只想要其中一些随机元素,可以用 randomhead 和 randomaccessories 选项分别独立获取随机头部装饰和随机配饰。

random-head-gear-and-accessories.png

4. 4 进一步定制

本宏包永远无法做到每个潜在用户想做的一切,因为这个数量很快就会趋近∞——但由于鸭子只是 tikzpicture 里的东西,TikZ 宏包的所有重型武器都可用于进一步定制。

adding-things-to-the-duck.png

monochrome-duck.png

为方便起见,本宏包中较复杂的路径存储在宏中,可以轻松复用:

redraw-parts.png

具体来说,以下路径可用:

\duckpathbody、\duckpathgrumpybill、\duckpathbill、\duckpathtshirt、 \duckpathjacket、\duckpathcape、\duckpathshorthair、\duckpathlonghair、 \duckpathcrazyhair、\duckpathrecedinghair、\duckpathcrown、 \duckpathmohican、\duckpathmullet、\duckpathqueencrown、 \duckpathkingcrown、\duckpathdarthvader、\duckpathhorsetail、 \duckpathtowel

如果需要其他形状,请查看宏包源代码,见 tikzducks.sty。

为方便放置更多配饰,鸭子的一些特定位置用 TikZ 坐标标出,即翅膀、头、喙和尾巴。

coordinates.png

为了区分同一 tikzpicture 中多只鸭子的坐标,可以用 name 选项给鸭子命名。如果用了这个选项,坐标会加上相应的名字和连字符前缀:<名字>-<坐标>。

named-coordinates.png

有时可能需要在特定 z 位置添加东西,例如重绘一件带图案的 T 恤,让它位于鸭子的头发和配饰之下。为此 TikZducks 提供了几个钩子:

  • \NewHook{tikzducks/background}
  • \NewHook{tikzducks/body}
  • \NewHook{tikzducks/clothing}
  • \NewHook{tikzducks/hair}
  • \NewHook{tikzducks/hat}
  • \NewHook{tikzducks/foreground}

用户可以按需使用这些钩子:

hooks.png

5. 5 足球鸭——由 Carla Maggi 贡献

TikZducks 是狂热的体育迷!它们自己会做很多不同的运动(见配饰中的所有运动器材),但为了给喜爱的球队加油,它们需要合适的球迷服装。在 The Duck Pond 中,Carla Maggi 慷慨地贡献了给鸭子穿上球队颜色服装所需的代码。

一项(非代表性)调查3表明,大多数运动球衣都可以通过绘制各种颜色、尺寸和方向的条纹来模仿——这正是 stripes 宏所做的:在鸭子夹克的形状上绘制条纹。为了保留这个强大宏的全部灵活性,它被作为独立命令集成到 TikZducks 宏包中,这意味着它可以简单地用在已绘制好的鸭子之上:

stripes-macro.png

这可能不实用,因为条纹会画在鸭子可能有的任何配饰或头发之上。因此 stripes 选项让你注入通常用来绘制条纹的任何代码,位置在鸭子服装之上、头发和配饰之下:

using-stripes-for-tikzducks.png

并非所有球队都穿竖条纹球衣,因此可以调整许多参数,以最好地模仿你喜爱的球队球衣。可用选项:

  • color:条纹颜色,默认:black
  • distance:条纹周期长度,默认:0.3
  • width:条纹宽度,默认:0.15
  • height:条纹长度,默认:2.7
  • initialx:起点 x 坐标,默认:0.1
  • initialy:起点 y 坐标,默认:-0.3
  • rotate:旋转角度(度),默认:-10
  • emblem:添加标志等的可能,默认:空

请注意,条纹的颜色只影响条纹本身;要影响条纹之间空白处的颜色,请在条纹下方给鸭子穿上所需颜色的 T 恤或夹克。

stripes-options.png

对于更复杂或多彩的设计,条纹可以轻松地层层叠加:

multicoloured-stripes.png

几个例子,看看 stripes 的实际效果:

inter-duck.png

juve-duck.png

milan-duck.png

monchengladbach-duck.png

palmeiras-duck.png

cagliari-duck.png

sampdoria-duck.png

brescia-duck.png

6. 6 示例

要看更多用 TikZducks 能做什么的例子,欢迎访问 https://github.com/samcarter/tikzducks。

如果你创作了一只愿意与社区分享的鸭子,我很乐意把它加入这个合集,只需提交 pull request 或在 bug 跟踪系统中开一个 issue。

Footnotes: