HTML 演示文稿中的语法突出显示

HTML 演示文稿中的语法突出显示

示例展示了如何制作带有源代码语法高亮的 PDF 幻灯片。示例使用了beamer和 (大概)pdflatex

语法高亮的代码

其他示例显示了使用 的 HTML 输出语法着色htlatex。这是一个令人不快的临时解决方案

  1. 它阻止调用pdflatex同一个 LaTeX 文件
  2. 我们必须通过实验来ectt-1000找到
  3. 一个为 css 类别定义颜色,而不是为代码语法类别定义颜色

但它有效。

下面的代码重新审视了这个问题并要求做得更好。

\documentclass{article}
\usepackage{color}
\usepackage{listings}
\usepackage[T1]{fontenc}

\lstset{
    basicstyle=\ttfamily,
    language=C++,
    keywordstyle=\rmfamily\bfseries,
    commentstyle=\sffamily,
}

\begin{document}

\Css{div.lstlisting .ectt-1000 {font-family: monospace;color:blue}}
\Css{div.lstlisting .ecss-1000 {font-family: monospace;color:green}}
\Css{div.lstlisting .ecbx-1000 {font-family: monospace;color:red}}

\section*{Inserting source code}
\begin{lstlisting}
#include<stdio.h>
#include<iostream>
// A comment
int main(void)
{
    printf("Hello World\n");
    return 0;
}
\end{lstlisting}

\end{document}

现在注释掉这些\Css行并运行pdflatex会得到一个输出

pdflatex 输出是语法彩色的

并进行处理htlatex得到另一个。

htlatex 生成的语法颜色

你能建议一种方法来让这个临时解决方案更易于使用吗?

  1. 将两种“蓝色”关联起来——尽管最终一种是在 LaTeX 的颜色包中定义的,另一种是在 HTML 中定义的,
  2. 通过句法类别使\Css定义指向颜色,
  3. pdflatex使得在写入/调试时处理文件成为可能(htlatex速度相当慢)

答案1

正确的解决方案是在列表中的每个单词周围发出 html 标签,或者更好的是,在相同语法样式的块周围发出 html 标签,并根据语法样式设置类属性。

不幸的是,列表源代码很复杂,我不知道该怎么做,所以我将提供一些帮助来简化颜色定义。

创建文件textstyle4ht.sty

\RequirePackage{xcolor}

% extract current color as hexadecimal value
\newcommand\tsf@getColor[1][.]{
    % colorname `.` holds current color
    \extractcolorspec{.}{\tsf@color}
    \expandafter\convertcolorspec\tsf@color{HTML}\tsf@color
    %\tmpcolor
}

% write css color for given css selector
\newcommand\CssColor[1]{%
    % save current color
    \tsf@getColor%
    \Css{#1{color:\#\tsf@color;}}%
}

通过这个包,我们能够获取当前颜色并将其保存到文件中css

\Css在您的示例中,文档中有命令。这是一种不好的风格,正确的做法是提供带有tex4ht配置的配置文件。

hello.cfg

\RequirePackage{textstyle4ht}
\Preamble{xhtml}
\begin{document}
\makeatletter
\newcommand\LstCss[2]{%
    \bgroup%
        \csname lst@#2\endcsname%
        \CssColor{#1}%
    \egroup%
}
\makeatother
\LstCss{div.lstlisting .ecbx-1000}{keywordstyle}
\LstCss{div.lstlisting .ecss-1000}{commentstyle}
\LstCss{div.lstlisting .ectt-1000}{basicstyle}
\EndPreamble

在此文件中,textstyle4ht需要我们的包,并\LstCss提供了新命令。您的版本与此版本的区别在于使用了为样式定义的真实颜色。您仍然需要class为每个标识符样式找到相应的属性。

文档稍作修改:

\documentclass{article}
\usepackage{xcolor}
\usepackage{listings}
\usepackage[T1]{fontenc}

\lstset{
    basicstyle=\color{blue}\ttfamily,
    language=C++,
    keywordstyle=\color{red}\rmfamily\bfseries,
    commentstyle=\color{green}\sffamily,
}

\begin{document}

\section*{Inserting source code}
\begin{lstlisting}
#include<stdio.h>
#include<iostream>
// A comment
int main(void)
{
    printf("Hello World\n");
    return 0;
}
\end{lstlisting}

\end{document}

编译

htlatex filename hello

结果如下:

在此处输入图片描述

相关内容