这示例展示了如何制作带有源代码语法高亮的 PDF 幻灯片。示例使用了beamer
和 (大概)pdflatex
。
其他示例显示了使用 的 HTML 输出语法着色htlatex
。这是一个令人不快的临时解决方案
- 它阻止调用
pdflatex
同一个 LaTeX 文件 - 我们必须通过实验来
ectt-1000
找到 - 一个为 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
会得到一个输出
并进行处理htlatex
得到另一个。
你能建议一种方法来让这个临时解决方案更易于使用吗?
- 将两种“蓝色”关联起来——尽管最终一种是在 LaTeX 的颜色包中定义的,另一种是在 HTML 中定义的,
- 通过句法类别使
\Css
定义指向颜色, 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
结果如下: