使用数学来列出清单

使用数学来列出清单

我之前问过一个问题,关于如何将程序排版为美丽的数学。我得到的建议是使用listings。但这并不令人满意。

基本上,我的“程序”处于编程和数学之间的灰色地带。它们是某种低级的 ASCII 文本,但其理念是它们应该看起来像数学方程式:

  • =标志排列整齐
  • 数学字体和间距
  • 用数学符号适当替换 ASCII,就像在 Knuth-WEB 中一样

以下是列表和数学()交错的样子alignat,大致显示了我想要的内容。

pdflatex 输出

乳胶源

\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}}

可以看出,数学黑客非常可怕!当然,如果我能将源代码放入适当定制的对齐(或任何其他)模式中,那就太好了。我认为这很难!

但有几件事会有所帮助:

  1. 类似 Sed 的替代品
    • -> 至 \rightarrow
    • 树到 $\mathbf{Tree}$
    • Int 到 $\mathbb{Z}$ 等

    • 如果所有大写名称都可以这样处理会更好,但如果这更难,只需在某些设置位置列出mathbf 名称即可
  2. 运营商规范而非\, \!黑客
  3. `identifier`identifier运算符间距
  4. 换行符前面要加上\\
  5. &&在 之前插入=(但不在 之前==
  6. 为了能够重新启动alignat对齐,而无需新的对齐alignat
    ,请看示例 3:第一行是被迫与其余 3 个对齐。它应该是独立的。

附言:感谢 egreg鼓励问。

请忽略可见的框架或缺少的框架

相关内容