![我怎样才能将 lstlisting 块放入 subfloat 块中?](https://linux22.com/image/242700/%E6%88%91%E6%80%8E%E6%A0%B7%E6%89%8D%E8%83%BD%E5%B0%86%20lstlisting%20%E5%9D%97%E6%94%BE%E5%85%A5%20subfloat%20%E5%9D%97%E4%B8%AD%EF%BC%9F.png)
我正在尝试编译我的文档,但它爆炸了。我将其缩小到此部分:
\begin{figure}[h]
\caption{These are my awesome code snippets}
\subfloat[This code runs every cycle.]{
\begin{lstlisting}
static uint64_t i = 0;
void every_cycle()
{
if (i > 0)
i--;
}
\end{lstlisting}
}
\hfill
\subfloat[This code runs whenever.]{
\begin{lstlisting}
uint64_t next_num()
{
return (i += 0x100);
}
\end{lstlisting}
}
\label{fig:algOffset}
\end{figure}
但是,当我尝试编译时,我得到了
! Argument of \lst@next has an extra }.
<inserted text>
\par
l.181 }
从lstlisting
和subfloat
文档中,我看不出我所做的任何事都应该被禁止。为什么这段代码编译失败?有没有比lstlisting
显示代码片段更好的包可用?
答案1
可以先将列表装箱,然后再将它们用于\subfloat
。从技术上讲,这可能类似于@Torbjørn 的解决方案。装箱是通过lrbox
环境实现的。
\documentclass{article}
\usepackage{listings}% http://ctan.org/pkg/listings
\usepackage{subfig}% http://ctan.org/pkg/subfig
\usepackage{lipsum}% http://ctan.org/pkg/lipsum
\begin{document}
\lipsum[1]
% ======= STORE/BOX LISTINGS =======
\newsavebox{\firstlisting}
\begin{lrbox}{\firstlisting}% Store first listing
\begin{lstlisting}
static uint64_t i = 0;
void every_cycle()
{
if (i > 0)
i--;
}
\end{lstlisting}
\end{lrbox}
\newsavebox{\secondlisting}
\begin{lrbox}{\secondlisting}% Store second listing
\begin{lstlisting}
uint64_t next_num()
{
return (i += 0x100);
}
\end{lstlisting}
\end{lrbox}
\begin{figure}[h]
\caption{These are my awesome code snippets} \label{fig:algOffset}
\subfloat[This code runs every cycle.]{\usebox{\firstlisting}} \hfill%
\subfloat[This code runs whenever.]{\usebox{\secondlisting}}
\end{figure}
\lipsum[2]
\end{document}
答案2
我不知道为什么lstlistings
环境会失败,但是将代码放在外部文件中并使用\lstinputlisting{filename}
它就可以了。
环境filecontents*
会将其内容写入code.txt
(如果文件存在,则覆盖文件)。感谢 Werner 的建议。
\documentclass{article}
\usepackage{listings}
\usepackage{subfig}
\usepackage{filecontents}
\begin{filecontents*}{code.txt}
static uint64_t i = 0;
void every_cycle()
{
if (i > 0)
i--;
}
uint64_t next_num()
{
return (i += 0x100);
}
\end{filecontents*}
\begin{document}
\begin{figure}[h]
\caption{These are my awesome code snippets}
\subfloat[This code runs every cycle.]{\lstinputlisting[lastline=6]{code.txt}}
\hfill
\subfloat[This code runs whenever.]{\lstinputlisting[firstline=8]{code.txt}}
\label{fig:algOffset}
\end{figure}
\end{document}
firstline=n
并且lastline=n
按照您的想法,它定义了要包含在列表中的文件中的第一行/最后一行。
答案3
对我有用的解决方案是在子浮点数内使用 parbox:
\begin{figure}[h]
\centering
\subfloat[Example lstlisting]{%
\parbox{6cm}{
\lstinputlisting[language=json]{exampleJSON.json}
}
}
\hfill
\subfloat[Other Table]{%
\begin{tabular}{l|l}
\textbf{A} & \textbf{B} \\ \hline
C & D
\end{tabular}
}
\caption{lstlisting next to a table in subfloats}
\end{figure}