用缩进线来写 s 表达式?

用缩进线来写 s 表达式?

我正在写一些关于解析表达式的笔记,其中一件事我想说明的是前缀表示法方程。考虑到这一点,我希望能够缩进 s 表达式的某些部分。例如,这是我正在寻找的内容:

(−
  (+
    (∗ 7 −9)
    (−6
      (/ −3 2))))

但是,我找不到一个简单的方法来做到这一点。理想情况下,这些表达式也应该居中,并且能够“取消缩进”一些子表达式。

答案1

也许在这里使用minted是个不错的选择。使用下面的代码,您将获得以下输出。

在此处输入图片描述

\documentclass{article}
\usepackage{minted}

\begin{document}

\begin{minted}{lisp}
(-
  (+
    (* 7 -9)
    (-6
      (/ -3 2))))
\end{minted}

\end{document}

答案2

在此处输入图片描述

这遵循换行符但忽略根据 () 嵌套深度重新缩进的空格。 * 和 − 可以输入为 ascii * 和 - 或 Unicode ∗ −,如问题中所述。

整个表达以最长的一行为中心

\documentclass{article}

\DeclareUnicodeCharacter{2212}{\ensuremath{-}}
\DeclareUnicodeCharacter{2217}{\ensuremath{*}}
\newcount\sexpdepth
\catcode`\(\active
\catcode`\)\active
\catcode`\-\active
\catcode`\*\active
\newenvironment{sexp}
{\center
\global\sexpdepth=0 %
\bgroup
\catcode`\(\active
\catcode`\)\active
\catcode`\-\active
\catcode`\*\active
\edef-{$\string-$}%
\edef*{$\string*$}%
\edef({\string(\global\advance\sexpdepth1 }%
\edef){\string)\global\advance\sexpdepth\string-1 }%
\def\obeyedline{\\\hspace{\sexpdepth em}}%
\obeylines
\begin{tabular}{@{}l@{}}}
{\end{tabular}\egroup
\endcenter}
\catcode`\(12
\catcode`\)12
\catcode`\-12
\catcode`\*12

\begin{document}

\begin{sexp}
  (+
1
2
3)
\end{sexp}

\begin{sexp}
(−
  (+
  (∗ 7 −9)
  (−6
      (/ 1 −32))
          (* 1 2)
    5))  
\end{sexp}

\end{document}

答案3

一种选择是使用tabbing环境(在minipagecenter环境内部用于使构造居中)

\begin{center}
\begin{minipage}{.5\textwidth}
\begin{tabbing}
    $(-$\=\+\\
      $(+$\=\+\\
         $(\times$ $7$ $-9$\\
         $(-$\=\ $6$\+\\
             $(/$ $-3$ $2)))))$
\end{tabbing}   
\end{minipage}  
\end{center}    

在此处输入图片描述

tabbing环境中\=设置制表位,\+将下一行中的第一个制表位移动到“下一个”制表位。

答案4

\documentclass[12pt]{report}
\begin{document}
\noindent (-

(+

\indent\indent $(\times 7 - 9)$

\indent\indent (-6

\indent\indent\indent (/ - 32))))
\end{document}

在此处输入图片描述

为了实现这种多重缩进,您需要使用\indent多次。

相关内容