幫助使用 \newenvironment 尋找錯誤

幫助使用 \newenvironment 尋找錯誤

我正在學習\newenvironment,我需要幫助來找出我的錯誤所在\newenvironment。我收到乳膠錯誤,但我不明白我做錯了什麼。我正在嘗試透過建立新環境來減少程式碼重複。我將展示之前的程式碼,然後是我嘗試建立環境時的程式碼。

這是之前的,運行沒有錯誤:

\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 編譯,它給出

數學圖形

這是新程式碼,它嘗試使用與上面相同的精確定義進行\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}or一樣\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}啟動逐字列表模式後,它們會禁用解析,因此\不具有其正常含義,因此它可以逐字出現在程式碼列表中。 so\end{matlab}不是結束環境的指令,它只是要排版的字元序列。

顯然,程式碼必須有某種結束方式,以便它可以找到特定的字串\end{tcblisting}

許多逐字包提供了定義具有此行為的環境的方法(tcblisting 基於 lstlisting 的方式),但您需要檢查套件文件。

相關內容