
Я использую tcolorbox
with listings
для форматирования кода, что хорошо работает в pdf, но этот пакет не работает с tex4ht (выводит неверные данные).
Мне сложно разобраться в магическом коде Latex, который нужен, чтобы сообщить Latex, что делать при компиляции с tex4ht по сравнению с pdf, не дублируя сам фрагмент кода.
Небольшой пример поможет. В настоящее время это то, что у меня есть
\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.tex
и генерируется foo.html
в той же папке. Компилируется в pdf с помощью lualatex foo.tex
.
решение1
Почему вы просто не можете использовать новую listings
среду, если вы ее все равно загружаете, например, в случае 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}
решение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
.