コードの重複なしで tex4ht のコードリストの代替環境を定義する

コードの重複なしで tex4ht のコードリストの代替環境を定義する

私はコードのフォーマットにtcolorboxwith を使用していますlistingsが、これは pdf ではうまく機能しますが、このパッケージは tex4ht では機能しません (無効な出力が生成されます)。

コード フラグメント自体を複製せずに、tex4ht と pdf でコンパイルするときに Latex に何をすべきかを指示するために必要な LaTeX マジック コードを理解するのに苦労しています。

小さな例を挙げると分かりやすいでしょう。現在私が持っているのはこれです

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

問題は、パッケージ\newtcblistingのような環境でありtcolorbox、上記の完全な定義は以下であることです(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}

そして問題は、コード自体を複製することなく、tex4ht で何か違うことを実行できるようにする新しい環境をどのように定義するかということです。つまり、もちろんこれを行うことができます:

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

しかし、コードフラグメントは大きくなる可能性があり、ドキュメントはそのままでもすでに複雑なので、コード自体を複製したくありません。また、いくつかの理由から、これらのコードフラグメントをファイルに入れてファイルから読み取ることもしたくありません。

そして、これが私が行き詰まっているところです。私はこれをやりたいです:

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

しかし、上記の方法は機能しません。なぜなら、そこではverbatim環境が許可されていないからです。そこで、代わりにこれを試しました。

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

そして、これは tex4ht で構文エラーになります。この時点で私は手に負えなくなり、Latex コードマジックの限界に達しました。何をすべきかわかりません。

質問は: コード自体を複製せずに、tex4ht の実行時に有効になる新しい環境を、今のところはそのまま定義することは可能ですか?

ファイルは コマンドを使用して HTML にコンパイルされmake4ht foo.texfoo.html同じフォルダーに生成されます。 を使用して PDF にコンパイルされますlualatex foo.tex

答え1

listingstex4ht の場合、いずれにせよロードするのであれば、新しい環境を使用できないのはなぜですか?

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

答え2

moreverbパッケージを使用する方法は次のとおりです。

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

htlatexと の両方をテストしましたpdflatex

関連情報