表格内、宏内的逐字

表格内、宏内的逐字

我想实现一个宏,它创建一个 2x2 表来显示程序的示例输入和输出(测试用例)。类似这样:

---------------------------
|input    | example input |
|--------------------------
|output   | example output|
---------------------------

“输入”和“输出”始终相同且只是纯文本,这没有问题。但是,示例输入和示例输出可能有多行和空格,我希望使用 \texttt 提供的字体。自然而然地,我想到了 verbatim 环境,我设法让它像这样工作(受到其他 StackExchange 帖子的启发):

\begin{tabular}{ |l|l| }
\hline
    Input &
    \begin{minipage}{3in}
        \begin{verbatim}
5
1 2 3 4 5
3
        \end{verbatim}
    \end{minipage}
    \\
    \hline
    Output &
    \begin{minipage}{3in}
        \begin{verbatim}
PRESENT
        \end{verbatim}
    \end{minipage}
    \\
    \hline
\end{tabular}

但是,我无法将其放入 \newcommand,以避免代码重复。此代码:

\newcommand\example[2]{
\begin{tabular}{ |l|l| }
\hline
    sample &
    \begin{minipage}{3in}
        \begin{verbatim}
            {#1}
        \end{verbatim}
    \end{minipage}
    \\
    \hline
    sample &
    \begin{minipage}{3in}
        \begin{verbatim}
            {#2}
        \end{verbatim}
    \end{minipage}
    \\
    \hline
\end{tabular}
}

调用宏(\example{1}{2})会出现一堆错误(失控的争论?缺少插入的 \endgroup。缺少} 插入。额外的对齐标签已更改为 \cr。)。

除了感觉这是一件微不足道的事情并且我无法让它工作之外,还感觉有太多的变通方法,结果看起来不吸引人。只要它使用少量的库,我愿意接受完全不同的方法,因为我想在探索奇特的软件包之前先习惯 LaTeX 的基本功能。

谢谢你!

答案1

只要你不尝试

\Example{...\end{verbatim}...}{...}

或者

\Example{...}{...\end{verbatim}...}

\scantokens,如下例所示,在里面嵌套逐字(+v-type)参数可能会起到作用。

以下示例的另一个重要限制是,\Example当作为其他宏的替换文本传递或来自其他宏的参数时,无法成功使用。
更一般的说法,也涵盖这两种情况:
\Example在以下情况下无法成功使用:由于在执行过程中读取/标记 .tex 输入,因此构成其参数的标记不是由于读取/标记 .tex 输入而产生的\Example,因此具有由引入的临时类别代码设置,但在扩展其他事物/宏的过程中\Example被传递。\Example

例如,

\newcommand\macro[1]{#1}...\macro{...\Example{arg 1}{arg 2}...}

不会成功。

\newcommand\macro{...\Example{arg 1}{arg 2}...}...\macro

也行不通。

以下是代码:

\documentclass{article}
\usepackage{etoolbox}

\begingroup
\NewDocumentCommand\Example{+v+v}{%
  \endgroup
  \NewDocumentCommand\Example{+v+v}{%
    \begin{tabular}{|l|l|}%
    \hline
    Input&%
    \begin{minipage}[t]{3in}%
    \begingroup
    \newlinechar=\endlinechar
    \scantokens{#1##1#2}%
    \vskip\dp\strutbox
    \hrule height 0cm width 0cm %
    \end{minipage}%
    \\%
    \hline
    Output&%
    \begin{minipage}[t]{3in}%
    \begingroup
    \newlinechar=\endlinechar
    \scantokens{#1##2#2}%
    \vskip\dp\strutbox
    \hrule height 0cm width 0cm %
    \end{minipage}%
    \\%
    \hline
    \end{tabular}%
  }%
}%
\newlinechar=\endlinechar
\Example{\endgroup
\expandafter\preto\expandafter{\csname @verbatim\endcsname}{\topsep=0pt \partopsep=0pt }%
\begin{verbatim}
}{
\end{verbatim}
%}%

% \expandafter\show\csname Example code\endcsname

\begin{document}

\noindent
\Example{5
1 2 3 4 5
3}{PRESENT}

\bigskip\noindent\hrule\bigskip

\noindent
\Example{e
a b c d e
c}{PRESENT, TOO}

\end{document}

在此处输入图片描述

如果在 .tex-source-code/.tex-input-file 代码中表示参数的代码\Example跨行,则这些行的缩进很重要。
水平制表符的处理与 LaTeX 的逐字模式一样奇怪。

相关内容