生成显示文档结构的图表

生成显示文档结构的图表

我看到有些文档开头会有一张图,图中显示了文档结构。该图显示了章节及其连接方式(这在论文中经常看到)。随机示例:

对于我的文档,我也计划包含这样的图表。现在我想知道它是否可以在 LaTeX 中生成,以便它自动更新等,这将使它的处理变得更加容易。

答案1

手动...您可以创建它们,例如通过这种方式:

  1. 逐个\usepackage{tikz}
  2. 相同的
  3. tikz或者table;你可能想检查 CTAN 上的表格或矩阵包

自动...我不确定。您可能考虑将目录转换为一些图形。虽然您可以在 tikz 中定义和使用变量,但我不知道您是否可以从目录中检索它们。

我想知道,如果这是个好主意,那么从技术上来说是否可行……它可能最终会成为一场宏观灾难,而不是节省时间。所以最好的办法可能是:

  • 你迟早会知道你的文档的主要结构是什么样的
  • 即使有变化,也很可能只是一些小变化
  • 最终版本无论如何都会很清楚

使用tikz我会这样做:

  • 放入\input{graph/flow}你的文档中
  • 不时维护和完善你的额外文件graph/flow
  • 根据需要,随着时间的推移,从粗略(\section)到精细(\subsection,等等)\subsubsection
  • 如果你想确保所有地方的标题一致,可以通过序言中的一些宏来定义它们

这是一些简单的代码。不幸的是,我无法在这里很好地将其作为代码表达出来,但你会明白的。章节和部分的编号当然可以通过某种方式检索,但这超出了我目前的范围 ;-)

代码

这就是它所产生的。 可能是什么样子

答案2

由于我设法想出了一种初步的工作方法,因此我想分享其结果(可能会进一步扩展和改进):

\documentclass{book}
\usepackage[utf8]{inputenc}

\usepackage{tikz}
\usetikzlibrary{positioning,matrix,fit,arrows.meta}

\usepackage{adjustbox}

% Use a sans serif font
\usepackage{helvet}
\renewcommand{\familydefault}{\sfdefault}

% To add the list of figures etc. to the table of contents
\usepackage{tocbibind}

% To have clickable links for TOC, references etc.
\usepackage{hyperref}
\hypersetup{colorlinks=true,linkcolor=blue,citecolor=blue,urlcolor=blue}

\usepackage{nameref}

\begin{document}
\frontmatter
\tableofcontents
\listoffigures

\mainmatter
\chapter{Introduction} \label{chap:introduction}

Test...

\section{Test}
Test...

\section{Structure}
Graphic of structure

\begin{figure}[h]
    \centering
    \begin{adjustbox}{max width=\textwidth}
        \begin{tikzpicture}
            \pgfdeclarelayer{background}                        % Declare a background layer
            \pgfdeclarelayer{chapter_background}                % Declare a layer for the chapter backgrounds
            \pgfsetlayers{background,chapter_background,main}   % Set the order of the layers (main is the standard layer)

            \tikzstyle{part_name} = [rectangle, align=left, text width=2.5cm]
            \tikzstyle{part} = [matrix, rectangle, inner sep=0.3cm, node distance=0.05, align=left, fill=black!05]
            \tikzstyle{part_background} = [rectangle, inner sep=0.2cm, node distance=0.05, align=left, fill=black!05]
            \tikzstyle{chapter} = [rectangle, rounded corners, inner sep=0.05cm, node distance=0.65cm and 0cm, align=center, text width=6cm, draw=black!70, fill=black!20]
            \tikzstyle{chapter_text} = [node distance=0.65cm and 0cm, align=center, text width=6cm]
            \tikzstyle{chapter_number} = [circle, inner sep=0, minimum width=0.8cm, node distance=0.65cm and 0cm, draw, fill=white]
            \tikzstyle{arrow} = [ultra thick, -Triangle]
            
            \newcommand{\drawchapter}[5]{
                \node[chapter_number#1] (#2) {#4};
                \node[chapter_text, right=of #2] (tx) {#5};
                \begin{pgfonlayer}{chapter_background}    % Select the chapter background layer
                    \node[chapter, fit=(#2)(tx), draw] (#3) {};
                \end{pgfonlayer}
            }

            \newcommand{\drawpartbox}[2]{
                \begin{pgfonlayer}{background}    % Select the background layer
                    \node[part_background, fit=#1] (#2) {};
                \end{pgfonlayer}
            }
            
            \drawchapter{}{n1}{c1}{\ref{chap:introduction}}{\nameref{chap:introduction}}
            \node[part_name, left=of n1] (part_intro) {Intro};
            \drawchapter{, below=of n1}{n2}{c2}{\ref{chap:next}}{\nameref{chap:next}}
            \drawchapter{, below=of n2}{n3}{c3}{\ref{chap:another}}{\nameref{chap:another}}
            \drawpartbox{(part_intro)(c1)(c2)(c3)}{p1}
            
            \drawchapter{, below=of n3}{n4}{c4}{...}{...}
            \node[part_name, left=of n4] (part_middle) {...};
            \drawchapter{, below=of n4}{n5}{c5}{...}{...}
            \drawpartbox{(part_middle)(c4)(c5)}{p2}
            
            \drawchapter{, below=of n5}{n6}{c6}{\ref{chap:conclusion_and_outlook}}{\nameref{chap:conclusion_and_outlook}}
            \node[part_name, left=of n6] (part_end) {...};
            \drawpartbox{(part_end)(c6)}{p3}

            \draw[arrow] (c1) -- (c2);
            \draw[arrow] (c2) -- (c3);
            \draw[arrow] (c3) -- (c4);
            \draw[arrow] (c4) -- (c5);
            \draw[arrow] (c5) -- (c6);

        \end{tikzpicture}
    \end{adjustbox}
    \caption{Structure of the document}
    \label{fig:structure}
\end{figure}

\chapter{Next chapter} \label{chap:next}
Test...

\chapter{Another chapter} \label{chap:another}
Test...

\chapter{Conclusion and Outlook} \label{chap:conclusion_and_outlook}

\end{document}

结果如下: 结果

相关内容