我有两个问题与我在 LaTeX 中使用的算法环境有关。
例子
让我先从一个示例文件开始,以说明我正在寻找的内容。下面的 MWE 中的算法 1 实现了我想要的功能:它跨越了文本宽度的 95%,居中,具有该宽度的规则,并且缩进是我想要的方式,如下图所示。
\documentclass{memoir}
%% Memoir layout setup
%\setulmarginsandblock{3cm}{3cm}{*}
%\setlrmarginsandblock{2.25cm}{2.25cm}{*}
%\checkandfixthelayout
%% packages
\usepackage{etoolbox}
\usepackage{enumitem}
\usepackage{lipsum}
%% algorithm environment
\usepackage[vlined,ruled,algo2e]{algorithm2e}
\SetAlCapHSkip{0pt}
\setlength{\algoheightrule}{1pt}
\setlength{\algotitleheightrule}{0.7pt}
\newcommand{\marginwidth}{0.025\linewidth}
\newcommand{\algoboxwidth}{0.95\linewidth}
\setlength{\algomargin}{0.0em}
\SetCustomAlgoRuledWidth{0.95\linewidth}
\makeatletter
\patchcmd{\@algocf@start}{%
\begin{lrbox}{\algocf@algobox}%
}{%
\rule{\marginwidth}{\z@}%
\begin{lrbox}{\algocf@algobox}%
\begin{minipage}{\algoboxwidth}%
}{}{}
\patchcmd{\@algocf@finish}{%
\end{lrbox}%
}{%
\end{minipage}%
\end{lrbox}%
}{}{}
% extend caption all the way to the right
\renewcommand{\algocf@makecaption@ruled}[2]{%
\global\sbox\algocf@capbox{\hskip\AlCapHSkip%
\setlength{\hsize}{\columnwidth}% restored on exit of sbox
\addtolength{\hsize}{-2\AlCapHSkip}% add equal margin to both sides
\vtop{\algocf@captiontext{#1}{#2}}}% then caption is not centered
}%
\makeatother
\begin{document}
\lipsum[1]
\begin{algorithm2e}[H]
\caption{A simple algorithm}
\SetKwInOut{Input}{Input}
\Input{Give me some input.}
\smallskip
\ForEach{outer iteration}{
\ForEach{inner iteration}{
calculate some cool stuff
}
more cool stuff
}
\Return{got it}
\end{algorithm2e}
\lipsum[1]
\begin{algorithm2e}[H]
\caption{This is a very long caption. This is a very long caption. This is a very long caption. This is a very long caption. This is a very long caption. This is a very long caption. This is a very long caption. This is a very long caption. This is a very long caption. This is a very long caption. This is a very long caption.}
\SetKwInOut{Input}{Input}
\Input{\lipsum[2]}
\smallskip
\begin{enumerate}[itemsep=0.3em, labelwidth=0.9em, leftmargin=!, topsep=0pt]
\item \lipsum[2]
\item \lipsum[2]
\end{enumerate}
\end{algorithm2e}
\lipsum[2]
\end{document}
问题
请注意布局设置,即三行
\setulmarginsandblock{3cm}{3cm}{*} \setlrmarginsandblock{2.25cm}{2.25cm}{*} \checkandfixthelayout
在上述文档中被注释掉了。如果使用该设置,则限制算法的线条将不再延伸到线条宽度的 95%。当然,我可以摆弄 中的因子
\SetCustomAlgoRuledWidth{0.95\linewidth}
,但我想应该有一个通用的解决方案可以真正为我提供 95% 的线条宽度。此外,我很高兴了解为什么行为不像预期的那样。
下图显示了这种情况。
在算法 2 中,我们在标题、输入和算法主体中包含了更多文本,但有两点我不喜欢:
文本宽度:标题已手动更正为采用完整算法宽度,我该如何对输入执行此操作?算法主体似乎具有正确的宽度。
文本对齐:有没有办法证明输入和算法正文的合理性?我尝试了以下建议:algorithm2e 完全合理的输入/输出块用于输入,但是由于某些我无法理解的原因,在我的情况下,这会在输入上方引入额外的间距。
再次,下图显示了事物的样子。
答案1
一些分析供您参考:使用(浮动)环境enumerate
内的环境algorithm2e
似乎会破坏正常对齐,请参见此处维基百科。
比较:
- 正常
enumerate
环境 enumerate
algorithm2e
环境中的环境
\documentclass{article}
\usepackage[vlined,ruled,algo2e]{algorithm2e}
\usepackage{blindtext}
\begin{document}
\begin{enumerate}
\item \blindtext
\end{enumerate}
\begin{algorithm2e}[H]
\caption{some enum in algo}
\begin{enumerate}
\item \blindtext
\end{enumerate}
\end{algorithm2e}
\end{document}
这增加了我对在算法中使用枚举的怀疑:这是什么意思?算法在那里执行什么样的操作?
建议:在算法中使用一些清晰的动作语句(如plotting(thingies);
),并在稍后更详细地解释(plotting(thingies)
是一个复杂的过程,涉及这个和那个......),如果这是您想要的。
附言:如果你坚持使用里面的枚举,请尝试一下\parbox
,例如像这样,我不知道它是否会有副作用:
\documentclass{article}
\usepackage[vlined,ruled,algo2e]{algorithm2e}
\usepackage{blindtext}
\begin{document}
\begin{enumerate}
\item \blindtext
\end{enumerate}
\begin{algorithm2e}[H]
\caption{some enum in algo}
\begin{enumerate}
\item \blindtext
\item \parbox[t]{8cm}{\blindtext}
\end{enumerate}
\end{algorithm2e}
\end{document}