您使用 TikZ 的效率如何?

您使用 TikZ 的效率如何?

首先,我必须说我对 PGF/TikZ 的了解非常有限。我所做的大多数事情都是盲目复制粘贴我在互联网上找到的示例,并经过大量的反复试验和谷歌搜索。

在花了 4 个小时绘制下面的简单图表(以及在之前的图表上花费的许多其他时间)之后,我不禁想知道经验丰富的 TikZ 用户需要多少时间来绘制它。如果我使用一些点击和拖动工具,它肯定会花费不到 30 分钟。

我知道 TikZ 的学习曲线相当陡峭,就像 LaTeX 本身以及 vi 编辑器、shell 脚本、sed、awk 等其他工具一样。你必须学习很多东西才能真正弄清楚事物的工作原理以及如何表达你想要的东西(就像学习一门编程语言一样),但这种牺牲以后会得到回报,因为你可以比使用常规的“友好”工具更快地完成任务。然而,我不太确定这是否适用于 TikZ,至少对于像计算机科学图表这样的简单内容来说是这样。

因此,我的问题是:学习和理解 PGF/TikZ 的所有原理和技术是否值得?作为专业的 TikZ 用户,您是否会比普通的点击和拖动用户更快地绘制出如下所示的简单图表?

在此处输入图片描述

图表链接:https://docs.google.com/open?id=0ByXEz0ubVg5rTGh3bFo3SW93c00

答案1

我看了一眼那张图表然后想到,“绝对地!使用 TikZ。”。然后我想尝试排版该图表并看看需要多长时间 - 我估计大约需要 1/4 小时才能得到相当接近的结果,然后可能还需要 10 分钟来调整到我想要的样子(假设我没有遇到任何隐藏的困难或任何有趣的行为 - 当我发现它时,这些会让我偏离主题)。

但后来我决定这不会有帮助。在我尝试这个网站的答案的“临时”目录中,我有 502 个 tex 文件,其中 306 个匹配usepackage{tikz}。所以我有点痴迷于 TikZ!所以像这样的简单图表真的不应该花我太多时间,否则我已经浪费了大量时间学习 TikZ。

相反,我要解释为什么我使用 TikZ 而不是 Inkscape 等图形软件包。我认为我的理由实际上是为什么我使用编程系统而不是图形系统,因此同样适用于 PSTricks 或其他类似系统。

  1. 精确我有点执着于把东西放在正确的位置,而不仅仅是看起来不错。如果 sMap没有完全对齐,您的图表看起来就不会那么精致 - 原因可能不明显,但看着它就会有一种不太正确的感觉。编程精度比拖放更容易。

  2. 重复 图表中有很多相同之处。许多部分具有相同的样式和布局。同样,编程比拖放更容易。我预计像 Inkscape 这样的程序有很多“将相同样式应用于所有这些”的快捷方式,但我也认为很容易遗漏一个方面,或者包含太多的一个方面。

  3. 变化我从来都不满意第一次的结果。我经常想改变一些小事情,直到我对它们感到满意为止。能够只改变一件事,而很多事情都取决于这一改变,这会让事情变得容易得多。因此,定义一个风格并且通过改变它或者将子图建立在特定坐标上,可以更轻松地改变事物,直到我满意为止。

  4. 重复我做过很多图表,但并不是很多,以至于我成了一名图形设计师。每次我制作新图表时,都会有一定程度的“我以前做过类似的事情,我是怎么做到的?”,然后进行剪切和粘贴。当我使用图形系统时,所有“我是怎么做到的?”信息都会丢失。我可以剪切和粘贴实际对象,但我很少想复制对象 - 我想要复制的是“我是如何获得特定效果的”。在编写图表时,所有这些都以易于复制的形式呈现。

对我来说,最后一个原因是 TikZ 非常适合我的工作流程。TeX 本身也是如此。时不时地,我会发现自己坐在 OpenOffice(或更糟)前面,想着“上次我是如何让页脚停留在底部的?现在它又浮在页面中间了!”。然后我必须记住菜单和选项的确切顺序才能做到这一点。使用 TeX,我会回顾发生这种情况的旧文档,找到\def\footerlocation{bottom},然后将其复制过来。这就是真实的为我节省了时间。

总之,如果你只需要绘制一张或少量图表,那么节省的时间/花费的时间可能不会交叉。但如果这是你经常做的事情,考虑花时间学习程序您的图表花的时间很值得。


