假设我们有一个 C++ 源代码,如下所示:
void dfs(int p){
if(o[p]) return;
o[p]=1;
c[p] = t++;
for(int i=0; i<s[p].size(); ++i){
dfs(s[p][i]);
}
}
我们怎样才能在纯 TeX 中正确显示此源代码?
解决方案应该保留所有空格、包含所有符号并使用固定宽度字体。
答案1
就像是
\def\verbatim{%
\begingroup
\def\do##1{\catcode`##1=12 }%
\dospecials
\obeylines
\obeyspaces
\tt
\verbatimaux
}
\begingroup
\catcode`\|=0 %
\catcode`\\=12 %
|gdef|verbatimaux#1\endverbatim{#1|endverbatim}%
|endgroup
\def\endverbatim{\endgroup}
{\obeyspaces\gdef {\ }}% Omit this for 'explicit' spaces
\verbatim
void dfs(int p){
if(o[p]) return;
o[p]=1;
c[p] = t++;
for(int i=0; i<s[p].size(); ++i){
dfs(s[p][i]);
}
}
\endverbatim
\bye
应该为你提供:LaTeXverbatim
环境的简化版本。另请参阅TeXbook|
(第 421 页),其中描述了 Knuth 如何为这本书本身做到这一点。(他要求每一行都使用...进行标记|
。)
答案2
打破连字符并遵守空行的版本:
\def\verbatim{%
\begingroup
\def\do##1{\catcode`##1=12 }%
\dospecials
\otherspecial\ {\ }%
\otherspecial\-{-\kern0pt }%
\otherspecial\`{\lq\kern0pt }%
\otherspecial\'{\rq\kern0pt }%
\otherspecial\^^M{\endgraf\ifblankline\vskip\baselineskip\fi\blanklinetrue}%
\parindent0pt\medskip
\everypar{\blanklinefalse}
\tt\verbatimaux
}
\newif\ifblankline
\begingroup\endlinechar=-1
\catcode`\|=0 %
\catcode`\\=12 %
|gdef|verbatimaux#1\endverbatim#2{#1|endgroup|par|medskip}%
|endgroup%
\def\otherspecial#1#2{%
\begingroup\lccode`~=`#1\relax
\lowercase{\endgroup\def~}{#2}%
\catcode`#1=\active
}
Some text some text some text some text some text some text.
Some text some text some text some text some text some text.
Some text some text some text some text some text some text.
\verbatim
void dfs(int p){
if(o[p]) return;
o[p]=1;
c[p] = t++;
for(int i=0; i<s[p].size(); ++i){
dfs(s[p][i]);
}
}
-- --- `` '' `? `!
\endverbatim
Some text some text some text some text some text some text.
Some text some text some text some text some text some text.
Some text some text some text some text some text some text.
\bye
答案3
当使用 opmac 时\begtt
...\endtt
环境就可以使用了:
\input opmac
aha
\begtt
void dfs(int p){
if(o[p]) return;
o[p]=1;
c[p] = t++;
for(int i=0; i<s[p].size(); ++i){
dfs(s[p][i]);
}
}
// -- --- `` '' `? `!
\endtt
\bye
此外,你可以从这个 Opmac 技巧你也可以
\hisyntax{C}
在前面添加\begtt
,得到以下结果:
答案4
在 OpTeX 中,\hisyntax
宏已集成到格式中,因此你可以编写
\fontfam[lm]
\begtt \hisyntax{C}
void dfs(int p){
if(o[p]) return;
o[p]=1;
c[p] = t++;
for(int i=0; i<s[p].size(); ++i){
dfs(s[p][i]);
}
}
// -- --- `` '' `? `!
\endtt
\bye
您将获得与上一个答案相同的“彩色”结果。