我正在寻找不同的排版校样树选项。我问过一个更一般问题并遇到一些问题。特别是,我试图了解如何显示非常大的证明树,可能有数百个节点。我正在尝试不同的软件包组合bussproofs
,ebproofs
或 tikz 的库tree
,以及standalone
或preview
在某些情况下,除非我为边框参数设置一个较大的值,否则最终的校样树会被裁剪。问题(和疑问)是我不应该需要提前知道这样的值。我不明白为什么(似乎)对于其中一些组合我需要提前设置它。
让我展示一些例子。
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 中执行所需的放置操作,特别是使用基于堆栈的语法,据我所知,这是指定复杂证明的唯一实用方法。