在算法中包含换行符,同时保持缩进

在算法中包含换行符,同时保持缩进

我有这个代码:

\DeclareCaptionFormat{algor}{%
  \hrulefill\par\offinterlineskip\vskip1pt%
    \textbf{#1#2}#3\offinterlineskip\hrulefill}
\DeclareCaptionStyle{algori}{singlelinecheck=off,format=algor,labelsep=space}
\captionsetup[algorithm]{style=algori}

\begin{document}
    \section{Struttura dati}
    \begin{floatleft}
        \captionof{algorithm}{Leggi file .gpx}\label{getgpx}
        \begin{algorithmic}[1]
                  \State $speed \gets computeSpeed(\linebreak gpx.track(i).segment(j).delta\_s(q), \linebreak gpx.track(i).segment(j).delta\_t(q));$
            \end{algorithmic}
    \end{floatleft}
\end{document}

代码显示如下:

我希望行gpx.track....delta_s(q),gpx.track....delta_t(q),和 的);缩进与行首的缩进完全一致27。我尝试使用\indent命令,但缩进空间与文档其余部分的缩进空间不同,最终结果很混乱。

答案1

环境中每个块的默认缩进algorithmic(来自algorithmicx包裹) 是\algorithmicindent。因此,您可以将整行代码放在\parbox[t]具有足够宽度的顶部对齐中,或者使用varwidth来自varwidth包裹,并根据需要缩进:

在此处输入图片描述

\documentclass{article}
\usepackage{algorithm}% http://ctan.org/pkg/algorithm
\usepackage{algpseudocode}% http://ctan.org/pkg/algorithmicx
\usepackage{varwidth}% http://ctan.org/pkg/varwidth
\begin{document}
\section{Struttura dati}
\begin{algorithm}
  \caption{Leggi file .gpx}\label{getgpx}
  \begin{algorithmic}[1]
    \State \begin{varwidth}[t]{\linewidth}
      speed~$\gets$~computeSpeed(\par
        \hskip\algorithmicindent gpx.track(i).segment(j).delta\_s(q),\par
        \hskip\algorithmicindent gpx.track(i).segment(j).delta\_t(q));
      \end{varwidth}
  \end{algorithmic}
\end{algorithm}
\end{document}​

这是可以替代使用的另一种方法。它利用了 的修改版本\Statex,也是由 提供的algorithmicx。它现在接受一个可选参数,指示要应用于特定行的缩进数,而不对其进行编号( 的默认设置\Statex)。

在此处输入图片描述

\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]
    \State speed~$\gets$~computeSpeed(
    \Statex gpx.track(i).segment(j).delta\_s(q),
    \Statex[2] gpx.track(i).segment(j).delta\_t(q));
  \end{algorithmic}
\end{algorithm}
\end{document}

请注意,我已从上面发布的最小工作示例 (MWE) 中删除了不必要的前言内容。在发布问题/疑问时鼓励这样做 - 可以编译并重现问题的内容。

答案2

如果所有其他解决方案看起来都太复杂,请尝试使用 \newline 与 \hspace*{} 的组合:

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

\begin{document}
\section{Struttura dati}

\begin{algorithm}
  \caption{Leggi file .gpx}\label{getgpx}
  \begin{algorithmic}[1]
    \State speed~$\gets$~computeSpeed(\newline
        \hspace*{5em} gpx.track(i).segment(j).delta\_s(q), \newline
        \hspace*{5em} gpx.track(i).segment(j).delta\_t(q));
  \end{algorithmic}
\end{algorithm}

\end{document}

这产生了 在此处输入图片描述

答案3

这是对 Werner 答案的补充。如评论中所述,该解决方案不适用于\Forand\While循环,因为它们在末尾包含“do”。可以定义\Forand的替代版本\While,如下例所示

在此处输入图片描述

\documentclass{article}
\usepackage{algorithm,algpseudocode}
\makeatletter
\newcommand{\StatexIndent}[1][3]{%
  \setlength\@tempdima{\algorithmicindent}%
  \Statex\hskip\dimexpr#1\@tempdima\relax}
\algdef{S}[WHILE]{WhileNoDo}[1]{\algorithmicwhile\ #1}%
\makeatother
\begin{document}
\begin{algorithm}[H]
  \caption{Cool algorithm}
  \begin{algorithmic}[1]
    \WhileNoDo{everything is all right, and}
    \StatexIndent[2] the sun is shining bright \algorithmicdo
       \State Sing and dance
    \EndWhile
  \end{algorithmic}
\end{algorithm}
\end{document}

我希望它对其他人也有帮助。

答案4

我遇到了类似的问题,只不过我的长表达式是 If 语句的条件。我通过为表达式使用 LaTeX 数组环境修复了这个问题,输出看起来有点奇怪,因为它看起来不像符合常理的伪代码。

\If{$\left(
    \begin{array}{l}
    (current\_context \neq \text{NULL})\, \vee \\
    (MR\_num\_outstanding\_contexts < MR\_max\_contexts) \\
    \end{array}
    \right)$}

如果数学风格的输出是可以接受的那么这很容易。

相关内容