该代码无法编译:
\documentclass{article}
\usepackage{listings}
\lstset{
language=C,
basicstyle=\small
}
\begin{document}
lorem ipsum\footnote{%
\begin{lstlisting}
// some C code or whatever...
printf("Blah blah\n");
\end{lstlisting}}
\end{document}
它说Illegal parameter number in definition of \lst@insertargs.
我知道listings
它对去向很挑剔,但那里必须是一种将列表塞进脚注的方法,对吗?
(这是一个 MWE,我的 tex 文件有点复杂;我的实际错误是,Paragraph ended before \lst@next was complete.
但希望它们相关;我无法使用 MWE 得到这个错误。)
答案1
另一个选择是使用cprotect
包,并替换\footnote
为\cprotect\footnote
。
\documentclass{article}
\usepackage{cprotect}
\usepackage{listings}
\lstset{
language=C,
basicstyle=\small
}
\begin{document}
lorem ipsum\cprotect\footnote{%
\begin{lstlisting}
// some C code or whatever...
printf("Blah blah\n");
\end{lstlisting}}
\end{document}
主要优点是许多宏可以\cprotect
像脚注一样使用 -ed 命令。主要缺点是(目前)每个\cprotect
-ed 命令都会生成一个辅助文件。
你可以找到这个CTAN 上的软件包(它相当新)。
答案2
\usepackage{bigfoot}
应该可以解决问题。它的功能远不止这些,但让脚注文本仅被解析一次(就像普通 TeX 用它自己的\footnote
宏所做的那样)就是其中之一。
如果你想要更轻量级的答案(大多数需要更多的手动工作,但不会过多地干扰 LaTeX 的内部结构),https://texfaq.org/FAQ-verbwithin给出了一些。
答案3
传递列表(和其他逐字材料)的一种万无一失的方法是使用一个盒子,而且不需要任何额外的包或实验性功能:
\documentclass{article}
\usepackage{listings}
\lstset{
language=C,
basicstyle=\small
}
\newsavebox{\LstBox}
\begin{document}
\begin{lrbox}{\LstBox}
\begin{lstlisting}
// some C code or whatever...
printf("Blah blah\n");
\end{lstlisting}
\end{lrbox}
%
lorem ipsum\footnote{\usebox{\LstBox}}
\end{document}
答案4
列表作者描述了在参数中使用列表的困难,并提供了一种“实验性”的方法来处理它(参见用户手册第 46 页)。
\documentclass{article}
\usepackage{listings}
\lstset{
language=C,
basicstyle=\small
}
\usepackage{fancyvrb}
\begin{document}
lorem\footnote{\lstinline{var i:integer;} and
\lstinline!protected\ \ spaces! and
\fbox{\lstinline!\\\{\}\%!}}
ipsum \VerbatimFootnotes
We can put verbatim\footnote{\verb+_Yes!_+} text in footnotes
\end{document}
fancyvrb
您还可以使用提供 的包,\VerbatimFootnote
如上面的极简图所示。