![ajuda para encontrar erros usando \newenvironment](https://rvso.com/image/335472/ajuda%20para%20encontrar%20erros%20usando%20%5Cnewenvironment.png)
Estou aprendendo \newenvironment
e 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á
Aqui está o novo código, que tenta fazer \newenvironment
chamadas matlab
com 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 \newenvironment
e 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 listings
pacote tem \lstnewenvironment
para lidar com o caso de definição de novos ambientes com base lstlisting
e, claro, o tcolorbox
pacote 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}
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.