3

I want to put a listing code inside a gray container, similar to the following picture:

enter image description here

To do this, I used the following

 \documentclass[svgnames]{report}
 \usepackage{tikz}
 \usepackage{verbatim}
 \usepackage{kpfonts}
 \usepackage[explicit]{titlesec}
 \usetikzlibrary{calc}
 \usetikzlibrary{shadows}
 \usetikzlibrary{shadows.blur}
 \usetikzlibrary{matrix}
 \usetikzlibrary{shapes,snakes}
 \usetikzlibrary{shapes.geometric, arrows}
 \usepackage{listings}

 \definecolor{codegreen}{rgb}{0,0,0}
 \definecolor{codegray}{rgb}{0,0,0}
 \definecolor{codepurple}{rgb}{0,0,0}
 %\definecolor{backcolour}{rgb}{0.95,0.95,0.92}
 \definecolor{backcolour}{rgb}{1,1,1}
 \lstdefinestyle{mystyle}{
 backgroundcolor=\color{backcolour},   
 commentstyle=\color{codegreen},
 numberstyle=\tiny\color{codegray},
 stringstyle=\color{codepurple},
 basicstyle=\normalsize\ttfamily,
 breakatwhitespace=false,         
 breaklines=true,                 
 captionpos=b,                    
 keepspaces=true,                 
 numbers=none,                    
 numbersep=5pt,                  
 showspaces=false,                
 showstringspaces=false,
 showtabs=false,                  
 tabsize=4, 
 lineskip=.1cm
}

 \lstset{style=mystyle}

 \begin{document}
      \tikzstyle{Container} = [draw=none, fill=gray, thick,
      rectangle, rounded corners, inner sep=10pt, inner ysep=20pt]
      \tikzstyle{ProgramBox} = [draw=black, fill=white,thick,
      rectangle, rounded corners, inner sep=10pt, inner ysep=20pt,drop    shadow={color=black}
      ]

     \tikzstyle{ExampleBox} = [draw=black, fill=white, thick,
      rectangle, rounded corners, inner sep=10pt, inner ysep=20pt,drop     shadow={color=black}]

\begin{center}  
        \begin{tikzpicture}
        \label{num}
        \node [Container](container){   
                    \begin{tikzpicture}
                    \node [ProgramBox] (pbox){%
                        \begin{minipage}{1\textwidth}
                        \hrule width \hsize height 1pt


                        \lstinputlisting[language=Java]{FristProgram.java}
                        \hrule width \hsize \kern 1mm \hrule width \hsize height 1pt

                        \end{minipage}      
                    };      
                    \end{tikzpicture}
        };
        \node [ExampleBox, left = -150pt] at (container.south west) {
                \begin{minipage}{0.3\textwidth}
                    this\\
                    is \\
                    the \\
                    first \\
                    example                     
                \end{minipage}
        };  

        \node [ExampleBox,right = -150pt] at (container.south east) {
                \begin{minipage}{0.3\textwidth}
                    this\\
                    is \\
                    the \\
                    second \\
                    example \\
                    which \\
                    is \\
                    larger\\
                    than \\
                    first\\
                    example                 
                \end{minipage}
            };
        \end{tikzpicture}%

        \end{center}

   \end{document}

this code generates the following output: enter image description here

As it can be seen, the examples are not positioned in right places. How can I fix this problem??

Zarko
  • 296,517

3 Answers3

2

just a concept (since you not provide file FristProgram.java):

\documentclass{report}
\usepackage{tikz}
\usetikzlibrary{arrows,
                calc,
                positioning,
                shadows}
\usepackage{listings}
\usepackage{graphicx}

