我怎样才能将 lstlisting 块放入 subfloat 块中?

我怎样才能将 lstlisting 块放入 subfloat 块中?

我正在尝试编译我的文档,但它爆炸了。我将其缩小到此部分:

\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     }

lstlistingsubfloat文档中,我看不出我所做的任何事都应该被禁止。为什么这段代码编译失败?有没有比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}

相关内容