如何显示非常大的证明树(bussproofs、ebproofs、tikz 的树库)

如何显示非常大的证明树(bussproofs、ebproofs、tikz 的树库)

我正在寻找不同的排版校样树选项。我问过一个更一般问题并遇到一些问题。特别是,我试图了解如何显示非常大的证明树,可能有数百个节点。我正在尝试不同的软件包组合bussproofsebproofs或 tikz 的库tree,以及standalonepreview

在某些情况下,除非我为边框参数设置一个较大的值,否则最终的校样树会被裁剪。问题(和疑问)是我不应该需要提前知道这样的值。我不明白为什么(似乎)对于其中一些组合我需要提前设置它。

让我展示一些例子。

bussproofs+ standalone。除非我不设置更大的第三(右)边框参数,否则输出将被裁剪。如果这可行,那么这将是我的小项目的最佳设置。所以主要问题是:我需要哪段代码让 pdf/latex 计算值以在足够大的 .pdf(.ps、.dvi)文件中显示给定的证明树?

\documentclass[border={10pt 50pt 50pt 50pt},varwidth]{standalone}
\usepackage{bussproofs}
\begin{document}
\begin{prooftree}
\AxiomC{A}
\UnaryInfC{B}
\AxiomC{C}
\BinaryInfC{D}
\AxiomC{E}
\AxiomC{F}
\BinaryInfC{G}
\UnaryInfC{H}
\BinaryInfC{J}
\AxiomC{A}
\UnaryInfC{B}
\AxiomC{C}
\BinaryInfC{D}
\AxiomC{E}
\AxiomC{F}
\BinaryInfC{G}
\UnaryInfC{H}
\BinaryInfC{J}
\BinaryInfC{JJ}
\AxiomC{A}
\UnaryInfC{B}
\AxiomC{C}
\BinaryInfC{D}
\AxiomC{E}
\AxiomC{F}
\BinaryInfC{G}
\UnaryInfC{H}
\BinaryInfC{J}
\AxiomC{A}
\UnaryInfC{B}
\AxiomC{C}
\BinaryInfC{D}
\AxiomC{E}
\AxiomC{F}
\BinaryInfC{G}
\UnaryInfC{H}
\BinaryInfC{J}
\BinaryInfC{JJ}
\BinaryInfC{JJJ}
% for a larger proof tree
% repeat all node as above, 
% and add a further line:  \BinaryInfC{JJJJ}
\end{prooftree}
\end{document}

bussproofs+ preview。输出被裁剪,除非我不增加第三个(右)边框参数:

\documentclass[14pt]{article}
\usepackage{bussproofs}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{prooftree}
\renewcommand\PreviewBbAdjust{-10pt -10pt 50pt 10pt}
\begin{document}
\begin{prooftree}
   AS ABOVE, CUT AND PASTE FROM ABOVE
\end{prooftree}
\end{document}

ebproofs+ standalone。输出将被裁剪,除非我不将第三个(右)边框参数从 10 增加到 100:

\documentclass[border={10pt 10pt 10pt, 10pt},varwidth]{standalone}
\usepackage{ebproof}
\begin{document}
\begin{prooftree}
      AS BELOW, CUT AND PASTE FROM BELOW
\end{prooftree}
\end{document}

ebproofs+ preview输出很好!此设置有效。我的问题是:为什么会这样?

\documentclass[14pt]{article}
\usepackage{ebproof}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{prooftree}
\renewcommand\PreviewBbAdjust{-10pt -10pt 10pt 10pt}
\begin{document}
\begin{prooftree}
\hypo{ &\vdash A, B, C }
\infer1{ A &\vdash B, C }
\hypo{ D &\vdash E }
\infer2{ A, B, D &\vdash C, E }
\infer1{ A &\vdash B, C, D, E }
\hypo{ D &\vdash E }
\infer2{ A, B, D &\vdash C, E }
\hypo{ D &\vdash E  }
\infer2{ A, B, D &\vdash C, E }
\hypo{ D &\vdash E  }
\infer2{ A, B, D &\vdash C, E }
\hypo{ D &\vdash E  }
\infer2{ A, B, D &\vdash C, E }
\hypo{ D &\vdash E  }
\infer2{ A, B, D &\vdash C, E }
\hypo{ D &\vdash E  }
\infer2{ A, B, D &\vdash C, E }
\hypo{ D &\vdash E, 002 }
\infer2{ A, B, D &\vdash C, E, 002 }
\end{prooftree}
\end{document}

tikz+ preview。输出很好!但我不知道是否有办法使用 tikz 的树库来定义证明树,如bussproofs/中所示ebproofs(我怀疑这是可能的,但需要做相当多的工作)

\documentclass{article}
\usepackage{tikz}
\usepackage[active,tightpage]{preview}
\PreviewEnvironment{tikzpicture}
\usetikzlibrary{trees}
\begin{document}
\begin{tikzpicture}
    \node {root}
    [edge from parent fork down]
    child {node {left}}
    child {node {right}
        child[child anchor=north east] {node {AAA}}
        child {node {BBB}}
        [edge from parent fork down]
        child {node {BB0}}
        child {node {BB1}}
        [edge from parent fork down]
        child {node {BB0}}
        child {node {BB2}}
        [edge from parent fork down]
        child {node {BB0}}
        child {node {BB3}}
        %%%     REPEAT SEVERAL TIMES
        %%% [edge from parent fork down]
        %%%   child {node {BB0}}
        %%%   child {node {BBN}}
};
\end{tikzpicture}
\end{document}

- - 编辑

我收到了 Emmanuel Beffara 的一条评论,他是 的程序员ebproofs。我经他的许可在这里粘贴。

> [...] 关于 bussproofs+preview 失败的事实,显然是因为 bussproofs 中的 prooftree 环境以当前页面宽度在垂直模式下产生其结果,因此边界框计算失败。您可以按如下方式编写您的示例:

  \documentclass[12pt]{article}
  \usepackage{bussproofs}
  \usepackage[active,tightpage]{preview}
  \newenvironment{hproof}{}{\DisplayProof} % Just so we have an environment
  \PreviewEnvironment{hproof}
  \renewcommand\PreviewBbAdjust{-10pt -10pt 10pt 10pt}
  \begin{document}
  \begin{hproof}
    % Same contents as before
  \end{hproof}
  \end{document}

而且它确实有效。

至于如何使用 TikZ 树来渲染证明,我不知道在没有太多编码的情况下是否可行。起初我想使用 TikZ 来开发 ebproof,因为它允许在证明上绘图并以非常不同的风格进行渲染,但我从未找到如何在 TikZ 中执行所需的放置操作,特别是使用基于堆栈的语法,据我所知,这是指定复杂证明的唯一实用方法。

相关内容