![幫助使用 \newenvironment 尋找錯誤](https://rvso.com/image/335472/%E5%B9%AB%E5%8A%A9%E4%BD%BF%E7%94%A8%20%5Cnewenvironment%20%E5%B0%8B%E6%89%BE%E9%8C%AF%E8%AA%A4.png)
我正在學習\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 的方式),但您需要檢查套件文件。