Algorithmusumgebung, Definition eines benutzerdefinierten Stils

Algorithmusumgebung, Definition eines benutzerdefinierten Stils

Ich verwende derzeit folgendes mwe

\documentclass{article}
\usepackage{algpseudocode}
\usepackage[plain]{algorithm}
\begin{document}
\begin{algorithm}[H]
\hrule
\vspace{0.5em}
\caption{Euclide's algorithm}\label{euclid}
\begin{algorithmic}[5]
\Procedure{Euclide}{$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 \Return $b$\Comment{The gcd is b}
\EndProcedure
\end{algorithmic}
\hrule
\end{algorithm}
\end{document}

Um eine Mischung aus normalem und liniertem Stil zu erhalten (beachten Sie das hrule). Ich bevorzuge linierten Stil wegen der Trennung zum Text, die er bewirkt, und normalen Stil, weil er den Beschriftungsstil in meinen Dokumenten einhält. Siehe Bild. Bildbeschreibung hier eingeben

Gibt es eine einfache Möglichkeit, die einfache Umgebung neu zu definieren? Ich habe versucht, die Antwort zu verwenden, umdiese Frage

\makeatletter
\let\oldalgorithmic\algorithmic
\def\algorithmic{\@ifnextchar[\algorithmic@i \algorithmic@ii}
  \def\algorithmic@i[#1]{\hrule\vspace{0.5em}\oldalgorithmic[#1]\hrule}
  \def\algorithmic@ii[#1]{\hrule\vspace{0.5em}\oldalgorithmic\hrule}
\makeatother

Aber das funktioniert nicht wie erwartet, da die zweite hrule immer noch ganz oben im Algorithmus steht. Übersehe ich etwas?

Antwort1

algorithmverwendet diefloatPaketum die algorithmUmgebung mit \floatstyles zu gestalten. Hier sind die Float-Stile für plainund ruled:

% The 'plain' float style
\newcommand\fs@plain{\def\@fs@cfont{\rmfamily}\let\@fs@capt\floatc@plain
  \def\@fs@pre{}\def\@fs@post{}%
  \def\@fs@mid{\vspace\abovecaptionskip\relax}%
  \let\@fs@iftopcapt\iffalse}
% The 'ruled' float style
\newcommand\fs@ruled{\def\@fs@cfont{\bfseries}\let\@fs@capt\floatc@ruled
  \def\@fs@pre{\hrule height.8pt depth0pt \kern2pt}%
  \def\@fs@post{\kern2pt\hrule\relax}%
  \def\@fs@mid{\kern2pt\hrule\kern2pt}%
  \let\@fs@iftopcapt\iftrue}

Jeder Float-Stil definiert eine Anzahl von Komponenten, die beim Erstellen des Floats verwendet werden. Betrachten Sie den ruledFloat-Stil: Eine pre- und post-Komponente umgibt den \caption, während die mid-Komponenten den Float beenden.

Auf dieser Grundlage können wir einen neuen Float-Stil erstellen, plainruledder beispielsweise eine Mischung aus beidem bietet:

Bildbeschreibung hier eingeben

\documentclass{article}
\usepackage{algpseudocode,algorithm}

\makeatletter
% The 'plainruled' float style
\newcommand\fs@plainruled{\def\@fs@cfont{\rmfamily}\let\@fs@capt\floatc@plain
  \def\@fs@pre{\hrule height.8pt depth0pt \kern2pt}%
  \def\@fs@post{}%
  \def\@fs@mid{\kern2pt\hrule height.8pt depth0pt\relax\kern\abovecaptionskip}%
  \let\@fs@iftopcapt\iffalse}
\makeatother

\floatstyle{plainruled}
\restylefloat{algorithm}

\begin{document}

\begin{algorithm}[H]
  \caption{Euclide's algorithm}\label{euclid}
  \begin{algorithmic}[5]
    \Procedure{Euclide}{$a,b$}\Comment{The g.c.d.\ of~$a$ and~$b$}
       \State $r \gets a \bmod b$
       \While{$r \neq 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 \Return $b$\Comment{The g.c.d.\ is~$b$}
    \EndProcedure
  \end{algorithmic}
\end{algorithm}

\end{document}

verwandte Informationen