我正在開發一個自訂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}