如何在算法中为 \If 语句添加换行符

如何在算法中为 \If 语句添加换行符

我正在尝试应用解决方案在算法中包含换行符,同时保持缩进对于以 开头的行if。但then不会对断行执行。

\documentclass{article}
\usepackage{algorithm}% http://ctan.org/pkg/algorithm
\usepackage{algpseudocode}% http://ctan.org/pkg/algorithmicx
\makeatletter
\let\OldStatex\Statex
\renewcommand{\Statex}[1][3]{%
  \setlength\@tempdima{\algorithmicindent}%
  \OldStatex\hskip\dimexpr#1\@tempdima\relax}
\makeatother
\begin{document}
\section{Struttura dati}
\begin{algorithm}
  \caption{Leggi file .gpx}\label{getgpx}
  \begin{algorithmic}[1]
      \If{x=10 \textbf{and}}
      \Statex y=10
    \State speed~$\gets$~computeSpeed(
    \Statex gpx.track(i).segment(j).delta\_s(q),
    \Statex[2] gpx.track(i).segment(j).delta\_t(q));
    \EndIf
  \end{algorithmic}
\end{algorithm}
\end{document}

输出:

在此处输入图片描述

想要的输出:

1: if x=10 and 
       y=10  then
2:     speed ← computeSpeed(...

答案1

下面定义了一个新的 if 调用,它允许您使用-like 格式(条件以 分隔)\multilineIf指定一组堆叠的条件。结尾tabular\\然后会自动添加到条件的末尾。

在此处输入图片描述

\documentclass{article}

\usepackage{algorithm,algpseudocode}

\makeatletter
\let\OldStatex\Statex
\renewcommand{\Statex}[1][3]{%
  \setlength\@tempdima{\algorithmicindent}%
  \OldStatex\hskip\dimexpr#1\@tempdima\relax}
\makeatother

\newcommand{\stackedconditions}[1]{%
  \begin{tabular}[t]{@{} l @{}}
    #1
  \end{tabular}%
}
\algdef{SE}[IF]{multilineIf}{EndIf}[1]{\algorithmicif\ \stackedconditions{#1\ \algorithmicthen}}{\algorithmicend\ \algorithmicif}%

\begin{document}

\section{Struttura dati}

\begin{algorithm}
  \caption{Leggi file .gpx}\label{getgpx}
  \begin{algorithmic}[1]
    \multilineIf{%
      $x = 10$ \textbf{and} \\
      $y = 10$}
      \State speed~$\gets$~computeSpeed(
      \Statex gpx.track(i).segment(j).delta\_s(q),
        \Statex[2] gpx.track(i).segment(j).delta\_t(q));
    \EndIf
  \end{algorithmic}
\end{algorithm}

\end{document}

默认情况下条件是l左对齐的,但您可以更改它以满足您的需要。

\multilineIfvia的定义是从原始定义\algdef复制并更改的,\Ifalgpseudocode.sty

相关内容