我正在学习\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 编译后得到
这是新的代码,它尝试使用与上面完全相同的定义进行\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 的方式),但您需要检查包文档。