我有一个 tabularx 环境,我想在其中放入一个lstlisting
。但是 Latex 无法编译它。测试用例:
\documentclass[a4paper,12pt]{scrreprt}
\usepackage[utf8x]{inputenc}
\usepackage{tabularx}
\usepackage{listings}
\begin{document}
\begin{tabularx}{\textwidth}{lX}
First column &
\begin{lstlisting}
Sample text
\end{lstlisting} \\
\end{tabularx}
\end{document}
我总是得到一个! Argument of \lst@next has an extra }
。两个问题:
- 是什么原因造成的?
- 我该如何修复它?
答案1
您可以使用:
\begin{tabularx}{\textwidth}{lX}
First column &
\begin{lstlisting}^^J
Sample text^^J
\end{lstlisting} \\
\end{tabularx}
一般来说,所有逐字命令和环境都不能直接用于其他命令的参数。在tabularx
环境中,X
columntype 实际上作为宏参数工作(它首先将单元格内容读入框中)。listings
包部分修复了这个问题,但仍然有一些限制。请参阅“5.1 参数内的列表”手册listings
了解更多信息。
答案2
tabularx
必须在执行宏之前读取其内容,因此它不支持逐字代码。在外面做清单
tabularx
a) 使用带有的外部文件
\lstinputlisting
。可以结合使用来filecontents
自动生成此文件:\documentclass[a4paper,12pt]{scrreprt} \usepackage[utf8x]{inputenc} \usepackage{tabularx} \usepackage{listings} \usepackage{filecontents} \newsavebox\mybox \begin{document} % Writes content to temp file \begin{filecontents*}{\jobname.abc} Sample text \end{filecontents*} % Or just add the 'listings' environment here % and use `\input` instead. \begin{tabularx}{\textwidth}{lX} First column & \lstinputlisting{\jobname.abc} \\ \end{tabularx} \end{document}
b)将列表存储在盒子中并使用里面的盒子
tabularx
:\documentclass[a4paper,12pt]{scrreprt} \usepackage[utf8x]{inputenc} \usepackage{tabularx} \usepackage{listings} \newsavebox\mybox \begin{document} \begin{lrbox}{\mybox} \begin{lstlisting} Sample text \end{lstlisting} \end{lrbox} \begin{tabularx}{\textwidth}{lX} First column & \usebox\mybox \\ \end{tabularx} \end{document}