Definindo ambiente alternativo para listagem de código para tex4ht sem duplicação de código

Definindo ambiente alternativo para listagem de código para tex4ht sem duplicação de código

Estou usando tcolorboxwith listingspara formatação de código, que funciona bem em pdf, mas este pacote não funciona com tex4ht (produz saída inválida).

Estou tendo dificuldade em descobrir o código mágico do látex necessário para dizer ao Latex o que fazer ao compilar com tex4ht vs. pdf, sem ter que duplicar o próprio fragmento de código.

Um pequeno exemplo ajudará. Atualmente é isso que eu tenho

\documentclass[12pt]{book}%
 ...
\begin{document}
\newtcblisting{....}{....code is here ...}  

O problema é que \newtcblistingé um ambiente como o do tcolorboxpacote, a definição completa do acima está abaixo (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}

E o problema é como definir um novo ambiente, que me permitirá fazer algo diferente no tex4ht, sem ter que duplicar o próprio código. ou seja, eu posso fazer isso, é claro:

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

Mas não quero duplicar o código em si, pois os fragmentos de código podem ser grandes e o documento já é complicado como está. Também não quero colocar esses fragmentos de código em arquivos e lê-los nos arquivos por vários motivos.

E é aqui que estou preso. Eu gostaria que isso acontecesse:

....
\ifdefined\HCode 
   \newenvironment{matlab}[1]
   {\begin{verbatim}}
   {\end{verbatim}}
\else
\newtcblisting{matlab}[1]{
....

Mas o que foi dito acima não funciona, uma vez que o ambiente literal não é permitido lá. Então eu tentei isso em vez disso

\DefineVerbatimEnvironment{matlabX}{Verbatim}{fontsize=\small}    
\ifdefined\HCode 
   \newenvironment{matlab}[1]
   {\begin{matlabX}}
   {\end{matlabX}}
\else
\newtcblisting{matlab}[1]{
 .....

E isso dá erro de sintaxe com tex4ht. Estou muito perdido neste ponto e alcancei meu limite na magia do código Latex. Não sei o que fazer.

Questão é: É possível definir um novo ambiente, digamos literalmente por enquanto, que entra em ação quando o tex4ht está em execução, sem ter que duplicar o código em si?

O arquivo é compilado em HTML usando o comando make4ht foo.texe é gerado foo.htmlna mesma pasta. Compilado para pdf usando lualatex foo.tex.

Responder1

Por que você não pode simplesmente usar um novo listingsambiente, já que o está carregando de qualquer maneira, no caso do 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}

Responder2

Aqui está uma maneira de usar moreverbo pacote:

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

Testei ambos htlatexe pdflatex.

informação relacionada