I am writing a document where I use tcolorbox
to list code. I would like to have a couple of commands to list code from an external file, and one (or two) environment for inline snippets. What I have (and it's nicely working) is something along the way of this MWE:
\RequirePackage{filecontents}
\begin{filecontents}{test.c}
#include <stdio.h>
int main() {
return 0;
}
\end{filecontents}
\documentclass{article}
\usepackage[listings, breakable, skins, fitting]{tcolorbox}
% from http://tex.stackexchange.com/a/163617/38080
\newtcbinputlisting[auto counter]{\putcodecomment}[2]{
listing file={#1},
title={Listing \thetcbcounter: #1}, fonttitle=\bfseries,
listing and comment,
comment={#2},
%%% start of common things here
breakable,
width=0.9\linewidth,
bicolor,
lower separated=true,
colback=red!5,
colframe=red!75!black,
listing options={
language = {[Visual]C++}, % Language
basicstyle = \ttfamily, % Default format
keywordstyle = \color{blue}, % Keywordformat
breaklines = true, % Automatic line breaks
breakatwhitespace = true, % Line breaks only at white spaces
tabsize = 4, % Number of spaces equal to a tab
showspaces = false, % Show spaces in the code
showtabs = false, % Show tabs in the code
showstringspaces = false, % Show spaces among strings
},
}
\newtcblisting{justcode}[0]{
listing only,
breakable,
width=0.9\linewidth,
%%% start of common things here
breakable,
width=0.9\linewidth,
bicolor,
lower separated=true,
colback=red!5,
colframe=red!75!black,
listing options={
language = {[Visual]C++}, % Language
basicstyle = \ttfamily, % Default format
keywordstyle = \color{blue}, % Keywordformat
breaklines = true, % Automatic line breaks
breakatwhitespace = true, % Line breaks only at white spaces
tabsize = 4, % Number of spaces equal to a tab
showspaces = false, % Show spaces in the code
showtabs = false, % Show tabs in the code
showstringspaces = false, % Show spaces among strings
},
}
\begin{document}
\putcodecomment{test.c}{%
No comment here
}
\begin{justcode}
a = a + 1;
\end{justcode}
\end{document}
… which works, but as you can see, I had to use copy and paste to "repeat" the common part of the options of the boxes. Now, if I want to change the color of the background, I need to change it in two (really they are four) different place.
I tried to put all the common option in a \def\commonoptions{...}
but it choked…
Is there a way to put the common part in common "style" so that I can organize it better? Something on the line of the tikz
styles?
Best Answer
Just use
\lstdefinestyle{foo}{ your options}
and saylisting options={style=foo}
, this will save a lot of typing (or work).You can change the listing options after setting the style:
listing options={style=foo,numbers=right}
, for example.Here's a modified version of the O.P. code
Edit
Here's a version that has common options for
tcolorbox
as well:Use
and say
code={\pgfkeysalsofrom{\commonboxoptions}}
in thetcolorbox
options (thelisting boxes
here!)