我正在一个自定义环境中工作lstlisting
,在其中我使用 TikZ 添加框架和标题。由于 的花括号非常普遍,node
我无法使用newenvironment
,因此我不得不求助于NewEnviron
。
从 MWE 和下图可以清楚看出我想要实现的目标:
\documentclass[a4paper,11pt]{article}
\usepackage{listings}
\lstset{breaklines=true, postbreak={\mbox{$\hookrightarrow\space$}}, language=Mathematica}
\usepackage{tikz}
\usetikzlibrary{shapes,decorations}
\tikzstyle{boxround} = [draw=black, thick, rectangle, rounded corners, inner sep=10pt, inner ysep=20pt]
\tikzstyle{head} =[draw=black, fill=white, thick, rectangle]
\usepackage{environ}
\NewEnviron{code}{%
\bigskip
\noindent\begin{tikzpicture}
\node [boxround] (box){%
\begin{minipage}{.94\textwidth}
\BODY
\end{minipage}};
\node[head, right=10pt] at (box.north west) {\textbf{Code listing}};
\end{tikzpicture}
\bigskip
}
\begin{document}
\begin{code}
How to get some \textsc{Mathematica} code (shown below) in this box...
\end{code}
\footnotesize
\begin{lstlisting}
B11[x_, y_] = Piecewise[{{1, 0 <= x <= 1 && 0 <= y <= 1}}];
Plot3D[B11[x, y], {x, -.5, 1.5}, {y, -.5, 1.5}, PlotRange -> Full];
\end{lstlisting}
\normalsize
\end{document}
其结果是
如果不是tikzpicture
,我只会使用lstnewenvironment
。但考虑到广泛使用的花括号,node
我不知道该怎么做。有什么想法吗?
答案1
这里有一个建议mdframed
:
\documentclass{article}
\usepackage{libertine}
\usepackage[T1]{fontenc}
\usepackage{listings}
\lstset{basicstyle=\footnotesize\ttfamily,breaklines=true, postbreak={\mbox{$\hookrightarrow\space$}}, language=Mathematica}
\usepackage[framemethod=TikZ]{mdframed}
\mdfdefinestyle{lstlisting}{%
innertopmargin=5pt,
middlelinewidth=1pt,
outerlinewidth=9pt,outerlinecolor=white,
innerleftmargin=10pt,
innerrightmargin=10pt,
leftmargin=-9pt,rightmargin=-9pt,
skipabove=\topskip,
skipbelow=\topskip,
roundcorner=5pt,
singleextra={\node[draw, fill=white,anchor=west, xshift=10pt+1pt,font=\bfseries] at (O|-P) {Code Listings};},
firstextra={\node[draw, fill=white,anchor=west, xshift=10pt+1pt,font=\bfseries] at (O|-P) {Code Listings};}
}
\lstnewenvironment{code}{%
\mdframed[style=lstlisting]%
}{\endmdframed}
\begin{document}
Text
\begin{code}
B11[x_, y_] = Piecewise[{{1, 0 <= x <= 1 && 0 <= y <= 1}}];
Plot3D[B11[x, y], {x, -.5, 1.5}, {y, -.5, 1.5}, PlotRange -> Full];
\end{code}
\end{document}
更新
在下面的示例中,您有一个名为 的新环境,code
它有一个可选参数和一个强制参数。可选参数传递给\lstset
,强制参数是标题。
\documentclass{article}
\usepackage{libertine}
\usepackage[T1]{fontenc}
\usepackage{listings}
\lstset{basicstyle=\footnotesize\ttfamily,breaklines=true, postbreak={\mbox{$\hookrightarrow\space$}}, language=Mathematica}
\usepackage[framemethod=TikZ]{mdframed}
\makeatletter
\def\mdf@@codeheading{Code Listings}%new mdframed key:
\define@key{mdf}{title}{%
\def\mdf@@codeheading{#1}
}
\mdfdefinestyle{lstlisting}{%
innertopmargin=5pt,
middlelinewidth=1pt,
outerlinewidth=9pt,outerlinecolor=white,
innerleftmargin=10pt,
innerrightmargin=10pt,
leftmargin=-9pt,rightmargin=-9pt,
skipabove=\topskip,
skipbelow=\topskip,
roundcorner=5pt,
singleextra={\node[draw, fill=white,anchor=west, xshift=10pt+1pt,font=\bfseries] at (O|-P) {\csname mdf@@codeheading\endcsname};},
firstextra={\node[draw, fill=white,anchor=west, xshift=10pt+1pt,font=\bfseries] at (O|-P) {\csname mdf@@codeheading\endcsname};}
}
\lstnewenvironment{code}[2][]{%
\lstset{#1}%
\mdframed[style=lstlisting,title={#2}]%
}{\endmdframed}
\begin{document}
Text
\begin{code}{Mathematice Listings}
B11[x_, y_] = Piecewise[{{1, 0 <= x <= 1 && 0 <= y <= 1}}];
Plot3D[B11[x, y], {x, -.5, 1.5}, {y, -.5, 1.5}, PlotRange -> Full];
\end{code}
Text
\begin{code}{Code Listings}
B11[x_, y_] = Piecewise[{{1, 0 <= x <= 1 && 0 <= y <= 1}}];
Plot3D[B11[x, y], {x, -.5, 1.5}, {y, -.5, 1.5}, PlotRange -> Full];
\end{code}
\end{document}
答案2
这里建议使用tcolorbox
\documentclass{article}
\usepackage{libertine}
\usepackage[T1]{fontenc}
\usepackage{tikz}
\usepackage{tcolorbox}
\tcbuselibrary{listings}
\tcbuselibrary{skins}
\newenvironment{code}{%
\tcblisting{listing only,colback=white,enlarge top by=5.5mm,enhanced,%
overlay={\node[draw,fill=white,xshift=10pt,right,font=\bfseries] at (frame.north west) {Code Listings};},%
listing options={basicstyle=\footnotesize\ttfamily,breaklines=true,%
postbreak={\mbox{$\hookrightarrow\space$}},language=Mathematica},%
}%
}%
{\endtcblisting}
\begin{document}
\begin{code}
B11[x_, y_] = Piecewise[{{1, 0 <= x <= 1 && 0 <= y <= 1}}];
Plot3D[B11[x, y], {x, -.5, 1.5}, {y, -.5, 1.5}, PlotRange -> Full];
\end{code}
\end{document}