我一直都在使用 bussproofs,但这里有一个我尚未解决的情况。我想以这样的方式排版以下内容,即右侧的“in [CATEGORY]”添加内容与 bussproofs 树的基线对齐。(当然,我不想只将文本放入“树”中,那样会违背目的。)理想情况下,文本还会右对齐。
此示例只是并排排列了两棵防总线树,但双线与无线条的差异使它们具有不同的高度。(而且,其他印刷因素可能会使情况恶化。)
有人能提供一些很酷的技巧吗?
\documentclass{article}
\usepackage{amsmath}
\usepackage{bussproofs}
\begin{document}
\begin{align*}
\AxiomC{$\mathsf{Forget}(A) \xrightarrow{f} Y$}
\doubleLine
\UnaryInfC{$A \xrightarrow{g} \nabla Y$}
\DisplayProof
\AxiomC{$\textrm{in \textbf{Set}}$}
\noLine
\UnaryInfC{$\textrm{in $D$-\textbf{Set}}$}
\DisplayProof
\end{align*}
\end{document}
答案1
这需要两次运行来测量位置
\documentclass{article}
\usepackage{amsmath}
\usepackage{bussproofs}
\makeatletter
\def\zz#1{\pdfsavepos\write\@auxout{\gdef\expandafter\string\csname ZZ#1\endcsname{\the\pdflastxpos sp}}}
\def\zzadjust#1#2{%
\expandafter\ifx\csname ZZ#1\endcsname\relax
\else
\kern\dimexpr\csname ZZ#2\endcsname-\csname ZZ#1\endcsname\relax
\fi}
\makeatother
\begin{document}
\begin{center}
\AxiomC{$\mathsf{Forget}(A) \xrightarrow{f} Y$\rlap{\zz{a}\zzadjust{a}{z}in \textbf{Set}}}
\doubleLine
\UnaryInfC{$A \xrightarrow{g} \nabla Y$\rlap{\zz{b}\zzadjust{b}{z}in $D$-\textbf{Set}}}
\DisplayProof\zz{z}
\end{center}
\end{document}
答案2
这是可行的,但需要一些低级技巧。
\documentclass{article}
\usepackage{amsmath}
\usepackage{bussproofs}
\begin{document}
\[
\AxiomC{$\mathsf{Forget}(A) \xrightarrow{f} Y$}
\doubleLine
\UnaryInfC{$A \xrightarrow{g} \nabla Y$}
\sbox{0}{\DisplayProof}
\usebox{0}
\vcenter to \dimexpr\ht0+\dp0{
\hbox{$\textrm{in \textbf{Set}}\vphantom{\xrightarrow{f}}$}
\vfill
\hbox{$\textrm{in $D$-\textbf{Set}}$}
}
\]
\end{document}