我之前问过一个问题,关于如何将程序排版为美丽的数学。我得到的建议是使用listings
。但这并不令人满意。
基本上,我的“程序”处于编程和数学之间的灰色地带。它们是某种低级的 ASCII 文本,但其理念是它们应该看起来像数学方程式:
=
标志排列整齐- 数学字体和间距
- 用数学符号适当替换 ASCII,就像在 Knuth-WEB 中一样
以下是列表和数学()交错的样子alignat
,大致显示了我想要的内容。
乳胶源
\documentclass[conference,a4paper]{IEEEtran}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{graphicx}
\usepackage{longtable}
\usepackage{wrapfig}
\usepackage{rotating}
\usepackage[normalem]{ulem}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{capt-of}
\usepackage{hyperref}
\usepackage{mystyle}
\newcommand\scalemath[2]{\scalebox{#1}{\mbox{\ensuremath{\displaystyle #2}}}}
\newcommand{\gufx}[1] {\scalemath{1.1}{\text{\,\guilsinglleft{#1}\guilsinglright}}\,\,}
\date{}
\title{A Title}
\begin{document}
\section{Examples}
\label{sec:org31daa8a}
Haskell eg1
\begin{HSK}
swaptree.(Leaf.x) = Leaf.x
swaptree.(Br.l.r) = Br.(swaptree.r).(swaptree.l)
\end{HSK}
Math eg1
{\small \begin{alignat*}{3}
&swaptree.(\textbf{Leaf}.x)&&= \textbf{Leaf}.x\\
&swaptree.(\textbf{Br}.l.r)&&= \textbf{Br}.(swaptree.r).(swaptree.l)
\end{alignat*}}
Haskell eg2
\begin{HSK}
c : Int -> Int -> Int
0 `c` (r+1) = 0
n `c` 0 = 1
(n+1) `c` r = n `c` r + n `c` (r-1)
\end{HSK}
Math eg 2
\begin{alignat*}{4}
&c &&: \mathbb{Z} \rightarrow \mathbb{Z} \rightarrow \mathbb{Z}\\
&0 &&\gufx{c} (r+1) &&= 0\\
&n &&\gufx{c} 0 &&= 1\\
&(n+1) &&\gufx{c} r &&= n \gufx{c} \! r + n \gufx{c} \!(r-1)
\end{alignat*}
Haskell eg3
\begin{HSK}
ce : [t] -> Int -> [[t]]
[] `cE` (r+1)= []
xs `cE` 0 = [[]]
(x::xs)`cE` r = xs `cE` r ++ [x::y| y <- xs `cE` (r-1)]
\end{HSK}
Math eg3
\begin{alignat*}{5}
&ce &&&&: [t] \rightarrow \mathbb{Z} \rightarrow [[t]]\\
&[\,] &&\gufx{ce}(r\!+\!1)&&= [\,]\\
&xs &&\gufx{ce} 0 &&= [[\,]]\\
&(x::xs) &&\gufx{ce} r &&= xs \gufx{ce} r +\!\!\!\!\!+\,\, [x::y \mid y \in (xs \gufx{ce} \!(r\!-\!1))]\\
\end{alignat*}
\end{document}
关联的样式文件 mystyle.sty
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{listings}
\usepackage{bbding}
\usepackage[fleqn]{calculation}
\usepackage{tikz-qtree}
\usepackage[figurename=Code, font={small,it}, belowskip=-8pt, aboveskip=0pt]{caption}
\captionsetup{skip=0.333\baselineskip}
%\usepackage{arevmath}
\DeclareFontEncoding{MDA}{}{}
\DeclareFontSubstitution{MDA}{cmr}{m}{n}
\lstnewenvironment{HSK}
{\lstset{language=Haskell,
basicstyle=\footnotesize\ttfamily,
identifierstyle=\footnotesize\itshape,
keywordstyle=\footnotesize\itshape\bfseries,
aboveskip=5pt,belowskip=5pt,
flexiblecolumns=false,
morekeywords={ctype},
frame=single,
breaklines=true,
basewidth={0.5em,0.45em},
frameshape={RYR}{Y}{Y}{RYR},
literate={+}{{\texttt{+}}}1 {/}{{$/$}}1 {*}{{\texttt{*}}}1 {=}{{\texttt{=}}}1 {:}{{\texttt{:}}}1 {::}{{\texttt{::}}}2
{>}{{$>$}}1 {<}{{$<$}}1 {\\}{{$\lambda$}}1
{\\\\}{{\char`\\\char`\\}}1
{->}{{$\rightarrow$}}4
{>=}{{$\geq$}}2
{<-}{{{\scriptsize$\in$}}}1
{=}{{=}}3
{.}{{\,.}}1
%{Int}{{${\mathbf{Z}}$}}2
%{...}{{$\ldots$}}2
{,}{{\texttt{,}}}1
{<=}{{$\leq$}}2 {=>}{{$\Rightarrow$}}2
%{\ .}{{$\circ$}}2 {\ .\ }{{$\circ$}}2
{>>}{{>>}}2 {>>=}{{>>=}}2
{|}{{$\mid$}}1
{?}{{\textbf{?}}}1
}}{}
\lstdefinestyle{HSKstyle}
{
language=Haskell,
basicstyle=\footnotesize\ttfamily,
identifierstyle=\footnotesize\itshape,
keywordstyle=\footnotesize\itshape\bfseries,
literate={+}{{\texttt{+}}}1 {/}{{$/$}}1 {*}{{\texttt{*}}}1 {=}{{\texttt{=}}}1 {:}{{\texttt{:}}}1 {::}{{\texttt{::}}}2 {->}{{$\rightarrow$}}4
}
\newcommand{\HSKinline}[1]{\lstinline[style=HSKstyle]{#1}}
可以看出,数学黑客非常可怕!当然,如果我能将源代码放入适当定制的对齐(或任何其他)模式中,那就太好了。我认为这很难!
但有几件事会有所帮助:
- 类似 Sed 的替代品
- -> 至 \rightarrow
- 树到 $\mathbf{Tree}$
- Int 到 $\mathbb{Z}$ 等
如果所有大写名称都可以这样处理会更好,但如果这更难,只需在某些设置位置列出mathbf 名称即可
- 运营商规范而非
\,
\!
黑客 `identifier`
以identifier
运算符间距- 换行符前面要加上
\\
&&
在 之前插入=
(但不在 之前==
)- 为了能够重新启动
alignat
对齐,而无需新的对齐alignat
,请看示例 3:第一行是被迫与其余 3 个对齐。它应该是独立的。
附言:感谢 egreg鼓励问。
请忽略可见的框架或缺少的框架