定义 tex4ht 代码列表的替代环境,无需代码重复

定义 tex4ht 代码列表的替代环境,无需代码重复

我正在使用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}

已测试htlatexpdflatex

相关内容