使用宏绘制边图

使用宏绘制边图

我正在尝试在 TikZ 中绘制图形,但使用宏时它无法按预期工作。这是一个最小的例子:

\documentclass{minimal}
\usepackage{tikz}
\usetikzlibrary{graphs}
\usetikzlibrary{graphdrawing}
\usegdlibrary{layered}

\def\myedge#1#2{"#1" -> "#2"}
\begin{document}
% this works as expected
\begin{tikzpicture}
\graph[nodes={draw, circle}, layered layout, sibling distance=8mm, level distance=8mm] {
"a" -> "b";
"a" -> "c";
"b" -> "d";
"b" -> "e";
};
\end{tikzpicture}

% this doesn't work as expected
\begin{tikzpicture}
\graph[nodes={draw, circle}, layered layout, sibling distance=8mm, level distance=8mm] {
\myedge{a}{b};
\myedge{a}{c};
\myedge{b}{d};
\myedge{b}{e};
};
\end{tikzpicture}
\end{document}

在第二张图片中,我得到 0 条边和 4 个节点:"a" -> "b",,,,,"a" -> "c""b" -> "d"不是"b" -> "e"5 个节点和 4 条边。

输出:2 张图表

我怎样才能让它工作?

我实际上正在尝试以编程方式绘制图形(详细背景),因此\myedge宏将被更复杂的东西取代。我曾考虑直接使用 PGF 而不是使用 TikZ,但我在 pgf 手册中找不到任何相关示例。事实上,如果不是太难的话,我更喜欢基于 PGF 的解决方案。

编辑:根据我对这个问题得到的答案,我想我应该更清楚地说明我正在尝试做什么。

有一个文件graph.tex看起来像这样:

\myedge{a}{b}
\myedge{a}{c}
\myedge{b}{d}
\myedge{b}{e}

该文件由程序自动生成,我不想反复弄乱该程序的源代码,因此假设它graph.tex已修复。

我想\input graph.tex将 变成main.tex,并且我想控制 中边的格式main.tex。例如,如果我想将节点标签从abc等更改为Client aClient b、 等或Theorem \ref{a}Theorem \ref{b}等,那么我应该能够main.tex通过更改 的定义从内部进行更改\myedge

这基本上就是关注点分离:生成程序graph.tex不需要知道节点标签到底是什么。它只应该知道哪些实体链接到哪些其他实体。关于节点标签到底是什么的信息应该属于main.tex

答案1

我不会为 TikZ 烦恼graphgraphdrawing使用forest包更简单(至少对我来说)实现你的目标,解决方案适用于 pdfLaTeX、XeLaTeX 以及 LuaLateX 引擎。代码也更短:

\documentclass[margin=3.14159 mm]{standalone}
\usepackage{forest}
\forestset{
  myedge/.style={%
    for tree = {circle, draw, minimum size=1.1em, inner sep=0pt,
                l sep=8mm, s sep=8mm}
                }
        }
        
\begin{document}
    \begin{forest} myedge
[a  [c]
    [b  [d] [e]]
]
    \end{forest}
\end{document}

在此处输入图片描述

答案2

也许是这样的——直接来自书上

在此处输入图片描述

\documentclass{minimal}
\usepackage{tikz}
    \usetikzlibrary {graphs,quotes}
\usetikzlibrary {graphs,shapes.geometric}


\begin{document}

%\begin{tikzpicture}
    \tikz
    \graph [
    grow down, branch right, nodes={circle,draw,minimum size=2em}] {
        "" -> h [] -> {
            c [] -> {
                a [],
                e []
            },
            j []
        }
    };



\tikz [new set=my nodes] {
    \node [set=my nodes, circle, draw] at (1,1) {A};
    \node [set=my nodes, circle, draw] at (1.5,0) {B};
    \node [set=my nodes, circle, draw] at (1,-1) {C};
    \node (d) [circle, draw] at (3,0) {D};
    \graph { X [circle,draw]-> (my nodes) -> (d) };
}




\tikz \graph [simple,nodes={circle,draw}] {
% The larger tree, no special options in force
a -> {
    b -> {c,d},
    e -> {f,g},
    h
},
{ [edges=red] % Now highlight a part of the tree
    a -> e -> {f,g}
}
};
%\end{tikzpicture}
\end{document}

相关内容