![如何引用代码框?](https://linux22.com/image/304854/%E5%A6%82%E4%BD%95%E5%BC%95%E7%94%A8%E4%BB%A3%E7%A0%81%E6%A1%86%EF%BC%9F.png)
我正在使用clrscode3e
包排版伪代码,我想引用codebox
es 中的过程来生成类似“Procedure InsertionSort”的内容。该怎么做?
例如,如果我想引用某个章节,我可以轻松地写:
\label{chap:foo}
和\nameref{chap:foo}
,然后我就会得到章节名称。
我怎样才能通过引用它来获取过程名称(\proc{}
在环境中定义)(也就是说,我只能在中定义然后使用它在其他地方获取该过程的名称)?codebox
\label{proc:InsertionSort}
codebox
\nameref{proc:InsertionSort}
答案1
由于在来自的环境\Procname
下的程序codeblock
clrscode3e
没有与之关联的数字,仅有\nameref
意义。
\Procname
对宏进行以下修改clrscode3e
更新超链接目标以及“要引用的名称”:
\documentclass{article}
\usepackage{clrscode3e,etoolbox}
\usepackage{hyperref}
\robustify{\proc}
\makeatletter
\renewcommand{\Procname}[1]{%
\global\def\saveprocname{#1}%
\global\procnametrue%
\let\@currentlabelname\saveprocname
\phantomsection}
\makeatother
\begin{document}
\section{A section}
See \nameref{proc:insertion-sort}.
\begin{codebox}
\Procname{$\proc{Insertion-Sort}(A)$}\label{proc:insertion-sort}
\li \For $j \gets 2$ \To $\attrib{A}{length}$
\li \Do
$\id{key} \gets A[j]$
\li \Comment Insert $A[j]$ into the sorted sequence
$A[1 \twodots j-1]$.
\li $i \gets j-1$
\li \While $i > 0$ and $A[i] > \id{key}$
\li \Do
$A[i+1] \gets A[i]$
\li $i \gets i-1$
\End
\li $A[i+1] \gets \id{key}$
\End
\end{codebox}
\end{document}