![ayuda para encontrar errores usando \newenvironment](https://rvso.com/image/335472/ayuda%20para%20encontrar%20errores%20usando%20%5Cnewenvironment.png)
Estoy aprendiendo \newenvironment
y 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
Aquí está el nuevo código, que intenta realizar \newenvironment
llamadas matlab
con 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 \newenvironment
y 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 listings
paquete tiene \lstnewenvironment
para hacer frente al caso de definir nuevos entornos basados en lstlisting
y, por supuesto, también el tcolorbox
paquete 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}
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.