Определение альтернативной среды для листинга кода для tex4ht без дублирования кода

Определение альтернативной среды для листинга кода для tex4ht без дублирования кода

Я использую tcolorboxwith listingsдля форматирования кода, что хорошо работает в pdf, но этот пакет не работает с tex4ht (выводит неверные данные).

Мне сложно разобраться в магическом коде Latex, который нужен, чтобы сообщить Latex, что делать при компиляции с tex4ht по сравнению с pdf, не дублируя сам фрагмент кода.

Небольшой пример поможет. В настоящее время это то, что у меня есть

\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.

Связанный контент