将 ASCII 艺术图表转换/改编为 tikz 的策略?

将 ASCII 艺术图表转换/改编为 tikz 的策略?

尽管多年来我使用过 (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 艺术转换为劣质的 TiZ.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}

在此处输入图片描述

相关内容