我正在使用tcolorbox
代码listings
格式化,它在 pdf 中运行良好,但是这个包不适用于 tex4ht(它会产生无效的输出)。
我很难弄清楚在使用 tex4ht 与 pdf 进行编译时需要告诉 Latex 要做什么的乳胶魔法代码,而无需复制代码片段本身。
举个小例子会有所帮助。目前这是我所拥有的
\documentclass[12pt]{book}%
...
\begin{document}
\newtcblisting{....}{....code is here ...}
问题是,这\newtcblisting
是一个类似于来自包的环境tcolorbox
,上面的完整定义如下(MWE)
\documentclass[12pt]{book}%
\usepackage[T1]{fontenc}
\usepackage{color}
\usepackage{listings}
\usepackage{tcolorbox}
\tcbuselibrary{listings}
\usepackage{matlab-prettifier}
\definecolor{bg}{RGB}{240,240,240}
\usepackage{upquote} %to fix string quotes
\usepackage{fancyvrb}
\newtcblisting{matlab}[1]{
nobeforeafter,colback=bg,size=minimal,hbox,listing only,
listing options={style=Matlab-editor,basicstyle=\ttfamily#1,
breaklines= false,escapechar= `,mlshowsectionrules = true
}}
\begin{document}
\begin{matlab}{\small}
clear all;
m_zeros = [-1 -2];
m_poles = [0 -4 -6];
\end{matlab}
\end{document}
问题是,如何定义新的环境,以便我可以在 tex4ht 中做一些不同的事情,而不必重复代码本身。即我当然可以这样做:
...
\ifdefined\HCode
\begin{verbatim}%font size option not important, so no need to pass it
... code listing....
\end{verbatim}
\else
\begin{matlab}{\small}%in pdf using tcblisting
... code listing....
\end{matlab}
\fi
.....
但我不想复制代码本身,因为代码片段可能很大,文档本身已经很复杂了。出于多种原因,我也不想将这些代码片段放在文件中,然后从文件中读取它们。
这就是我被困住的地方。我想这样做:
....
\ifdefined\HCode
\newenvironment{matlab}[1]
{\begin{verbatim}}
{\end{verbatim}}
\else
\newtcblisting{matlab}[1]{
....
但上面的方法不起作用,因为那里不允许使用 verbatim 环境。所以我尝试了这个
\DefineVerbatimEnvironment{matlabX}{Verbatim}{fontsize=\small}
\ifdefined\HCode
\newenvironment{matlab}[1]
{\begin{matlabX}}
{\end{matlabX}}
\else
\newtcblisting{matlab}[1]{
.....
这会导致 tex4ht 语法错误。我现在已经超出了能力范围,并且达到了我在 Latex 代码魔法方面的极限。不知道该怎么办。
问题是:是否可以定义新的环境,比如现在的逐字逐句,当 tex4ht 运行时启动,而不必重复代码本身?
使用命令将文件编译为 HTML make4ht foo.tex
,并在同一文件夹中生成foo.html
。使用 编译为 pdf lualatex foo.tex
。
答案1
listings
对于 tex4ht 的情况,既然你无论如何都要加载它,为什么不能直接使用新环境呢?
\documentclass[12pt]{book}%
\usepackage[T1]{fontenc}
\usepackage{color}
\usepackage{listings}
\usepackage{matlab-prettifier}
\definecolor{bg}{RGB}{240,240,240}
\usepackage{upquote} %to fix string quotes
\usepackage{fancyvrb}
\ifdefined\HCode
\lstnewenvironment{matlab}
{}
{}
\else
\usepackage{tcolorbox}
\tcbuselibrary{listings}
\newtcblisting{matlab}[1]{%
nobeforeafter,
colback=bg,
size=minimal,
hbox,
listing only,
listing options={%
style=Matlab-editor,
basicstyle=\ttfamily#1,
breaklines= false,
escapechar= `,
mlshowsectionrules = true,
},
}
\fi
\begin{document}
\begin{matlab}{\small}
clear all;
m_zeros = [-1 -2];
m_poles = [0 -4 -6];
\end{matlab}
\end{document}
答案2
这是使用包的一种方法moreverb
:
\documentclass[12pt]{book}%
\usepackage[T1]{fontenc}
\usepackage{color}
\usepackage{listings}
\usepackage{tcolorbox}
\tcbuselibrary{listings}
\usepackage{matlab-prettifier}
\definecolor{bg}{RGB}{240,240,240}
\usepackage{upquote} %to fix string quotes
\newtcblisting{matlab}[1]{
nobeforeafter,colback=bg,listing only,
listing options={style=Matlab-editor,basicstyle=\ttfamily#1,
breaklines= false,escapechar= `,mlshowsectionrules = true
}}
\def\putVerb{%
\HCode{<PRE>}%
\verbatiminput{a.tex}%
\HCode{</PRE>}%
}
\ifdefined\HCode
\usepackage{moreverb}
\newenvironment{code}
{\verbatimwrite{a.tex}}
{\endverbatimwrite
\aftergroup\putVerb}
\else
\usepackage{fancyvrb}
\newenvironment{code}
{\matlab{\small}}
{\endmatlab}
\fi
\begin{document}
\begin{code}
clear all;
m_zeros = [-1 -2];
m_poles = [0 -4 -6];
\end{code}
and
\begin{code}
clear all;
m_poles = [0 -4 -6];
m_zeros = [-1 -2];
\end{code}
\end{document}
已测试htlatex
和pdflatex
。