非等宽代码中的对齐、悬挂缩进

非等宽代码中的对齐、悬挂缩进

我想排版一段包含换行符的代码。新行应缩进到上一行的指定点。下面是一个等宽字体示例来说明我的意思。请注意下面“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

有多种方法可以实现这一点:

  1. 您可以使用\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{}占用与其参数一样多的水平空间,但不占用垂直空间。

  2. 正如@egreg 评论的那样,您还可以使用tabbing如下所示的环境。

  3. 正如@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}

相关内容