如何以纯 TeX 显示代码片段

如何以纯 TeX 显示代码片段

假设我们有一个 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

您将获得与上一个答案相同的“彩色”结果。

相关内容