Clipped minted environment di dalam bentuk node PGF baru
Saya ingin membuat file atau bentuk node seperti halaman di PGF dan menempatkan lingkungan yang dicetak dalam bentuk itu. Lihat gambar di bawah ini:
Ada beberapa masalah. Salah satunya adalah teks digambar melewati batas di bagian bawah dan kanan. Yang lainnya adalah saya ingin dapat menskalakan konten lingkungan yang dicetak sebesar 0,5, katakanlah. Saya juga suka jika saya bisa menyediakan semua barang yang dicetak sebagai atribut ke simpul atau bentuk, sesuatu seperti itu \node [draw, shape=document, minted={python,class.py}] {};, tetapi saya akan menyelesaikannya jika itu tidak memungkinkan. Saya tidak terikat pada implementasi minipage dengan cara apa pun.
Untuk teks di perbatasan, saya pikir mungkin lebar garis saat ini dapat dikurangi dari dimensi minipage. Saya mencoba kotak skala di dalam minipage untuk penskalaan, tetapi lingkungan kata demi kata yang dicetak gagal di sana. Saya benar-benar tidak tahu bagaimana mungkin melewatkan parameter yang dicetak sebagai atribut ke node.
Penerapan:
\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}
Jawaban
Hal serupa dapat dilakukan dengan tcolorbox, meskipun saya tidak tahu cara memotong iklan.
\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}