
Estou usando tcolorbox
with listings
para 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 tcolorbox
pacote, 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.tex
e é gerado foo.html
na mesma pasta. Compilado para pdf usando lualatex foo.tex
.
Responder1
Por que você não pode simplesmente usar um novo listings
ambiente, 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 moreverb
o 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 htlatex
e pdflatex
.