Entorno acuñado recortado dentro de una nueva forma de nodo PGF

Entorno acuñado recortado dentro de una nueva forma de nodo PGF

Quiero crear un archivo o una forma de nodo similar a una página en PGF y poner un entorno creado en esa forma. Vea la imagen a continuación:

ingrese la descripción de la imagen aquí

Hay algunos problemas. Una es que el texto se dibuja sobre el borde inferior y derecho. La otra es que me gustaría poder escalar el contenido del entorno acuñado en 0,5, digamos. También me gustaría poder proporcionar todo el material acuñado como un atributo del nodo o forma, algo así como \node [draw, shape=document, minted={python,class.py}] {};, pero me conformaría si eso no es posible. No estoy apegado a la implementación de la minipágina de ninguna manera.

Para el texto en el borde, creo que probablemente el ancho de línea actual podría restarse de las dimensiones de la minipágina. Probé una caja de escala dentro de la minipágina para escalar, pero los entornos textuales creados fallaron allí. Realmente no tengo idea de cómo pasar los parámetros acuñados como un atributo al nodo.

Implementación:

\documentclass{standalone}

\usepackage{minted}

\usepackage{tikz}
\usetikzlibrary{positioning}
\usetikzlibrary{calc}

\renewcommand{\familydefault}{\sfdefault}

\begin{filecontents}{class.py}
class MyClass:
    variable = "blah"

    def function(self):
        print("This is a message inside the class.")

myobjectx = MyClass()

myobjectx.variable
\end{filecontents}

\makeatletter
\pgfdeclareshape{document}{
  \inheritsavedanchors[from=rectangle] % this is nearly a rectangle
  \inheritanchorborder[from=rectangle]
  \inheritanchor[from=rectangle]{center}
  \inheritanchor[from=rectangle]{north}
  \inheritanchor[from=rectangle]{south}
  \inheritanchor[from=rectangle]{west}
  \inheritanchor[from=rectangle]{east}
  % ... and possibly more
  \backgroundpath{% this is new
    % store lower right in xa/ya and upper right in xb/yb
    \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
    \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y
    % compute corner of ‘‘flipped page’’
    \pgf@xc=\pgf@xb \advance\pgf@xc by-7.5pt % this should be a parameter
    \pgf@yc=\pgf@yb \advance\pgf@yc by-7.5pt
    % construct main path
    \pgfpathmoveto{\pgfpoint{\pgf@xa}{\pgf@ya}}
    \pgfpathlineto{\pgfpoint{\pgf@xa}{\pgf@yb}}
    \pgfpathlineto{\pgfpoint{\pgf@xc}{\pgf@yb}}
    \pgfpathlineto{\pgfpoint{\pgf@xb}{\pgf@yc}}
    \pgfpathlineto{\pgfpoint{\pgf@xb}{\pgf@ya}}
    \pgfpathclose
    % add little corner
    \pgfpathmoveto{\pgfpoint{\pgf@xc}{\pgf@yb}}
    \pgfpathlineto{\pgfpoint{\pgf@xc}{\pgf@yc}}
    \pgfpathlineto{\pgfpoint{\pgf@xb}{\pgf@yc}}
    \pgfpathlineto{\pgfpoint{\pgf@xc}{\pgf@yc}}
  }
}
\makeatother

\begin{document}

\begin{tikzpicture}

  \node [draw, line width=3pt, shape=document] {\begin{minipage}[t][1cm][t]{4cm}\inputminted{python}{class.py}\end{minipage}};

\end{tikzpicture}

\end{document}

Respuesta1

Se puede hacer algo similar con tcolorbox, aunque no sé cómo recortar el listado.

\documentclass{article}
\usepackage[most, minted]{tcolorbox}

\tcbset{
    mylisting/.style={
        listing engine=minted, minted style=trac,
        minted language=python, listing only,
        enhanced,
        boxrule=1mm,
        colback=yellow!50,
        colframe=yellow!20!black,
        sharp corners,rounded corners=northeast,arc is angular,arc=3mm,
        underlay={%
            \path[fill=tcbcolback] ([yshift=-3mm]interior.north east)-|([xshift=-3mm]interior.north east);
            \path[draw=tcbcolframe, shorten <=-0.5mm,shorten >=-0.5mm, line width=1mm] ([yshift=-3mm]interior.north east)-|([xshift=-3mm]interior.north east);},
        #1
    }
}

\begin{filecontents}{class.py}
class MyClass:
    variable = "blah"

    def function(self):
        print("This is a message inside the class.")

myobjectx = MyClass()

myobjectx.variable
\end{filecontents}

\begin{document}
\tcbinputlisting{mylisting, listing file=class.py}
\end{document}

ingrese la descripción de la imagen aquí

información relacionada