我想实现一个宏,它创建一个 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 的逐字模式一样奇怪。