我想排版一段包含换行符的代码。新行应缩进到上一行的指定点。下面是一个等宽字体示例来说明我的意思。请注意下面“case”和“of”以及“let”和“in”的排列方式:
swap : forall a, b. Tuple a b -> Tuple b a
swap a b x = case x
of tuple a b y z. let x' = tuple b a z y
in x'
我想要排版的代码不是等宽的,所以我不能只使用逐字环境来获得我想要的。例如,第一行的实际 LaTeX 是
\mathsf{swap} : \forall\alpha,\beta.\;\mathsf{Tuple}\;\alpha\;\beta\to\mathsf{Tuple}\;\beta\;\alpha
如何将某些文本与上一行中的特定点对齐?
答案1
可以tabbing
动态设置制表位:
\begin{tabbing}
$\mathsf{swap} : \forall\alpha,\beta.\;\mathsf{Tuple}\;\alpha\;\beta\to\mathsf{Tuple}\;\beta\;\alpha$\\
$\mathsf{swap}\;\alpha\;\beta\;x={}$%
\=$\mathsf{case}\;x$\\
\>$\mathsf{of}\;\mathsf{Tuple}\;\alpha\;\beta\;x\;z.\;$%
\=$\mathsf{let}\;x'=\mathsf{Tuple}\;\beta\;\alpha\;z\;y$\\
\>\>$\mathsf{in}\;x'$
\end{tabbing}
通过\=
设置一个从该行开始有效的制表位,\>
我们转到下一个制表位。
也可以通过再次使用 来取消先前设置的制表位\=
。
答案2
有多种方法可以实现这一点:
您可以使用
\phantom{<arg>}
来留出与 占用的一样多的空间<arg>
。因此,在这种情况下,您可以这样做:\phantom{swap a b x = }of tuple a b y z. let x' = tuple b a z y
\phantom{swap a b x = of tuple a b y z. }in x'
\phantom{}
将占用尽可能多的水平和垂直空间作为其参数。还有一个\vphantom{}
占用与其参数一样多的垂直空间,但不占用水平空间,以及一个相应的\hphantom{}
占用与其参数一样多的水平空间,但不占用垂直空间。正如@egreg 评论的那样,您还可以使用
tabbing
如下所示的环境。正如@cmhughes 评论的那样,您也可以使用
tabular
。
这些方法都会产生类似的结果:
笔记:
- 虽然下面的制表符空间是硬编码的,但它们可以很容易地使用
\widthof{}
可用的包裹calc
。或者更好的是,参见 egreg 提供的解决方案,其中展示了如何tabbing
正确使用。 - 由于没有提供 MWE,我猜测了其定义。
代码:
\documentclass{article}
\usepackage{amsmath}
\newcommand{\Case}{\mathsf{case}}%
\newcommand{\Let}{\mathsf{let}}%
\newcommand{\Swap}{\mathsf{swap}}%
\newcommand{\Tuple}{\mathsf{Tuple}}%
\begin{document}
\noindent
$\Swap : \forall\alpha,\beta.\;\Tuple\;\alpha\;\beta\to\Tuple\;\beta\;\alpha$
\noindent
$\Swap : \alpha,\beta x = \Case\; x$
\noindent
$\phantom{\Swap : \alpha,\beta x ={}}of \;\Tuple\; \alpha \beta y z. \;\Let\; x' = \Tuple\; \beta \alpha z y$
\noindent
$\phantom{\Swap : \alpha,\beta x = of \;\Tuple\; \alpha \beta y z.}\in x'$
\begin{tabbing}
\hspace{0em}\=\hspace{6.5em}\=\hspace{6.8em}\=\kill
%
\>$\Swap : \forall\alpha,\beta.\;\Tuple\;\alpha\;\beta\to\Tuple\;\beta\;\alpha$\\
\>$\Swap : \alpha,\beta x ={}$\>$\Case\; x$\\
\>\>$of \;\Tuple\; \alpha \beta y z. \;\Let\; x' = \Tuple\; \beta \alpha z y$\\
\>\>\>$\in x'$
\end{tabbing}
\noindent
\begin{tabular}{l@{}l@{}l@{}}
\multicolumn{3}{l}{$\Swap : \forall\alpha,\beta.\;\Tuple\;\alpha\;\beta\to\Tuple\;\beta\;\alpha$}\\
$\Swap : \alpha,\beta x ={}$&$\Case\; x$\\
&$of \;\Tuple\; \alpha \beta y z. \;$&$\Let\; x' = \Tuple\; \beta \alpha z y$\\
&&$\in x'$
\end{tabular}
\end{document}