由于这个问题如此受欢迎,我想我应该再补充一些。具体来说,是例子。不久前,我将使用 TikZ 为这个网站生成的所有图片上传到了 Picassa(至少,我认为它们都使用了 TikZ。当然,大多数图片都使用了 TikZ。)。您可以通过以下链接查看它们:https://plus.google.com/photos/110765980098077923527/albums/5659314316046158689?banner=pwa。一张特定的图片,它不存在,我认为这说明了 TikZ 之类的东西在哪里基本的如下:

戒指中的戒指

其他例子还有很多魔法森林

答案2

Andrew 列举了一些使用 TikZ 来制作此类图表和类似材料的很好的理由。我想反驳一下,使用其他工具有很多理由,例如Inkscape、Adobe Illustrator、在线协作工具(Lucidchart和其他)或大量插图/绘图软件包中的任何一个。

避免使用 TikZ 或类似的“图形编程”语言的主要原因是

  1. 精度/生产率权衡

    虽然元素的对齐、完全相同的尺寸和字体大小确实是每个设计师应该追求的目标,但最终往往并不那么重要。我做过相当多的 CAD,所以我喜欢一切都完美对齐,我的同事们经常无法区分一些“快速破解”和完美对齐的图形。正如你所说,快速版本需要 30 分钟,而精确版本可能需要几个小时。

  2. 互操作性

    除了 TeX 社区之外,没有人听说过 TiKZ。所以如果你想把你的图表给别人,而他们想修改任何东西,你就必须自己动手。另一方面也是如此:如果我发现一些不错的设计,我可以轻松地将其复制粘贴到图形软件中,如果是矢量格式,我也可以将其拆开、修改和玩弄。即使是 Andrew 在这里写得很好的例子,我也需要花几分钟才能读懂他是如何实现某些技巧的,更不用说自己使用它们了。

  3. 交互设计

    通常,我对“正确”的外观只有一个模糊的想法,我会在图表中推拉东西,修改线宽、曲线角度或尝试一些奇特的效果,最常用的组合键是 CTRL+Z,用于撤消上一个操作。如果您事先不知道它应该是什么样子,每次都要经历一个编译周期确实会大大减慢您的速度。

  4. 学习曲线

    这是很难承认的事情。我不喜欢阅读手册,几乎所有同事都从未查阅过任何手册。现在 TikZ 附带了一本写得很好的精美手册。不过,没有它,你在 TikZ 中什么也做不了。我最近开始在 Adob​​e Illustrator 中做一些小东西,我也花了一点时间才弄清楚基础知识,但我觉得用它相当有效率,我只需要查阅手册来了解更奇特的事情或使用内置的 Javascript 语言来自动执行某些任务。

TikZ 的一个非常宝贵的优势是:尝试使用任何其他软件来创建像您这样的图表,其中包含不断变化的数据集,即元素、标签和数字的灵活数量。这很痛苦,而且很难实现自动化。

答案3

现在是练习的时间了!

我在这里想要的是获得一些灵活性,因为这是一个大图,我认为缩放结果会非常有用。我想轻松调整尺寸并修改样式。

首先我们需要分析一下你的例子。我们可以看到七组节点。主节点是 Group。节点从左侧链接到右侧,我们可以看到三个灰色的包装器。

第一个节点很容易画

\node[main] (shuffle) {Group}; 

我将此节点命名为 (shuffle),并赋予其一个名为 main 的样式main/.style={draw,fill=yellow,inner sep=.5em}。我赋予其值.5eminner sep因为当我们改变字体大小时,它会更加美观。

现在最重要的节点组是 Reducer 和 Mapper。这些组的方法相同。首先,我们需要确定 (shuffle) 和 Reducer 之间的距离。我取的距离48 ex是 8cm,距离取决于字体的大小。

更新x=...我想缩放,所以我做了一些修改。如果我们使用和缩放图片 ,则可以使用(适合)y=...,但在这种情况下,我需要使用没有单位的值。我写的是 8,而不是 48 ex 等。

为了创建节点,我使用了相对坐标($(shuffle)+(8,0)$),并将节点命名为 R0、R1+ 和 R1-。上面 + 下面 - 很容易理解。

\node[R] at ($(shuffle)+(8,1)$)    (R1+) {Reduce};
\node[R] at ($(shuffle)+(8, 0)$)   (R0)  {Reduce};
\node[R] at ($(shuffle)+(8,-1)$)   (R1-) {Reduce};   

等等。

第一个组 S 更复杂,因为我们需要在节点内使用表格,我们需要正确放置这个表格。我还使用了相对坐标,并决定将组放置在组 M 之前的 9 ex。如您所见,节点对齐且宽度相同。我决定使用多部分节点。代码是重复的,所以我创建了一个宏\tabins

