我正在写一些关于解析表达式的笔记,其中一件事我想说明的是前缀表示法方程。考虑到这一点,我希望能够缩进 s 表达式的某些部分。例如,这是我正在寻找的内容:
(−
(+
(∗ 7 −9)
(−6
(/ −3 2))))
但是,我找不到一个简单的方法来做到这一点。理想情况下,这些表达式也应该居中,并且能够“取消缩进”一些子表达式。
答案1
答案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}