国外大神的例子
这篇文章里我不过多地讨论艺术,我只想说LaTex是可以用来进行艺术创作的。对于现代艺术设计需要的技术LaTex是完全支持的。比如在TikZ例子网站,有168行代码画出的龙猫Totoro:
我们简单整理一下,艺术创作需要哪些基本的技术,我认为需要以下几点:任意曲线,任意颜色、填充,渐变色,组件复用。当然还有其他的技术,碍于篇幅,我只讲上面四种技术。
任意曲线
只要知道了曲线的方程,可以很精确地用Latex画出曲线。但是LaTex也支持插值技术,就是仅提供几个点,LaTex会用插值法计算出曲线方程,得到一根经过这些点地平滑曲线,这种技术叫做贝塞尔曲线Bézier curve。贝塞尔曲线有个重要概念就是控制点,控制点是曲线不经过的点,但是对曲线提供了一个特别大的“引力”。贝塞尔曲线的语法就是controls子句,下面我以一个例子讲讲贝塞尔曲线:
\documentclass[tikz,11pt]{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\coordinate (A) at (0,3);
\coordinate (B) at (6,3);
\draw [help lines, green] (0,0) grid (6,6);
\draw (0,0) .. controls (A) and (B) .. (6,6);
\draw [fill] (0,0) circle (2pt);
\draw [fill] (6,6) circle (2pt);
\draw (A) circle (2pt);
\draw (B) circle (2pt);
\end{tikzpicture}
\end{document}
效果如下:
任意颜色
LaTex定义颜色有两个命令,一个是直接从rgb创造的definecolor命令,另一个是改变现有颜色深浅的colorlet命令,下面我以粉红为例子,介绍这两个命令的使用:
\documentclass[tikz,11pt]{article}
\usepackage{tikz}
\usetikzlibrary{patterns}
\begin{document}
\definecolor{darkred}{rgb}{1,0.2,0.5}
\colorlet{bgcolor}{darkred!60}
\begin{tikzpicture}
\fill[bgcolor] (1,1) rectangle(3cm,2cm);
\end{tikzpicture}
\end{document}
最终获得了这样的粉红:
填充
填充需要用到tikz的库patterns。比如以下是一个填充砖块的例子(该例子来自TikZ官方文档):
\documentclass[tikz,11pt]{article}
\usepackage{tikz}
\usetikzlibrary{patterns}
\begin{document}
\begin{tikzpicture}
\def\mypath{(0,0) -- +(0,1) arc (180:0:1.5cm) -- +(0,-1)}
\fill [red] \mypath;
\pattern[pattern color=white,pattern=bricks] \mypath;
\end{tikzpicture}
\end{document}
效果如下:
渐变色
渐变色的使用,可以达到非常好的艺术效果,这也是手工绘图(油画、国画)很难实现的,油画或者绘画的渐变色与计算机绘图相比显得十分粗糙。计算机绘图,不管是PhotoShop还是CorelDraw都可以轻松实现精细的渐变色。Tikz的渐变色库是shadings,以下是一个渐变色的例子:
\documentclass[tikz,11pt]{article}
\usepackage{tikz}
\usetikzlibrary{shadings}
\begin{document}
\begin{tikzpicture}
\draw[top color=white,bottom color=black,middle color=red] (0,0) circle (2);
\end{tikzpicture}
\end{document}
效果如下:
你以为这就完了?下面给出一个不需要shadings库的光照效果:
\documentclass[tikz,11pt]{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\shade[ball color=white] (0,0) circle (2cm);
\shade[ball color=green] (5,0) circle (2cm);
\shade[ball color=black] (10,0) circle (2cm);
\end{tikzpicture}
\end{document}
效果是十分逼真的:
组件复用
组件复用,在前端技术里非常常见。就拿最热的vue.js来说,就大量使用了组件复用技术。组件复用的好处是节省代码量,有改动时,能做到一改全改。Tikz中复用组件使用tikzset命令,我举个例子就清楚了:
\documentclass[tikz,11pt]{article}
\usepackage{tikz}
\tikzset{
flower/.pic={
\draw [smooth](0,0) .. controls (0.1,0.9) ..(1,1) .. controls(0.9,0.1) .. (0,0);
\draw [smooth](0,0) .. controls (-0.1,0.9) ..(-1,1) .. controls(-0.9,0.1) .. (0,0);
\draw [smooth](0,0) .. controls (0.1,-0.9) ..(1,-1) .. controls(0.9,-0.1) .. (0,0);
\draw [smooth](0,0) .. controls (-0.1,-0.9) ..(-1,-1) .. controls(-0.9,-0.1) .. (0,0);
}
}
\begin{document}
\begin{tikzpicture}
\draw [help lines, green] (-1,-1) grid (6,6);
\pic at (1,1) {flower};
\pic at (3,1) {flower};
\pic at (5,1) {flower};
\end{tikzpicture}
\end{document}
我把四个贝塞尔曲线组成的图形定义为花,然后做成了组件,随后复用组件,花了三朵花,如图: