Ambiente cunhado recortado dentro de um novo formato de nó PGF

Ambiente cunhado recortado dentro de um novo formato de nó PGF

Quero criar um formato de arquivo ou nó semelhante a uma página no PGF e colocar um ambiente criado nessa forma. Veja a imagem abaixo:

insira a descrição da imagem aqui

Existem alguns problemas. Uma é que o texto é desenhado além da borda inferior e direita. A outra é que eu gostaria de poder dimensionar o conteúdo do ambiente cunhado em 0,5, digamos. Eu também gostaria se pudesse fornecer todo o material cunhado como um atributo para o nó ou forma, algo como \node [draw, shape=document, minted={python,class.py}] {};, mas aceitaria se isso não fosse possível. Não estou apegado à implementação da minipágina de forma alguma.

Para o texto na borda, acho que provavelmente a largura da linha atual poderia ser subtraída das dimensões da minipágina. Tentei uma caixa de escala dentro da minipágina para dimensionamento, mas os ambientes literais criados falharam. Eu realmente não tenho ideia de como passar os parâmetros cunhados como um atributo para o nó.

Implementação:

\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}

Responder1

Algo semelhante pode ser feito com tcolorbox, embora eu não saiba como recortar a listagem.

\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}

insira a descrição da imagem aqui

informação relacionada