我有这个代码:
\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 答案的补充。如评论中所述,该解决方案不适用于\For
and\While
循环,因为它们在末尾包含“do”。可以定义\For
and的替代版本\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)$}
如果数学风格的输出是可以接受的那么这很容易。