Я использую ebproof
пакет для создания деревьев вывода для правил вывода. Эти правила имеют посылки над суждением и побочные условия слева:
Для его создания я использую:
\begin{prooftree*}
\hypo{\Gamma \vdash \triple{P'}{S}{Q'}}
\infer[left label=
$\begin{array}{r}
Q' \geq 0 \\
P \geq P' \\
Q \leq Q'
\end{array}$]
1[\textsc{(While)}]
{ \Gamma \vdash \triple{P}{while $e$ do $S$}{Q} }
\end{prooftree*}
Однако у меня возникла проблема, когда боковые условия перекрываются окружающими элементами. Там, где есть один вывод, я могу просто поставить \vspace{...}
до и после prooftree, но там, где есть другой вывод (т. е. как часть большего дерева), это не работает ( \vspace{...}
игнорируется внутри среды prooftree).
(Код для генерации этого:)
\begin{prooftree}
\hypo{\Gamma \vdash \triple{P}{$S_1$}{Q_1}}
\hypo{\Gamma \vdash \triple{P}{$S_2$}{Q_2}}
\infer[left label={
$\begin{array}{r}
Q' \leq Q_1 \\
Q' \leq Q_2
\end{array}$}]
2[\textsc{(B-Cond)}]
{ \Gamma \vdash \triple{P}{if $e$ then $S_1$ else $S_2$}{Q} }
\infer
[left label={$
\begin{array}{r}
P \geq Q' \\
Q \leq Q'
\end{array}
$}]
1[\textsc{(B-Conseq)}]
{\Gamma \vdash \triple{P}{if $e$ then $S_1$ else $S_2$}{Q}}
\end{prooftree}
Есть ли чистый способ сделать так, чтобы у него было правильное количество места? Использование среды array
немного хакерское, но это был единственный способ, которым я мог добавить переносы строк в параметр left-label в \infer
. Или есть ли другие пакеты, которые предоставляют этот синтаксис более чистым способом?
Это не имеет отношения к проблеме, но если вы хотите в точности скопировать эти фрагменты кода в свой документ, вот определение \triple:\newcommand{\triple}[3]{ \{#1\}\ \texttt{#2}\ \{#3\}}
решение1
Я вижу две возможности.
\documentclass{article}
\usepackage{amsmath}
\usepackage{ebproof}
\newcommand{\triple}[3]{\{#1\}\ \texttt{#2}\ \{#3\}}
\newcommand{\bstrutb}{\smash[t]{\vphantom{\bigg|}}}
\newcommand{\bstrutt}{\smash[b]{\vphantom{\bigg|}}}
\newcommand{\bstrut}{\vphantom{\bigg|}}
\begin{document}
\section{Spacing the lines}
\begin{prooftree}
\hypo{\bstrutb \Gamma \vdash \triple{P}{$S_1$}{Q_1}}
\hypo{\Gamma \vdash \triple{P}{$S_2$}{Q_2}}
\infer[left label={
$\begin{array}{@{}r@{}}
Q' \leq Q_1 \\
Q' \leq Q_2
\end{array}$}]
2[\textsc{(B-Cond)}]
{\bstrut \Gamma \vdash \triple{P}{if $e$ then $S_1$ else $S_2$}{Q} }
\infer
[left label={
$\begin{array}{@{}r@{}}
P \geq Q' \\
Q \leq Q'
\end{array}$}]
1[\textsc{(B-Conseq)}]
{\bstrutt \Gamma \vdash \triple{P}{if $e$ then $S_1$ else $S_2$}{Q}}
\end{prooftree}
\section{Reducing the size, with some more space}
\begin{prooftree}
\hypo{\Gamma \vdash \triple{P}{$S_1$}{Q_1}}
\hypo{\Gamma \vdash \triple{P}{$S_2$}{Q_2}}
\infer[left label={
$\substack{
Q' \leq Q_1 \\
Q' \leq Q_2
}$}]
2[\textsc{(B-Cond)}]
{\vphantom{\Big|}\Gamma \vdash \triple{P}{if $e$ then $S_1$ else $S_2$}{Q} }
\infer
[left label={
$\substack{
P \geq Q' \\
Q \leq Q'
}$}]
1[\textsc{(B-Conseq)}]
{\Gamma \vdash \triple{P}{if $e$ then $S_1$ else $S_2$}{Q}}
\end{prooftree}
\end{document}
На самом деле, дополнительные места можно получить с помощью взлома.
С помощью \smash[t]{\vphantom{\bigg|}}
я вставляю нижнюю часть a \bigg|
(не печатая символ), потому что \smash[t]{...}
это позволяет не учитывать высоту символа. Это полезно для верхней строки, поэтому я называю это «нижней распоркой».
Аналогично с `\smash[b]{\vphantom{\bigg|}}, «верхняя распорка», полезная для нижней линии (глубины, то есть того, что находится ниже базовой линии), игнорируется.
Полная распорка полезна для средней линии: ни высота, ни глубина не игнорируются.
Во втором варианте используется более короткая стойка, но идея та же.