ajuda para encontrar erros usando \newenvironment

ajuda para encontrar erros usando \newenvironment

Estou aprendendo \newenvironmente preciso de ajuda para descobrir onde está meu erro ao cometer \newenvironment. Recebo um erro de látex e não vejo o que estou fazendo de errado. Estou tentando reduzir a duplicação de código criando um novo ambiente. Vou mostrar o código antes, e depois o código quando tento fazer um ambiente.

Aqui está o antes, que funciona sem erros:

\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 com lualatex e dá

Gráficos matemáticos

Aqui está o novo código, que tenta fazer \newenvironmentchamadas matlabcom a mesma definição exata acima.

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

Quando compilo o acima, recebo

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

? 

Procurei a definição de \newenvironmente não vejo que erro estou cometendo. Definição

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

Usando TL 2015

Responder1

Você não pode usar \begin{tcblisting}dentro do argumento para outro comando, assim como \begin{verbatim}ou \begin{lstlisting}.

O listingspacote tem \lstnewenvironmentpara lidar com o caso de definição de novos ambientes com base lstlistinge, claro, o tcolorboxpacote também tem o recurso apropriado, chamado \newtcblisting(ver página 290 do manual, seção 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}

insira a descrição da imagem aqui

Responder2

ambientes literais como listagens não podem ser aninhados em definições pela simples razão de desabilitarem a análise, depois que \begin{matlab}você inicia o modo de listagem literal, então \não tem seu significado normal para que possa aparecer literalmente nas listagens de código. portanto, \end{matlab}não é a instrução para encerrar um ambiente, é apenas a sequência de caracteres a ser composta.

Obviamente o código tem que ter alguma forma de terminar para que ele procure a string específica \end{tcblisting}.

Muitos pacotes literais fornecem maneiras de definir ambientes que possuem esse comportamento (da mesma forma que tcblisting é baseado em lstlisting), mas você precisa verificar a documentação do pacote.

informação relacionada