我需要引用某些算法,为此,我希望有一个可以接受 3 个参数的命令,第一个参数是算法的关键,第二个和第三个参数是算法内行的选项。如果命令名称是 algoref,则当第二个参数为空时,我需要\algoref{key}
生成代码A.~\ref{#1}
。如果第二个参数不为空,则生成代码A.~\ref{#1},L.#2
;如果第二个和第三个参数不为空,则生成代码A.~\ref{#1},L.#2:#3
。这可能吗?
答案1
以下是实现:语法如下
\algoref{key}
表示“A. 1”
\algoref[3]{key}
表示“A. 1, L. 3”
\algoref[4-6}{key}
表示“A. 1, L. 4:6”
\documentclass{article}
\usepackage{algorithm}
\usepackage{algpseudocode}
\usepackage{xparse}
\NewDocumentCommand{\algoref}{om}{%
% main reference
A.~\ref{#2}%
% check for the optional argument
\IfValueT{#1}{,~L.~\algolines{#1}}%
}
\NewDocumentCommand{\algolines}{>{\SplitArgument{1}{-}}m}{%
% check for a hyphen
\algolinessplit#1%
}
\NewDocumentCommand{\algolinessplit}{mm}{%
% first or unique line number
#1%
% second line number, if given
\IfValueT{#2}{:#2}%
}
\begin{document}
\begin{algorithm}
\caption{Euclid’s algorithm}\label{euclid}
\begin{algorithmic}[1]
\Procedure{Euclid}{$a,b$}\Comment{The g.c.d. of a and b}
\State $r\gets a\bmod b$
\While{$r\not=0$}\Comment{We have the answer if r is 0}
\State $a\gets b$
\State $b\gets r$
\State $r\gets a\bmod b$
\EndWhile\label{euclidendwhile}
\State \textbf{return} $b$\Comment{The gcd is b}
\EndProcedure
\end{algorithmic}
\end{algorithm}
References: \algoref{euclid}, \algoref[3]{euclid}, \algoref[1-4]{euclid}
\end{document}
我使用了algpseudocode
,但实际上任何包都可以。