我目前正在研究一些程序的算法复杂性,我必须处理一行又一行的代码,如果我可以将其中一些行括在右(或左)花括号中并在旁边记下所述行(数学公式)的复杂性,这将非常好并且很有帮助。
我使用这个listings
包是因为我认为它在显示代码方面做得非常出色,但说实话,我并不是乳胶专家,这就是为什么到目前为止我只遇到了令人讨厌的错误而什么也没做。我希望你能帮我解决这个问题。
编辑:以下是我希望在纸面上实现的目标:
答案1
我首先承认,对于您希望实现的目标而言,这种结构可能过于繁琐,但我还是会介绍它。我们在这里所做的是将不同的逐字代码块粘贴到命名的宏中(这些宏是包含给定代码行的框)。如果我们只是按顺序重新调用命名的宏(MWE 中的未标记代码),我们就可以恢复源代码,但请注意,作为一个框,宏不会跨页面中断。
但后来我创建了一个\labelcode{}{}
宏,它的第一个参数是一个重现代码框的宏,第二个参数是应用于该块的标签。如果没有嵌套,则非常简单:只需提供与特定环境关联的宏名称myverbbox
。但是,如果要嵌套标签,则必须使用\savestack
将内部代码和标签填充到新框中,然后应用于\labelcode
保存的堆栈宏。
我尝试构造布局\begin{myverbbox}
并\end{myverbbox}
使其不干扰代码流,但我会注意到之前的空白\end{mybox}
是动词框的一部分,会影响所应用的任何标签的水平定位。
\documentclass{article}
\usepackage{verbatimbox}
\usepackage{scalerel}
\usepackage[usestackEOL]{stackengine}[2013-10-15]
\makeatletter\let\macroname\@macro@name\makeatother
\newcommand\labelcode[2]{%
\def\boxname{\csname\macroname{#1}content\endcsname}%
\scaleleftright[1.5ex]{.}{#1~}{\}}%
\raisebox{.5\ht\boxname-.5\ht\strutbox}{#2}%
}
\parindent 0in
\parskip 1em
\begin{document}
\begin{myverbbox}{\partitionA}
mt Partition (A, start, end) \end{myverbbox}
\begin{myverbbox}{\thetaONE}
pivot = A[start]
i = start - 1
j = end + 1 \end{myverbbox}
\begin{myverbbox}{\thetaNa}
REPEAT
REPEAT
i = i + 1
until A[i] >= pivot
REPEAT
j = j - 1
until A[j] <= pivot \end{myverbbox}%
\begin{myverbbox}{\thetaI}
if i < j then
exchange(A[i], A[j]) \end{myverbbox}
\begin{myverbbox}{\thetaNb}
until (i >=j) \end{myverbbox}
\begin{myverbbox}{\partitionB}
RETURN j \end{myverbbox}
MARKED CODE:\\%
\\
\partitionA\\%
\\
\labelcode{\thetaONE}{$\Theta(1)$}\\%
\\
\savestack{\x}{\Shortstack[l]{\thetaNa\\%
\\
\labelcode{\thetaI}{$\Theta(I)$}\\%
\\
\thetaNb}}%
\labelcode{\x}{$\Theta(n)$}\\%
\\
\partitionB
UNMARKED CODE:\\%
\\
\partitionA\\%
\\
\thetaONE\\%
\\
\thetaNa\\%
\\
\thetaI\\%
\\
\thetaNb\\%
\\
\partitionB
\end{document}