Definición de un entorno alternativo para el listado de códigos para tex4ht sin duplicación de código

Definición de un entorno alternativo para el listado de códigos para tex4ht sin duplicación de código

Estoy usando tcolorboxwith listingspara formatear código, que funciona bien en pdf, pero este paquete no funciona con tex4ht (produce resultados no válidos).

Me resulta difícil calcular el código mágico de látex necesario para decirle a Latex qué hacer al compilar con tex4ht frente a pdf, sin tener que duplicar el fragmento de código.

Un pequeño ejemplo ayudará. Actualmente esto es lo que tengo

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

El problema es que \newtcblistinges un entorno como el del tcolorboxpaquete, la definición completa de lo anterior se encuentra a continuación (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}

Y el problema es cómo definir un nuevo entorno que me permita hacer algo diferente en tex4ht, sin tener que duplicar el código. es decir, puedo hacer esto por supuesto:

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

Pero no quiero duplicar el código en sí, ya que los fragmentos de código pueden ser grandes y el documento ya es complicado. Tampoco quiero colocar estos fragmentos de código en archivos y leerlos desde archivos por varias razones.

Y aquí es donde estoy estancado. Me gustaría hacer esto:

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

Pero lo anterior no funciona, ya que allí no se permite el entorno textual. Así que probé esto en su lugar

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

Y esto genera un error de sintaxis con tex4ht. Estoy muy por encima de la cabeza en este punto y alcancé mi límite en la magia del código Latex. No saber que hacer.

La pregunta es: ¿Es posible definir un nuevo entorno, digamos textualmente por ahora, que se active cuando se ejecuta tex4ht, sin tener que duplicar el código?

El archivo se compila en HTML usando el comando make4ht foo.texy se genera foo.htmlen la misma carpeta. Compilado en pdf usando lualatex foo.tex.

Respuesta1

¿Por qué no puedes simplemente usar un nuevo listingsentorno ya que lo estás cargando de todos modos, para el caso de 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}

Respuesta2

Aquí hay una forma de usar moreverbel paquete:

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

Probado tanto htlatexcomo pdflatex.

información relacionada