在 JR Heard 的论文《美丽的代码令人信服的证据》中——代码以特殊方式格式化,其中包括边注。我正在寻找一种方法来做到这一点,因为我认为这是一种以文学编程风格注释代码的非常清晰的方法。
答案1
正如评论中提到的,您可以使用(包)escapeinside
选项在代码列表中执行自己的代码。还有和可以在这些标记之前和之后自动插入代码。lstlisting
listings
executebegin
executeend
我的想法:* 使用minipages
将列表限制为小于文本宽度,并使用一些水平空间将其向右移动。* 可以使用选项添加像链接论文中的分隔线。frame=l
* 使用上述命令在代码行的开头添加注释。* 自动添加的代码将注释放在左侧,\llap{<content>\hspace{<distance>}}
不占用任何官方空间。* 为了允许多行注释,minipage
在注释周围添加了具有正确对齐方式的额外注释。
代码如下所示:(第一个列表仅支持单行注释,而第二个列表支持多行注释!)
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{lmodern} % better tt fonts!
\usepackage{xcolor}
\usepackage{listings}
\usepackage{lipsum}% dummy text
\makeatletter
\def\comsep{\dimexpr\lst@numbersep+\lst@frametextsep\relax}% most likely not correct!
\makeatother
\begin{document}
\lipsum
\begin{minipage}{\linewidth}
\hspace*{.3\linewidth}%
\begin{minipage}{.7\linewidth}
\begin{lstlisting}[frame=l,basicstyle=\ttfamily,language=C,
escapeinside={(*@}{@*)},
escapebegin={\begin{lrbox}{0}\normalfont\itshape\small\color{black!70}},
escapeend={\end{lrbox}\llap{\box0\hspace{\comsep}}}
]
(*@ Declare it @*) int i = 0;
(*@ useless! @*) i + i;
(*@ increment @*) i++:
(*@ now print it @*) print i;
\end{lstlisting}
\end{minipage}
\end{minipage}
\begin{minipage}{\linewidth}
\hspace*{.3\linewidth}%
\lstset{% set here because `\linewidth` has still its old value
escapeinside={(*@}{@*)},
escapebegin={\begin{lrbox}{0}\minipage[t]{.3\linewidth}\raggedleft\normalfont\itshape\small\leavevmode\color{black!70}\ignorespaces},
escapeend={\endminipage\end{lrbox}\llap{\raisebox{0pt}[0pt][0pt]{\box0}\hspace{\comsep}}}
}%
\begin{minipage}{.7\linewidth}
\begin{lstlisting}[frame=l,basicstyle=\ttfamily,language=C]
(*@ Declare it @*) int i = 0;
(*@ useless! @*) i + i;
(*@ increment; more text more @*) i++:
(*@ now print it @*) print i;
\end{lstlisting}
\end{minipage}
\end{minipage}
\end{document}
如下所示:
如果使用频率较高,可以定义一个新的环境(\newlstenvironment
)或者进行全局设置。
注意:理论上,可以对listings
代码进行更深入的改造,以便将注释添加到末尾而不是开头。这将简化注释的添加,但编码难度会大大增加。