我需要以两种不同的方式使用一个特定的包,一次使用选项,另一次不使用选项。更具体地说,我想对文档中的两种算法使用algpseudocode
一次带选项的包[noend]
,一次不带选项的包。据我在网上读到的,两次使用不同的选项调用一个包是不可能的。我找不到这个问题的明确答案。任何建议都将不胜感激。
我发现了类似的问题:algorithm2e - 覆盖默认值但是algorithm2e
我在使用时它使用了包algorithm
。
[noend]
编辑:我需要使用带有和不带有选项的包algpseudocode
不是algorithm
。
答案1
您可能指的是algpseudocode
或algorithmic
,而不是algorithm
。
包裹algpseudocode
\documentclass{article}
\usepackage{algorithm}
\usepackage{algpseudocode}
\newcommand{\algorithmwithoutend}{%
\algtext*{EndWhile}%
\algtext*{EndFor}%
\algtext*{EndLoop}%
\algtext*{EndIf}%
\algtext*{EndProcedure}%
\algtext*{EndFunction}%
}
\begin{document}
\begin{algorithm}
\algorithmwithoutend
\caption{Euclid’s algorithm without end tags}\label{euclidwithout}
\begin{algorithmic}[1]
\algorithmwithoutend
\Procedure{Euclid}{$a,b$}\Comment{The gcd 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{euclidendwhilewithout}
\State \textbf{return} $b$\Comment{The gcd is $b$}
\EndProcedure
\end{algorithmic}
\end{algorithm}
\begin{algorithm}
\caption{Euclid’s algorithm with end tags}\label{euclidwith}
\begin{algorithmic}[1]
\Procedure{Euclid}{$a,b$}\Comment{The gcd 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{euclidendwhilewith}
\State \textbf{return} $b$\Comment{The gcd is $b$}
\EndProcedure
\end{algorithmic}
\end{algorithm}
\end{document}
包裹algorithmic
\documentclass{article}
\usepackage{algorithm}
\usepackage{algorithmic}
\makeatletter
\newcommand{\algorithmwithoutend}{%
\renewcommand{\ENDIF}{\end{ALC@if}}%
\renewcommand{\ENDFOR}{\end{ALC@for}}%
\renewcommand{\ENDWHILE}{\end{ALC@whl}}%
\renewcommand{\ENDLOOP}{\end{ALC@loop}}%
}
\makeatother
\begin{document}
\begin{algorithm}
\caption{Example algorithm with end tags}
\begin{algorithmic}
\REQUIRE $n \geq 0$
\ENSURE $y = x^n$
\STATE $y \leftarrow 1$
\STATE $X \leftarrow x$
\STATE $N \leftarrow n$ \WHILE{$N \neq 0$}
\IF{$N$ is even}
\STATE $X \leftarrow X \times X$ \STATE $N \leftarrow N / 2$ \ELSE[$N$ is odd]
\STATE $y \leftarrow y \times X$ \STATE $N \leftarrow N - 1$ \ENDIF
\ENDWHILE
\end{algorithmic}
\end{algorithm}
\begin{algorithm}
\caption{Example algorithm without end tags}
\begin{algorithmic}
\algorithmwithoutend
\REQUIRE $n \geq 0$
\ENSURE $y = x^n$
\STATE $y \leftarrow 1$
\STATE $X \leftarrow x$
\STATE $N \leftarrow n$ \WHILE{$N \neq 0$}
\IF{$N$ is even}
\STATE $X \leftarrow X \times X$ \STATE $N \leftarrow N / 2$ \ELSE[$N$ is odd]
\STATE $y \leftarrow y \times X$ \STATE $N \leftarrow N - 1$ \ENDIF
\ENDWHILE
\end{algorithmic}
\end{algorithm}
\end{document}
答案2
您不能加载一个包两次,但通常可以从文档中重现选项的效果。
algorithm
没有定义noend
选项,但它是一个声明的选项,因为包定义了一个默认选项。
\newcommand{\ALG@name}{Algorithm}
\DeclareOption*{\edef\ALG@name{\CurrentOption}}
\floatname{algorithm}{\ALG@name}
因此,\ALG@name
在包加载后重新定义并重新执行\floatname
将撤消该选项的效果。
\documentclass{article}
\usepackage[noend]{algorithm}
\begin{document}
% noend caption
\begin{algorithm}
aa
\caption{zzz}
\end{algorithm}
\makeatletter
\renewcommand\ALG@name{Algorithm}
\floatname{algorithm}{\ALG@name}
\makeatother
% Algorithm caption, as if the option had not been used
\begin{algorithm}
bbb
\caption{zzz2}
\end{algorithm}
\end{document}