我正在写一本书,在书中我们让读者参考 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
与其他设置一起添加时那样。