我有一个算法,它处理一些非常大的参数名称,这破坏了可读性。到目前为止,我所做的就是将有问题的语句(第 4-5 行)手动拆分为两个单独的语句。如果没有它,语句将超出页边距。过程签名会自行包装。
我想要做的是将过程名称和长语句中的溢出行缩进到上图中箭头的位置。
我该怎么做?我也愿意听取对其他算法包的建议。
\documentclass[12pt,a4paper,english,twoside,titlepage]{report}
\usepackage{algorithm}
\usepackage{algpseudocode}
\begin{document}
\begin{algorithm}
\caption{This procedure calculates the \texttt{response} value}
\begin{algorithmic}[1]
\Procedure {CalculateResponse}{$pszMethod$, $pszDigestUri$, $pszQop$, $pszUsername$, $pszRealm$, $pszPassword$, $pszNonce$, $pszCNonce$, $pszNonceCount$}
\State $ha1 \gets DigestCalcHA1(pszUsername, pszRealm, pszPassword)$
\State $ha2 \gets DigestCalcHA2(pszMethod, pszDigestUri, pszQop)$
\State $response \gets calculateResponse(ha1, ha2,pszMethod, pszDigestUri,$
\State $pszQop,pszNonce, pszNonceCount, pszCNonce)$
\EndProcedure
\Statex
\end{algorithmic}
\end{algorithm}
\end{document}
答案1
人们可以修改algorithmic
环境,以便连续的行可以缩进。
\documentclass[12pt,a4paper]{report}
\usepackage{algorithm}
\usepackage{algpseudocode}
\makeatletter
\newlength{\continueindent}
\setlength{\continueindent}{6em}
\renewenvironment{algorithmic}[1][0]%
{%
\edef\ALG@numberfreq{#1}%
\def\@currentlabel{\theALG@line}%
%
\setcounter{ALG@line}{0}%
\setcounter{ALG@rem}{0}%
%
\let\\\algbreak%
%
\expandafter\edef\csname ALG@currentblock@\theALG@nested\endcsname{0}%
\expandafter\let\csname ALG@currentlifetime@\theALG@nested\endcsname\relax%
%
\begin{list}%
{\ALG@step}%
{%
\rightmargin\z@%
\itemsep\z@ \itemindent\z@ \listparindent2em%
\partopsep\z@ \parskip\z@ \parsep\z@%
\labelsep 0.5em \topsep 0.2em%\skip 1.2em
\ifthenelse{\equal{#1}{0}}%
{\labelwidth 0.5em}%
{\labelwidth 1.2em}%
\leftmargin\labelwidth \addtolength{\leftmargin}{\labelsep}
\ALG@tlm\z@%
}%
\parshape 2 \leftmargin \linewidth \continueindent \dimexpr\linewidth-\continueindent\relax
\setcounter{ALG@nested}{0}%
\ALG@beginalgorithmic%
}%
{% end{algorithmic}
% check if all blocks are closed
\ALG@closeloops%
\expandafter\ifnum\csname ALG@currentblock@\theALG@nested\endcsname=0\relax%
\else%
\PackageError{algorithmicx}{Some blocks are not closed!!!}{}%
\fi%
\ALG@endalgorithmic%
\end{list}%
}%
\makeatother
\begin{document}
\begin{algorithm}
\caption{This procedure calculates the \texttt{response} value}
\begin{algorithmic}[1]
\Procedure {CalculateResponse}{$pszMethod$,
$pszDigestUri$, $pszQop$, $pszUsername$, $pszRealm$,
$pszPassword$, $pszNonce$, $pszCNonce$, $pszNonceCount$}
\State $ha1 \gets DigestCalcHA1(pszUsername, pszRealm,
pszPassword)$
\State $ha2 \gets DigestCalcHA2(pszMethod, pszDigestUri,
pszQop)$
\State $response \gets calculateResponse(ha1,
ha2,pszMethod, pszDigestUri,\break pszQop,pszNonce,
pszNonceCount, pszCNonce)$
\EndProcedure
\Statex
\end{algorithmic}
\end{algorithm}
\end{document}
对环境标准定义的变化是,\parshape
在项目中添加了一个命令。缩进量由新的长度控制\continueindent
。现在您可以让 latex 自动为您换行,因此不妨看看这个问题在内联数学模式中允许在“,”处换行吗?使这个过程更加顺利,或者您可以手动\break
在公式中添加命令。我在上面的代码中提供了每个命令的示例。
对于文本中的中断,使用\newline
。
如果您需要在单行上额外缩进,则可以使用\break\hspace*{2em}
和\newline\hspace*{2em}
。
还可以考虑使用@JLDiaz 的建议,\raggedright
以避免线条拉长过多。
答案2
这只是对 Andrew Swann 的回答的一个小补充,即嵌套算法块级别也会获得适当的悬挂缩进(社区 wiki 也是如此)。\parshape
每次缩进更改时()都必须设置 now,\ALG@beginblock
而不仅仅是在环境开始时algorithmic
。
\documentclass[12pt,a4paper]{report}
\usepackage{algorithm}
\usepackage{algpseudocode}
% continuation indent patch http://tex.stackexchange.com/questions/78776/forced-indentation-in-algorithmicx
\newlength{\continueindent}
\setlength{\continueindent}{2em}
\usepackage{etoolbox}
\makeatletter
\newcommand*{\ALG@customparshape}{\parshape 2 \leftmargin \linewidth \dimexpr\ALG@tlm+\continueindent\relax \dimexpr\linewidth+\leftmargin-\ALG@tlm-\continueindent\relax}
\apptocmd{\ALG@beginblock}{\ALG@customparshape}{}{\errmessage{failed to patch}}
\makeatother
% end continuation indent patch
\begin{document}
\begin{algorithm}
\caption{This procedure is filler text, extracted from lipsum package}
\begin{algorithmic}[1]
\Procedure{Lipsum}{r}
\State Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut purus elit, vestibulum ut, placerat ac, adipiscing vitae, felis. Curabitur dictum gravida mauris.
\While{$r\not=0$}
\State Nam arcu libero, nonummy eget, consectetuer id, vulputate a, magna. Donec vehicula augue eu neque. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas.
\State Mauris ut leo. Cras viverra metus rhoncus sem. Nulla et lectus vestibulum urna fringilla ultrices.
\State $r \gets r - 1$
\EndWhile\label{euclidendwhile}
\State Phasellus eu tellus sit amet tortor gravida placerat. Integer sapien est, iaculis in, pretium quis, viverra ac, nunc.
\EndProcedure
\end{algorithmic}
\end{algorithm}
\end{document}
答案3
编辑:以下答案使用版本1.1
包algorithtmicx
。使用版本1.2
,续行不缩进。由于有更好的答案,因此寻找原因和补救措施毫无意义。
旧答案:
algorithmicx
只要您提供正确的输入,包确实可以正确完成工作。在您的例子中,您使用单个公式来包含所有参数列表。TeX 不允许在该公式中换行,因此它会打印在一行(过满)中。如果您将参数列表分隔在逗号分隔的独立公式列表中(每个变量一个),则可以允许换行,并且输出就是您想要的。
\documentclass[12pt,a4paper,english,twoside,titlepage]{report}
\usepackage{algorithm}
\usepackage{algpseudocode}
\begin{document}
\begin{algorithm}
\caption{This procedure calculates the \texttt{response} value}
\begin{algorithmic}[1]
\Procedure {CalculateResponse}{$pszMethod$, $pszDigestUri$, $pszQop$,
$pszUsername$, $pszRealm$, $pszPassword$, $pszNonce$,
$pszCNonce$, $pszNonceCount$}
\State $ha1 \gets DigestCalcHA1$ ($pszUsername$, $pszRealm$, $pszPassword$)
\State $ha2 \gets DigestCalcHA2$ ($pszMethod$, $pszDigestUri$, $pszQop$)
\State $response \gets calculateResponse$ ($ha1$, $ha2$,
$pszMethod$, $pszDigestUri$, $pszQop$ , $pszNonce$,
$pszNonceCount$, $pszCNonce$)
\EndProcedure
\Statex
\end{algorithmic}
\end{algorithm}
\end{document}
但请注意,结果仍然存在问题,即许多框未满且间距太大。您可以使用\raggedright
内部algorithmic
环境修复此问题:
\begin{algorithmic}[1]\raggedright