![Hilfe bei der Fehlersuche mit \newenvironment](https://rvso.com/image/335472/Hilfe%20bei%20der%20Fehlersuche%20mit%20%5Cnewenvironment.png)
Ich lerne \newenvironment
und brauche Hilfe, um herauszufinden, wo mein Fehler beim Erstellen liegt \newenvironment
. Ich erhalte einen Latex-Fehler und sehe nicht, was ich falsch mache. Ich versuche, Code-Duplikationen zu reduzieren, indem ich eine neue Umgebung erstelle. Ich werde den Code vorher zeigen und dann den Code, wenn ich versuche, eine Umgebung zu erstellen.
Hier ist das Vorher-Bild, das ohne Fehler funktioniert:
\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}
Kompiliert mit lualatex und es gibt
Hier ist der neue Code, der versucht, ihn mit der exakt gleichen Definition wie oben \newenvironment
aufzurufen .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}
Wenn ich das oben genannte kompiliere, erhalte ich
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
?
Ich habe die Definition von nachgeschlagen \newenvironment
und sehe nicht, welchen Fehler ich mache. Definition
\newenvironment{nam}[args]{begdef}{enddef}
Verwenden von TL 2015
Antwort1
Sie können es nicht \begin{tcblisting}
innerhalb des Arguments eines anderen Befehls verwenden, genau wie \begin{verbatim}
oder \begin{lstlisting}
.
Das listings
Paket verfügt \lstnewenvironment
über die Möglichkeit, den Fall der Definition neuer Umgebungen zu bewältigen lstlisting
, und natürlich tcolorbox
hat das Paket auch die entsprechende Funktion, die aufgerufen wird \newtcblisting
(siehe Seite 290 im Handbuch, Abschnitt 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}
Antwort2
Wörtliche Umgebungen wie Auflistungen können nicht in Definitionen verschachtelt werden, aus dem einfachen Grund, dass sie die Analyse deaktivieren, nachdem \begin{matlab}
Sie den wörtlichen Auflistungsmodus gestartet haben, sodass \
er nicht seine normale Bedeutung hat, sodass er wörtlich in Codeauflistungen erscheinen kann. Dies \end{matlab}
ist nicht die Anweisung zum Beenden einer Umgebung, sondern nur die Zeichenfolge, die gesetzt werden soll.
Offensichtlich muss der Code eine Möglichkeit zum Beenden haben, damit er nach der bestimmten Zeichenfolge sucht \end{tcblisting}
.
Viele Verbatim-Pakete bieten Möglichkeiten zum Definieren von Umgebungen mit diesem Verhalten (so wie tcblisting auf lstlisting basiert), Sie müssen jedoch die Paketdokumentation prüfen.