一些备注:我尝试获取相同的图表,因此我需要做出一些好的选择。为了正确放置我使用的表,[baseline=(Tab.base)每个表的名称始终相同,但此表内的对象与 $k_i$ 位于同一基线上。这里可以使用数组,因此我不会给出有关此宏的其他解释,因为代码内部与 TeX 相关,而不是与 TikZ 相关。重要的是样式S/.style={anchor=east}为什么这样?这是将所有节点向右对齐!

对于最后的节点,问题非常相似并且更加容易。

现在,我需要绘制包装纸,绘制包装纸的方法有很多种,但我不知道哪种方法最好(这是未来的问题)。我选择了一种简单的方法:

\begin{scope}[on background layer]
    \node[fill=lightgray!50,inner sep = 4mm,fit=(shuffle),label=above:Shuffle] {}; 
\end{scope} 

`fit' 的问题在于缩放图片。由于包装器使用了三次,因此可以创建一个宏。宏在另一张图片中很有用。

如何绘制边缘。使用 a 非常容易,因为它始终是相同的代码。重要的是要看到to`\foreach之间的区别-- and

完整代码:

% (S) -> (M) -> (V) -> (shuffle) -> (P) -> (R) - (F)
% S for Start F for Final
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{%
  calc,
  fit,
  shapes,
  backgrounds
}
% the next macro is useful to create a table
\newcommand\tabins[3]{%
 \tikz[baseline=(Tab.base)] 
           \node  [rectangle split, 
                   rectangle split parts=3, 
                   draw, 
                   align=right,
                   inner sep=.5em,
                   rectangle split horizontal] (Tab)
                           {\hbox to 4ex{#1}
           \nodepart{two}  {\hbox to 8ex{\hfill #2\$}}  
           \nodepart{three}{\hbox to 3ex{#3}}}; 
}

\begin{document}
\parindent=0pt
\begin{tikzpicture}[%
   %every node/.style={transform shape},% now it's not necessary but good for a poster
  x=1.25cm,y=2cm,  
  font=\footnotesize,
  % every group of nodes have a style except for main, the style is named by a letter
  main/.style={draw,fill=yellow,inner sep=.5em},
  R/.style={draw,fill=purple!40!blue!30,inner sep=.5em},
  M/.style={draw,fill=green!80!yellow,inner sep=.5em},
  S/.style={anchor=east},
  V/.style={anchor=west},
  P/.style={anchor=center},
  F/.style={anchor=west}
  ]

% main node the reference Shuffle 
\node[main] (shuffle) {Group};
%group R reducer
\node[R] at ($(shuffle)+(8,1)$)    (R1+) {Reduce};
\node[R] at ($(shuffle)+(8, 0)$)   (R0)  {Reduce};
\node[R] at ($(shuffle)+(8,-1)$)   (R1-) {Reduce};
% group M Mapper
\node[M] at ($(shuffle)+(-6,+2.5)$)   (M3+)  {Map};
\node[M] at ($(shuffle)+(-6,+ 1.5)$)  (M2+)  {Map};
\node[M] at ($(shuffle)+(-6,+ .5)$)   (M1+)  {Map};
\node[M] at ($(shuffle)+(-6,- .5)$)   (M1-)  {Map};
\node[M] at ($(shuffle)+(-6,- 1.5)$)  (M2-)  {Map};
\node[M] at ($(shuffle)+(-6,-2.5)$)   (M3-)  {Map};
% group S Start the first nodes
\node[S] at ($(M3+)+(-1.5,0)$)  (S3+) {\Big($k_1$,\tabins{4711}{59.90}{NY}\Big)};
\node[S] at ($(M2+)+(-1.5,0)$)  (S2+) {\Big($k_2$,\tabins{4713}{142.99}{CA}\Big)};
\node[S] at ($(M1+)+(-1.5,0)$)  (S1+) {\Big($k_3$,\tabins{4714}{72.00}{NY}\Big)}; 
\node[S] at ($(M1-)+(-1.5,0)$)  (S1-) {\Big($k_4$,\tabins{4715}{108.75}{NY}\Big)}; 
\node[S] at ($(M2-)+(-1.5,0)$)  (S2-) {\Big($k_5$,\tabins{4718}{19.89}{WA}\Big)};  
\node[S] at ($(M3-)+(-1.5,0)$)  (S3-) {\Big($k_6$,\tabins{4719}{36.60}{CA}\Big)};  
% group V  why not
\node[V] at ($(M3+)+(1.5,0)$)  (V3+) {\Big(NY,59.90\$\Big)};
\node[V] at ($(M2+)+(1.5,0)$)  (V2+) {\Big(CA,142.99\$\Big)};
\node[V] at ($(M1+)+(1.5,0)$)  (V1+) {\Big(NY,72.00\$\Big)}; 
\node[V] at ($(M1-)+(1.5,0)$)  (V1-) {\Big(NY,108.75\$\Big)}; 
\node[V] at ($(M2-)+(1.5,0)$)  (V2-) {\Big(WA,19.89\$\Big)};  
\node[V] at ($(M3-)+(1.5,0)$)  (V3-) {\Big(CA,36.60\$\Big)};   

\node[P] at ($(R1+)+(-4,0)$) (P1+) {\Big(CA,\big[142.99\$,36.60\$\big]\Big)};
\node[P] at ($(R0) +(-4,0)$) (P0)  {\Big(NY,\big[59.90\$,72.00\$,108.75\big]\Big)};
\node[P] at ($(R1-)+(-4,0)$) (P1-) {\Big(WA,\big[19.89\$\big]\Big)}; 

\node[F] (F1+) at ($(R1+)+(1.5,0)$) {(CA,89.80\$)};
\node[F] (F0)  at ($(R0) +(1.5,0)$) {(NY,80.22\$)}; 
\node[F] (F1-) at ($(R1-)+(1.5,0)$) {(WA,72.00\$)}; 

% wrappers
\begin{scope}[on background layer]
    \node[fill=lightgray!50,inner sep = 4mm,fit=(shuffle),label=above:Shuffle] {}; 
\end{scope} 
\begin{scope}[on background layer]
    \node[fill=lightgray!50,inner sep = 4mm,fit=(R1+)(R1-),label=above:Reducer] {}; 
\end{scope}  
\begin{scope}[on background layer]
    \node[fill=lightgray!50,inner sep = 4mm,fit=(M3+)(M3-),label=above:Mapper] {}; 
\end{scope}

%edges

\foreach \indice in {3+,2+,1+,1-,2-,3-} \draw[->] (S\indice.east) -- (M\indice.west); 
\foreach \indice in {3+,2+,1+,1-,2-,3-} \draw[->] (M\indice.east) -- (V\indice.west);
\foreach \indice in {3+,2+,1+,1-,2-,3-} \draw[->] (V\indice.east) to [out=0,in=180] (shuffle.west); 
\foreach \indice in {1+,0,1-} \draw[->] (shuffle.east) to [out=0,in=180] (P\indice.west);  
\foreach \indice in {1+,0,1-} \draw[->] (P\indice.east) -- (R\indice.west);
\foreach \indice in {1+,0,1-} \draw[->] (R\indice.east) -- (F\indice.west);   
\end{tikzpicture} 

\end{document}      

结论:花了 10 分钟编写代码并得到一些正确的东西,然后遇到了一些困难:表格中第一列的大小和位置存在问题,但这是 tex 的问题,而不是 tikz 的问题。另一个问题是关于包装器,因为我想得到一些对我的下一组图片有用的东西。另一个问题不是我的问题,而是初学者的问题,那就是理解为什么 (fit) 不适用于 scale(本网站上的一些答案解释了原因)。

在此处输入图片描述

答案4

我将以 PStricks 的长期用户的身份来回答。我要说的一切也适用于 TikZ,但 PStricks 的学习曲线比 TikZ 的学习曲线更长、更陡峭。(我做过一些 TikZ 的事情,但我已经了解 PStricks,虽然 TikZ 更好,但它并不足够的最好让我换一下。)

学习和理解 PGF/TikZ 的所有原理和技术对我有帮助吗?

可能不会。专注于坐标节点, 和路径你将能够绘制出许多有用的图画。

作为 TikZ 的专家用户,您是否会比普通的点击和拖动用户更快地绘制出如下所示的简单图表?

我不知道普通用户的速度有多快。但是,我“所见即所得”。我可能很快就能得到一个不错的图表,但当我必须得到图表时正确的,我需要能够对其进行编程。当我有一组经过多次修订的图表时,我真的受益于 TikZ 和 PStricks 的可编程性。

这里有一个更大的问题,那就是如何处理图表。以下是我所做的:

  • 如果我需要快速获得合适的图表,我会尝试画给我听。

  • 如果这不起作用,通常最快的解决方案是手写一些内容并使用扫描或拍照。

  • 如果要画得正确,我几乎总是会使用程序来画。通常是 PStricks,有时是 TikZ,有时是更专业的程序。

您可能会发现了解以下内容很有用ktikzqtikz,分别是用于 TikZ 图表的 KDE 和 QT 编辑器。也许它们兼具了两全其美的优势?

相关内容