
Я учусь \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}
запуска режима дословного перечисления, поэтому \
не имеет своего обычного значения, чтобы отображаться дословно в листингах кода. so \end{matlab}
не является инструкцией по завершению окружения, это просто последовательность символов, которые необходимо набрать.
Очевидно, что код должен каким-то образом заканчиваться, чтобы он искал конкретную строку \end{tcblisting}
.
Многие пакеты verbatim предоставляют способы определения сред, которые имеют такое поведение (способ, которым tcblisting основан на lstlisting), но вам необходимо проверить документацию пакета.