списки \def проблема

списки \def проблема

Когда я компилирую следующий код с помощью xelatex, %\end{lstlisting}нужна ли строка для предотвращения ошибки. В чем проблема?

\documentclass[a4paper,11pt, onecolumn, openany,]{memoir}
\usepackage[english]{babel} % English please
%\usepackage[final]{microtype} % Less badboxes
\usepackage{fontspec}


\usepackage{listings}
\usepackage{xcolor}


\newfontfamily{\lstcode}[Scale=0.85]{Ubuntu Mono}
\lstdefinestyle{csharp}
{
     language=[Sharp]C,
     frame=shadowbox,
     rulecolor=\color{white!80!black},
     rulesepcolor=\color{white!80!black},
     basicstyle=\lstcode,
     showstringspaces=false,     
     breaklines=true
}

\def\bcsh#1\ncsh
{
    \lstset{style=csharp}
    \begin{lstlisting}[numbers=left]
    #1
    \end{lstlisting}
}

\begin{document}
\bcsh
class Program
{  
    static void Main()
    {
        System.Console.WriteLine("Hello World!");
        System.Console.ReadKey();
    }
}
\ncsh
%\end{lstlisting}

\end{document}

решение1

Короткий ответ: вы не можете передать lstlistingокружение в качестве аргумента макросу.

Вместо этого вы можете определить новую среду.

\documentclass[a4paper,11pt, onecolumn, openany,]{memoir}
\usepackage[english]{babel} % English please
%\usepackage[final]{microtype} % Less badboxes
\usepackage{fontspec}


\usepackage{listings}
\usepackage{xcolor}


\newfontfamily{\lstcode}[Scale=0.85]{Ubuntu Mono}
\lstdefinestyle{csharp}
{
     language=[Sharp]C,
     frame=shadowbox,
     rulecolor=\color{white!80!black},
     rulesepcolor=\color{white!80!black},
     basicstyle=\lstcode,
     showstringspaces=false,     
     breaklines=true
}

\lstnewenvironment{bcsh}[1][]
 {\lstset{style=csharp,numbers=left,#1}}
 {}

\begin{document}
\begin{bcsh}
class Program
{  
    static void Main()
    {
        System.Console.WriteLine("Hello World!");
        System.Console.ReadKey();
    }
}
\end{bcsh}

\end{document}

введите описание изображения здесь

Связанный контент