ayuda para encontrar errores usando \newenvironment

ayuda para encontrar errores usando \newenvironment

Estoy aprendiendo \newenvironmenty necesito ayuda para encontrar dónde está cometiendo mi error \newenvironment. Me sale un error de Latex y no veo que estoy haciendo mal. Estoy intentando reducir la duplicación de código creando un nuevo entorno. Mostraré el código antes y luego el código cuando intente crear un entorno.

Aquí está antes, que funciona sin errores:

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

Compilado con lualatex y da

gráficos matemáticos

Aquí está el nuevo código, que intenta realizar \newenvironmentllamadas matlabcon la misma definición exacta que la anterior.

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

Cuando compilo lo anterior, obtengo

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

? 

Busqué la definición de \newenvironmenty no veo qué error estoy cometiendo. Definición

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

Usando TL 2015

Respuesta1

No puedes usarlo \begin{tcblisting}dentro del argumento de otro comando, como \begin{verbatim}o \begin{lstlisting}.

El listingspaquete tiene \lstnewenvironmentpara hacer frente al caso de definir nuevos entornos basados ​​en lstlistingy, por supuesto, también el tcolorboxpaquete tiene la característica apropiada, llamada \newtcblisting(consulte la página 290 en el manual, sección 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}

ingrese la descripción de la imagen aquí

Respuesta2

Los entornos textuales, como los listados, no se pueden anidar en definiciones por la sencilla razón de que deshabilitan el análisis, después de \begin{matlab}iniciar el modo de listado textual, \no tiene su significado normal para que pueda aparecer textualmente en los listados de código. por lo tanto, \end{matlab}no es la instrucción para finalizar un entorno, es solo la secuencia de caracteres que se van a escribir.

Obviamente el código tiene que tener alguna forma de terminar para buscar la cadena en particular \end{tcblisting}.

Muchos paquetes textuales brindan formas de definir entornos que tienen este comportamiento (la forma en que tcblisting se basa en lstlisting), pero es necesario consultar la documentación del paquete.

información relacionada