\newenvironment 中的表格环境

\newenvironment 中的表格环境

我正在写一本书,在书中我们让读者参考 CD-ROM 中的源代码,并告诉他编译器和运行程序的结果。以下是一个例子:

预期的

由于这个“模板”在书中出现了很多次,我决定为它定义一个新的环境(\cprotEnv下面使用的命令来自包保护):

\newenvironment{CDROM}[2]
    {\begin{tabular}{| m{0.5in} m{0.3in} m{5in} |}
        \hline
        \includegraphics[width=0.5in]{CD-ROM.pdf} && #1 \\
        & \includegraphics[width=0.3in]{Hand.pdf} &
        We used the free compiler #2. \\
        & \includegraphics[width=0.3in]{Hand.pdf} &
    }
    {\\ \hline \end{tabular}}

\cprotEnv\begin{CDROM}{\verb"\SampleCodes\C++\GetPageSize"}{Open Watcom}
The page size for this system is 4096 bytes.
\end{CDROM}

然而,输出有些奇怪:

制作

您能帮助我获得预期的结果吗?

答案1

问题是,它\cprotEnv被认为是针对特定环境的,例如,align不接受其主体中的逐字记录。如果您的方案总是像示例一样,有两个“手写行”,那么定义命令比定义环境更容易:

\newcommand{\CDROM}[3]
    {\begin{tabular}{| m{0.5in} m{0.3in} m{5in} |}
        \hline
        \includegraphics[width=0.5in]{CD-ROM.pdf} && #1 \\
        & \includegraphics[width=0.3in]{Hand.pdf} &
        We used the free compiler #2. \\
        & \includegraphics[width=0.3in]{Hand.pdf} & #3\\ \hline \end{tabular}}

然后使用它作为

\cprotect[mmm]\CDROM{\verb"\SampleCodes\C++\GetPageSize"}{Open Watcom}
  {The page size for this system is 4096 bytes.}

让你摆脱困境的一种\cprotect方法

\newcommand{\CDROM}{\begingroup\catcode`\#=12 \xCDROM}
\newcommand{\xCDROM}[3]
    {\begin{tabular}{| m{0.5in} m{0.3in} m{5in} |}
        \hline
    \includegraphics[width=0.5in]{CD-ROM.pdf} &&
          \ttfamily\catcode`\\=12 \catcode`\ =9
          \scantokens{#1} \\
        & \includegraphics[width=0.3in]{Hand.pdf} &
        We used the free compiler #2. \\
        & \includegraphics[width=0.3in]{Hand.pdf} & #3\\ \hline \end{tabular}\endgroup}

现在

\CDROM{\SampleCodes\C++\GetPageSize}{Open Watcom}
  {The page size for this system is 4096 bytes.}
\CDROM{\SampleCodes\C#\GetPageSize}{}{}

无需 即可工作\verb。但是,这假设您不需要在“逐字”第一个参数中添加空格。

通过将命令分成两部分,我们可以确保#字符不会加倍,就像我们\catcode`\#=12与其他设置一起添加时那样。

相关内容