我想在 LaTeX 中绘制下图。
图像是:
我查看了 TikZ 包,它似乎就是我需要的。但是,我需要以某种方式自动完成绘制此图表的任务,因为我需要绘制数百张图表。我想知道是否可以创建一个 LaTeX 命令(可能基于 TikZ),执行如下操作:
\QOC{{How wide?}, {Narrow, Wide}, {Screen compactness, Ease of hiting with a mouse}, 2, {1}, {2}}
对应于图中的第一张图。第一组包含问题,第二组包含选项,第三组包含标准,第一个数字(2
)表示所选选项,数字组{1}
表示对选项 1 的积极评价(即,对标准编号 ONE 有积极评价),第二组数字包含对第二个选项的积极评价,在本例中为2
,即第二个标准。
对于如何显示?的问题,命令将是:
\QOC{{How to display?}, {Permanent, Appearing}, {Low user effort, Screen compactness, Continuous feedback to user}, 2, {1,3}, {2}}
答案1
这是第一个。它使用trees
库。您将在 TiKZ 手册的“教程:约翰内斯的讲座地图”、“让树生长”和“树库”章节中找到有关 TiKZ 树的信息。请阅读它们(以及其他一些教程章节)以理解以下代码。这只是一个例子,每个节点、边、文本都可以更改。
另一个选择是Tikz-qtree。您也可以在这里搜索tree
,将获得超过 400 个问题及其答案。
\documentclass[border=3mm]{standalone}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lmodern}
\usepackage[english]{babel}
\usepackage{tikz}
\usetikzlibrary{trees}
\begin{document}
\begin{tikzpicture}[
grow=right,
growth parent anchor=east,
parent anchor=east,
child anchor=west,
level distance=2cm,
every node/.style={anchor=east,text width=2.5cm, align=left},
every child node/.style={anchor=west},
level 1/.style={nodes={text width=\widthof{O: Narrow}}}]
\node (Q1) {Q: How wide?}
child {node [draw] (O2) {O: Wide}
child {node[text width=3cm] (C2) {C: Ease of heating\\with the mouse}}}
child {node (O1) {O: Narrow}
child {node (C1) {C: Screen\\ compactness}}
};
\draw[dashed] (O1.east)--(C2.west) (O2.east)--(C1.west);
\end{tikzpicture}
\end{document}
答案2
我提供了一个基于 TikZ 的解决方案,只需调用以下命令即可自动执行创建过程:
\qoc{How wide?}{Wide,Narrow}{1}{Ease of hitting with a mouse,Screen compactness}{{1},{2}}{{2},{1}}
不幸的是,它的参数数量相当多;让我们检查一下:
- 第一个是起点;
- 第二个包含以下列表项目第二阶段(第一阶段显示在底部);
- 第三个命令允许你决定项目在第二阶段被选中并放入盒子中;
- 第四个包含以下列表项目在第三阶段(规则相同:第一个放在底部,最后一个放在顶部)
- 第五条命令用于创建正边(连续的线);规则如下:
{{1},{2}}
表示第二阶段的第一个模块与第三阶段的第一个模块相连;你可以列出它们,这样就{{2},{1,3}}
表示第二阶段的第二个模块与第三阶段的第一个和第三个模块相连; - 第六条命令与前一条命令非常相似,但它用于创建负边(带有虚线)。
我知道这看起来很奇怪,但是看看 MWE:
\documentclass{article}
\usepackage{etoolbox}
\usepackage{tikz}
\usetikzlibrary{positioning,calc}
\newcommand{\qoc}[6]{%
\begin{tikzpicture}[every node/.style={anchor=center, align=left},
thirdstage/.style={anchor=west,text width=4cm, align=left},rotate=-90]
% First stage
\node (X){Q: #1};
\foreach \z [count=\xi] in {#2} {\global\let\maxz\xi}
\foreach \w [count=\yi] in {#4} {\global\let\maxw\yi}
% Nodes definition second stage
\foreach \z [count=\xi] in {#2}
{%
\pgfmathtruncatemacro{\angle}{180/(\maxz+1)*\xi}
\ifnumequal{#3}{\xi}{
\node[rectangle,draw] (X\xi) at (\angle:2.5cm) {O: \z };
}{
\node (X\xi) at (\angle:2.5cm) {O: \z };
}
\path (X)edge(X\xi) ;
}%
% Nodes definition third stage
\foreach \w [count=\yi] in {#4}
{%
\pgfmathtruncatemacro{\angle}{180/(\maxw+1)*\yi}
\node[thirdstage,xshift=5cm] (XX\yi) at (\angle:2.5cm) {C: \w};
}%
% Positive connections (dashed)
\foreach \x [count=\xi] in {#5}
{%
\foreach \y in \x
\draw(X\xi)--(XX\y);
}
% Negative connections (dashed)
\foreach \x [count=\xi] in {#6}
{%
\foreach \y in \x
\draw[dashed](X\xi)--(XX\y);
}
\end{tikzpicture}
}
\begin{document}
\qoc{How wide?}{Wide,Narrow}{1}{ Ease of hitting with a mouse,Screen compactness}{{1},{2}}{{2},{1}}
\vspace*{2cm}
\qoc{How to display?}{Appearing,Permanent}{1}{Continuous feedback to users,Screen compactness,Low user effort}{{2},{3,1}}{{1,3},{2}}
\vspace*{2cm}
\qoc{How to display?}{Appearing,Permanent}{1}{Continuous feedback to users,Screen compactness,Low user effort,No user effort}{{2,4},{3,1}}{{1,3},{2,4}}
\end{document}
结果是:
您真正需要在文档中插入的部分与您在问题中提供的伪代码相差不大;此外,我的解决方案保证它在两个阶段都适用于可变数量的项目(我认为不是太大)。