尽管多年来我使用过 (La)TeX,但我从未使用 tikz 制作过图表。对我来说,一直是 LO Draw、Inkscape 或 LO Calc / MS Excel 图表。
现在,我正在将一份文本+ASCII 艺术技术报告转换为 LaTeX。这带来了一些挑战,但我关心的是艺术作品。这一次,与以前不同,我打算使用 tikz 来重现 ASCII 艺术。
什么样的艺术?本质上,是 3D 实体的 2D 投影图。有像素、矩形、圆形、相交线、星号填充区域、一些轴插图、一些用于绘制元素的文本标签。没有超大的图表。所以,总的来说,没有什么特别花哨的东西。例如:
Y
^ | /
| | /
| | /
| +----|/--+--------+
| |####*###| |
| |###/|###| |
| |##/#|###| |
| +-/--|---+--------+
| / |
| / |
| / |
------------------> X
我的问题是:作为 tikz 新手,我需要遵循哪些步骤才能快速且轻松地完成此转换?或者 - 也许这不是一个好主意,我最好使用图表应用程序,然后导出?
当然,我宁愿不必遵循显而易见的路径,即首先获得大量的 tikz 经验和技能,然后“仅仅”用 tikz 重新绘制图表。
答案1
这里有一些简单的步骤可以帮助您继续前进。
建议:注释掉多行,编译并观察变化。
Latex 结构启动 Tikz
\documentclass[10pt,border=3mm,tikz]{standalone}
\begin{document}
\begin{tikzpicture}
.... your Tikz code here
\end{tikzpicture}
\end{document}
standalone
很不错,这样您在开发过程中就不必关心尺寸了。您可以像往常一样tikz
从选项中删除并替换\usepackage{tikz}
。节目从tikzpicture
环境开始。
pgf-手册,在线版本
查找https://tikz.dev/,或者通过 ctan 获取 pdf 版本。
我在代码中的注释引用了本手册中的一些相关部分。尝试比阅读更容易......
代码
\documentclass[10pt,border=3mm,tikz]{standalone}
\begin{document}
\begin{tikzpicture}
% ~~~ draw x- and y-axis # https://tikz.dev/tutorial#sec-2.3 ~~~~~
% # https://tikz.dev/tutorial#sec-2.17
\draw[<->] (4,0) -- (0,0) -- (0,5);
% ~~~ putting x-y-labels via nodes # https://tikz.dev/tikz-shapes#sec-17.2 ~~~~~~
% # https://tikz.dev/tutorial#sec-2.21
\node at (4.3,0) {x};
\node at (0 , 5.3) {y};
% ~~~ drawing the two lines ~~~~~~~~~~
% using cartesian coordinates
\draw[red] (2 ,0) -- (2,5);
\draw[purple] (.5,0) -- (3,5);
% ~~~ putting those rectangles, closed and open ~~~~~~~~~
% # https://tikz.dev/tikz-paths#sec-14.1
\draw[fill=gray] (1,2) -- (1,4) -- (3,4) -- (3,2) -- cycle;
\draw (3,4) -- (4,4) -- (4,2) -- (3,2);
\end{tikzpicture}
\end{document}
结果
一些评论
从学习的角度来看,最好把红线和紫线放在第一位,因为我认为这些陈述很容易理解。
然而,正如您所看到的,它们应该在矩形显示之后再绘制。
封闭的用于-- cycle
封闭路径,因此您可以用某种颜色填充它。第二个只是一个左侧缺失的矩形结构...因此您无法填充它,除非您放置一个-- cycle
语句。
从 ASCII 到 Tikz 的策略
我建议:
- 首先获得一套基本的 Tikz 技能,如上面的技能
- 其次,在 ASCII 艺术中发现这样的图形结构,比如矩形等。
- 第三,选择并尝试
Tikz
你在手册中看到的想法,或者例如在这里,即边学边做
请记住,它仍然有效:
- 蒂亚姆托特迪
- 总是有不止一种方法可以做到
答案2
以下内容其实不必太当真,但我觉得很有趣,值得发布。(是的,我觉得用它pxpic
定义 Ti 的前端很有趣。钾Z)
我们可以简单地定义一个转换器,自动将精美的 ASCII 艺术转换为劣质的 Ti钾Z.YMMV!
\begin{filecontents}[overwrite]{aa2px.sty}
\ProvidesPackage{aa2px}
\RequirePackage{pxpic}
\RequirePackage{expkv-def}
\RequirePackage{tikz}
\ekvsetdef\aaTpxsetup{aa2px}
\ekvdefinekeys{aa2px}
{
store lines = \aaTpx@color@lines
,initial lines = black
,store fills = \aaTpx@color@fills
,initial fills = black
% knowing pxpic uses expkv as well, this will forward all unknown keys:
,unknown redirect = pxpic
}
%\protected\def\aaTpx@letactive#1%
%{%
%\catcode`#1=13
%\begingroup\lccode`\~=`#1\lowercase{\endgroup\let~}= %
%}
\protected\def\aaTpx@init@ccregime
{%
\catcode`\ =12
}
\protected\def\aaTpx@init
{%
\aaTpx@init@ccregime
\aaTpx@init@symbols
}
\newcommand\aaTpx@init@symbols{}
\protected\def\aaTpx@new@symbol#1%
{\expandafter\aaTpx@new@symbol@\csname aaTpx@symbol@#1\endcsname}
\protected\def\aaTpx@new@symbol@#1#2%
{%
\newsavebox#1%
\edef\aaTpx@init@symbols
{\unexpanded\expandafter{\aaTpx@init@symbols\aaTpx@set@symbol#1{#2}}}%
}
\protected\def\aaTpx@set@symbol#1#2%
{%
\sbox#1%
{%
\begin{tikzpicture}[x=.5\pxpicWD,y=.5\pxpicHT]
\path[use as bounding box] (-1, -1) rectangle (1, 1);
#2%
\end{tikzpicture}%
}%
}
\aaTpx@new@symbol{ }{}
\aaTpx@new@symbol{|}{\draw[\aaTpx@color@lines](0,1)--(0,-1);}
\aaTpx@new@symbol{-}{\draw[\aaTpx@color@lines](1,0)--(-1,0);}
\aaTpx@new@symbol{/}{\draw[\aaTpx@color@lines](-1,-1)--(1,1);}
\aaTpx@new@symbol{\@backslashchar}{\draw[\aaTpx@color@lines](1,-1)--(-1,1);}
\aaTpx@new@symbol{+}{\draw[\aaTpx@color@lines](0,1)--(0,-1)(1,0)--(-1,0);}
\aaTpx@new@symbol{*}
{%
\draw[\aaTpx@color@lines]%
(0,1)--(0,-1)(1,0)--(-1,0)(-1,-1)--(1,1)(1,-1)--(-1,1);%
}
\aaTpx@new@symbol{x}{\draw[\aaTpx@color@lines](-1,-1)--(1,1)(-1,-1)--(1,1);}
\aaTpx@new@symbol{\detokenize{#}}{\fill[\aaTpx@color@fills](-1,-1)rectangle(1,1);}
\aaTpx@new@symbol{^}{\fill[\aaTpx@color@lines](0,0)--(-1,-1)--(1,-1)--cycle;}
\aaTpx@new@symbol{>}{\fill[\aaTpx@color@lines](0,0)--(-1,1)--(-1,-1)--cycle;}
\aaTpx@new@symbol{v}{\fill[\aaTpx@color@lines](0,0)--(-1,1)--(1,1)--cycle;}
\aaTpx@new@symbol{<}{\fill[\aaTpx@color@lines](0,0)--(1,1)--(1,-1)--cycle;}
\def\aaTpx@symbol#1{\unhcopy\csname aaTpx@symbol@\detokenize{#1}\endcsname}
\def\aaTpx@hover#1{\rule\z@\pxpicHT\smash{\makebox[\pxpicWD][c]{#1}}}
\pxpicnewmode{aa2px}
{%
\@ifundefined{aaTpx@symbol@\detokenize{#1}}%
\aaTpx@hover
\aaTpx@symbol
{#1}%
}
\newcommand\aaTpx[1][]
{%
\begingroup
\aaTpxsetup{#1}%
\aaTpx@init
\aaTpx@collect
}
\newcommand\aaTpx@collect[1]
{%
\pxpic[mode=aa2px,lines=space]{#1}%
\endgroup
}
\end{filecontents}
\documentclass[border=3.14]{standalone}
\usepackage{aa2px}
\begin{document}
\aaTpx[size=5pt, lines=green]{
Y
^ | /
| | /
| | /
| +----|/--+--------+
| |####*###| |
| |###/|###| |
| |##/#|###| |
| +-/--|---+--------+
| / |
| / |
| / |
+------------------>X
}
\end{document}