在 tabularx 里面列出吗?

在 tabularx 里面列出吗?

我有一个 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. 是什么原因造成的?
  2. 我该如何修复它?

答案1

您可以使用:

\begin{tabularx}{\textwidth}{lX}
 First column &
\begin{lstlisting}^^J
  Sample text^^J
\end{lstlisting} \\
\end{tabularx}

一般来说,所有逐字命令和环境都不能直接用于其他命令的参数。在tabularx环境中,Xcolumntype 实际上作为宏参数工作(它首先将单元格内容读入框中)。listings包部分修复了这个问题,但仍然有一些限制。请参阅“5.1 参数内的列表”手册listings了解更多信息。

答案2

  1. tabularx必须在执行宏之前读取其内容,因此它不支持逐字代码。

  2. 在外面做清单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} 
    

相关内容