Reproducción de bloques de código de programación/Python con modificación

Reproducción de bloques de código de programación/Python con modificación

Quiero poder reproducir este entorno en el contexto de la corrección de exámenes.

Una pista que encontré es el uso del paquete bclogo.

https://ctan.org/pkg/bclogo

Sin embargo, me gustaría incluir el código Python resaltado como se ve aquí, y quiero incluir líneas de sangría y colorearlas según el alcance (nivel de sangría).

ingrese la descripción de la imagen aquí

Coloreando las líneas de un algoritmo.:

ingrese la descripción de la imagen aquí

Código del algoritmo coloreado:

\pdfoutput=1
\usepackage[linesnumbered,titlenumbered,ruled,vlined,resetcount,algosection]{algorithm2e}
\usepackage[usenames,dvipsnames]{xcolor}
\usepackage{color}

\begin{document}
\title{MWE}
\maketitle
\section{Algorithm}

\begin{algorithm}
    \caption{3-SAT in polynomial time}
    \label{alg:hs}
    \DontPrintSemicolon
    \KwIn{List of clauses}
    \KwOut{The clauses are satisfiable}
    \SetKwProg{Fn}{Function}{ is}{end}
    \Fn{\textsc{IsSatisfiable}($C$)} {
    
        \color{red} %<- my best attempt
        $k\gets 0$ \;
        \For {$i = 1$ \bf{to} $|C|$}
        {
            $c_i \gets $ $i$-th clause \;
            $L \gets$ list of literals of $c_i$ \;
            $k\gets f(k, L)$ \tcp{a miracle in polynomial time}
        }
        \color{black} %<- go back to color black
        
        \If {$k$ is even} {
            \Return true
        }
        \Else {
            \Return false
        }
        
    }
\end{algorithm}

\end{document}

Respuesta1

Para el código Python, aquí hay una solución con el paquete pitonque requiere el uso de LuaLaTeX (pero ningún programa externo).

\documentclass{article}
\usepackage{geometry}
\usepackage{tikz}
\usepackage{piton}
\usepackage{lipsum}

\definecolor{bleupyth}{rgb}{0.2157,0.436,0.6172}
\definecolor{jaunpyth}{rgb}{1,0.8157,0.25}

\newcommand{\PythonLogo}{
\begin{tikzpicture}[scale=0.004]
  \begin{scope}[,yscale=-1]
    \fill[bleupyth] (41.1090,0.0000) .. controls (20.0860,0.0000) and
    (21.3980,9.1170) ..  (21.3980,9.1170) -- (21.4220,18.5620) --
    (41.4840,18.5620) -- (41.4840,21.3980) -- (13.4530,21.3980)
    .. controls (13.4530,21.3980) and (0.0000,19.8710)
    .. (0.0000,41.0860) .. controls (0.0000,62.3010) and
    (11.7420,61.5470) .. (11.7420,61.5470) -- (18.7500,61.5470) --
    (18.7500,51.7030) .. controls (18.7500,51.7030) and
    (18.3710,39.9610) ..  (30.3050,39.9610) .. controls
    (42.2380,39.9610) and (50.2030,39.9610) ..  (50.2030,39.9610)
    .. controls (50.2030,39.9610) and (61.3830,40.1410) ..
    (61.3830,29.1560) .. controls (61.3830,18.1720) and
    (61.3830,10.9920) ..  (61.3830,10.9920) .. controls
    (61.3830,10.9920) and (63.0820,0.0000) ..  (41.1090,0.0000) --
    cycle(30.0470,6.3520) .. controls (32.0430,6.3520) and
    (33.6560,7.9650) .. (33.6560,9.9610) .. controls (33.6560,11.9570)
    and (32.0430,13.5700) .. (30.0470,13.5700) .. controls
    (28.0510,13.5700) and (26.4380,11.9570) .. (26.4380,9.9610)
    .. controls (26.4380,7.9650) and (28.0510,6.3520)
    .. (30.0470,6.3520) -- cycle;
  \end{scope}

  \begin{scope}[shift={(81,-81)},xscale=-1]
    \fill[jaunpyth] (41.1090,0.0000) .. controls (20.0860,0.0000) and
    (21.3980,9.1170) ..  (21.3980,9.1170) -- (21.4220,18.5620) --
    (41.4840,18.5620) -- (41.4840,21.3980) -- (13.4530,21.3980)
    .. controls (13.4530,21.3980) and (0.0000,19.8710)
    .. (0.0000,41.0860) .. controls (0.0000,62.3010) and
    (11.7420,61.5470) .. (11.7420,61.5470) -- (18.7500,61.5470) --
    (18.7500,51.7030) .. controls (18.7500,51.7030) and
    (18.3710,39.9610) ..  (30.3050,39.9610) .. controls
    (42.2380,39.9610) and (50.2030,39.9610) ..  (50.2030,39.9610)
    .. controls (50.2030,39.9610) and (61.3830,40.1410) ..
    (61.3830,29.1560) .. controls (61.3830,18.1720) and
    (61.3830,10.9920) ..  (61.3830,10.9920) .. controls
    (61.3830,10.9920) and (63.0820,0.0000) ..  (41.1090,0.0000) --
    cycle(30.0470,6.3520) .. controls (32.0430,6.3520) and
    (33.6560,7.9650) .. (33.6560,9.9610) .. controls (33.6560,11.9570)
    and (32.0430,13.5700) .. (30.0470,13.5700) .. controls
    (28.0510,13.5700) and (26.4380,11.9570) .. (26.4380,9.9610)
    .. controls (26.4380,7.9650) and (28.0510,6.3520)
    .. (30.0470,6.3520) -- cycle;
  \end{scope}
\end{tikzpicture}} 

\ExplSyntaxOn
\NewPitonEnvironment{Python}{}
  { 
    \noindent \PythonLogo\newline \nobreak
    \leavevmode 
    \hspace* { 7.4 pt } 
    \vrule width 1pt 
    \hspace* { 5 pt } 
    \dim_set:Nn \l_tmpa_dim { \linewidth - 12.4 pt }
    \begin { minipage } { \l_tmpa_dim }
  }
  { \end { minipage } }
\ExplSyntaxOff

\begin{document}

\lipsum[1]

\begin{Python}
class PCFS(StratégieOrdonnancement):
    def elire(sef):
        p = min(selp.fp.data, key = lambda p : p.taP)
        if p.taP <= self.horlogie:
            p.changerEtat("Elu")
\end{Python}

\end{document}

Se ha tomado el código para el logo de Python.aquí.

Salida del código anterior

información relacionada