\begin{document}
\begin{center}
    \begin{tikzpicture}[
   node distance = 8pt and 24pt,
      box/.style = {rectangle, rounded corners, draw, thick, fill=white,
                    text width=#1, inner xsep=10pt, inner ysep=20pt,
                    drop shadow={color=black}
container/.style = {rectangle, rounded corners, fill=gray, 
                    text width=\linewidth, inner xsep=10pt, inner ysep=20pt}
                        ]
%\label{num}
\node [box=0.95\linewidth,align=center] (list)
    {
    \includegraphics[width=0.9\linewidth]{example-image-duck}%\lstinputlisting[language=Java]{FristProgram.java}
    };
\scoped[on background layer]
    \node [container, fit=(list)] {};
%\label{num}
\node [box=\linewidth,align=center] (container)
    {
    \includegraphics[width=0.9\linewidth]{example-image-duck}%\lstinputlisting[language=Java]{FristProgram.java}
    };
\node [box=0.3\linewidth, below right=of container.south west]
    {this\\
     is \\
     the \\
     first \\
     example};
\node [box=0.3\linewidth,below left=of container.south east]
    {this\\
     is \\
     the \\
     second \\
     example \\
     which \\
     is \\
     larger\\
     than \\
     first\\
     example};
     \end{tikzpicture}%
\end{center}
\end{document}

enter image description here

note:

  • nesting tikzpicture in node is not recommended
  • for gray background i suggest to use library fit and drawn it as node in background
  • if you define text width in the node, than you not need to use minipage
  • for positioning of nodes is used library positioning
  • node styles are defined as option to tikzpicture instead use of the obsolete \tikzstyle

edit: ups, i forgot on the gray background ... now is added.

Zarko
  • 296,517
2

You should use anchor= to specify the point with which to place the \nodes instead of left = -150pt. If you desire to overlap with the border, you can adjust that by adding a y shift=.

enter image description here

Notes:

  • the showframe package was used to show the page layout.

  • The width of the minipage needed adjustment to fit to account for the shadow and inner sep:

      \textwidth-40pt
    

    seemed to work.

Code:

\begin{filecontents*}{FristProgram.java}
    import java.io.*;
    class ShowFile
    {
    }
\end{filecontents*}

\documentclass[svgnames]{report} \usepackage{tikz} \usepackage{verbatim} \usepackage{kpfonts} \usepackage[explicit]{titlesec} \usetikzlibrary{calc} \usetikzlibrary{shadows} \usetikzlibrary{shadows.blur} \usetikzlibrary{matrix} \usetikzlibrary{shapes,snakes} \usetikzlibrary{shapes.geometric, arrows} \usepackage{listings} \usepackage{showframe}

\definecolor{codegreen}{rgb}{0,0,0} \definecolor{codegray}{rgb}{0,0,0} \definecolor{codepurple}{rgb}{0,0,0} %\definecolor{backcolour}{rgb}{0.95,0.95,0.92} \definecolor{backcolour}{rgb}{1,1,1} \lstdefinestyle{mystyle}{ backgroundcolor=\color{backcolour},
commentstyle=\color{codegreen}, numberstyle=\tiny\color{codegray}, stringstyle=\color{codepurple}, basicstyle=\normalsize\ttfamily, breakatwhitespace=false,
breaklines=true,
captionpos=b,
keepspaces=true,
numbers=none,
numbersep=5pt,
showspaces=false,
showstringspaces=false, showtabs=false,
tabsize=4, lineskip=.1cm }

\lstset{style=mystyle}

\begin{document} \tikzstyle{Container} = [draw=none, fill=gray, thick, rectangle, rounded corners, inner sep=10pt, inner ysep=20pt] \tikzstyle{ProgramBox} = [draw=black, fill=white,thick, rectangle, rounded corners, inner sep=10pt, inner ysep=20pt,drop shadow={color=black} ]

 \tikzstyle{ExampleBox} = [draw=black, fill=white, thick,
  rectangle, rounded corners, inner sep=10pt, inner ysep=20pt,drop     shadow={color=black}]

{\centering
\begin{tikzpicture} \label{num} \node Container{
\begin{tikzpicture} \node [ProgramBox] (pbox){% \begin{minipage}{\dimexpr\textwidth-40pt\relax} \hrule width \hsize height 1pt

                    \lstinputlisting[language=Java]{FristProgram.java}
                    \hrule width \hsize \kern 1mm \hrule width \hsize height 1pt

                    \end{minipage}      
                };      
                \end{tikzpicture}
    };
    \node [ExampleBox, anchor=north west] at (container.south west) {
            \begin{minipage}{0.3\textwidth}
                this\\
                is \\
                the \\
                first \\
                example                     
            \end{minipage}
    };  

    \node [ExampleBox, anchor=north east] at (container.south east) {
            \begin{minipage}{0.3\textwidth}
                this\\
                is \\
                the \\
                second \\
                example \\
                which \\
                is \\
                larger\\
                than \\
                first\\
                example                 
            \end{minipage}
        };
    \end{tikzpicture}%

\par}

\end{document}

Peter Grill
  • 223,288
2

I've changed your code to use tikzset instead of tikzstyle (see Should \tikzset or \tikzstyle be used to define TikZ styles?) and a fit node on background layer to avoid using nested tikzpictures. With positioning library it's easy to control where to place nodes relative to others.

\documentclass[svgnames]{report}
 \usepackage{tikz}
 \usepackage{verbatim}
 \usepackage{kpfonts}
 \usepackage[explicit]{titlesec}
 \usetikzlibrary{calc}
 \usetikzlibrary{shadows}
 \usetikzlibrary{shadows.blur}
 \usetikzlibrary{matrix}
 \usetikzlibrary{shapes,snakes}
 \usetikzlibrary{shapes.geometric, arrows}
 \usetikzlibrary{backgrounds, fit, positioning}
 \usepackage{listings}

 \definecolor{codegreen}{rgb}{0,0,0}
 \definecolor{codegray}{rgb}{0,0,0}
 \definecolor{codepurple}{rgb}{0,0,0}
 %\definecolor{backcolour}{rgb}{0.95,0.95,0.92}
 \definecolor{backcolour}{rgb}{1,1,1}
 \lstdefinestyle{mystyle}{
 backgroundcolor=\color{backcolour},   
 commentstyle=\color{codegreen},
 numberstyle=\tiny\color{codegray},
 stringstyle=\color{codepurple},
 basicstyle=\normalsize\ttfamily,
 breakatwhitespace=false,         
 breaklines=true,                 
 captionpos=b,                    
 keepspaces=true,                 
 numbers=none,                    
 numbersep=5pt,                  
 showspaces=false,                
 showstringspaces=false,
 showtabs=false,                  
 tabsize=4, 
 lineskip=.1cm
}

 \lstset{style=mystyle}

\tikzset{
    Container/.style = {draw=none, fill=gray, thick,
      rectangle, rounded corners, inner sep=10pt, inner ysep=20pt},
   ProgramBox/.style = {draw=black, fill=white,thick,
      rectangle, rounded corners, inner sep=10pt, inner ysep=20pt,drop    shadow={color=black}},
    ExampleBox/.style = {draw=black, fill=white, thick,
      rectangle, rounded corners, inner sep=10pt, inner ysep=20pt,drop     shadow={color=black}},
      }


 \begin{document}

\begin{center}  
        \begin{tikzpicture}
                    \node [ProgramBox] (pbox){%
                        \begin{minipage}{\textwidth}
                        \hrule width \hsize height 1pt
                        \lstinputlisting[language=Java]{FirstProgram.java}
                        \hrule width \hsize \kern 1mm \hrule width \hsize height 1pt
                        \end{minipage}      
                    };      
        \begin{scope}[on background layer]
        \node[Container, fit=(pbox)] (container) {};
        \end{scope}

        \node [ExampleBox, below right=3mm and 1cm of pbox.south west] {
                \begin{minipage}{0.3\textwidth}
                    this\\
                    is \\
                    the \\
                    first \\
                    example                     
                \end{minipage}
        };  

        \node [ExampleBox, below left = 3mm and 1cm of pbox.south east] {
                \begin{minipage}{0.3\textwidth}
                    this\\
                    is \\
                    the \\
                    second \\
                    example \\
                    which \\
                    is \\
                    larger\\
                    than \\
                    first\\
                    example                 
                \end{minipage}
            };
        \end{tikzpicture}%

        \end{center}

   \end{document}

enter image description here

Ignasi
  • 136,588