帮助使用 \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}您启动逐字列表模式后,因此\它不具有其正常含义,因此它可以逐字出现在代码列表中。所以\end{matlab}不是结束环境的指令,它只是要排版的字符序列。

显然,代码必须有某种结束方式,因此它会寻找特定的字符串\end{tcblisting}

许多逐字包提供了定义具有这种行为的环境的方法(tcblisting 基于 lstlisting 的方式),但您需要检查包文档。

相关内容