помощь в поиске ошибки с использованием \newenvironment

помощь в поиске ошибки с использованием \newenvironment

Я учусь \newenvironmentи мне нужна помощь в поиске моей ошибки при создании \newenvironment. Я получаю ошибку Latex и не вижу, что я делаю неправильно. Я пытаюсь уменьшить дублирование кода, создавая новую среду. Я покажу код до этого, а затем код, когда я пытаюсь создать среду.

Вот пример, который работает без ошибок:

\documentclass[12pt]{book}%
\usepackage[T1]{fontenc}
\usepackage{color}
\usepackage{tcolorbox}
\tcbuselibrary{listings}
\usepackage{matlab-prettifier}
\definecolor{bg}{RGB}{240,240,240}
\usepackage{upquote} %to fix string quotes    
\begin{document}

\begin{tcblisting}{colback=bg,size=minimal,hbox,listing only,
                     listing options={style=Matlab-editor,
                                      basicstyle=\ttfamily\normalsize,
                                      breaklines         = false,
                                      escapechar         = `
                                      }%
                      }%
K=[3 -2;-2 2]; M=[1 0;0 3];
[phi,lam]=eig(K,M)
\end{tcblisting}
\end{document}

Скомпилировано с помощью lualatex и это дает

Графика Mathematica

Вот новый код, который пытается вызвать \newenvironmentфункцию matlabс тем же точным определением, что и выше.

\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

\newenvironment{matlab}
{
  \begin{tcblisting}{colback=bg,size=minimal,hbox,listing only,
                     listing options={style=Matlab-editor,
                                      basicstyle=\ttfamily\normalsize,
                                      breaklines         = false,
                                      escapechar         = `
                                      }%
                      }%
}%
{
 \end{tcblisting}\ignorespacesafterend
}%

\begin{document}

\begin{matlab}
K=[3 -2;-2 2]; M=[1 0;0 3];
[phi,lam]=eig(K,M)
\end{matlab}
\end{document}

Когда я компилирую вышеизложенное, я получаю

lualatex foo2.tex
This is LuaTeX, Version beta-0.80.0.1 (TeX Live 2015) (rev 5863) 
 restricted \write18 enabled.
(./foo2.tex
LaTeX2e <2015/10/01> patch level 2
Babel <3.9m> and hyphenation patterns for 79 languages loaded.
(/usr/local/texlive/2015/texmf-dist/tex/latex/base/book.cls
Document Class: book 2014/09/29 v1.4h Standard LaTeX document class
...
(/usr/local/texlive/2015/texmf-dist/tex/generic/oberdiek/etexcmds.sty)))
(/usr/local/texlive/2015/texmf-dist/tex/latex/latexconfig/epstopdf-sys.cfg)))
Runaway argument?
! File ended while scanning use of \next.
<inserted text> 
\par 
<*> foo2.tex

? 

Я посмотрел определение \newenvironmentи не вижу, какую ошибку я делаю. Определение

    \newenvironment{nam}[args]{begdef}{enddef}

Использование TL 2015

решение1

Вы не можете использовать \begin{tcblisting}внутри аргумента другой команды, как \begin{verbatim}или \begin{lstlisting}.

Пакет listingsимеет \lstnewenvironmentдля решения задачи определения новых сред на основе lstlistingи, конечно же, также tcolorboxпакет имеет соответствующую функцию, называемую \newtcblisting(см. стр. 290 в руководстве, раздел 15.2).

\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}{
  colback=bg,
  size=minimal,
  hbox,
  listing only,
  listing options={
    style=Matlab-editor,
    basicstyle=\ttfamily\normalsize,
    breaklines= false,
    escapechar=`,
  },
}

\begin{document}

\begin{matlab}
K=[3 -2;-2 2]; M=[1 0;0 3];
[phi,lam]=eig(K,M)
\end{matlab}
\end{document}

введите описание изображения здесь

решение2

Дословные окружения, такие как списки, не могут быть вложены в определения по той простой причине, что они отключают синтаксический анализ после \begin{matlab}запуска режима дословного перечисления, поэтому \не имеет своего обычного значения, чтобы отображаться дословно в листингах кода. so \end{matlab}не является инструкцией по завершению окружения, это просто последовательность символов, которые необходимо набрать.

Очевидно, что код должен каким-то образом заканчиваться, чтобы он искал конкретную строку \end{tcblisting}.

Многие пакеты verbatim предоставляют способы определения сред, которые имеют такое поведение (способ, которым tcblisting основан на lstlisting), но вам необходимо проверить документацию пакета.

Связанный контент