Definieren einer alternativen Umgebung für die Codeauflistung für tex4ht ohne Codeduplizierung

Definieren einer alternativen Umgebung für die Codeauflistung für tex4ht ohne Codeduplizierung

Ich verwende tcolorboxes listingszur Codeformatierung, was in PDF gut funktioniert, aber dieses Paket funktioniert nicht mit tex4ht (es erzeugt eine ungültige Ausgabe).

Es fällt mir schwer, den Latex-Magic-Code herauszufinden, der erforderlich ist, um Latex mitzuteilen, was beim Kompilieren mit tex4ht vs. pdf zu tun ist, ohne das Codefragment selbst duplizieren zu müssen.

Ein kleines Beispiel wird helfen. Momentan habe ich Folgendes

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

Das Problem ist, dass es \newtcblistingsich um eine Umgebung wie aus dem tcolorboxPaket handelt. Die vollständige Definition des oben genannten finden Sie weiter unten (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}

Und das Problem besteht darin, wie ich eine neue Umgebung definiere, die es mir ermöglicht, in tex4ht etwas anderes zu tun, ohne den Code selbst duplizieren zu müssen. Ich kann natürlich Folgendes tun:

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

Aber ich möchte den Code selbst nicht duplizieren, da die Codefragmente groß sein können und das Dokument bereits so kompliziert ist. Ich möchte diese Codefragmente aus verschiedenen Gründen auch nicht in Dateien speichern und aus Dateien lesen.

Und hier stecke ich fest. Ich möchte Folgendes tun:

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

Aber das oben genannte funktioniert nicht, da die wörtliche Umgebung dort nicht zulässig ist. Also habe ich stattdessen Folgendes versucht

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

Und das führt zu einem Syntaxfehler mit tex4ht. Ich bin an diesem Punkt völlig überfordert und habe mein Limit in Sachen Latex-Code-Magie erreicht. Ich weiß nicht, was ich tun soll.

Die Frage ist: Ist es möglich, eine neue Umgebung zu definieren, sagen wir vorerst nur wörtlich, die aktiviert wird, wenn tex4ht ausgeführt wird, ohne den Code selbst duplizieren zu müssen?

Die Datei wird mit dem Befehl in HTML kompiliert make4ht foo.texund im selben Ordner generiert foo.html. In PDF kompiliert mit lualatex foo.tex.

Antwort1

Warum können Sie im Fall von tex4ht nicht einfach eine neue listingsUmgebung verwenden, da Sie diese sowieso laden?

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

Antwort2

So verwenden Sie moreverbdas Paket:

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

Beides getestet htlatexund pdflatex.

verwandte Informationen