在 Latex 中使用带有和不带有选项的包

在 Latex 中使用带有和不带有选项的包

我需要以两种不同的方式使用一个特定的包,一次使用选项,另一次不使用选项。更具体地说,我想对文档中的两种算法使用algpseudocode一次带选项的包[noend],一次不带选项的包。据我在网上读到的,两次使用不同的选项调用一个包是不可能的。我找不到这个问题的明确答案。任何建议都将不胜感激。

我发现了类似的问题:algorithm2e - 覆盖默认值但是algorithm2e我在使用时它使用了包algorithm

[noend]编辑:我需要使用带有和不带有选项的包algpseudocode不是algorithm

答案1

您可能指的是algpseudocodealgorithmic,而不是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}

在此处输入图片描述

相关内容