
Estoy usando tcolorbox
with listings
para 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 \newtcblisting
es un entorno como el del tcolorbox
paquete, 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.tex
y se genera foo.html
en la misma carpeta. Compilado en pdf usando lualatex foo.tex
.
Respuesta1
¿Por qué no puedes simplemente usar un nuevo listings
entorno 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 moreverb
el 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 htlatex
como pdflatex
.