这个问题是在关于 tcolorboxes 内部算法的问题。
在提问之前,最好先解释一下我现在所拥有的。我有一个包含算法的文件q-learning.tex
。
\documentclass{standalone}
\usepackage[utf8]{inputenc}
\usepackage[longend]{algorithm2e}
\usepackage{textgreek}
\usepackage{amssymb}
\begin{document}
\begin{algorithm}[H]
Algorithm parameters: step size $\alpha \in (0, 1]$\;
Initialize $Q(s, a)$, for all $s \in \mathcal{S}^+, a \in \mathcal{A}(s)$, arbitrarily except that $Q(\mathrm{terminal}, \cdot) = 0$\;
\ForEach{episode}{
Initialize S\;
\ForEach{step of episode}{
Choose $A$ from $S$ using policy derived from $Q$ (e.g. \textepsilon-greedy)\;
Take action $A$, observe $R$, $S'$\;
$Q(S, A) \leftarrow Q(S, A) + \alpha [R + \gamma \max_a Q(S', a) - Q(S, A)]$\;
$S \leftarrow S'$\;
}
}
\end{algorithm}
\end{document}
并且我将其包含到我的主文件中standalone
。
\documentclass{book}
\usepackage[utf8]{inputenc}
\usepackage[subpreambles,sort]{standalone}
\usepackage{tcolorbox}
\usepackage{algorithm2e}
\begin{document}
\begin{tcolorbox}[fonttitle=\bfseries, title=Q-learning for estimating $\pi \approx \pi^*$]
\input{q-learning}
\end{tcolorbox}
\end{document}
裁剪后的效果如下。
algorithm2e
我不知道为什么我需要再次加载,但这不是现在困扰我的原因。我希望对算法进行编号,然后列出它们\listofalgorithms
,并且我还希望能够引用这种图形。但是,在这个实现中,我没有标题,也不知道把它放在哪里。标题应该是title
的字段tcolorbox
,即标题应该显示为“算法 3.2 Q 学习...”,但标签应该引用里面的算法。
总结一下:
- 标签应该引用算法,我应该能够用列出算法列表
\listofalgorithms
。 - 算法的说明应该显示为
tcolorbox
到目前为止,我所做的最佳更改是在算法中插入一个空白标题和一个标签,并在标题中引用它。它也会正确显示在算法列表中。但是,我无法删除底部烦人的“算法 1:”。
这是视觉效果:
代码如下:
q-学习.tex
\documentclass{standalone}
\usepackage[utf8]{inputenc}
\usepackage[longend]{algorithm2e}
\usepackage{textgreek}
\usepackage{amssymb}
\begin{document}
\begin{algorithm}[H]
Algorithm parameters: step size $\alpha \in (0, 1]$\;
Initialize $Q(s, a)$, for all $s \in \mathcal{S}^+, a \in \mathcal{A}(s)$, arbitrarily except that $Q(\mathrm{terminal}, \cdot) = 0$\;
\ForEach{episode}{
Initialize S\;
\ForEach{step of episode}{
Choose $A$ from $S$ using policy derived from $Q$ (e.g. \textepsilon-greedy)\;
Take action $A$, observe $R$, $S'$\;
$Q(S, A) \leftarrow Q(S, A) + \alpha [R + \gamma \max_a Q(S', a) - Q(S, A)]$\;
$S \leftarrow S'$\;
}
}
\caption[Q-learning for estimating $\pi \approx \pi^*$]{}
\label{alg:q-learning}
\end{algorithm}
\end{document}
主文本
\documentclass{book}
\usepackage[utf8]{inputenc}
\usepackage[subpreambles,sort]{standalone}
\usepackage{tcolorbox}
\usepackage{algorithm2e}
\begin{document}
\frontmatter
\listofalgorithms
\mainmatter
\chapter{First chapter}
\begin{tcolorbox}[fonttitle=\bfseries, title=Algorithm \ref{alg:q-learning}: Q-learning for estimating $\pi \approx \pi^*$]
\input{q-learning}
\end{tcolorbox}
\end{document}
当然,现在的结果还不适合我的需要。
答案1
找到了解决方案。虽然不完美,但还是有用的。
q-学习.tex
\documentclass{standalone}
\usepackage[utf8]{inputenc}
\usepackage[longend]{algorithm2e}
\usepackage{textgreek}
\usepackage{amssymb}
\begin{document}
\begin{algorithm}[H]
Algorithm parameters: step size $\alpha \in (0, 1]$\;
Initialize $Q(s, a)$, for all $s \in \mathcal{S}^+, a \in \mathcal{A}(s)$, arbitrarily except that $Q(\mathrm{terminal}, \cdot) = 0$\;
\ForEach{episode}{
Initialize S\;
\ForEach{step of episode}{
Choose $A$ from $S$ using policy derived from $Q$ (e.g. \textepsilon-greedy)\;
Take action $A$, observe $R$, $S'$\;
$Q(S, A) \leftarrow Q(S, A) + \alpha [R + \gamma \max_a Q(S', a) - Q(S, A)]$\;
$S \leftarrow S'$\;
}
}
\caption[Q-learning for estimating $\pi \approx \pi^*$]{}
\label{alg:q-learning}
\end{algorithm}
\end{document}
主文本
\documentclass{book}
\usepackage[utf8]{inputenc}
\usepackage[subpreambles,sort]{standalone}
\usepackage{tcolorbox}
\usepackage{algorithm2e}
\NoCaptionOfAlgo
\usepackage{hyperref}
\begin{document}
\frontmatter
\listofalgorithms
\mainmatter
\chapter{First chapter}
\begin{tcolorbox}[fonttitle=\bfseries, title=Algorithm~\ref*{alg:q-learning}: Q-learning for estimating $\pi \approx \pi^*$]
\input{q-learning}
\end{tcolorbox}
\end{document}
基本上,它的工作原理如下:
\NoCaptionOfAlgo
不会在标题中打印算法及其编号。此宏仅适用于“algoruled”或“ruled”算法(请参阅文档)。- 在算法中,我只设置了标签和可选参数
\caption
。第一个用于参考,第二个用于在打印的算法列表中显示\listofalgorithms
。 - 我在 tcolorbox 的标题中手动输入了标题前缀以及算法编号。如果
hyperref
加载了该包,我建议使用带星号的版本\ref
以避免超链接。
这个解决方案很好用。唯一让我不满意的是最后一点:标题、参考资料和标题中的标题前缀都是手动设置的。这意味着很容易出错。如果有人能提出更好的自动化解决方案,我将不胜感激。